xaM_Max
14.02.2012, 23:24
Hallo
Ich hätte eine kleine Frage und zwar hab ich folgendes Programm bei dem mit der Zeit die Pulsbreite von Timer2 erhöht werden soll:
#include <avr/io.h>
#include <avr/interrupt.h>
//Funktionsdeklaration
void init();
void init_timer0();
void init_timer2();
//Timer0:
#define T0_TEILER64 TCCR0|=0x03;TCCR0 &=0xFB
#define T0_NORMAL TCCR0&=0x87
#define T0_RESET TCNT0=0
#define T0_OVL_INT TIMSK|=0x01;SREG|=0x80
//Timer2:
#define T2_INT_OVL_ENABLE TIMSK|=0x40;SREG|=0x80
#define T2_FAST_PWM_EIN TCCR2&=0x00;TCCR2|=0x68
#define T2_PULSBREITE OCR2
#define T2_TEILER_1 TCCR2&=0xF8;TCCR2|=0x07
int main()//
{
//Initialisierung der Baugruppen)
init();
init_timer0();
init_timer2();
// Hintergrundschleife bzw. Hintergrundprozess
do
{
}
while(1);
return 0;
}
void init()
{
DDRA &=0x00;
//PB5 als Ausgang konfigurieren
DDRD |=0xFF;
}
void init_timer0()
{
//Normalbetrieb einstellen
T0_NORMAL;
//Teiler (64) einstellen
T0_TEILER64;
//Zählerstand Reset
T0_RESET;
//Interrupt freischalten (Überlaufinterrupt freischalten)
T0_OVL_INT;
}
void init_timer2()
{
// PWM-Betrieb einstellen
T2_FAST_PWM_EIN;
// Pulsbreite auf 0 einstellen
T2_PULSBREITE = 0;
// Maximale Frequenz - Teiler
T2_TEILER_1;
// Overflow Interrupt freigeben
T2_INT_OVL_ENABLE;
}
//ISR für Timer0 Überlauf (alle 2ms)
ISR(TIMER0_OVF_vect)
{
static unsigned char zaehler=0;
zaehler ++;
if(zaehler >= 49)//ca alle 98ms
{
zaehler = 0;
if(T2_PULSBREITE<=250)
{
T2_PULSBREITE += 5;
}
}
}
Das Problem ist das wenn die Variable zaehler den Wert 16 erreicht das Programm wieder zu init springt und dann wieder init_timer0 und init_timer2 durchläuft und das ganze wieder von vorne beginnt.
Vielleicht weiß jemand wo da der Fehler liegt!
Ich bin totaler Anfänger und weiß auch nicht ob ich hier in diesem Forum mit dieser Frage richtig bin...
Aber ich würde mich über die Lösung des Problems freuen!!! :)
Ich hätte eine kleine Frage und zwar hab ich folgendes Programm bei dem mit der Zeit die Pulsbreite von Timer2 erhöht werden soll:
#include <avr/io.h>
#include <avr/interrupt.h>
//Funktionsdeklaration
void init();
void init_timer0();
void init_timer2();
//Timer0:
#define T0_TEILER64 TCCR0|=0x03;TCCR0 &=0xFB
#define T0_NORMAL TCCR0&=0x87
#define T0_RESET TCNT0=0
#define T0_OVL_INT TIMSK|=0x01;SREG|=0x80
//Timer2:
#define T2_INT_OVL_ENABLE TIMSK|=0x40;SREG|=0x80
#define T2_FAST_PWM_EIN TCCR2&=0x00;TCCR2|=0x68
#define T2_PULSBREITE OCR2
#define T2_TEILER_1 TCCR2&=0xF8;TCCR2|=0x07
int main()//
{
//Initialisierung der Baugruppen)
init();
init_timer0();
init_timer2();
// Hintergrundschleife bzw. Hintergrundprozess
do
{
}
while(1);
return 0;
}
void init()
{
DDRA &=0x00;
//PB5 als Ausgang konfigurieren
DDRD |=0xFF;
}
void init_timer0()
{
//Normalbetrieb einstellen
T0_NORMAL;
//Teiler (64) einstellen
T0_TEILER64;
//Zählerstand Reset
T0_RESET;
//Interrupt freischalten (Überlaufinterrupt freischalten)
T0_OVL_INT;
}
void init_timer2()
{
// PWM-Betrieb einstellen
T2_FAST_PWM_EIN;
// Pulsbreite auf 0 einstellen
T2_PULSBREITE = 0;
// Maximale Frequenz - Teiler
T2_TEILER_1;
// Overflow Interrupt freigeben
T2_INT_OVL_ENABLE;
}
//ISR für Timer0 Überlauf (alle 2ms)
ISR(TIMER0_OVF_vect)
{
static unsigned char zaehler=0;
zaehler ++;
if(zaehler >= 49)//ca alle 98ms
{
zaehler = 0;
if(T2_PULSBREITE<=250)
{
T2_PULSBREITE += 5;
}
}
}
Das Problem ist das wenn die Variable zaehler den Wert 16 erreicht das Programm wieder zu init springt und dann wieder init_timer0 und init_timer2 durchläuft und das ganze wieder von vorne beginnt.
Vielleicht weiß jemand wo da der Fehler liegt!
Ich bin totaler Anfänger und weiß auch nicht ob ich hier in diesem Forum mit dieser Frage richtig bin...
Aber ich würde mich über die Lösung des Problems freuen!!! :)