- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 9 von 9

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

Hybrid-Darstellung

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

    Atmega16 - Zwei Timer verwenden. - Nur einer funktioniert

    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

Ä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
  •  

Labornetzteil AliExpress