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

[Atmega8][C] Odbiornik IR

Coobracool 27 Mar 2009 21:01 3515 9
REKLAMA
  • #1 6341819
    Coobracool
    Poziom 10  
    Witam, od długiego czasu staram się uruchomić odbiornik IR w mojej atmedze, kiedy wydawało mi się, że "tym razem to juz musi działać" pojawiły się błędy z którymi już nie wiem co zrobić postanowiłem zapytać Was.
    #include <avr/io.h> 
    #include <avr/interrupt.h>
    
    #include "remote.h"
    
    #define OSC 4
    #define LED_ON PORTC |= 0x01
    #define LED_OFF PORTC &= 0xFE 
    
    
    unsigned int licznik=0;
    void waitms(unsigned char x)
    {
    unsigned char a, b; // zmnienne licznikowe
    for( ; x > 0; --x) // ta pętla zostanie wykonana x-razy
    for(b = 10; b > 0; --b) // a ta 10 razy
    for(a = 25 * OSC; a > 0; --a) // natomiast ta 100 razy
    __asm("nop"); // dodatkowa instrukcja opóźniająca o 1 cykl
    // razem to da opóźnienie ok. x * 1ms
    // x od 0 do 255
    // gdy x = 0 to opóźnienie = 256ms 
    }
    
    
    int main (void) 
    
    {
    
     LED_ON;
    
    waitms (10);
     LED_OFF;
    
      
    
     // teraz, przed wejściem do nieskończonej pętli 
    
     // uruchamiamy przerwanie INT0 od opadającego zbocza sygnału
    
    ENABLE_INTO_FALLING;
    
    //czekamy chwilę, aż zakończy się stan nieustalony
    
    // spowodowany zmianą trybu pracy wejścia INT0
    
    waitms (10);
    
    //uruchamiamy obsługę systemu przerwań przez mikrokontroler
    
    sei();
    
     
    
    // Program wchodzi do nieskończonej pętli
    
    // I jedyne co robi to resetowanie watchdoga
    
    for (;;)  
    
       {
    
       asm volatile ( 
    
                            "WDR"::);
    
       } 
    
        return (0);             
    
    }
    
     
    
    SIGNAL(SIG_INTERRUPT0)
    
    { 
    
    if(przelacznik==0)
    
    {
    
    LED_ON;
    
    przelacznik=1;
    
    waitms (100);
    
    }
    
    else
    
    {
    
    LED_OFF;
    
    
    przelacznik=0;
    
    waitms (100);
    
    }
    
    }

    Kontra uparty PN =[]
    > "make.exe" all
    avr-gcc -g -Wall -O2 -mmcu=atmega8    -c -o remote.o remote.c
    remote.c: In function 'main':
    remote.c:40: warning: implicit declaration of function 'cbi'
    remote.c:40: warning: implicit declaration of function 'sbi'
    remote.c:40: warning: implicit declaration of function 'outp'
    avr-gcc -g -Wall -O2 -mmcu=atmega8  -Wl,-Map,remote.map -o remote.elf remote.o 
    remote.o: In function `main':
    D:\Documents and Settings\Michał\Pulpit\I R\remote/remote.c:40: undefined reference to `cbi'
    D:\Documents and Settings\Michał\Pulpit\I R\remote/remote.c:40: undefined reference to `sbi'
    D:\Documents and Settings\Michał\Pulpit\I R\remote/remote.c:40: undefined reference to `outp'
    make.exe: *** [remote.elf] Error 1
    
    > Process Exit Code: 2
    > Time Taken: 00:00
    


    Jesteście moją ostatnią deską ratunku ;)



    Poprawiłem tytuł - Regulamin. [c_p]
  • REKLAMA
  • #2 6342071
    MirekCz
    Poziom 35  
    Temat stary jak świat. W nowszych winavr nie ma już tych funkcji. Na forum znajdziesz definicje je zastępujące, ale generalnie nie powinieneś już ich używać. (cbi,sbi,outp)
  • REKLAMA
  • #3 6342113
    Coobracool
    Poziom 10  
    jeśli ściągne stary, to wszystko tu będzie działać? Bo boję się, że jak jeszcze zaczne to "poprawiac" to się tak zacznie buraczyć, że już z tego nic nie będzie.

    Jeśli ktoś jest w stanie, to chętnie zobaczył bym poprawiony, przez kogoś kto ma o tym większe pojęcie niż ja =]
  • REKLAMA
  • #5 6343019
    zumek
    Poziom 39  
    Jeśli już musisz ich użyć, to dodaj taki plik nagłówkowy:
    
    #include <compat/deprecated.h>
    

    MirekCz napisał:
    ... ale generalnie nie powinieneś już ich używać. (cbi,sbi,outp)

    ... w swoich przyszłych projektach ;)
  • #6 6345240
    janbernat
    Poziom 38  
    zumek a SIGNAL?
    Chyba też przestarzałe.
  • #7 6345529
    Coobracool
    Poziom 10  
    Ślicznie dziękuję wszystkim, kod działa, i to jak=].

    Poprawiony kod, z eliminacją zakłuceń [reaguje TYLKO na pilota, nie zmienia się "sam od siebie"]

    #include <avr/io.h> 
    #include <avr/interrupt.h>
    
    #include "remote.h"
    #include <compat/deprecated.h>
    #define OSC 4
    #define LED_ON PORTC |= 0x02
    #define LED_OFF PORTC &= 0xFD
    
    
    unsigned int licznik=0;
    void waitms(unsigned char x)
    {
    unsigned char a, b; // zmnienne licznikowe
    for( ; x > 0; --x) // ta pętla zostanie wykonana x-razy
    for(b = 10; b > 0; --b) // a ta 10 razy
    for(a = 25 * OSC; a > 0; --a) // natomiast ta 100 razy
    __asm("nop"); // dodatkowa instrukcja opóźniająca o 1 cykl
    // razem to da opóźnienie ok. x * 1ms
    // x od 0 do 255
    // gdy x = 0 to opóźnienie = 256ms 
    }
    
    
    int main (void) 
    
    {
    
     LED_ON;
    
    waitms (10);
     LED_OFF;
    
      
    
     // teraz, przed wejściem do nieskończonej pętli 
    
     // uruchamiamy przerwanie INT0 od opadającego zbocza sygnału
    
    ENABLE_INTO_FALLING;
    
    //czekamy chwilę, aż zakończy się stan nieustalony
    
    // spowodowany zmianą trybu pracy wejścia INT0
    
    waitms (10);
    
    //uruchamiamy obsługę systemu przerwań przez mikrokontroler
    
    sei();
    
     
    
    // Program wchodzi do nieskończonej pętli
    
    // I jedyne co robi to resetowanie watchdoga
    
    for (;;)  
    
       {
    
       asm volatile ( 
    
                            "WDR"::);
    
       } 
    
        return (0);             
    
    }
    
     
    
    
    
    SIGNAL(SIG_INTERRUPT0)
    
    { 
    
    unsigned int czas_trwania_impulsu=0;
    
    // dokonujemy pomiaru czasu trwania impulsu w pętli
    
    // wiemy, że nominalny czas trwania impulsu jest 889 mikrosekund
    
    // tak więc nie czekamy więcej jak 900 mikrosekund
    
     
    
    for(czas_trwania_impulsu=0;czas_trwania_impulsu<40;czas_trwania_impulsu++)
    
                {
    
                            if(bit_is_set(PIND,PD2)) 
    
                                                                                                  {
    
                                                                                                  break;
    
                                                                                                  }
    
                            }
    
    // teraz analizujemy szerokość odebranego impulsu
    
    // przyjmujemy, że impulsy o czasie trwania wynoszącym
    
    // przynajmniej 1/2 wartości nominalnej zakwalifikujemy
    
    // jako ważne bity startu
    
    if(czas_trwania_impulsu>20) //tutaj zmieniaj kryterium kwalifikowania
    
                            {
    
                            // pod wpływem ważnego bitu startu przełączamy diodę led
    
                                       if(przelacznik==0)
    
                                                   {
    
                                                               LED_ON;
    
                                                               przelacznik=1;
    
                                                                           }
    
                                                   else
    
                                                   {
    
                                                               LED_OFF;
    
    
                                                               przelacznik=0;
    
                                                   }
    
                            }
    
    }
  • #8 8273489
    bashunter0101
    Poziom 2  
    Witam
    Coobracool poniższy kod działa gratuluję, mógłbyś zamieścić jeszcze plik remote.h bo tez chciałbym mieć taki odbiornik

    dziekuję i pozdrawiam
  • REKLAMA
  • #9 8274333
    gaskoin
    Poziom 38  
    janbernat napisał:
    zumek a SIGNAL?
    Chyba też przestarzałe.


    jak dinożarły :D
  • #10 8276280
    carkar
    Poziom 15  
    Teraz jest ISR(INT0_vect) zamiast SIGNAL(SIG_INTERRUPT0)
REKLAMA