Abend,
ich versuche schon den ganzen Abend den INT 2 am Atmega 32 zu nutzen.
Allerdings tut sich weder in der Simulation noch real etwas.
Wahrscheinlich ist es nur ein dummer Fehler, denn ich aber einfach nicht
finde.
Ich initialisiere den INT 2 so:
1
ldi temp, (1<<ISC11)
2
out MCUCR, temp
3
4
ldi temp, (0<<ISC2)
5
out MCUCSR, temp
6
7
ldi temp, (0<<INTF2)
8
out GIFR, temp
9
10
ldi temp, (1<<INT1) | (1<<INT2)
11
out GICR, temp
Global sind Interrupts auch aktiv. (Int 1 läuft).
Das Flag für Int 1 in GIFR wird auch gesetzt nur der Sprung klappt
nicht.
Gruß und Danke im Voraus Michael
Zeig mehr Code
Das hier
ldi temp, (0<<ISC2)
out MCUCSR, temp
ldi temp, (0<<INTF2)
out GIFR, temp
ist zwar Unsinn, sollte aber deinen Interrupt nicht am Feuern hindern.
Der Fehler wird dann wohl in den Codeteilen liegen, die du nicht zeigst.
ldi temp, (1<<ISC11)
out MCUCR, temp
ldi temp, (0<<ISC2)
out MCUCSR, temp
und das ist auch Quatsch, da der erste Teil wieder überschrieben wird.
Entweder alle Anweisungen für ein Register in einer Zeile laden.
Oder or/and verwenden.
Bleiben noch die Vektoren. Dran gedacht, dass die beim Mega32 3 Byte
lang (jmp) sind?
H.joachim Seifert schrieb:> ldi temp, (1<<ISC11)> out MCUCR, temp> ldi temp, (0<<ISC2)> out MCUCSR, temp>> und das ist auch Quatsch,
Wiso? MCUCR ist doch was anderes als MCUCSR, oder?
die Vektoren sehen so aus:
1
.org 0x000
2
rjmp main
3
4
.org INT2addr
5
rjmp int2_handler
6
7
.org INT1addr
8
rjmp int1_handler
9
10
.org OC2addr
11
rjmp timer2_match
12
13
.org OC1Aaddr
14
rjmp timer1_match
15
16
.org OVF0addr
17
rjmp timer0_overflow
18
19
.org ADCCaddr
20
rjmp adc_holen
Was vom Code wollt ihr noch sehen die Routine soll zum test nur ne LED
einschalten.
Hi
>Was vom Code wollt ihr noch sehen die Routine soll zum test nur ne LED>einschalten.
Stell einfach das komplette Programm als Anhang rein. Deine
Salamitaktik bringt nichts. Die Fehler stecken meist in den nicht
geposteten Programmteilen.
MfG Spess
Hallo,
ein reti Befehl kann ich nicht einsetzen. Da ich ja über den
Watchdog-Timer einen komplett Reset des Atmegas durchführe um den
Abgleich zu verlassen. Geht das so nicht? Die Flags müssten sich doch
durch den Reset auch zurück setzen.
Grüß Michael
Michael Mayer schrieb:> ein reti Befehl kann ich nicht einsetzen.
Es in den Wald laufen zu lassen, geht schonmal garnicht.
Du solltest erstmal den PC abschalten und Dir einen Programmablaufplan
auf Papier zeichnen.
Wenn man weiß, wie ein Programm funktionieren soll, kann man es
wesentlich besser in Code umsetzen.
So aus dem Kopf einfach drauflos zu coden, geht in der Regel schief.
Peter
Hi
>ein reti Befehl kann ich nicht einsetzen.
Dann mach wenigstens eine Endlosschleife rein. Denn sonst macht der
Controller mit dem, was er nach 'out WDTCR, temp' im Flash findet
weiter.
MfG Spess
Hi
>Ich schalte im int1_hanlder doch INT 1 ab und nicht INT2.>ldi temp, (1<<INT1) -> temp = $80>out GICR, temp>ldi temp, (0<<INT1) -> temp = $00>out GICR, temp
Damit löscht du in beiden Fällen INT2.
MfG Spess