Problem mit INT2 am Atmega 32

OP #2270206
Lesenswert?

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
#2270263
Lesenswert?

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?
OP #2270318
Lesenswert?

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.
Gast #2270410
Lesenswert?

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
#2270832
Lesenswert?

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
Gast #2270834
Lesenswert?

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
Gast #2271218
Lesenswert?

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
Gast #2271230
Lesenswert?

Hi

>man benutzt in solchen Fällen Read Modify Write Instuktionen falls
>vorhanden. Oder liest ein, maskiert aus, und schreibt zurück.

Genau. Z.B. so:
1
; Setzen
2
in r16,GICR
3
sbr r16,1<<INT1
4
out GICR,r16
5

6
; Löschen
7
in r16,GICR
8
cbr r16,1<<INT1
9
out GICR,r16

MfG Spess

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren