Realisator
12.03.2009, 20:34
Hallo,
habe ein recht umfangreiches BASCOM-Programm für den ATMega2561 geschrieben, das auch wunderbar funktioniert.
Doch nun habe ich am Port B0, also dem PCINT0 eine Hardware angeschlossen, von der ich Daten einlesen will.
Dabei hängt sich mein Programm sofort auf, so als ob ein Interrupt in einer Dauerschleife hängen bleibt. Dabei verwende ich gar keine Interrupts!?!
Der PB0 ist als Eingang geschaltet und Pullup ist aktiviert:
Portb = &B10001001
Ddrb = &B01110110
An dem Port hängt der Ausgang eines GAL16V8, der ein einzelnes Eingangssignal einfach nur unverändert durchreicht, ohne Invertierung und ohne Tristate, einfach nur als Buffer.
Sobald der auch nur kurzzeitig ein Low bekommt, was er auch brav an den PB0 weiter reicht, hängt mein Programm!
Liegt der Pin schon beim Einschalten auf low, startet das Programm gar nicht erst.
Übrigens: wenn oben im Quelltext der 2561 angegeben ist:
$regfile = "m2561def.dat" 'Verwendeter Controller
... dann schluckt Bascom den folgenden Codeschnippsel gar nicht erst, der beim ATMega88 bestens funzt:
On Pcint0 Int0_int 'Pin-Change-Interrupt initialisieren.
Pcmsk0 = &B00000001 'Nur PortB.0 abfragen.
Enable pcInt0 'Den Interrupt aktivieren.
Habe daher den Codeschnippsel auch auskommentiert - wird nicht benötigt, ich will hier gar nicht mit Interrupts arbeiten!
Habe unten in der m2561def.dat auch gesehen, dass die Interrupts hier anders heißen als beim ATMega88 und es eh' keinen PCINT0 gibt.
Blicke aber noch nicht ganz durch, mit den Interrupt-Sachen und kann auch nur BASCOM (kein C, kein Assembler).
Kurz und gut:
Was mich absolut wundert ist, wieso das Programm zu jedem Zeitpunkt sofort zum Stoppen kommt, wenn am PB0 ein Low liegt, selbst wenn ich den Pin gar nicht abfrage und obwohl ich das
Enable Interrupts
auskommentiert habe (das ich mal für die serielle Datenübertragung von Debugausgaben verwendet hatte).
Warum wird offenbar ein Interrupt ausgelöst, obwohl ich das gar nicht will?
Und was kann man dagegen tun?
Wer toll, wenn da einer einen Tipp hätte!
habe ein recht umfangreiches BASCOM-Programm für den ATMega2561 geschrieben, das auch wunderbar funktioniert.
Doch nun habe ich am Port B0, also dem PCINT0 eine Hardware angeschlossen, von der ich Daten einlesen will.
Dabei hängt sich mein Programm sofort auf, so als ob ein Interrupt in einer Dauerschleife hängen bleibt. Dabei verwende ich gar keine Interrupts!?!
Der PB0 ist als Eingang geschaltet und Pullup ist aktiviert:
Portb = &B10001001
Ddrb = &B01110110
An dem Port hängt der Ausgang eines GAL16V8, der ein einzelnes Eingangssignal einfach nur unverändert durchreicht, ohne Invertierung und ohne Tristate, einfach nur als Buffer.
Sobald der auch nur kurzzeitig ein Low bekommt, was er auch brav an den PB0 weiter reicht, hängt mein Programm!
Liegt der Pin schon beim Einschalten auf low, startet das Programm gar nicht erst.
Übrigens: wenn oben im Quelltext der 2561 angegeben ist:
$regfile = "m2561def.dat" 'Verwendeter Controller
... dann schluckt Bascom den folgenden Codeschnippsel gar nicht erst, der beim ATMega88 bestens funzt:
On Pcint0 Int0_int 'Pin-Change-Interrupt initialisieren.
Pcmsk0 = &B00000001 'Nur PortB.0 abfragen.
Enable pcInt0 'Den Interrupt aktivieren.
Habe daher den Codeschnippsel auch auskommentiert - wird nicht benötigt, ich will hier gar nicht mit Interrupts arbeiten!
Habe unten in der m2561def.dat auch gesehen, dass die Interrupts hier anders heißen als beim ATMega88 und es eh' keinen PCINT0 gibt.
Blicke aber noch nicht ganz durch, mit den Interrupt-Sachen und kann auch nur BASCOM (kein C, kein Assembler).
Kurz und gut:
Was mich absolut wundert ist, wieso das Programm zu jedem Zeitpunkt sofort zum Stoppen kommt, wenn am PB0 ein Low liegt, selbst wenn ich den Pin gar nicht abfrage und obwohl ich das
Enable Interrupts
auskommentiert habe (das ich mal für die serielle Datenübertragung von Debugausgaben verwendet hatte).
Warum wird offenbar ein Interrupt ausgelöst, obwohl ich das gar nicht will?
Und was kann man dagegen tun?
Wer toll, wenn da einer einen Tipp hätte!