www.mikrocontroller.net

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


Autor: Konstantin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Konstantin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Konstantin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...
      };
}

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Konstantin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Konstantin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.