PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Software PWM



MKaiser
18.03.2007, 16:54
Hallo ihr,
hab da ein kleines Problem mit meinem Programm. Ich habe den Timer0 als Overflow interupt. bei einem Interrupt soll er den zähler i um eins erhöhen bis 50 und dann wieder zurücksetzten. Gleichzeitig vergleicht er i mit x und solange i<x setzt er den PORTC und sonst setzt er ihn zurück.
Nun mein Problem wenn ich x in meiner endlosschleife eine Wert gebe ist der PORT die ganze aus. Geb ich ihm einmal vor der Endlosschelfie einen Wert klappts.
Weiß jemand was ich falsch mache?
Danke schonmal

Hier noch der Code:


#include <avr/io.h>
#include <avr/interrupt.h>

uint8_t x ;
uint8_t i = 0;

//_____________Interrupt routine start
ISR (SIG_OVERFLOW0)
{
if (i>=50)
i=0;
if (i<x)
PORTC = 0xff;
else
PORTC = 0x00;
i++;
}
//______________Interrupt routine end

int main(void)
{

DDRC = 0xff;
PORTC = 0x00;
TCCR0 |= (1<<CS02)| (1<<CS00) ; //Teiler setzten
TIMSK |= (1<< TOIE0); //Timer0 Interrupt freigeben
sei();
//Interupt Global aktivieren
x=45; //hier gehts

for(;;)
{
x=45; //hier nicht
}

}

Superhirn
18.03.2007, 18:23
es muss auf jeden fall heißen am anfang:

volatile uint8_t x;
volatile uint8_t i; //Das = 0 kannst du weglassen. das macht der compiler automatisch.

und:
ISR (SIG_OVERFLOW0) ist eine mischung der alten und neuen schreibweise. normalerweise gehts glaub ich. aber beser du nimmst nur die alte schreibweise SIGNAL (SIG_OVERFLOW0) oder nur die neue ISR (OVERFLOW0_vect), bin mir bei der neuen abe rnicht ganz sicher.

abe rich denk das erste müsste dein problem sicher lösen. denn der compiler optimiert den code so dass in den funktionen nu rmehr kopien verwendet werden, die alt bleiben. und durch volatile verhinderst du das.

MKaiser
21.03.2007, 22:00
Hey cool
Habs grad probiert und klappt einwandfrei.
Dankeschön