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: Timer1, miganie diody co 0.5s przy zegarze 8MHz - jak ustawić?

VonPiter 04 Lip 2006 20:55 4608 6
REKLAMA
  • #1 2790973
    VonPiter
    Poziom 12  
    Posty: 47
    Pomógł: 2
    Ocena: 8
    Witam
    Ostatnio zmienialem fusebity tak aby uC pracowal z zewnetrznym rezonatorem 8MHz. Poustawialem wszystko przez PonyProga i wygladalo,ze wszystko jest oki, no i zaczolem sprawdzac. Popelnilem maly program, ktory zapala i wygasza diode co 1 s. Wszystko bylo by fajnie, gdyby nie to ze wedlug tych ustawien i zegarze 8MHz dioda powinna migac co 0.5s. ,tak mi sie wydaje :-( Sa to moje pierwsze kroki w C, wiec moglem cos sknocic, albo zle wyliczyc. W zwiazku z powyzszym mam pytanie, czy dioda powinna migac co 0.5 czy co 1 sek ?
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h> 
    
    #define L 0xDC;
    #define H 0x0B;
    #define pres 0x03;
    
    
    SIGNAL (SIG_OVERFLOW1)
    {
    TCNT1L = L; // załadowanie do licznika wartości początkowych
    TCNT1H = H; 
    
    PORTD ^= (1<<PD1); // zmiana stanu na wyjściu
    }
    
    
    // Program główny
    int main(void)
    {
    
    TCNT1L = L; // załadowanie do licznika wartości początkowych
    TCNT1H = H; 
    
    TCCR1B = pres;
    
    TIMSK|=(1<<TOIE1);// odblokowanie przerwania od licznika
    
    DDRD |= 1<<PD1;// konfiguracja portów I/O
    PORTD = 0x00;
    
    sei();// globalne odblokowanie przerwań
    
    // pusta pętla nieskoczona
    while(1);
    return 0;
    }



    inventco.eu - proszę stosować znaczniki CODE. I proszę poprawić pisownię (przycisk PISOWNIA).
  • REKLAMA
  • #2 2791906
    HIOB
    Poziom 17  
    Posty: 222
    Pomógł: 23
    Ocena: 1
    Witaj!

    Zmień:

    #define L 0xDC;
    #define H 0x0B;
    #define pres 0x03;

    Na:

    #define L 0x84
    #define H 0x1E //7812
    #define pres 0x05 //preskaler 1024*7812/8M=~1 - dioda miga co 1s

    Nie pisz średników w define

    Pozdrawiam!
  • REKLAMA
  • #3 2792140
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 139
    Ocena: 32
    Nie musisz też rozbijać wartości ładowanej do TCNT1...
    Jest to co prawda rejestr 16-bit ale gcc samo się tym zajmuje...
    Możesz napisać np. TCNT1 = 1200; i będzie ok...
    Nie wiem może jesteś przyzwyczajony do zapisu szenastkowego i wiesz co ustawiasz ale mi jest łatwiej zapisać ustawianie w rejestrach tak:
    TCCR1B = (1 << CS12) | (1 << CS10);
    W ten sposób łatwo mi sprawdzić bez liczenia co ustawiłem...
    A jak chcesz mieć prescal na początku to możesz zapisać:
    #define pres (1 << CS12) | (1 << CS10)
  • REKLAMA
  • #4 2794631
    VonPiter
    Poziom 12  
    Posty: 47
    Pomógł: 2
    Ocena: 8
    HIOB napisał:


    #define L 0x84
    #define H 0x1E //7812
    #define pres 0x05 //preskaler 1024*7812/8M=~1 - dioda miga co 1s

    Nie pisz średników w define


    Witam

    Tak myslalem, ze cos jest nie tak. Wprowadszilem tak jak napisales i dioda miga co ok 8s. Wynika z tego, ze uC dziala z czestotliwoscia 1MHz :-(. Ustawialem fusebity wedlug info na stronie http://www.tkdami.net/~voytek/programy/programy.html . Napewno procek dziala na zewnetrznym rezonatorze, bo gdy go wyciagne przestaje dzialac.

    Oki juz nie pisze srednikow :-)
    Dopiero zaczynam zabawe z uC, dlatedo dzieki za kazda rade .
    Załączniki:
    • ATmega8: Timer1, miganie diody co 0.5s przy zegarze 8MHz - jak ustawić? fusebit.jpg (19.65 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #5 2794685
    VonPiter
    Poziom 12  
    Posty: 47
    Pomógł: 2
    Ocena: 8
    pubus napisał:
    Nie musisz też rozbijać wartości ładowanej do TCNT1...
    Jest to co prawda rejestr 16-bit ale gcc samo się tym zajmuje...
    Możesz napisać np. TCNT1 = 1200; i będzie ok...


    Przy odczytywaniu TCNT1 sprawdza sie ta sama zasada? Nie trzeba oddzielnie odczytywac H i L ?


    pubus napisał:
    Nie wiem może jesteś przyzwyczajony do zapisu szenastkowego i wiesz co ustawiasz ale mi jest łatwiej zapisać ustawianie w rejestrach tak:
    TCCR1B = (1 << CS12) | (1 << CS10);
    W ten sposób łatwo mi sprawdzić bez liczenia co ustawiłem...
    A jak chcesz mieć prescal na początku to możesz zapisać:
    #define pres (1 << CS12) | (1 << CS10)


    Faktycznie latwiej ogarnac calosc przy takim zapise jak podales.

    Dodano po 52 [minuty]:

    HIOB napisał:


    #define L 0x84
    #define H 0x1E //7812
    #define pres 0x05 //preskaler 1024*7812/8M=~1 - dioda miga co 1s



    Znalazlem w necie kalkulator do obliczania przerwan timerow i po wstawieniu tego co podales wynika, ze przerwanie wystepuje co 7,38867200 s.
    Wynika z tego, ze fusebity mam ustawione prawidlowo.
  • REKLAMA
  • #6 2794906
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 139
    Ocena: 32
    Tak przy odczycie może wczytać do innej zmiennej (oczywiście 16-bitowej) wartość rejestru TCNT1...
    Czyli np. mamy zmienną "stan" typu int i możemy napisać tak stan = TCNT1; i będzie ok...
  • #7 2794918
    VonPiter
    Poziom 12  
    Posty: 47
    Pomógł: 2
    Ocena: 8
    pubus napisał:
    Tak przy odczycie może wczytać do innej zmiennej (oczywiście 16-bitowej) wartość rejestru TCNT1...
    Czyli np. mamy zmienną "stan" typu int i możemy napisać tak stan = TCNT1; i będzie ok...


    Dzieki, faktyczie dziala.
    Pozdawiam.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemu z miganiem diody podłączonej do mikrokontrolera ATmega8 pracującego z zewnętrznym rezonatorem 8 MHz. Autor programu chciał, aby dioda migała co 0,5 s, jednak efekt był inny. Wskazano błędy w definicjach makr (#define) – nie powinno się stosować średników oraz zaproponowano poprawne wartości rejestrów TCNT1H i TCNT1L oraz preskalera, aby uzyskać przerwanie co 1 sekundę. Zasugerowano także prostszy sposób ustawiania preskalera i rejestru TCCR1B za pomocą bitów CS12 i CS10. Po poprawkach dioda migała co około 8 sekund, co wskazywało na pracę mikrokontrolera z częstotliwością 1 MHz zamiast 8 MHz, mimo poprawnego ustawienia fusebitów i działania zewnętrznego rezonatora. Omówiono również sposób odczytu 16-bitowego rejestru TCNT1 jako jednej zmiennej typu int, co ułatwia obsługę timera. Ostatecznie potwierdzono, że fusebity są ustawione prawidłowo, a problem wynika z nieprawidłowych obliczeń i konfiguracji timerów.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA