Forum: Mikrocontroller und Digitale Elektronik Problem mit INT2 am Atmega 32


von Michael M. (eos400dman)


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

von Karl H. (kbuchegg)


Lesenswert?

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.

von H.Joachim S. (crazyhorse)


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?

von Michael M. (eos400dman)


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.

von spess53 (Gast)


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

von Michael M. (eos400dman)


Angehängte Dateien:

Lesenswert?

Hier mal der Code, die Include Teile die fehlen haben nichts mit den 
INTs zu tun.

Gruß Michael

von spess53 (Gast)


Lesenswert?

Hi

In deiner 'abgleich_modus.asm' fehlt mindestens ein 'reti'.

MfG Spess

von Michael M. (eos400dman)


Lesenswert?

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

von Peter D. (peda)


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

von spess53 (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

Noch etwas: Das du in 'int1_handler' und 'timer2_match' den INT2 
abschaltest ist Absicht?

MfG Spess

von Michael M. (eos400dman)


Lesenswert?

Ich schalte im int1_hanlder doch INT 1 ab und nicht INT2.

von spess53 (Gast)


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

von Uwe (Gast)


Lesenswert?

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

von spess53 (Gast)


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

von Michael M. (eos400dman)


Lesenswert?

Danke, das war der Fehler. Hatte nicht bedacht das ich durch das andern 
von INT1 auch INT2 im GICR mit beeinflusse.

Gruß Michael

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.