Problémy s nastavením registrů u časovaču u Arduina.
Napsal: 13 bře 2023, 22:47
O víkendu jsem si hrál s Arduinem, do kterýho jsem chtěl namastit generátor pulzů, kterej 1 x za 2 minuty vymrskne na výstupu impulz 20ms. Není žádnej problém to udělat s delay (20) a delay (120000) ale je to baterkový zařízení, tak by to chtělo kvůli spotřebě na 2 minuty nastavit časovač, uspat procík, po dvou minutách ho vzbudit přerušením od časovače, vygenerovat přes delay ten 20ms impulz, shodit ho a zase uspat procík a stále dokola.
Je to oblbovač proti vypnutí odměřování, co se tu řešilo s časovačem TPL5111.
Něco jsem našel na netu jak řešit nastavení časovače a to uspání. Ještě jsem k tomu domastil další, co budu potřebovat.
Dělal jsem to na PC v dílně a stále mi to hlásilo, že nejsou deklarovaný TCCR1A a další v sekci inicializace časovače. Tak jsem s tím praštil a před chvílí to znova zkusil na jiným PC se stejnou verzí Arduina IDE. No a světe div se, na tomhle PC kompilátor nehlásí žádnou chybu. Jestli to chodí jsem ale zatím nezkoušel. Proč to na jednom PC zkompilovat nejde a na druhým jo? Knihovna avr/sleep.h je na obou PC stejná ale stejně v ní definice pro časovač nejsou.
Nevíte prosím někdo, v který vnitřní knihovně jsou ty definice časovačů schovaný? Co s tím? Napadá mě v dílně zkusit překopírovat všechny složky s názvem Arduino (v Program Files a Users) těma z PC, kde kompilace chodí. Jsou tam kupy definičních texťáků a netuším, kde je rozdíl nejspíš od nějaký aktualizace knihoven nebo desek.
Je to oblbovač proti vypnutí odměřování, co se tu řešilo s časovačem TPL5111.
Něco jsem našel na netu jak řešit nastavení časovače a to uspání. Ještě jsem k tomu domastil další, co budu potřebovat.
Kód: Vybrat vše
#include <avr/sleep.h>
// pin pro generování pulzu
#define PULSE_PIN 3
volatile bool timer_fired = false;
ISR(TIMER1_COMPA_vect) // přerušení od časovače,
{timer_fired = true; } // nastavení že timer vypršel
//************************************************
void setup() {
pinMode(PULSE_PIN, OUTPUT); // nastavení pinu pro generování pulzu
//-------------------------------
// inicializace časovače
TCCR1A = 0;
TCCR1B = 0;
TCCR1B |= (1 << WGM12); // nastavení časovače do CTC módu
// OCR1A = 15624; // nastavení hodnoty pro 1 minutu (při 16 MHz)
OCR1A = 31248; // nastavení hodnoty pro 2 minuty (při 16 MHz)
TIMSK1 |= (1 << OCIE1A); // povolení přerušení při dosažení hodnoty OCR1A
//-------------------------------
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // nastavení režimu uspání
sleep_enable();
sei(); // povolení globálních přerušení
}
//*************************************************
void loop()
{ // čekání na přerušení po dvou minutách (časovač 1)
while (!timer_fired)
{sleep_mode();}
timer_fired = false; // reset příznaku přerušení
digitalWrite(PULSE_PIN, HIGH); // generujeme pulz 20 ms
delay(20);
digitalWrite(PULSE_PIN, LOW);
sleep_cpu(); // uspat procesor na další dvě minuty
}
Nevíte prosím někdo, v který vnitřní knihovně jsou ty definice časovačů schovaný? Co s tím? Napadá mě v dílně zkusit překopírovat všechny složky s názvem Arduino (v Program Files a Users) těma z PC, kde kompilace chodí. Jsou tam kupy definičních texťáků a netuším, kde je rozdíl nejspíš od nějaký aktualizace knihoven nebo desek.