Atmega644 timer kann nicht eingestellt werden!

Gast #2582046
Lesenswert?
• ▲
▼
Hallo ich habe ein Problem und bin schon seit Stunden auf der Suche nach 
einer Lösung, doch leider ohne Erfolg! Vieleicht kann mir hier jemand 
auf die Sprünge helfen? Der Timer2 soll im Overflow Interrupt die Led 
blinken lassen, das funktioniert auch, aber egal auf welchen Wert ich 
den TCNT2 stelle die LED blinkt immer mit der selben Frequenz. Aber 
warum??? Probiert hab ich es nur in der Init ohne TCNT2 im Interrupt zu 
ändern aber auch in der ISR geht nix. Später soll noch eine PWM dazu und 
noch ein paar sachen aber erst muss die LED wie gewünscht blinken!

Hier der Programmcode:

int main()    //Hauptprogramm
{
init();      // Init UP aufruf
ADC_Init();    // ADC initialisieren


 while(1)
 {
 if (PINB & (1<<PINB0)) //Wenn Schlüsselschalter EIN ist (Schluessel == 
1)
 {
   lcd_linit();  //LCD Initialisieren
  lcd_clear();  //Display löschen


  PORTD |= (1<<PD3);  // Summer an
  _delay_ms(80);    // 80mSec warten
  PORTD &= ~(1<<PD3);  // Summer aus

  sei();      // Interrupts freigegeben
  _delay_ms(500);    // halbe Sec warten


 while ( PINB & (1<<PINB0) )
 {
   //hier erstmal nix machen nur in der ISR
 }

 else
     {
  cli();
  _delay_ms(2000);  // 2sec warten
  PORTB |= (1 << PB3);    // LED Einschalten Rot Error
  PORTD |= (1<<PD3);      // Summer an
  lcd_clear();
  }
}
}

ISR(TIMER2_OVF_vect)  //Timer 0 Überlauf Interruptroutine
{
    TCNT2 = 0xB2;    // Timer2 value 0xB2 (dez178) !!!
  /* Interrupt Aktion (bei TCNT2=0xB2) alle
  (8000000/1024)/178 Hz = 43,89 Hz bzw. 1/43,89 s = 22,78 ms
  0x52 =etwa 10ms
  */
cli();

  flag++;
  if (flag == 88)  // alle x sec. trifft das zu!
   {
     flag = 0;
     PORTD ^= (1 << PD2);    // LED toggeln Gelb
   }
sei();
}

void init()
{
    PORTA=0b00000000;
    DDRA =0b11000000; //1=als Ausgang konfiguriert 0=Eingang

    PORTB=0b00000000;
    DDRB =0b11111000;

    PORTC=0b00000000;
    DDRC =0b11111111;

    PORTD=0b00000000;
    DDRD =0b11111111; //alle als Ausgänge

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 7,813 kHz
    // MODUS: Normal top=FFh
    // OC0 output: Disconnected
    OCR0A=0x00;    // Output Compare Register – OCR0A einfach
    OCR0B=0x00;    // Output Compare Register – OCR0B einfach
    TCCR0B |= ( 1<<CS02 )|( 1<<CS00 ); // Vorteiler 1024
    TCNT0=0x00;    // Timer auf Null
  //TIMSK0 |= ( 1<<TOIE0 );//timer AUS!!!



    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 8000,000 kHz
    // MODUS: Ph. correct PWM top=00FFh
    // OC1A output: Non-Inv.
    // OC1B output: Inverted
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer 1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off

    TCCR1A=0xB1;  //COM1A1=1 COM1A0=0 (10= nicht invertiert) COM1B1=1 
COM1B0=1    0001==PWM, Phase Correct, 8-bit
    TCCR1B=0x01;  //0000 0001 1=cs10 bedeutet im cpu Takt  clkIO/1 (From 
prescaler)
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0xff;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: 8Mhz
    // MODUS: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2B|= ( 1<<CS02 )|( 1<<CS00 );// Vorteiler 1024 Timer/Counter
                                //Control Register (größte Vorteiler)
    TCNT2=0xB2;     // Timer auf 1011 0010 (178 dezimal) B2
    OCR2A=0x00;
    OCR2B=0x00;
    TIMSK2 |= (1<<TOIE2); // Timer Overflow Interrupt freischalten
  //Ber.: Frequenz/Vorteiler= 8Mhz/1024= 7812,5 durchläufe pro sek.
  //Jedesmal wenn der Timer seinen höchsten Wert erreicht
        //hat, erfolgt ein
  //Overflow und der Timer beginnt wieder bei 0 zu zählen.
  /* Interrupt Aktion (bei TCNT2=256) alle
  (8000000/1024)/256 Hz = 30,52 Hz bzw. 1/30,52 s = 32,77 ms
  (8000000/1024)/178 Hz = 43,89 Hz bzw. 1/43,89 s = 22,78 ms
  */

    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=0x00;
    MCUSR=0x00;
}
Danke schon mal!
Grüße Daniel

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.