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

Thema: Problem mit Timer2 und ISR

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    10.07.2006
    Ort
    Winsen
    Alter
    35
    Beiträge
    30

    Problem mit Timer2 und ISR

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Moin,

    ich lese mich schon seit drei Tagen hier durchs Forum, finde aber meinen Fehler nicht.

    Ich versuche ein Soft-PWM mit dem Timer2 zu programmieren. Timer1 ist schon belegt. Ist für eine Servo Ansteuerung.
    Der Quelltext ist kaum verändert aus dem RN-Wissen Servo Beispiel, nur leider wird die ISR nie aufgerufen.
    Habe mittlerweile keine Ahnung mehr, was ihm noch fehlt. Ist ein ATMega32 und ich programmiere unter Linux, deswegen kann ich dann Quelltext nicht simulieren.

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include "../uart.h"
    
    #define F_CPU 16000000
    
    #define SERVOPIN 3
    #define SERVOPORT PORTB
    #define DDRSERVO DDRB
    
    volatile unsigned char servopos;
    volatile unsigned int count=0;
    
    void delay_ms(unsigned int ms);
    void servo_init();
    
    
    ISR(TIMER2_COMP_vect)
    {
    	PORTC=~0x0f;
    	delay_ms(10);
    	PORTC=~0x00;
    }
    
    int main (void)
    {
    	init_USART();
    	servo_init();
    	sendUSART("Hallo\r\n");
    
    	DDRC=0xff;
    
    	int n=0;
    	char buffer[5];
    	
    	while(1)
    	{
    		PORTC=~0x01;		
    		for(n=0; n<150; n++)
    		{
    			servopos=100;
    //			delay_ms(100);
    			sendUSART("run\r");
    			itoa(count,buffer,10);
    			sendUSART(buffer);
    		}
    	}
    	return 0;
    }
    
    void servo_init()
    {
    	TIMSK |= (1<<TOIE2);
    	TCCR2 = (1<<WGM21) | (1<<CS20);	//Prescale=1, CTC mode
    	OCR2 = F_CPU/1600000;			//alle 10µS ein IRQ
    	DDRSERVO|=(1<<SERVOPIN);
    	sei();
    }
    
    void delay_ms(unsigned int ms)
    {
    	unsigned int zaehler;
       
    	while (ms) 
    	{
    		zaehler = F_CPU / 5000;
           
    	        while (zaehler) {
    	            asm volatile("nop");
    	            zaehler--;
    	        }
    	        ms--;
    	}
    }
    Habe das RN-Control an Port C sind LEDs, testweise habe ich einfach das LED Blinken mit in die ISR gepackt. Die Text Ausgabe über UART fliegt auch wieder raus, wenn#s funktioniert.

    Danke

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    55
    Beiträge
    524
    Hallo,

    TOIE -> timer overflow interrupt enable [-X

    Gruß

    Jens

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    10.07.2006
    Ort
    Winsen
    Alter
    35
    Beiträge
    30
    Hallo Jens,
    danke für den Hinweis, wäre ich ja nie drauf gekommen !
    Mit TIMSK |= (1<<OCIE2) funktioniert's jetzt!

    Aber dann steht das im RN-Wissen Artikel auch falsch, kann man das irgendwie anmerken?

    Großes THX Christian

Berechtigungen

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

Labornetzteil AliExpress