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
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
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.
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... }; }
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ß
@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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.