"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).