"Robot igaühele" 2007 koodinäited
Programmeerimiseks kasutatud vahendid
Näide 1
#include <avr/cpp/IO.h> /* Paneb kaks LEDi vastasfaasis vilkuma */ int main() { uint16_t counter = 0; // PD6 ja PD7 seada väljundiks DDRD = DDRD | _BV(PD6) | _BV(PD7); /* ehk lühemalt: DDRD |= _BV(PD6) | _BV(PD7); või veelgi lihtsustatult: DDRD |= _PD6 | _PD7; */ // Esimene LED põlema PORTD |= _PD6; // Teine LED ei põle PORTD &= ~_PD7; // Lõpmatu tsükkel while (true) { /* Tekitame viivitust */ counter = 0; while (counter < 10000) { counter++; } // Mõlema väljundi väärtus seada vastupidiseks PORTD ^= _PD6 | _PD7; } return 0; }
Näide 2
#include <avr/cpp/IO.h> /* Kaks LEDi vilguvad, kui kaks mikrolülitit on alla vajutatud */ int main() { uint16_t counter; /* PD6 ja PD7 väljundiks */ DDRD |= _PD6 | _PD7; /* Seab sisendid PD2 ja PD3 õigesse sisendirežiimi */ PORTD |= _PD2 | _PD3; // Esimene LED põlema PORTD |= _PD6; // Teine LED ei põle PORTD &= ~_PD7; // Lõpmatu tsükkel while (true) { /* Tekitame viivitust */ for (counter = 0; counter < 10000; counter++) ; /* Kui mõlemad mikrolülitid on alla vajutatud */ if ((PIND & _PD2) && (PIND & _PD3)) { // Mõlema väljundi väärtus seada vastupidiseks PORTD ^= _PD6 | _PD7; } } return 0; }
Näide 3
Sama, mis näide 2, kuid kasutab AVR C++ teegi võimalusi.
#include <avr/cpp/IO.h> /* Väljundid */ typedef OutputPin6<PortD> LED1; typedef OutputPin7<PortD> LED2; /* Sisendid */ typedef InputPin2<PortD> Button1; typedef InputPin3<PortD> Button2; int main() { uint16_t counter; LED1::InitOutput(); LED2::InitOutput(); Button1::InitInput(); Button2::InitInput(); LED1::Set(); LED2::Clear(); while (true) { for (counter = 0; counter < 10000; counter++) ; if (Button1::IsSet() || Button2::IsSet()) { LED1::Toggle(); LED2::Toggle(); } } return 0; }
Näide 4
Ülesanne:
Üks LED vilgub konstantse sagedusega, teine LED vilgub sagedusega, mis on võrdeline analoogsisendite väärtuste summaga.
#include <sl/StudentLib.h> /* Väljundid */ typedef OutputPin6<PortD> LED1; typedef OutputPin7<PortD> LED2; /* Sisendid */ typedef InputPin2<PortD> Button1; typedef InputPin3<PortD> Button2; int main() { uint16_t adc0, adc1; uint16_t sum = 0; uint16_t counter0 = 0, counter1 = 0; while (true) { /* Ootame 10 millisekundit */ Delay(0.01); /* Suurendame loendurite väärtusi ühe võrra */ counter0++; counter1++; /* Kui esimene loendur on jõudnud maksimaalse väärtuseni */ if (counter0 > 10) { /* loenduri nullimine */ counter0 = 0; /* LED1 põlemise olek vastupidiseks */ LED1::Toggle(); } /* Kui teine loendur on jõudnud maksimaalse väärtuseni */ if (counter1 > sum) { /* Analoogkanalitest väärtuste lugemine */ adc0 = GetADCResult(0); adc1 = GetADCResult(1); /* Summeerimine ja konstandiga jagamine, et 'sum' jääks soovitavasse väärtustevahemikku */ sum = (adc0 + adc1) / 100; /* loenduri nullimine */ counter1 = 0; /* LED2 põlemise olek vastupidiseks */ LED2::Toggle(); } } return 0; }
Iseseisev ülesanne
Ühele fototransistorile vastab üks LED. Panna valgustugevusest sõltuma mõlema LEDi vilkumise sagedus. LEDi vilkumise erinevaid sagedusi on vähemalt 16. Kui üks mikrolüliti on alla vajutatud, siis see säilitab mikrolüliti allavajutamise hetkel esinenud LEDide vilkumise sageduse. Teise mikrolüliti allavajutamisel mõlemad LEDid hakkavad põlema ja jäävad põlema ajaks, mil nupp on allavajutatud. Teine mikrolüliti on prioriteetsem (kui alla on vajutatud nii esimene kui ka teine mikrolüliti, siis tegevus toimub teise mikrolüliti järgi).