Forum: Mikrocontroller und Digitale Elektronik Atmega644 timer kann nicht eingestellt werden!


von DanielAtm (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.