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

[AVR] Generowanie częstotliwości na OC0/ OC2 w tybie CTC

Mikemtb 04 Maj 2008 17:51 2017 8
REKLAMA
  • #1 5104985
    Mikemtb
    Poziom 12  
    Posty: 128
    Ocena: 22
    Probuje wyenerować czestotliwość na AtMega16, niby proste, jest instrukcja jak to zrobić które bity jak ustawić, a wyszło jak zwykle, czyli nie działa:). W ogóle jest jakaś różnica czy ja to zrobie na liczniku 0 czy na 2? Na razie robie na wewnętrznym 1Mhz i chce uzyskać około 8Hz żeby było coś widać na diodzie. Więc zgodnie ze wzorem z datasheet
    f=fclk/(2*N*(1+OCRn)) daje preksaler(N) 256 i OCR2 ustawiam na 243 co powinno dac to 8,0046 Hz, ale oczywiście dioda się nie pali.

    Kod pod licznik 2, czyli na PD7:

    
    #include <avr/io.h> 
    #define F_CPU 1000000UL 
    
    
    int main(void) 
    { 
    	DDRD=0xFF;   //PortD jako wyjscia                          
    	TCCR2|=(1<<CS21)|(1<<CS22)||(1<<WGM21)|(1<<COM20); //presk 265 ; wlaczony tryb CTC; zmiana stanu OC2 na przeciwny gdy nastapi porownanie 
    	OCR2=243;// ~8Hz
    	while (1) 
    	{} 
    } 
    


    Co robię nie tak? Na liczniku0 to samo.
  • REKLAMA
  • #2 5105004
    Krzysiek_k1984
    Poziom 13  
    Posty: 127
    Pomógł: 4
    Ocena: 1
    A do jakiego pinu masz podpiętą diode?:)
  • #3 5105018
    Mikemtb
    Poziom 12  
    Posty: 128
    Ocena: 22
    No jak robie pod OC0, to pod PB3, a jak pod OC2 to pod PD7....szczerze...w desperacji probowałem pod każdy xD
  • REKLAMA
  • #4 5105044
    Krzysiek_k1984
    Poziom 13  
    Posty: 127
    Pomógł: 4
    Ocena: 1
    Spróbuj dać ocr2 przed tccr i dopisać takie coś:)
    while (1);
    return 0;
  • REKLAMA
  • Pomocny post
    #5 5105193
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Mikemtb napisał:

    
    	TCCR2|=(1<<CS21)|(1<<CS22)||(1<<WGM21)|(1<<COM20); //presk 265 ; wlaczony tryb CTC; zmiana stanu OC2 na przeciwny gdy nastapi porownanie 
    

    Co robię nie tak? Na liczniku0 to samo.

    Przyjżyj się dokładnie tym || czerwonym kreseczkom i zastanów się , co one robią w Twoim kodzie :D
  • #6 5105513
    Mikemtb
    Poziom 12  
    Posty: 128
    Ocena: 22
    OMG:) no dobra. Działa.
    Kod kopiowałem gdzieś z archiwum forum i przy zmianie preskalera musiał się wkraść błąd, szczególnie że ja preferuje zapis heksadecymalny.
    Co ciekawe chyba bez forum bym nie uruchomił tego, bo pierw próbowałem na liczniku 0. Sęk w tym, że teraz też się nie da- ustawiam wszsytko jak jak dla licznika 2, oczywiscie dodaję DDRB=0xFF i nie działa.
    Dla mnie to nie ważne, bo mogę sobie zrobić na liczniku 2, ale ciekawe czemu nie działa.
  • REKLAMA
  • #7 5105584
    Krzysiek_k1984
    Poziom 13  
    Posty: 127
    Pomógł: 4
    Ocena: 1
    Sprawdź powinno działać :)

    
    #include <avr/io.h>
    #define F_CPU 1000000UL
    
    
    int main(void)
    {
    	DDRB=0x08;	//00 00 10 00 ---> dioda na PB3 jako wyjście
     	OCR0=243;// ~8Hz
    	TCCR0|=(1<<CS22)|(1<<WGM01)|(1<<COM00); //presk 256 ; wlaczony tryb CTC; toggle OC0
    	while (1);
    	return 0;
    } 
    
    
  • #8 5105615
    Mikemtb
    Poziom 12  
    Posty: 128
    Ocena: 22
    No nie działa, zresztą c oza różnica czy DDRB=0xFF czy DDRB=0x08 i tak interesuje mnie tylko PB3. No ale mówię- mało mnie to już interesuje, ważne, że na PD7 działa :).
    Dziękuję wszystkim za pomoc.
  • #9 5105646
    Krzysiek_k1984
    Poziom 13  
    Posty: 127
    Pomógł: 4
    Ocena: 1
    Dziwne u mnie działa.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemu generowania niskiej częstotliwości (~8 Hz) na wyjściach OC0 i OC2 mikrokontrolera AtMega16 w trybie CTC. Autor próbuje ustawić preskaler na 256 i wartość OCR2 na 243 zgodnie ze wzorem z datasheet, jednak dioda podłączona do PD7 (OC2) nie świeci. W kodzie pojawił się błąd składniowy związany z użyciem operatora logicznego || zamiast bitowego | podczas konfiguracji rejestru TCCR2. Po poprawieniu błędu kod działa poprawnie na liczniku 2. Próby uruchomienia generowania na liczniku 0 (pin PB3) nie przyniosły efektu, mimo poprawnej konfiguracji DDRB i rejestrów. Wskazano, że ustawienie OCR przed konfiguracją TCCR jest ważne, a także zwrócono uwagę na prawidłowe przypisanie pinów i tryb CTC z przełączaniem stanu OCn. Ostatecznie rozwiązanie działa na liczniku 2, a problem z licznikiem 0 pozostaje nierozwiązany.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA