Hallo alle zusammen,
also ich steh voll auf dem Schlauch! Bin jetzt seit 3 Tagen dran mich in
die Timer einzuarbeiten und komme an einem REST-Problem nicht weiter.
Hab wirlich alle möglichen Forenbeiträge durchgelesen.
Vielleicht bin ich auch nur Betriebsblind!
Ich möchte mit dem Timer1 im CTC Mode den Interrupt alle 1 Sekunde
auslösen lassen. Alles funktioniert, nur das beim Interrupt Auslösen der
uC resetet.
Ich hab auch versucht per ISR(BADISR_vect) was abzufangen, aber ging
auch nicht. Die Routine wurde garnicht angesprochen.
- uC mega8
- Board AVR-P28 (Rev.B)
- Quarz 8000000 Hz
Hier der Code
mn schrieb:> Ja, damit der da hängen bleibt und die LED zur Kontroller schneller> Blinkt.
Was'n das für ein Unsinn?
Die LED in deiner ISR blinkt so schnell, so schnell kannst du gar nicht
schauen.
Kein Wunder, dass das für dich nach reset aussieht.
@"ich":
Danke für den Tip, aber das bringt mir nicht viel.
@Karl Heinz Buchegger:
Also eine Endlosschleife in einer ISR ist nicht sinnvoll, das ist mir
klar. Ich möchte damit erkennen können ob die ISR angesprungen wird.
Ich kann wohl die LED blinken, bzw. flimmern sehen, hab die gleiche
Schleife in der main() ausprobiert.
Wegen OCR1A = 10 sollte die LED unmittelbar nach dem Einschalten
angehen. Wenn sie das tut, weißt Du, dass die ISR ausgeführt wurde.
Anschließend hast Du immer noch Zeit für Modifikationen am Code.
Funktioniert dieses Programm?
mn schrieb:> @"ich":> Danke für den Tip, aber das bringt mir nicht viel.>> @Karl Heinz Buchegger:> Also eine Endlosschleife in einer ISR ist nicht sinnvoll, das ist mir> klar. Ich möchte damit erkennen können ob die ISR angesprungen wird.> Ich kann wohl die LED blinken, bzw. flimmern sehen, hab die gleiche> Schleife in der main() ausprobiert.
Probier doch erst mal das hier
1
#define F_CPU 8000000UL
2
3
#include<avr/io.h>
4
#include<avr/interrupt.h>
5
6
ISR(TIMER1_COMPA_vect)
7
{
8
PORTC^=(1<<PC5);
9
}
10
11
intmain(void)
12
{
13
14
DDRC|=(1<<PC5);
15
PORTC=(1<<PC5);
16
17
OCR1A=F_CPU/1024;// Prescaler = 1024
18
TCCR1B=(1<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10);//Prescaler auf 1024, CTC-Mode
19
TIMSK=(1<<OCIE1A);
20
21
sei();
22
23
while(1)
24
{
25
;
26
}
27
28
return0;
29
}
Nichts gegen deine Ausfzählung aller Bits im Register. Aber das ist
ordentlich unübersichtlich. Man kann alles übertreiben. Wenn ich eine
60-Zeichen lange Zeile erst 5 mal von links nach rechts und wieder
zurück absuchen muss, bis ich die entscheidende '1' gefunden habe, dann
habe ich übertrieben.
Dein LED müsste jede Sekunde hell bzw dunkel werden.
Wenn sich nach 1 Sekunde noch nichts tut, dann warte weitere 7 Sekunden.
Dann kann es sein, dass dein µC gar nicht mit 8Mhz läuft, sondern noch
im Auslieferungszustand ist: 1Mhz
@Karl Heinz Buchegger:
Ja ist ein wenig unübersichtlich.
Dein Quellcode läut auch nicht.
Hab vergessen zu erwähnen das ich mit AVR-GCC unter Linux arbeite und
den Optimizer auf "-Os" gestell habe. Die Fusebits sind auch im
Auslieferungszustand nur das ich den 8MHz Quarz (nicht Oszillator)
eingestellt habe).
Ich hab auch mal einen zweiten baugleichen (neuen) uC genommen und das
Ergebnis war das Gleiche.
mn schrieb:> Dein Quellcode läut auch nicht.
Dann ist irgendwas ausserhalb des Programms faul.
Bei mir blinkt die (reale)LED am (realen)Prozessor munter vor sich hin.
@Karl Heinz Buchegger:
Fragt sich nur was!
Wie siehts bei dir mit den Fuses aus?
Was für ein Compiler und welche Compileroptimirungen hast du
eingestellt.
@Marint:
Der hat doch garkein JTAG
mn schrieb:> @Karl Heinz Buchegger:> Fragt sich nur was!> Wie siehts bei dir mit den Fuses aus?
Alles Standard. Bis eben: auf 8Mhz intern gefust, damit das Timing
stimmt.
> Was für ein Compiler und welche Compileroptimirungen hast du> eingestellt.
-Os
Spielt hier aber keine Rolle.
Mein Compiler ist schon etwas älter
Dein Originalprogramm (mit der while in der ISR) präsentiert sich mir
so:
nach dem Einschalten blinkt die LED ca 3 mal auf um dann in ein Flimmern
überzugehen. Entspricht so gesehen dem Wortlaut des Programmes.
Ich hab mal ein anderes Beispiel:
Hier sollte in der Hauptschleife die LED Blinken.
Und sobald der Interrupt vom Timer1 ausgelöst wird, müsste das Blinken
aufhören. Wenn ich die Zeile
1
TIMSK=(1<<OCIE1A);
auskommentiere, dann blinkt die LED ganz normal. Wenn ich die Zeile
drin lasse, dann sieht man ganz deutlich das die LED schneller und
abgehackt blinkt. Als resetet der uC.
1
#define F_CPU 8000000UL
2
3
#include<avr/io.h>
4
#include<avr/interrupt.h>
5
6
volatileinta=0;
7
volatileuint16_tcount1=0;
8
9
ISR(TIMER1_COMPA_vect)
10
{
11
if(a==1)
12
{
13
a=0;
14
}
15
}
16
17
intmain(void)
18
{
19
20
DDRC=(1<<PC5);
21
PORTC=(0<<PC5);
22
23
OCR1A=2000;
24
TCCR1B=(1<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10);//Prescaler auf 1024, CTC-Mode
Du hast im Make-File auch das richtige Target angegeben?
AVRs sind nicht binärkompatibel!
Und laß mal diese ollen Zähleschleifen sein.
Nimm gefälligst die "delay.h", dann kann man den Quelltext auch lesen,
d.h. die tatsächlichen Wartezeiten.
Peter
>Als resetet der uC
Hm... schreib mal ganz an den Anfang Deines Programms ein Stück Code,
das z. B. Pin D3 kurzzeitig auf GND outputtet und häng noch ne LED an
diesen Pin (und VCC). Wann immer der µC resettet wird: Diese LED wird es
Dir durch Aufblitzen anzeigen.
mn schrieb:> Alles funktioniert, nur das beim Interrupt Auslösen der> uC resetet.mn schrieb:> Hab vergessen zu erwähnen das ich mit AVR-GCC unter Linux arbeite
Mal wieder jemand, der das ELF-File in den Controller programmiert?
mn schrieb:> Als meine Makefile sieht so aus.
Ja, ist wohl so, denn ich kann dort nicht erkennen, dass da irgendwo ein
korrektes HEX-File erzeugt wird.