W mikrokontrolerach AVR wyróżniamy przerwania sprzętowe oraz programowe timery, które mogą przejąć ich funkcję.
Przerwania sprzętowe.
W przykładowej Atmedze 32/328 występują 2 przerwania sprzętowe, na pinach INT0 oraz INT1.
Dla atmegi 32 są to piny – (PD2[16]/PD3[17]) oraz dla atmegi 328 piny (PD2[18]/PD3[19]) – proszę zwrócić uwagę, że piny mają lub mogą mieć trochę odmienne numeracje.
Przerwania sprzętowe mogą reagować na zbocze rosnące, opadające oraz na wykrytą zmianę stanu. Odpowiedni zapis w kodzie pozwala reagować na zmiany stanu na pinie, jest to metoda „attachInterrupt(<pin>, <callback>, <zbocze>)” która na skutek wzrostu napięcia (zbocze rosnące) uruchamia instrukcję „setEdge”. Założeniem jest aby kod pod przerwaniem wykonywał się krótko, może to być flaga wpływająca na wywołanie innego kodu w pętli loop programu. Zapobiega to wstrzymywaniu pracy procesora na dłuższy czas. Oczywiście wykorzystanie osobnego przerwania pinu do takiej czynności jest trochę marnotrawstwem zasobu, jednak w tym momencie i tak do niczego innego nie będę go wykorzystał. Również można wykorzystać timery wewnętrzne.
#include "Arduino.h" int interruptPin = 2; int sendToDiode = 13; volatile auto flaga = false; void setup() { Serial.begin(9600); pinMode(interruptPin, INPUT); //pin dla przerwania attachInterrupt(digitalPinToInterrupt(interruptPin), setEdge, RISING); //przerwanie na zbocze wznoszace } void loop() { //test sprawdzający działanie przerwania. if(flaga){ Serial.print("1"); digitalWrite(sendToDiode, 1); _delay_ms(100); digitalWrite(sendToDiode, 0); flaga = false; } } void setEdge(){ //reakcja na przerwanie flaga = true; }
Co dalej z pomiarem energii
Kontynuując temat licznika energii, miganie diody trzeba zastąpić kodem obsługującym wykonanie konkretnego zadania. Informacje, że takie przerwanie nastąpiło wysłać można bezpośrednio do innego urządzenia agregującego dane. W tym wypadku należałoby obsłużyć interfejs komunikacyjny dowolnego rodzaju. Idąc dalej tym tropem nie zawsze można liczyć, że przesyłanie danych odbędzie się poprawnie i na pewno do niego dojdzie. W razie problemów z połączeniem dłuższym niż kilkanaście sekund, może nawarstwić się informacji o liczbie przerwań. Przesłanie ich jednym ciągiem, z pewnością zaburzy dokładność takiego pomiaru energii. Dlatego dobrze byłoby zapisywać gdzieś aktualną godzinę razem z informacją o przerwaniu, czyli zużyciu 1W. Tu posłużyć warto się zewnętrznym zegarem RTC, ceny zwykle występują między 4-100zł. Można też łączyć się przez internet i pobierać aktualny czas z jakiegoś serwera, najlepiej własnego. Następnie działać na kwarcu procesora i co jakiś czas uaktualniać wartość czasu.