- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 9 von 9

Thema: Atmega16 - Zwei Timer verwenden. - Nur einer funktioniert

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.09.2005
    Beiträge
    114

    Atmega16 - Zwei Timer verwenden. - Nur einer funktioniert

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    mal wieder ein µC Problem


    Zunächst mein Quelltext (habe den der einfachheithalber auf ein Minimum reduziert):


    Code:
    #include <avr/io.h>
    
    #define LCD_PORT PORTC
    
    #include "display.inc"
    #include <avr/interrupt.h>
        
    
    int main(){
    
    
        DDRC=0xff;
        DDRA=0x00;
        DDRD=(1<<PD5);    // sound output
    
        TCCR0=(1<<WGM01)|(1<<CS02)|(1<<CS00);    // pr 1024 - ctc        => 3600hz
        
        TCCR1A = (1<<COM1A0);
        TCCR1B= (1<<WGM12)|(1<<CS10);    // pr 1024 - ctc
        TIMSK = (1<<OCIE1A)|(1<<OCIE0);
    
    
    
        TCNT0=0;
    
        TCNT1=0;
    
    
        OCR1A=0;
    
        OCR0=200;            // *18 = 3600 => 1sekunde
    
    
        DDRB=0xff;
        PORTB=0xff;
    
        sei();
    
        while(1){        
        }
    
        return 0;
    }
    
    
    
    
    ISR(TIMER1_COMPA_vect){
        PORTB=0x0f;
    }
    
    
    ISR(TIMER0_COMP_vect){
        PORTB=0xf0;
    
    
    }

    Was es tun soll: Ich möchte mit Timer0 und Timer1 arbeiten.

    Problem: Es wird nur die ISR von Timer1 aufgerufen. Die Timer0-ISR wird nie aufgerufen.
    Kommentiere ich oben die TCCR1[A|B] aus, funktioniert die ISR vom Timer0.


    Habe ich irgendwas elementares einfach übersehen?



    Danke im Voraus
    Kesandal

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    29
    Beiträge
    661
    ich hab mal im daten blatt gesucht
    Zu TCNT0 steht folgendens wo wahrscheinlich auch das Problem liegt:

    The Timer/Counter Register gives direct access, both for read and write operations, to the
    Timer/Counter unit 8-bit counter. Writing to the TCNT0 Register blocks (removes) the compare
    match on the following timer clock. Modifying the counter (TCNT0) while the counter is running,
    introduces a risk of missing a compare match between TCNT0 and the OCR0 Register.

    Also setzt TCNT0 = 0; bevor du den Timer startest

    mfG _Martinius_
    MfG Martinius

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.09.2005
    Beiträge
    114
    Danke für Deine Antwort..

    hmm...
    wo starte ich denn den Timer?
    Indem ich die TCCR-Register beschreibe?

    Gruß
    kesandal

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    29
    Beiträge
    661
    hier:


    TCCR0=(1<<WGM01)|(1<<CS02)|(1<<CS00); // pr 1024 - ctc => 3600hz
    Geändert von Martinius11 (22.06.2011 um 03:09 Uhr)
    MfG Martinius

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.09.2005
    Beiträge
    114
    Zitat Zitat von Martinius11 Beitrag anzeigen
    hier:


    TCCR0=(1<<WGM01)|(1<<CS02)|(1<<CS00); // pr 1024 - ctc => 3600hz
    Habe es ausprobiert.
    Die ISR von Timer 0 wird jedoch nach wie vor nicht aufgerufen


    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
     
    int main(){
    
     DDRC=0xff;
     DDRA=0x00;
     DDRD=(1<<PD5); // sound output
    
     TCNT0=0;
     TCNT1=0;
    
     TCCR0=(1<<WGM01)|(1<<CS02)|(1<<CS00); // pr 1024 - ctc  => 3600hz
     
     TCCR1A = (1<<COM1A0);
     TCCR1B= (1<<WGM12)|(1<<CS10); // pr 1024 - ctc
     TIMSK = (1<<OCIE1A)|(1<<OCIE0);
     
     
    
     OCR1A=0;
     OCR0=200;   // *18 = 3600 => 1sekunde
    
     DDRB=0xff;
     PORTB=0xff;
     sei();
     while(1){  
     }
     return 0;
    }
     
    
    ISR(TIMER1_COMPA_vect){
    // PORTB=0x0f;
    }
    
    ISR(TIMER0_COMP_vect){
     PORTB=0xf0;
    
    }

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    29
    Beiträge
    661
    Lösung gefunden du muss noch

    TIFR = (1<<OCF0);

    einfügen
    MfG Martinius

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.09.2005
    Beiträge
    114
    Auch das funktioniert leider nicht


    Zum OCF0 bit steht folgendes im Manual:
    The OCF0 bit is set (one) when a compare match occurs between the Timer/Counter0 and the
    data in OCR0 – Output Compare Register0.

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hi,
    wenn Timer1 auf CTC eingestellt ist und Du OCR1A auf 0 setzt, tritt der Interrupt eventuell so oft auf, daß immer nur der Interrupt von Timer1 abgearbeitet wird. Dieser steht in der Interrupt Vector Tabelle weit vor dem OVF Timer 0 und wird deshalb immer als erster dran kommen.

    Wie sieht es aus, wenn OCR1A nicht 0 ist?

    PS Mit welcher Taktfrequenz läuft der µC? Ist der erste Code vom ersten Beitrag genau der Code mit dem Du auch testest? Wie überprüftst Du, daß Timer0 ISR nicht aufgerufen wird? (LEDs?)

    Gruß
    Searcher
    Geändert von Searcher (24.06.2011 um 12:59 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.09.2005
    Beiträge
    114
    Hallo Searcher,

    dein Hinweis brachte mich zur Lösung.

    Deine Vermutung hat sich bestätigt

Ähnliche Themen

  1. Timer zweinmal verwenden ?
    Von nase im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 21.06.2011, 10:51
  2. Timer verwenden zur Servoansteuerung
    Von beginner1101 im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 02.03.2009, 18:59
  3. timer in C verwenden, 2. Versuch
    Von RedEagle im Forum C - Programmierung (GCC u.a.)
    Antworten: 18
    Letzter Beitrag: 03.02.2007, 19:50
  4. GetRC5 an zwei Eingang-Pins verwenden
    Von vanveeteren im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 24.07.2005, 10:34
  5. Problem SPI Kommunikation mit zwei ATmega16
    Von doctorbluex im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 13.07.2005, 09:27

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test