Programmering for begyndere Brug af Arduino Internt interrupt - Arduino - Afslutning EDR Hillerød Knud Krogsgaard Jensen / OZ1QK 1
Intern interrupt Jeg vil rydde lidt op. Her er nogle punkter vil har glemt eller sprunget let hen over: Noise Reduction under brug af A/D konverter Aftenens emne: Intern / timer interrupt Watch dog Programeksempler Arbejde med strenge 2
Ekstern Interrupt Opsamling fra sidst Vi havde følgende kode: uint8_t oldsreg = SREG; cli(); Pos = encoderpos; SREG = oldsreg; uint8_t er en variabeltype unit8_t er 8 bit unsigned integer, dvs. 0 255.
Interrupt SREG indeholder en række oplysninger om status: Bit Navn 7 I Global Interrupt Enable 6 T Bit Copy Storage 5 H Half Carry Flag - Carry in some arithmetic operations 4 S Sign Bit, S = N V 3 V Two s Complement Overflow Flag 2 N Negative Flag indicates a negative result in an arithmetic operation. 1 Z Zero Flag - in an arithmetic or logic operation 0 C Carry Flag - in an arithmetic or logic operation
Noise Reduction Der er en helt række hvorpå man kan stoppe processoren:
Noise Reduction Eller en anden oversigt:
Noise Reduction Hvordan får man nu fat i det register? Det må jeg vende tilbage med en løsning på i foråret
Timer interrupt /* pulsetimer2pulse a pin at a rate set from serial input */ #include <MsTimer2.h> const int pulsepin = 13; const int NEWLINE = 10; // ASCII value for newline int period = 100; // 10 milliseconds boolean output = HIGH; // the state of the pulse pin void setup() { pinmode(pulsepin, OUTPUT); Serial.begin(9600); MsTimer2::set(period/2, flash); MsTimer2::start(); period= 0; // reset to zero, ready for serial input }
Timer interrupt void loop() { if( Serial.available()) { char ch = Serial.read(); if( isdigit(ch) ) // is this an ascii digit between 0 and 9? { period = (period * 10) + (ch - '0'); // yes, accumulate } else if (ch == NEWLINE) // is newline character { Serial.println(period); MsTimer2::set(period/2, flash); MsTimer2::start(); period = 0; // reset to 0, ready for the next } } }
Timer interrupt void flash() { digitalwrite(pulsepin, output); output =!output; // invert the output }
Watchdog Funktion: Hvis programmet kører helt i skoven foretages en reset. Det realiseres ved at man starter en timer. Med jævne mellemrum nulstilles timeren, typisk ved start eller slut af loop(). Hvis nulstilling ikke foretages inden for et bestemt tidsrum foretages reset. Intervallet er typisk 2 sek.?? Det diskuteres meget. Et problem er at hvis tiden er for kort når Arduino ikke at boote.
Watchdog Watchdog understøttes kun delvist i Arduino Jeg nævner det her fordi Erik/7EC i foråret nævnte det som en af de godt ting ved Arduino og Atmega328P. Det er også noget af det ved programmering, som synes at være lidt ud over det elementære. Spørgsmål: Har I nogle godt eksempler hvor det kunne være relevant at bruge en watchdog? Det er nok noget vi skal dyrke lidt mere i foråret.
Lidt grundlæggende Der er nok nogle ting vi er gået lidt for let hen over. Det er bl.a.: Håndtering af strenge Brug af for-løkke Jeg vil tage det op igen ved at gennemgå et program til håndtering af tekst på display.
Strenge Eksempler: Alle de følgende er lovlige definitioner af strenge: char Str1[15]; char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'}; char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'}; char Str4[ ] = "arduino"; char Str5[8] = "arduino"; char Str6[15] = "arduino"; Muligheder for definition af strenge Str1: Erklæring uden initialisering af indhold. Str2: Erklæring uden ekstra karakter. Compileren vil tilføje NULL Str3: Erklæring med nulterminering Str4: Erklæring med... Compileren vil tilføje NULL på sidsteplads Str5: Erklæring og initialisering af streng. NULL på sidste plads Str6: Erklæring og delvis initialisering. NULL på sidste plads
Strenge Opdeling af strenge Man kan opdele strenge på denne måde: char minstring[ ] = "Dette er den ene linje" " dette er den anden linje" " og vi kunne blive ved";
Brug af strenge Program eksempel: #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 6, 5, 4, 3); char tekst1[21] = " OZ1EDR "; char tekst2[21] = " Sjov med Arduino "; char tekst3[21] = " En ny del af "; char tekst4[21] = "verdens bedste hobby"; char tekst[81]; int n; int antal = 0; (Forsættes)
Brug af strenge void setup() { lcd.begin(20, 4); // putter de fire tekster ind i strengen tekst: for (n =0 ; n < 21; n++) tekst[n] = tekst1[n]; for (n =0 ; n < 21; n++) tekst[n+20] = tekst2[n]; for (n =0 ; n < 21; n++) tekst[n+40] = tekst3[n]; for (n =0 ; n < 21; n++) tekst[n+60] = tekst4[n]; } Det er sådan jeg har afleveret programmet; men er nu også rigtigt. Jeg er usikker. Lad os finde ud af det sammen.
Brug af strenge void loop() { lcd.setcursor(0,0); for (n = 0; n < 20; n = n + 1) lcd.print(tekst[n]); lcd.setcursor(0,1); for (n = 0; n < 20; n = n + 1) lcd.print(tekst[n+20]); lcd.setcursor(0,2); for(n = 0; n < 20; n = n + 1) lcd.print(tekst[n+40]); lcd.setcursor(0,4); for(n = 0; n < 20; n = n + 1) lcd.print(tekst[n+60]); if ((antal % 20) == 0) delay(4000);/* Alt er netop flyttet en linje */ else delay(100); antal = antal + 1; tekst[80] = tekst[0]; /* første tegn flyttes bagerst*/ for (n = 0; n < 81; n = n + 1) tekst[n] = tekst[n+1]; /* alle tegn rykkes en til venstre*/ }
Opfordring til arbejd nu Jeg har ikke kunne nå mere så derfor: Få en lysdiode til at varierer i lysstyrke Få en stepmotor til at køre til en bestemt position Få teksten i displayet til at køre den anden vej end angivet i eksemplet ovenfor. Desværre: Det er kun ved at gøre at man lærer. Kun ved at programmere lærer man det.