logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Program - atmega16 rc5 bez użycia timerów

wifex 25 Kwi 2010 23:07 1573 5
REKLAMA
  • #1 8003540
    wifex
    Poziom 10  
    Usiluje napisac program ,ktory bedzie obslugiwac pilot TV.Jako odbiornik mam tsop1736 podpiety zgodnei z dokumentacja.Program ma byc bez uzycia timerow poniewaz sa mi one potrzebne do sterowania silnikami.Zamieszczam kod programu ,ktory nie dziala poprawnie i bardzo prosze o jakies sugestie



    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    #include "HD44780.c"
    #define F_CPU 1000000

    int tab[28];
    int licznik=0;

    int main (void)
    {
    LCD_Initalize();
    LCD_Clear();
    //TCCR1B |= (1 << WGM12); //pwm
    DDRD =0x00;//
    PORTD=0xff;
    MCUCR = (1<<ISC00) | (0<<ISC01) ;
    GICR |= (1<<INT0);//włączenie przerwania od INT1

    sei();
    while(1)
    {
    for(int k=0;k<14;k++)
    {
    LCD_WriteInt(k,0 ,1, tab[k]);
    LCD_WriteInt(k,1 ,1, tab[k+14]);

    }
    }

    }




    SIGNAL(SIG_INTERRUPT0)

    {

    unsigned int czas_trwania_impulsu=0;
    //for(i=0;i<14;i++)
    //{
    for(czas_trwania_impulsu=0;czas_trwania_impulsu<40;czas_trwania_impulsu++)
    {

    if(bit_is_set(PIND,PD2))

    {

    break;

    }

    }

    if(czas_trwania_impulsu>25)
    {
    tab[licznik]=1;

    }
    else
    {
    tab[licznik]=0;

    }
    licznik++;
    if(licznik>27)
    {licznik=0;
    _delay_ms(1000);
    }


    //_delay_us(200);

    //}
    LCD_Clear();

    //LCD_WriteInt(0,1,3,czas_trwania_impulsu);
    //_delay_ms(30);
    }
  • REKLAMA
  • Pomocny post
    #2 8004458
    grzewoj
    Poziom 27  
    Bez timerów to bardzo trudne zadanie, instrukcje opóźniające _delay są dosyć niedokładne,.
  • REKLAMA
  • Pomocny post
    #3 8004519
    ksarim
    Poziom 15  
    Twój sposób odczytywania jest ciekawy ale nie jestem pewny czy praktyczny. Program przy takim przerwaniu i odczytywaniu kodu RC5 dość dużo czasu będzie spędzał na pętlach delay. W związku z tym, że będziesz wykorzystywał też różne inne przerwania nie jestem pewny czy program się nie pogubi i poprawnie odczyta kod RC5.
  • REKLAMA
  • Pomocny post
    #4 8005468
    mirekk36
    Poziom 42  
    Sugestia jest jedna, cóż to za silniki, że potrzebujesz aż 3 timerów ??? Jeśli chodzi ci o to aby wykorzystać je do sprzętowych PWM - to wystarczy zrobić sobie programowe wyjścia PWM w oparciu o tylko jeden timer a dwa pozostaną wolne do twojej dyspozycji. Zatem w oparciu o kolejny Timer zrobisz sobie RC5 a jeszcze jeden zostanie ci wolny.
  • REKLAMA
  • #5 8006116
    wifex
    Poziom 10  
    Programowe rozwiazanie generowania sygnału PWM chyba bedzie jedynym rozsądnym rozwiazaniem pogodzenia komunikacji IR oraz obslugi silnikow DC sterowanych przy uzyciu l293DNE.
  • Pomocny post
    #6 8006500
    mirekk36
    Poziom 42  
    No do sterowania silników DC i to jeszcze przez L293D - to tylko programowe. Tracenie na to sprzętowego PWM'a to wręcz nieporozumienie ;) tym bardziej, że i tak silników DC nie będziesz w stanie sterować w calutkim zakresie PWM.
REKLAMA