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

[ATmega16] [C]Generato przebiegu prostokątnego 32kHz

www 29 Maj 2008 09:37 2130 7
REKLAMA
  • #1 5193279
    www
    Poziom 14  
    Witam.

    Za pomocą tego timera chce wygenerować na porcie PB1 sygnał zegara potrzebny do wysterowania urządzenia i robię to tak:

    void Timer_1_Init(void)
    {
      // Timer 1
      TCCR1A = 0x40;
      TCCR1B = 0x09;         // Timer 1 prescaler at /1
      OCR1A  = 0xfa;         // for 32khz at 16Mhz
    
      DDRD |= 0x20 + 0x80;
      DDRD &= ~0x40;
    
      DDRB |= 0x02;
    }

    Niestety sygnał nie pojawia się. Czy o czymś tu jeszcze zapomniałem??

    Pozdrawiam.
  • REKLAMA
  • REKLAMA
  • #4 5196375
    www
    Poziom 14  
    Moja wina, zamiast sięgnąć do dokumentacji ATmega8 czytałem o ATmega16.
  • #5 5196476
    krzemowy
    Poziom 19  
    Tu masz przykład:
    
    #include <avr/io.h>
    
    #ifndef F_CPU
    #define F_CPU 16000000   //zdefiniowanie w razie potrzeby wartości kwarcu
    #endif
    
    #ifndef _BV
    #define _BV(bit) (1 << (bit))
    #endif
    
    const unsigned int _freq_time = F_CPU/64000 - 1; //połówka okresu przebiegu
    int main(void)
    {
    	DDRD = _BV(PD5);  //ustawienie linii portu OC1A jako wyjście
    	TCCR1A = _BV(COM1A0);  //"toggle OC1A on compare match"
    	TCCR1B = _BV(WGM12);  //tryb 4 licznika wg Table 47 ze str. 113 pdfa
    	TCCR1B |= _BV(CS10);  //clkIO/1(no prescaling)
    	OCR1A = _freq_time;
    	while(1);
    	return 0;
    }
    


    A jeżeli koniecznie chcesz mieć sygnał na linii PB0 to można tak:
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    #ifndef F_CPU
    #define F_CPU 16000000   //zdefiniowanie w razie potrzeby wartości kwarcu
    #endif
    
    #ifndef _BV
    #define _BV(bit) (1 << (bit))
    #endif
    
    ISR (TIMER1_COMPA_vect)
    {
    	PORTB ^= _BV(PB0);  //negowanie linii PB0
    }
    
    const unsigned int _freq_time = F_CPU/64000 - 1; //połówka okresu przebiegu
    int main(void)
    {
    	DDRB = _BV(PB0);
    	TCCR1B = _BV(WGM12);  //tryb 4 licznika wg Table 47 ze str. 113 pdfa
    	TCCR1B |= _BV(CS10);  //clkIO/1(no prescaling)
    	OCR1A = _freq_time;
    	TIMSK = _BV(OCIE1A);  //włączenie przerwania od porównania
    	sei();
    	while(1);
    	return 0;
    }
    




    EDIT: Kosmetyka pierwszego przykładu.
  • REKLAMA
  • REKLAMA
  • #7 5197945
    krzemowy
    Poziom 19  
    A co ja niby zrobiłem? :wink:

    Wzmiankowana wyżej tabela 47 ze strony 113 pdf'a:

    [ATmega16] [C]Generato przebiegu prostokątnego 32kHz
REKLAMA