- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 4 von 4

Thema: Timer2 Problem mit ATmega32

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    09.01.2005
    Alter
    41
    Beiträge
    76

    Timer2 Problem mit ATmega32

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo zusammen,

    Ich hab da ein Problem mit meinem Timer2, ich habe Ihn ähnlich wie den Timer0 initialisiert. Der Interrupt von Timer0 wird auch richtig ausgelöst, nur in die Interruptroutine vom Timer2 kommt er nicht.
    Ich hoffe mir kann jemand helfen.
    Hier ein Ausschnitt aus meinem Code:
    Code:
    #ifndef F_CPU
    #define F_CPU 1000000UL     /* Quarz mit 1.0 Mhz  */
    
    #include <avr/interrupt.h> 
    #include <avr/io.h>
    #include <util/delay.h>
    #include <stdio.h>
    
    #define FORWARD		1
    #define BACKWARD	-1
    #define BREAK		0
    
    #endif
    
    void init_timer2(void){
    	TCCR2 = (1 << WGM21) | (1 << CS22) | (1 << CS21) | (1 << CS20);	//ctc mode
    	OCR2 = 0x64;				//Compare Match
    	TIMSK |= (1 << OCIE2);	//interrupt enabled
    	TCNT2 = 0;				//start position
    	
    	lcd_gotoxy(0,2);
    	lcd_puts("init timer");
    }
    
    void init_Hbridge(void){
    	DDRA = (1 << PA4) | (1 << PA5) | (1 << PA6) | (1 << PA7);
    	PORTA |= (1 << PA4) | (1 << PA5) | (1 << PA6) | (1 << PA7);
    	init_timer2();
    }
    
    ISR(TIMER2_COMP_vect){
    	lcd_gotoxy(0,3);
    	lcd_puts("Interrupt!");
    }
    
    
    int main(void){
    	
    	//Outputs:
    	DDRD = (1 << DDD6) | (1 << DDD3) | (1 << DDD7);	//PD3,PD6,PD7=LED
    	PORTD |= (1<<PD6) | (1 << PD7) | (1 << PD3);
    	
    	//Inputs:
    	DDRD  &= ~((1 << DDD0) | (1 << DDD1) | (1 << DDD2)); 
    	PORTD |= (1<<PD0);    // internen Pull-Up aktivieren 
    	PORTD |= (1<<PD1); 
    	PORTD |= (1<<PD2); 
    
    lcd_init(LCD_DISP_ON);							//LCD initialisieren
    init_Hbridge();
    lcd_home();
    lcd_puts("- LCD	BEREIT");
    
            return 0;
    }
    Auf dem Display wird "- LCD BEREIT" und "init timer" ausgegeben aber kein "Interrupt!".

    Danke für eure Hilfe.

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hast Du eine Endlosschleife vor return 0 vergessen, oder brauch ich eine Brille ?

    Gruß Sebastian

    EDIT:

    Hm, ich sehe auch nicht gerade, wo Du die Interrupts allgemien zuläßt ( sei()
    Software is like s e x: its better when its free.
    Linus Torvald

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.11.2006
    Ort
    Geislingen a. d. Steige
    Alter
    33
    Beiträge
    344
    Hi,
    du musst die globalen interrupts aktivieren!
    das geht mit sei(); mit cli(); kanst du sie deaktivieren

    MfG Martin

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    09.01.2005
    Alter
    41
    Beiträge
    76
    Ohhhjeeeeee!

    In meiner Panik habe ich das sei() auskommentiert.

    Ich danke euch 2 für die sehr schnelle Antwort!

    schönen Abend

Berechtigungen

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

Labornetzteil AliExpress