Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C][Atmega8] - Sterownik żaluzji

szczarek 28 Paź 2012 07:33 1074 4
  • #1 28 Paź 2012 07:33
    szczarek
    Poziom 8  

    Witam próbuję napisać program do sterownika żaluzji.
    Program ma działać tak że gdy budzik zadzwoni serwo modelarskie zmienia pozycje tak aby otworzyć żaluzje, pozostaje w tym stanie przez ok 10 godzin po czym żaluzje się same zamykają a sterownik czeka na sygnał od budzika by otworzyć żaluzje.

    #define F_CPU 100000
    #include <avr/io.h>
    #include <util/delay.h>

    int main(void)

    {
    DDRD=0xff;
    DDRB=0x00;
    PORTB=0x00; //wejście budzika ktore jest sterowane masa
    {

    { //pierwszy podprogram zalujze otwarte
    PORTD=0XFF;
    _delay_ms(1.5);
    PORTD=0x00;
    _delay_ms(20);
    }
    { //drugi podprogram zaluzje zamkniete
    PORTD=0XFF;
    _delay_ms(2.5);
    PORTD=0x00;
    _delay_ms(20);
    }
    }
    }
    Mój problem polega na tym że nie wiem jakiej instrukcji użyć aby zrobić taką pętle która gdy dostanie sygnał na wejście to wykonuje pierwszy program i robi go przez 10 godzin po czym wykonuje drugi podprogram i czeka znowu na sygnał.
    Ktoś z panów programistów mi pomoże?

    0 4
  • #2 28 Paź 2012 08:07
    ZbeeGin
    Poziom 38  

    szczarek napisał:
    Mój problem polega na tym że nie wiem jakiej instrukcji użyć aby zrobić taką pętle która gdy dostanie sygnał na wejście to wykonuje pierwszy program i robi go przez 10 godzin po czym wykonuje drugi podprogram i czeka znowu na sygnał.

    Jeśli chodzi o najprostsze rozwiązania to pętlę zrobisz korzystając z instrukcji while(warunek) { co wyonać }, a warunek wejścia korzystając z if(warunek) { co wyonać }.

    Gdybyś jednak chciał zrobić to "po bożemu" to trzeba skorzystać z przewań zewnętrznych, które wykryją zdarzenie budzika oraz jednego z dostępnych liczników do odliczania równych odcinków czasu, które póżniej złożą się na czas 10 godzin.

    szczarek napisał:
    #define F_CPU 100000

    Najprawdopodobniej brakuje Ci jednego zera.

    0
  • #3 28 Paź 2012 09:20
    mirekk36
    Poziom 42  

    Tego #define F_CPU w ogóle nie powinieneś mieć w kodzie programu, tylko w ustawieniach projektu (ew w makefile)

    0
  • #4 28 Paź 2012 10:18
    szczarek
    Poziom 8  

    Zrobiłem coś takiego ale nadal nie działa. Możecie mi jakoś bardziej szczegółowo co zrobić?
    #define F_CPU 1000000
    #include <avr/io.h>
    #include <util/delay.h>

    int main(void)

    {
    DDRD=0xff;
    DDRB=0x00;
    PORTB=0x00;
    {
    while(PINB=0x01)
    { //pierwsza instrukcja
    PORTD=0XFF;
    _delay_ms(1.5);
    PORTD=0x00;
    _delay_ms(20);
    }
    if(!(PINB=0x01))
    { //druga instrukcja
    PORTD=0XFF;
    _delay_ms(2.5);
    PORTD=0x00;
    _delay_ms(20);
    }
    }
    }

    0
  • #5 28 Paź 2012 17:17
    KKK14
    Poziom 9  

    A ogólnie działa serwo na funkcji delay ? U mnie serwo kiedyś na takich czasach delay nie działało, dopiero jak dałem kilka małych delay to zaczęło chodzić. Lepiej odmierzać czas za pomocą Timera .
    http://www.robotyka.net.pl/category/artykuly-praktyczne/avr/ -opisane tu są zarówno Timery jak i przerwania zewnętrzne z przykładami, może pomoże.

    0