Interrupts in asm für 2313

Gast #89296
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
Gast #89298
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.
Gast #89299
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...
      };
}
Gast #89300
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ß
Gast #89301
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.
Gast #89302
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
Gast #89303
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
-------------

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