Forum: Mikrocontroller und Digitale Elektronik Interrupts in asm für 2313


von Konstantin (Gast)


Lesenswert?

Tach,

anbei ist ein kleines asm-Programm durch den ein AT90S2313 via
Interrupts (EXT_INT0 u. EXT_INT1) einen Zähler realisieren soll.
Das Programm soll lediglich das Register r16 hoch- und runterzählen
wenn die entsprechenden externen Interrupts ausgelöst werden.
Dafür habe ich mir eine kleine Testplatine zusammengelötet.
Die Taster funktionieren mit einem sinngleichen C-Programm simuliert
und auf den uC geflasht einwandfrei, der asm-Code gibt bei der
Simulation korrekte Ergebnisse, produziert aber geflasht nur seltsames
Geflacker an den LEDs die ich zur Ausgabe an PB gelötet habe.

Kann mir jemand sagen was nicht stimmt ?

.include "2313def.inc"

.org 0x000
         rjmp MAIN           ;Reset Handler
.org 0x001
         rjmp EXT_INT0       ;IRQ0 Handler
.org 0x002
         rjmp EXT_INT1       ;IRQ1 Handler


MAIN:    ldi r16, RAMEND     ;Stackpointer initialisieren
         out SPL, r16

         ldi r16, 0b11111111
         out DDRB, r16       ;PORTB ist output

         ldi r16, 0b00001010 ;INT0 und INT1 konfigurieren
         out MCUCR, r16

         ldi r16, 0b11000000
         out GIMSK, r16      ;INT0 und INT1 aktivieren
         out GIFR, r16       ;InterruptFlags zurücksetzen

         clr r16             ;r16 zurücksetzen
         out PORTB, r16      ;und ausgeben

         sei                 ;ab JETZT Interrupts erlauben

LOOP:    rjmp LOOP           ;Endlosschleife

EXT_INT0:dec r16
         out PORTB, r16
         reti

EXT_INT1:inc r16
         out PORTB, r16
         reti

von Klaus L. (Gast)


Lesenswert?

Hallo Konstantin,

kann es sein, dass die Taster "prellen"?

Hierzu gibt es einen aufschlussreichen thread im Forum
"codesammlung".

http://www.mikrocontroller.net/forum/read-4-16594.html

HTH,
Klaus

von Konstantin (Gast)


Lesenswert?

Danke für die Antwort, aber dieses Problem besteht sehr wahrscheinlich
bei mir nicht, da der compilierte C-Code in der List-Datei nicht viel
anders aussieht als der asm-Code.
Der C-Code funktioniert wie gesagt ohne Probleme.

von Konstantin (Gast)


Lesenswert?

Danke für die Antwort, aber dieses Problem besteht sehr wahrscheinlich
bei mir nicht, da der compilierte C-Code in der List-Datei nicht viel
anders aussieht als der asm-Code.
Der C-Code funktioniert wie gesagt ohne Probleme.

#include <90s2313.h>

unsigned char value = 0;

interrupt [EXT_INT0] void ext_int0_isr(void)
{
   PORTB = ++value;
}

interrupt [EXT_INT1] void ext_int1_isr(void)
{
   PORTB = --value;
}

void main(void)
{


DDRB=0xFF; // PortB auf Ausgabe
DDRD=0x00; // PortD auf Eingabe

GIMSK=0b11000000;
MCUCR=0b00001111;
GIFR =0b00000000;


#asm("sei") // Interrupts erlauben

while (1)
      {
         // Gähnende Leere...
      };
}

von Chris (Gast)


Lesenswert?

Hallo,

hast Du schon mal geschaut, ob der Assembler den Code im richtigen
Format ausgibt? Da gibt es mehrere Einstellmöglichkeiten. Ich hatte es
mal falsch eingestellt und tagelang den Fehler gesucht.
Intel intellec 8/MDS müßte das richtige sein.

Gruß

von Konstantin (Gast)


Lesenswert?

@Chris

Danke Chris, ich benutze den AVR910 ISP zur Programmierung,
der akzeptiert sowieso nix anderes als das Intel HEX-Format.

Kann es sein, dass der Watchdog standartmässig an ist oder sonstige
Timer die Stress machen könnten und vorher ausgeschaltet werden sollten
?
Das ist das erste Programm das ich für einen uC schreibe, ich habe also
noch keine Erfahrung mit solchen Stolperfallen.

von Klaus L. (Gast)


Lesenswert?

Hallo Konstantin,

den Unterschied zwischen ASM und C den ich sehe, ist dass einmal der
Interrupt bei pos. Flanke ausgelöst wird, einmal bei neg. Flanke.

Sind Deine INT Eingänge bei offenem Taster vielleicht nicht auf einen
Pegel definiert? (Interne Pullup Widerstände bei den Eingängen
schalten)

Dann könnte es sein dass die offenen Eingänge sich Pegel "einfangen".


Setzte doch zum Probieren mal im ASM Programm MCUCR und GIFR so wie im
C Programm.

Ciao,
Klaus

von Konstantin (Gast)


Lesenswert?

Tja, hab wohl zu viel an meiner Schaltung rumgelötet und den IC
gegrillt...
Selbst auf einem extra angelegten Testsockel meiner Steckrasterplatine
liest der ISP nur noch FFFFFFFFFFFFFFFFFFFFFFFFF aus dem Speicher.
Also: neuen 2313er besorgen, ISP checken und nochmal versuchen.

Das nennt sich dann wohl "Lehrgeld zahlen" ;-)

Wenn das Problem dann weiterhin herrscht melde ich mich nochmal.

Gruß
Konstantin
-------------

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.