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: Dekodowanie DCF77 i odczyt rejestru TCNT1H - co robię źle?

lukasb9 20 Lis 2006 00:34 1920 1
REKLAMA
  • #1 3242630
    lukasb9
    Poziom 28  
    Posty: 1421
    Pomógł: 56
    Ocena: 69
    Witam na wstepie zaznacza, że problem moze dla innych banalny, mnie przyspozył sporo problemów..., siedze juz od południa nad tym i bez rezultatu, program ma dekodowac informacje czasu (DCF77), całosc pracuje w atmedze8, jest to tylko rdzeń odbioru DCF-a, oscylator wewnetrzny 8MHz, pierwsza sprawa, czy dobze licze i przy ustawieniach jak w listingu i czestotliwosci oscylatora jak napisałem (8MHz) przerwanie od timera1 wystąpi po czasie ok 0,5s? (nie musi byc dokaldnie, potrzebne mi to do wychwytywania poaczatku transmisji DCF), druga sprawa, przerwania wystepuja, problem w tym że za nic nie moge odczytac zawartości rejestru TCNT1H - czemu? w programie umiesciłem dwie linijki które maja zapalac diody podłaczone do portu PD7 i PD6 kiedy zawartość TCNT1H jest rózna od zera, ale nie zapalaja sie....prosze o chwile cierpliwosci, moze dlawas to proste, ja juz trace siły, najbardziej zalezy mi na tym czemu zawartość tego rejestru jest ciagle równa 0?


    #include <avr/io.h>
    #include <avr/signal.h>
    #include <avr/interrupt.h>
    unsigned char pause_counter = 0;
    unsigned char Dcf_counter = 0;
    unsigned char Start_dcf_flag=0;
    unsigned char Dcf_receiving_flag= 0;
    unsigned char Dcf_bit=0;
    unsigned char odebrany = 0;




    ///////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////
    int main (void)
    {
    DDRB = 0b11111110;
    DDRD = 0b11000000;
    DDRC = 0b11111111; //4MHz
    PORTB= 0b11000001;
    PORTD= 0b11000000;
    TCCR1A&=0b00000000; // rejestr sterujacyA
    TCCR1B|=0b000000011; // rejestr sterujacy B ustaw timer1 na taktowanie poprzez prescaler/1
    TCNT1H = 0; //zeruj timer
    TIMSK=0b00000101;
    SREG |= _BV(7); //właczenie obsługo przerwan,



    while(1)
    {


    if (TCNT1H!=0) //tu - jesli rejestr TCNT1H rózny od 0 powinien wyzerowac bity PD7 i PD6
    PORTD=0b00111111; //niestety tego nie robi


    if ((Start_dcf_flag==0)&&(bit_is_set(PINB,PB0)))
    TCCR1B|=0b00000011; //wlacz timer
    if ((Start_dcf_flag==0)&&(bit_is_clear(PINB,PB0)))
    {TCCR1B&=0b11111100;
    TCNT1H = 0;
    pause_counter=0;}




    if (Start_dcf_flag==1)
    {
    if (bit_is_clear(PINB,PB0)) //jesli ten warunek jest spełniony, w tej chwili mineła minuta
    {TCCR1B|=0b00000011; //wlacz timer
    odebrany=1;}


    if ((bit_is_set(PINB,PB0))&&(odebrany==1))
    {
    odebrany =0;
    TCCR1B&=0b11111100; //zablokuj timer

    if((TCNT1H>40)&&(TCNT1H<70)) //okno 80ms - 120ms dla zera
    {Dcf_bit = 0;PORTD=0b01000000;}

    if((TCNT1H>88)&&(TCNT1H<103)) //okno 180ms - 210ms dla jedynki
    {Dcf_bit = 1;PORTD=0b10000000;}

    //if(((TCNT1L>0)&&(TCNT1L<40))||((TCNT1L>60)&&(TCNT1L<88))||(TCNT1L>103)) //okno bledu
    //{Start_dcf_flag=0;
    // piszrozkaz(128);
    // piszznak('e');}
    TCNT1H = 0;
    pause_counter=0;
    }



    }






    }}
    ///////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////


    SIGNAL(SIG_OVERFLOW1) //dla kwarcu 8MHz przerwania nastepuuja co 0,52ms
    {pause_counter++; ///T1H zmienia sie co 2,04mS, T1L zmienia sie co 8uS
    if(pause_counter==3)
    {pause_counter=0;
    Dcf_counter = 0;
    Start_dcf_flag=1;
    TCCR1B&= 0b11111100; //zatrzymaj timer
    TCNT1H = 0; //zeruj timer
    odebrany = 0;}}
  • REKLAMA
  • #2 3242960
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Żeby odczytać TCNT1H to najpierw musisz odczytać TCNT1L.
REKLAMA