Hallo Peter.
ICCAVR fügt while(1) automatisch am Programmende ein. Ich habe das
Programm schon mit main-loop kompiliert und es lief trotzdem nicht.
Meine Vermutung liegt beim Timer0-Interrupt. Ich habe in die ISR
tim0Ovf() den Befehl CLRBIT(PORTD,4); eingefügt. Es passiert nichts. Es
wird überhaupt nicht in die ISR gesprungen. Mit dem IAR-Compiler und
dem 8515 hat alles gut geklappt. Interrupt-Vector kann es auch nicht
sein. Würde IAR den 1200er unterstützen, würde ich es gar nicht
probieren mit dem ICCAVR.
Gruß
Hilel
Hi,
habe zwar keine Ahnung vom ICCtiny, aber ich denke der Fehler liegt in
deiner Delay-Funktion. Du setzt am Anfang timeout_1ms gleich n und
gehst dann in eine while-Schleife. Hier solltest Du timeout_1ms aber
auch dekrementieren, sonst ist die Bedingung immer erfüllt (es sei
denn, du übergibst eine 0 an die Funktion).
static void delay1ms (unsigned int n)
{
timeout_1ms = n;
SETBIT(TIMSK,TOIE0); // Interrupt Timer 0 frei
while(timeout_1ms)
{
timeout_1ms--; //z.B. so
}
CLRBIT(TIMSK,TOIE0); // Interrupt gesperrt
}
Hoffe, das wars,
viele Grüße,
Ralf
nö, das wirds nicht sein, timeout wird ja in der Timer-ISR
decrementiert, irgendwann wirds 0, und dann wird die while-Schleife
auch wieder verlassen.
Warum es nicht funktioniert, sehe ich aber auch nicht, sieht korrekt
aus.
Stell doch mal das erzeugte Assemblerlisting hier rein.
Hallo Ralf.
>>Du setzt am Anfang timeout_1ms gleich n und
gehst dann in eine while-Schleife. Hier solltest Du timeout_1ms aber
auch dekrementieren, sonst ist die Bedingung immer erfüllt (es sei
denn, du übergibst eine 0 an die Funktion).
>>
timeout_1ms soll eben nicht von der Routine static void delay1ms
(unsigned int n) verändert werden. Das Dekrementieren von timeout_1ms
übernimmt die ISR-Routine tim0Ovf().
void tim0Ovf()
{
TCNT0 = 240;
if(timeout_1ms) timeout_1ms--;
}
Immer wenn ein Interrupt von Timer0 ausgelöst wird, wird timeout_1ms
dekrementiert. Irgendwann erreicht timeout_1ms in der While-Schleife
den Wert 0 und die Routine static void delay1ms (unsigned int n)wird
bendet.
Dasselbe Programm hat ja schon mit dem AT90S8515 beim IAR-Compiler
funktioniert.
Viele Grüße
Hilel
Hi!
Ich habe zwar keine direkte Erfahrug mit AVR, aber es
sieht so aus, als ob bei dir die Compileroptimierung zuschlägt:)
Ist z.B. PortD als VOLATILE definiert?
Füge doch mal zum Testen etwas mehr Code zwischen deine Makros
ein, damit du die Optimierung überlistest...
Gruß, Dirk.
Eine eigene Frage?
Dieser Thread ist über 23 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.