Hasicské stopky na mega2560
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Hasicské stopky na mega2560
Ahojte,
Riešim hasické stopky na mega2560+wifi kde je daný kryštálhttps://techfun.sk/produkt/arduino-mega-wifi/
Viem že millis je nepresný tak by som uvítaľ nejaké nápady postrehy ako to správne urobiť. Nejaký vzorec nastavenie všetky postrehy sú vítané.
Ďakujem
Riešim hasické stopky na mega2560+wifi kde je daný kryštálhttps://techfun.sk/produkt/arduino-mega-wifi/
Viem že millis je nepresný tak by som uvítaľ nejaké nápady postrehy ako to správne urobiť. Nejaký vzorec nastavenie všetky postrehy sú vítané.
Ďakujem
Re: Hasicské stopky na mega2560
Jak dlouhé časové úseky tím chceš měřit a jakou potřebuješ přesnost (a proč), že řešíš nepřesnost millis?
Případně nestačí prostě změřit třeba 1.000 sec, podělit napočítanýma millis 1.000.000UL a tou hodnotou pak násobit všechny výsledky měření?
Případně nestačí prostě změřit třeba 1.000 sec, podělit napočítanýma millis 1.000.000UL a tou hodnotou pak násobit všechny výsledky měření?
Re: Hasicské stopky na mega2560
Millis je tak přesný, jak je přesný krystal hodin arduina. Pokud ti ten na desce nevyhovuje a potřebuješ vyšší přesnost, kup si kalibrovaný krystalový oscilátor se stejným kmitočtem, jaký má krystal a použij ho místo něj.
Nebo si připoj GPS modul a synchronizuj si čas každou sekundu podle něj, přesněji už to snad nejde.
Re: Hasicské stopky na mega2560
Hej,millis je nepresná. Síce sa snažia tú chybu korigovať ale aj tak si myslím že na dlhé časy (týždne) to nebude kóšer.
V stopkách to robí bordel v tom že neviem koľká v poradí milisekunda má inú dĺžku ako tie ostatné.
Na mege máš ale kopu čítačov. Tak si nastav napríklad Timer1 podľa seba a môžeš si základný tick nastaviť presne. Tiež súhlasím s tým že ten kryštál čo je tam nie je nič moc. Keď som v minulosti robil hodiny tak som používal pomerne presné, k tomu určené časové kryštály s f 2^22 = 4194304Hz.
Ale nemyslím že by hasiči behali niekde týždeň, takže na to stačí aj ten 16.000Mhz
V stopkách to robí bordel v tom že neviem koľká v poradí milisekunda má inú dĺžku ako tie ostatné.
Na mege máš ale kopu čítačov. Tak si nastav napríklad Timer1 podľa seba a môžeš si základný tick nastaviť presne. Tiež súhlasím s tým že ten kryštál čo je tam nie je nič moc. Keď som v minulosti robil hodiny tak som používal pomerne presné, k tomu určené časové kryštály s f 2^22 = 4194304Hz.
Ale nemyslím že by hasiči behali niekde týždeň, takže na to stačí aj ten 16.000Mhz
-
- Příspěvky: 67
- Registrován: 29 led 2020, 20:15
- Reputation: 0
Re: Hasicské stopky na mega2560
Kód: Vybrat vše
#include <timer.h>
#include <LiquidCrystal_I2C.h>
Timer<1, micros> timer; // create a timer with 1 task and microsecond resolution
unsigned long corr = 0;
LiquidCrystal_I2C lcd(0x23, 20, 4);
bool _10ms(void *) {
corr += 1;
}
void setup() {
lcd.init(); // initialize the lcd
lcd.backlight();
// call the toggle_led function every 10000 micros
timer.every(10000, _10ms);
}
void loop() {
lcd.setCursor(1, 0);
lcd.print(corr);
timer.tick(); // tick the timer
}
Re: Hasicské stopky na mega2560
Tak pozor takto nie!!!!!!
corr nie je volatile (musí byť). A prístup k premenej nie je atomický. Treba si naštudovať ako sa to robí. Stačí si pozieť zdroják millis.
corr nie je volatile (musí byť). A prístup k premenej nie je atomický. Treba si naštudovať ako sa to robí. Stačí si pozieť zdroják millis.
Re: Hasicské stopky na mega2560
ono je problém vtom že na všetkých uno sa začali používať rezonátory, kryštál čo tam je tak je na komunikáciu.peterple píše: ↑13 říj 2023, 19:43Hej,millis je nepresná. Síce sa snažia tú chybu korigovať ale aj tak si myslím že na dlhé časy (týždne) to nebude kóšer.
V stopkách to robí bordel v tom že neviem koľká v poradí milisekunda má inú dĺžku ako tie ostatné.
Na mege máš ale kopu čítačov. Tak si nastav napríklad Timer1 podľa seba a môžeš si základný tick nastaviť presne. Tiež súhlasím s tým že ten kryštál čo je tam nie je nič moc. Keď som v minulosti robil hodiny tak som používal pomerne presné, k tomu určené časové kryštály s f 2^22 = 4194304Hz.
Ale nemyslím že by hasiči behali niekde týždeň, takže na to stačí aj ten 16.000Mhz
Mega ich má až 6. Teraz otázka ako to správne napísať lebo nemám potuch, Lebo už som čital kopec článkov ako použiť timer ale niektoré si doslova odporujú. V tomto som úplny začiatočník..
Preto ak sa bude dať tak by som poprosil ako tá časť kódu má správne vyzerať.
Ďakujem
Re: Hasicské stopky na mega2560
Och, nečakaj že tu hodím funkčný kód konkurencii. Musí stačiť že píšem čo je špatne. Kód poslaný v predošlom príspevku má chyby čo som popísal. Po ich odstránení bude OK. Ak sa do toho neponoríš navždy zostaneš začiatočník. Doporučujem menej čítať blbosti a viac písať vlastné veci. Nejasnosti si vyjasniť na fóre.
Re: Hasicské stopky na mega2560
Tak ono taky dost záleží na tom co a proč a jak chceš měřit.
Pokud někde děláš nějaký rychlý protokol taháním za jednotlivé piny a doba instrukce navíc ti to může rozhodit, tak to nejspíš programuješ v assembleru a s brutální znalostí všeho.
Pokud je to tak, že měříš třeba nějaké hasičské závody, po startu stiskneš tlačítko na svém dobrovolnickém bastlu, po průběhu cílem druhé a vítěz dostane diplom a věnec klobás, tak nestejně dlouhé milisekundy nemusíš řešit, protože to tak přesně nenamačkáš, během těch tří minut se ti nenakumuluje tolik chyb, kolik tam tím mačkáním vneseš sám a navíc ty chyby budou pro všechny soutěžící docela podobné - během sobotního odpoledne se ty podmínky tolik nezmění - takže nejrychlejší stejně bude mít nejlepší čas (a že všechny časy budou kvůli tepelné závislosti o 2.54321 ms vedle vadit nebude)
Kdyby šlo o zápis do Guinessovy knihy rekordů a chtěli jste ve dvoudenním maratonu o zlomek sekundy překonat loňský vítězný team z Aljašky, tak zase budete používat řádově dražší a přesnější techniku, protože vám to jinak stejně nikdo neuzná
Pokud někde děláš nějaký rychlý protokol taháním za jednotlivé piny a doba instrukce navíc ti to může rozhodit, tak to nejspíš programuješ v assembleru a s brutální znalostí všeho.
Pokud je to tak, že měříš třeba nějaké hasičské závody, po startu stiskneš tlačítko na svém dobrovolnickém bastlu, po průběhu cílem druhé a vítěz dostane diplom a věnec klobás, tak nestejně dlouhé milisekundy nemusíš řešit, protože to tak přesně nenamačkáš, během těch tří minut se ti nenakumuluje tolik chyb, kolik tam tím mačkáním vneseš sám a navíc ty chyby budou pro všechny soutěžící docela podobné - během sobotního odpoledne se ty podmínky tolik nezmění - takže nejrychlejší stejně bude mít nejlepší čas (a že všechny časy budou kvůli tepelné závislosti o 2.54321 ms vedle vadit nebude)
Kdyby šlo o zápis do Guinessovy knihy rekordů a chtěli jste ve dvoudenním maratonu o zlomek sekundy překonat loňský vítězný team z Aljašky, tak zase budete používat řádově dražší a přesnější techniku, protože vám to jinak stejně nikdo neuzná
Re: Hasicské stopky na mega2560
Dosť mám nakodených iných projektov, ale nikdy so neriešil časovače. až takto.peterple píše: ↑15 říj 2023, 23:36Och, nečakaj že tu hodím funkčný kód konkurencii. Musí stačiť že píšem čo je špatne. Kód poslaný v predošlom príspevku má chyby čo som popísal. Po ich odstránení bude OK. Ak sa do toho neponoríš navždy zostaneš začiatočník. Doporučujem menej čítať blbosti a viac písať vlastné veci. Nejasnosti si vyjasniť na fóre.
Toto je čo som urobil, nápad ešte na nejaké doplnenie?
Kód: Vybrat vše
void init_timer1(void);
volatile unsigned long millis_counter=0;
void init_timer1(void){
// Nastavenie časovača 1 na generovanie prerušenia každú 1 ms
TCCR1A = 0;
TCCR1B = (1 << WGM52) | (1 << CS51) | (1 << CS50); // Režim CTC a preddeľovač 64
OCR1A = 249; // Nastavenie hodnoty porovnania pre generovanie prerušenia každých 1 ms
TIMSK1 = (1 << OCIE1A); // Povolenie prerušenia pri dosiahnutí hodnoty porovnania
}
ISR(TIMER1_COMPA_vect) {
// Obsluha prerušenia časovača 1, ktorá sa vykoná každých 1 ms
millis_counter++;
}
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 42 hostů