Hallo Zusammen : )
Ich arbeite gerade an einem größeren Projekt, in der ich 2 Timer benötige. Timer1 für einen Sekundenzähler, Timer0 zum Tastenentprellen. Dabei ist mir aufgefallen, dass die beiden ISR nicht zusammen laufen.
Zu Testzwecken habe ich mal ein kleines Programm zum Timer-Test gemacht, in der lediglich Variablen hochgezählt werden sollen um dann auf einem Display ausgegeben zu werden. Es handelt sich um einen ATmega64 mit 16MHz. 
Die ISR(TIMER0_OVF_vect) läuft nur, wenn das Compare Interrupt Enable Flag von Timer1 deaktiviert ist. Setze ich TIMSK |= (1<<OCIE1A) geht nur die ISR(TIMER1_COMPA_vect). Er zählt nie beide Variablen auf dem Display hoch. Je nach OCIE1A-Bit die eine oder die andere. Es scheint als würden die sich gegenseitig blockieren.
Weiß jemand Rat?
	Code:
	#include <stdint.h>					        // Standard data types
#include "dogm.h"                     		// Routinen für das DOGM LCD Module
#include <avr/pgmspace.h>					// PROGMEM
#include <avr/eeprom.h>						// EEPROM
#include <stdlib.h>
#include <stdio.h>							// sprintf
#include <inttypes.h>
#include <util/delay.h>
#include <avr/io.h>					        //I/O Ports
#include <avr/interrupt.h>
//Port und Pinnummer für LEDs:
#define LED1_OFF (PORTG&=~(1<<PG0))	
#define LED1_ON  (PORTG|=(1<<PG0))
#define LED2_OFF (PORTG&=~(1<<PG1))	
#define LED2_ON  (PORTG|=(1<<PG1))
#define LED3_OFF (PORTG&=~(1<<PG2))	
#define LED3_ON  (PORTG|=(1<<PG2))
#define LED4_OFF (PORTG&=~(1<<PG3))	
#define LED4_ON  (PORTG|=(1<<PG3))
#define LED5_OFF (PORTG&=~(1<<PG4))	
#define LED5_ON  (PORTG|=(1<<PG4))
static volatile uint8_t DELAY_1 = 0;
static volatile uint8_t DELAY_2 = 0;
// ************************************************************
//				D E L A Y _ T I M E R S  
// ************************************************************
ISR(TIMER1_COMPA_vect)
{
  char cSREG;
  cSREG = SREG; 
 
  DELAY_1++;
  PORTG ^= ( 1 << PG4 ); //LED5 Blinken
  
  SREG = cSREG; 
}
ISR(TIMER0_OVF_vect)
{
  char cSREG;
  cSREG = SREG; 
  DELAY_2++;
  PORTG ^= ( 1 << PG3 ); //LED5 Blinken
  
  SREG = cSREG; 
}
// ************************************************************
//				M A I N     
// ************************************************************
int main(void)
{
	//Ausgänge
	DDRG = 0x1F;			//PORTG als Ausgang (LED1-5)
	
	dogm_init();			//Initialisierung DOGM
	//Timer1 16Bit
	TCCR1B |= (1 << WGM12);                //CTC Modus (Mode 4)
	TCCR1B |= (1 << CS12) | (1 << CS10);  	//Prescaler 1024 
	TCCR1B&=~(1<<CS11);
	OCR1A = 15624;         	//Output Compare: 	OCR = (Sekunden * FCPU/Prescaler) -1
	TIMSK |= (1<<OCIE1A);   //<<<<<------ Sobald ich den Interrupt disable funktioniert die ISR des Timer0, ist es enabled, get nur die ISR Timer1
	
	//Timer0 8Bit
	TCCR0 |= (1<<CS02)|(1<<CS00);       	//Prescaler 256 -> t = (2^8 *1024)/16MHz = 4,1ms
	TIMSK |= (1<<TOIE0);               	//Enable timer interrupt
	
	
	//Für die Ausgabe am DIsplay
	char DELAY_CHAR_1[6];
	char DELAY_CHAR_2[6];
	
	sei();									//Interrupts aktivieren
	
	while(1)
    {	
		dogm_clear();
		
		//Ausgabe DELAY
		dogm_gotoxy(0,1);
		itoa (DELAY_1,DELAY_CHAR_1,10);
		dogm_puts(DELAY_CHAR_1);
		
		dogm_gotoxy(6,1);
		itoa (DELAY_2,DELAY_CHAR_2,10);
		dogm_puts(DELAY_CHAR_2);
		
		LED3_ON;
		_delay_ms(50);
		LED3_OFF;
	}
}
 
						
					
Lesezeichen