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

atmega8L timer2 RTC winavr

20 Lut 2009 04:38 3870 11
  • Poziom 13  
    Mam następujący problem, pisze program do zegarka, próbuję odliczać sekundy na timerze 2 w trybie asynchronicznym, podłączyłem kwarc zegarkowy do pinów 7 i 8 plus kondensatory 22pF. Naczytałem się datascheet'a poprzeglądałem przykładowe źródła i wyskrobałem kawałek kodu.

    Do portu PB0 jest podłączona dioda która ma sygnalizować odmierzoną sekundę.


    Code:
    #define F_CPU 1000000UL
    
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>


    volatile int c;

    void zmiana(void)
    {
       int i;

       c++;
       
       if(c==6)
       {
          
          PORTB ^= _BV(0);
          
          for(i=0; i<10; i++)
            {
             _delay_ms(10);   
            }
           
            PORTB ^= _BV(0);
          
          c=0;
       }   
       
    }

    SIGNAL (SIG_OVERFLOW2)
    {
          zmiana();
       
    }


    int main(void)
    {

       DDRB  |= _BV(0);

       TIMSK &=~_BV(TOIE2);// Wył. przerwania TC2
       
       ASSR |= _BV(AS2);// TC2 z taktowania zegarem CPU na generator asynchoniczny 32768 Hz
       TCNT2   = 0;
       OCR2   = 0;
       OCR2   = 255;
       
       TCCR2   = 0;
       TCCR2 = _BV(CS22)|_BV(CS21)|_BV(CS20);// preskaler - podział przez 128
          
       while(ASSR&0x07);// czekaj na uaktualnienie TC2
       
       TIFR   = 0;
       
       TIMSK |= _BV(TOIE2);// włącz przerwania z TC2

       sei();              // włącz obsługę przerwań

       for (;;){}
       
        return 0;
    }


    Jednak tak się nie dzieje, ale jeśli skomentuje kawałek kodu
    Code:
    ASSR |= _BV(AS2);// TC2 z taktowania zegarem CPU na generator asynchoniczny 32768 Hz

    odpowiedzialny za przełączenie w tryb asynchroniczny zaczyna działać, podejrzewam, że może coś z tym kwarcem jest nie tak, ale nie mam pewności ponieważ to moja pierwsza styczność z
    µK zatem może coś nie tak ustawiłem w programie.
  • AM TechnologiesAM Technologies
  • Pomocny post
    Poziom 33  
    Nie dziala to znaczy? Zeby zobaczyc na jakim etapie nie dziala to ja proponuje zebys ustawil w programie, przy inicjalizacji, zeby dioda sie swiecila a w przerwaniu zeby zgasla. Jesli nie bedzie swiecic to znaczy ze przerwanie sie wywoluje i raczej cos z kodem nie tak
  • AM TechnologiesAM Technologies
  • Pomocny post
    Poziom 32  
    Spróbuj bez kondensatora.
  • Poziom 13  
    Zatem tak uprościłem troszkę kod

    Code:


    #define F_CPU 1000000UL
    #include <avr/io.h>
    #include <avr/interrupt.h>



    void zmiana(void)
    {
     PORTB ^= _BV(0);
    }


    SIGNAL (SIG_OVERFLOW2)
    {
     zmiana();
    }

    int main(void)
    {

       DDRB  |= _BV(0);      //port PB0 wyj.

       TIMSK &=~_BV(TOIE2);// Wył. przerwania TC2
       
       ASSR |= _BV(AS2);   // TC2 z taktowania zegarem CPU na generator asynchroniczny
     
       TCCR2   = 0;         
       TCCR2 = _BV(CS20);   // preskaler fclk
             
       while(ASSR&0x07);   // czekaj na uaktualnienie TC2
       
       TIFR   = 0;
       TIMSK |= _BV(TOIE2);// włącz przerwania z TC2

       sei();              // włącz obsługę przerwań

       for (;;){}

    }



    i dołączyłem do pinu 6 generator 500Hz

    500/1/256=około co 2Hz przerwanie czyli co 2 przerwania(1 sek.) załączana powinna być dioda, i tak jest.
    Po podłączeniu samego kwarca nie rusza dalej, po dołączeniu kondensatorów 100pF(innego narazie nie mam) też nie rusza, jednak po dotknięciu palcem pinu 6 coś tam zaczyna mrugać dioda ale jak puszczę to dalej nic. Czyli chyba muszę dobrać odpowiedni kondensator.
    Co o tym sądzicie?
  • Poziom 26  
    Cytat:
    For AVR microcontrollers with Timer/Counter Oscillator pins (TOSC1 and TOSC2), the crystal is connected directly between the pins. No external capacitors are needed. The oscillator is optimized for use with a 32.768 kHz watch crystal. Applying an external clock source to TOSC1 is not recommended.


    Może to jest problem?

    pozdrawiam
  • Pomocny post
    Poziom 43  
    Tego nie widziałem. Znalazłem za to informację że dotyczy to rezonatora pracującego jako generator wytwarzający główny sygnał zegarowy:
    atmega8L timer2 RTC winavr

    A po drugie, akurat w ATMega8 jest błąd w krzemie i te wewnętrzne kondensatory nie działają (tzn. FuseBit ich nie włącza).

    Użycie rezonatora jako źródła sygnału dla Timer2 a nie jako głównego źródła sygnału zegarowego powoduje że FuseBity trzeba ustawić tak aby procesor był taktowany z wewnętrznego generatora RC, co automatycznie nie pozwala na podłączenie wewnętrznych kondensatorów 36p do nóżek XTAL1 i XTAL2, nawet jak by one działały (te kondensatory).

    Oczywiście mogę się mylić, ale mi nigdy nie działało bez kondensatorów 33p.

    PS. Gdy mi nie działał rezonator, ale zegar zaczynał chodzić jak się dotykało ręką do jednej z nóżek XTAL1 lub XTAL2 to okazało się że miałem włączony tryb Asynchroniczny, ale przy okazji EXCLK. Ale w ATMega8 się tak nie da ustawić (ja miałem ATMega88).
    W innym przypadku gdy nie działało jak zwykle kondensatory miały za małą wartość.
  • Poziom 38  
    atom1477 napisał:
    Tego nie widziałem. Znalazłem za to informację że dotyczy to rezonatora pracującego jako generator wytwarzający główny sygnał zegarowy:
    atmega8L timer2 RTC winavr

    A po drugie, akurat w ATMega8 jest błąd w krzemie i te wewnętrzne kondensatory nie działają (tzn. FuseBit ich nie włącza).

    Użycie rezonatora jako źródła sygnału dla Timer2 a nie jako głównego źródła sygnału zegarowego powoduje że FuseBity trzeba ustawić tak aby procesor był taktowany z wewnętrznego generatora RC, co automatycznie nie pozwala na podłączenie wewnętrznych kondensatorów 36p do nóżek XTAL1 i XTAL2, nawet jak by one działały (te kondensatory).

    Oczywiście mogę się mylić, ale mi nigdy nie działało bez kondensatorów 33p.

    PS. Gdy mi nie działał rezonator, ale zegar zaczynał chodzić jak się dotykało ręką do jednej z nóżek XTAL1 lub XTAL2 to okazało się że miałem włączony tryb Asynchroniczny, ale przy okazji EXCLK. Ale w ATMega8 się tak nie da ustawić (ja miałem ATMega88).
    W innym przypadku gdy nie działało jak zwykle kondensatory miały za małą wartość.

    Atom1477 dodaj to na górze do fusebitów.
    Jak mnie podkorciło żeby ustawić wewnętrzne kondensatory w ATMega8
    to musiałem podawać sygnał z zewnętrznego generatora aby ją "obudzić"
  • Poziom 13  
    Hmmm... no cóż mnie kilka chwil wcześniej pokorciło żeby ustawić CKSEL na 1001 tak jak jest tu napisane --> atmega8L timer2 RTC winavr

    i... teraz atmega nic a nic się nie odzywa. Tylko nie pamiętam jak miałem ustawione CKOPT, chociaż teraz nie wiem czy to ma jakieś znaczenie.
    Można ją jeszcze przywrócić do życia?
  • Pomocny post
    Poziom 26  
    atom1477 napisał:
    Tego nie widziałem. Znalazłem za to informację że dotyczy to rezonatora pracującego jako generator wytwarzający główny sygnał zegarowy:
    atmega8L timer2 RTC winavr

    A po drugie, akurat w ATMega8 jest błąd w krzemie i te wewnętrzne kondensatory nie działają (tzn. FuseBit ich nie włącza).

    Użycie rezonatora jako źródła sygnału dla Timer2 a nie jako głównego źródła sygnału zegarowego powoduje że FuseBity trzeba ustawić tak aby procesor był taktowany z wewnętrznego generatora RC, co automatycznie nie pozwala na podłączenie wewnętrznych kondensatorów 36p do nóżek XTAL1 i XTAL2, nawet jak by one działały (te kondensatory).

    Oczywiście mogę się mylić, ale mi nigdy nie działało bez kondensatorów 33p.

    PS. Gdy mi nie działał rezonator, ale zegar zaczynał chodzić jak się dotykało ręką do jednej z nóżek XTAL1 lub XTAL2 to okazało się że miałem włączony tryb Asynchroniczny, ale przy okazji EXCLK. Ale w ATMega8 się tak nie da ustawić (ja miałem ATMega88).
    W innym przypadku gdy nie działało jak zwykle kondensatory miały za małą wartość.


    nie chodzi chyba o wykorzystanie kwarca zegarkowego jako główny sygnał taktujący tylko jako źródło dla timera. Fusy wtedy (w przypadku mega8) muszą być na wewnętrzny rezonator (nóźki xtal są również do tosc). Kwarc podłączamy bezpośrednio do nóźek tosc1 i tosc2, a fusy tak jak pisałem na wewnętrzny rezonator.

    pozdrawiam hot-dog
  • Pomocny post
    Poziom 43  
    hotdog napisał:
    atom1477 napisał:
    Tego nie widziałem. Znalazłem za to informację że dotyczy to rezonatora pracującego jako generator wytwarzający główny sygnał zegarowy:
    atmega8L timer2 RTC winavr

    A po drugie, akurat w ATMega8 jest błąd w krzemie i te wewnętrzne kondensatory nie działają (tzn. FuseBit ich nie włącza).

    Użycie rezonatora jako źródła sygnału dla Timer2 a nie jako głównego źródła sygnału zegarowego powoduje że FuseBity trzeba ustawić tak aby procesor był taktowany z wewnętrznego generatora RC, co automatycznie nie pozwala na podłączenie wewnętrznych kondensatorów 36p do nóżek XTAL1 i XTAL2, nawet jak by one działały (te kondensatory).
    Oczywiście mogę się mylić, ale mi nigdy nie działało bez kondensatorów 33p.

    PS. Gdy mi nie działał rezonator, ale zegar zaczynał chodzić jak się dotykało ręką do jednej z nóżek XTAL1 lub XTAL2 to okazało się że miałem włączony tryb Asynchroniczny, ale przy okazji EXCLK. Ale w ATMega8 się tak nie da ustawić (ja miałem ATMega88).
    W innym przypadku gdy nie działało jak zwykle kondensatory miały za małą wartość.


    nie chodzi chyba o wykorzystanie kwarca zegarkowego jako główny sygnał taktujący tylko jako źródło dla timera. Fusy wtedy (w przypadku mega8) muszą być na wewnętrzny rezonator (nóźki xtal są również do tosc). Kwarc podłączamy bezpośrednio do nóźek tosc1 i tosc2, a fusy tak jak pisałem na wewnętrzny rezonator.

    pozdrawiam hot-dog



    No właśnie.
    Więc kondensatory nie zostaną podłączone. A wątpię żeby samo włączenie trybu asynchronicznego Timera2 włączało jakieś inne kondensatory. A kondensatory na pewno są potrzebne, czy to wewnętrzne czy zewnętrzne.




    Spróbuj:
    Code:

    #define F_CPU 1000000UL
    #include <avr/io.h>
    #include <avr/interrupt.h>



    void zmiana(void)
    {
     PORTB ^= _BV(0);
    }


    SIGNAL (SIG_OVERFLOW2)
    {
     zmiana();
    }

    int main(void)
    {

       DDRB  |= _BV(0);      //port PB0 wyj.

       TIMSK &=~_BV(TOIE2);// Wył. przerwania TC2
       
       TCCR2 = _BV(CS20);   // preskaler fclk

       ASSR |= _BV(AS2);   // TC2 z taktowania zegarem CPU na generator asynchroniczny
       
       TIFR   = 192;                                  //Tak się kasuje flagi przerwań
       TIMSK |= _BV(TOIE2);// włącz przerwania z TC2

       sei();              // włącz obsługę przerwań

       for (;;){}

    }



    Kolejność niezalecana przez datasheeta ale mi tak działa. A pamiętam że gdy robiłem zgodnie z datasheetem to nie działało. Może z mojej winy ale teraz to nie ważne.

    Dodano po 29 [minuty]:

    Acha. Zablokowałeś prcka.
    Tam nie pisze żeby ustawić CKSEL na "1001" (od tak, zawsze i wszędzie),
    tylko żeby ustawić CKSEL na "1001" aby ATMega była taktowana z rezonatora 32768Hz.
    A Tobie nie o to chodziło więc nie było zbyt mądre to co zrobiłeś.

    Podłacz kwarca bezpośrednio do nóżek XTAL1 i XTAL2, bez żadnych kondensatorów.
    Albo zrób generator sygnału prostokątnego 30...200kHz i podłącz go do nóżki XTLA1.
    Programator będziesz musiał nieźle spowolnić (poniżej 7kHz). I wtedy uda się zaprogramować procesor (tzn. zmienić FuseBity).

    Jaki masz programator?
    Możesz go spowolnić?
    Jak nie i masz LPT w komputerze to zaraz będziesz instalował BASCOMa ;p
  • Poziom 13  
    Programator mam stk200, dokładnie taki --> atmega8L timer2 RTC winavr

    do tego soft - ponyprog2000, ale czy mogę go spowolnić ? Nie wiem.
    atom1477 napisał:

    Podłacz kwarca bezpośrednio do nóżek XTAL1 i XTAL2, bez żadnych kondensatorów.
    Albo zrób generator sygnału prostokątnego 30...200kHz i podłącz go do nóżki XTLA1.
    Programator będziesz musiał nieźle spowolnić (poniżej 7kHz). I wtedy uda się zaprogramować procesor (tzn. zmienić FuseBity).

    Właśnie też taki sposób znalazłem na forum z generatorem i spowolnieniem programatora, ale nie było opisane jak go spowolnić i jaki programator.
    A jeśli chodzi o generator to chyba może być inna atmega dająca na przemiennie '1' i '0' o częstotliwości 30kHz?

    Code:


    4. CKOPT Does not Enable Internal Capacitors on XTALn/TOSCn Pins when 32 KHz
    Oscillator is Used to Clock the Asynchronous Timer/Counter2
    When the internal RC Oscillator is used as the main clock source, it is possible to run the
    Timer/Counter2 asynchronously by connecting a 32 KHz Oscillator between XTAL1/TOSC1
    and XTAL2/TOSC2. But when the internal RC Oscillator is selected as the main clock
    source, the CKOPT Fuse does not control the internal capacitors on XTAL1/TOSC1 and
    XTAL2/TOSC2. As long as there are no capacitors connected to XTAL1/TOSC1 and
    XTAL2/TOSC2, safe operation of the Oscillator is not guaranteed.
    Problem Fix / Workaround
    Use external capacitors in the range of 20 - 36 pF on XTAL1/TOSC1 and XTAL2/TOSC2.
    This will be fixed in ATmega8 Rev. G where the CKOPT Fuse will control internal capacitors
    also when internal RC Oscillator is selected as main clock source. For ATmega8 Rev. G,
    CKOPT = 0 (programmed) will enable the internal capacitors on XTAL1 and XTAL2. Customers
    who want compatibility between Rev. G and older revisions, must ensure that
    CKOPT is unprogrammed (CKOPT = 1).



    A co do kondensatorów, znalazłem to w erracie i jeśli dobrze zrozumiałem, to jeśli mam "ATmega8 Rev. G" kondensatory są niepotrzebne a jeżeli starszy wypust to należy dodać kondensatory.
    Czyli chyba trzeba kombinować na czuja - kwarc bez kondensatorów lub z kondensatorami i do tego dopasować ich wartość pojemności. Bo opcji odczytania wersji seryjnej "ATmega8 Rev. G" nie zauważyłem w programie, to chyba tylko można się dowiedzieć od sprzedawcy.

    Dodano po 3 [godziny] 6 [minuty]:

    Wszystko już działa !!!

    Korzystając ze wskazówek zrobiłem tak:

    Kupiłem te kondensatory 33pF i nowy kwarc, przeczytałem ten watek --> Link

    Próbowałem w ponyprog2000 zmienić częstotliwość programowania poprzez SPI ale tak jak pisze któryś z forumowiczów w podanym linku wartość ustawiona w pony progu po włączeniu programu sama przestawiała się na "NORMAL".
    Idąc kolejnym tropem pobrałem program ISPPROG z tej strony --> Link ustawiłem częstotliwość na 32768Hz i programator STK200

    atmega8L timer2 RTC winavr

    Sygnature uK program odczytał, fuse bity zmienił.

    Po testowałem jeszcze troszkę i wyciągnąłem wnioski - poprzedni kwarc był uszkodzony.
    Timer 2 zaczął działać w trybie asynchronicznym, kondensatory przy których oscylował to: 15pF, 18pF, 22pF, 33pF, 100pF(takie miałem), bez kondensatorów również działał tylko, że musiał być zaprogramowany bit CKOPT=0.
    Widocznie mam wersję Rev. G lub działa to ale tak jak jest napisane w erracie
    Code:
    As long as there are no capacitors connected to XTAL1/TOSC1 and
    
    XTAL2/TOSC2, safe operation of the Oscillator is not guaranteed.


    Dzięki za zainteresowanie tematem, pozdrawiam !

    Dodano po 42 [minuty]:

    PS. Będąc bardziej dociekliwym doszedłem do tego, że PonyProg2000 też może pomóc w takiej sytuacji wystarczy dobrze przeczytać jak się go konfiguruje -->Link

    Code:
    2.6.2 Calibration
    

    calibration tunes the serial bus speed for your computer. when you run calibration be sure that ponyprog is the only program running in the pc, and the hard disk is idle (look at the hd led). if your pc is busy because it's performing other tasks the calibration thinks your pc is slower than actual speed, and all i/os are performed without proper delay.
    after the calibration you can choose the speed for every serial bus modifying the following parameters in the ponyprog.ini (.ponyprogrc under linux) file:

        * i2cbusspeed=normal    affect 24cxx eeprom and other i˛cbus devices
        * spibusspeed=normal    affect avr micro, at89sxx micro and 25xxx eeprom
        * microwirebusspeed=normal    affect 93cxx eeprom
        * picbusspeed=normal    affect pic16x84 micro
        * sdebusspeed=normal    affect sde2506 eeprom

    every parameter can be assigned the value ultraslow, veryslow, slow, normal, fast or turbo.
    avoid to use the turbo value because it means "no delay", and probably it doesn't work on your pc, especially with the i/o driver.
    just for example my pc (pentium mmx 200mhz) run i˛cbus at about 80khz with normal, and 110 khz with fast. note that a lot of i˛cbus devices don't work at speed above the 100khz.

    a special note for avr devices. the avr need a valid system clock to be programmed via spi and the max frequency of the spi bus depends on this system clock. so if you changed the fuse (even accidentally) to use low clocks like 1mhz or 32.768khz you must change the spibusspeed=veryslow or ultraslow to access the avr anymore. if you have to use such low clocks i suggest to program the flash and eeprom first, and at last program the security and fuse bits.