Ich habe ein Problem mit meinen Mega32.
Sobald ich den Externen Interrupt1 initialisiere hakt das Programmablauf
komplett auch wenn ich den Anschluss auf Masse lege.
Wie kann das sein?
void Tsic_init(void)
{
DDRA |= (1 << DDA1); //PINA1 als Ausgang
GICR |=(1<<INT1); //INT1 freischalten
MCUCR |=(1<<ISC11); //Tnterrupt bei fallender Flanke
}
Das ist meine Initialisierungsfunktion.
sei() wird später wo anders ausgeführt.
Danke schon einmal!
ja sorry, der sieht so aus
ISR (INT1_vect)
{
lcd_set_cursor(10,LINE2+10);
lcd_puts(Book,"interrupt!!!");
//get_data();
//get_strobe();
return;
}
Ist ein wenig umfangreicher das ganze.
Aber sobald ich den Teil initialisiere funzt nix mehr.
Ich habe alles heraus genommen, nur eine Ausgabe aufs Display sobald ein
Interrupt kommt ist noch drin.
Sind das die einzigen LCD Ausgaben im ganzen Programm? Lies: Was
passiert wohl, wenn mitten in einer LCD-Ausgabe der Interrupt kommt?
Ausserdem ist diese Ausgabe recht langsam, folglich der Interrupt recht
lang beschäftigt.
Womit auf GND gehängt? Taster oder freifliegendes Kabel wäre keine gute
Idee, weil prellt und folglich mehrfach ausgelöst wird.
M.a.W: Nimm das LCD aus dem Interrupt raus und hänge eine oder mehrere
LEDs als Indikator dran.
Nein das sind nicht die einzigen.
Ich habe das Massekabel fest angeschlossen von meiner Masse klemme auf
die Anschlussklemme des Temperatursensor. Die Datenleitung des Sensors
ist natürlich runter.
Daniel schrieb:
> Ich habe das Massekabel fest angeschlossen von meiner Masse klemme auf> die Anschlussklemme des Temperatursensor. Die Datenleitung des Sensors> ist natürlich runter.
Und was hat das mit dem Interrupt zu tun?
Kannst du dir vorstellen, dass dieses inkrementelle
Infos-aus-der-Nase-ziehen etwas nervt?
Sorry, ich tippe heute zu schnell, da ich los muß; das war eine Mischung
aus zweitem und dritten Satz.
Kurzum: Es gibt dort auf PA1 kein INT1.
Andererseits kann das hier aber auch evtl. egal sein, wenn mit der
Initialisierung gar nicht INT1 gemeint sein soll.
Meiner Meinung nach kann dadurch, dass ich den PD3 auf Masse lege kein
Interrupt mehr ausgelöst werden. Jedenfalls keiner der dem externen
Interrupt 1 zu tun hat.
Daniel schrieb:
Meiner Meinung nach kann dadurch, dass ich den PD3 auf Masse lege kein
> Interrupt mehr ausgelöst werden. Jedenfalls keiner der dem externen> Interrupt 1 zu tun hat.
Und was hängt an PD3?
Eigentlich der TSIC 306, das Programm funzt einzelnd auch ganz gut.
Auch das andere Programm funktioniert ganz gut, jedoch nicht mehr sobald
der Externe interrupt 1 initialisiert ist.
Meiner meinung nach kann es nicht an der Beschaltung liegen, da ich den
PD3 ja auf Masse gezogen habe (zu Testzwecken).
Ich habe noch eine Funkuhrroutine und eine PWM am laufen.
Daniel schrieb:
> Meiner meinung nach kann es nicht an der Beschaltung liegen, da ich den> PD3 ja auf Masse gezogen habe (zu Testzwecken).
Und wie hast du den auf Masse gezogen (Wdh)?
Genau, das ist ja auch mein Ziel.
Demnach dürfte ich das restliche Programm damit nicht beeinflussen.
Wenn ich alles aus der ISR-Routine auskommentiere und auch die obige
initialisierung durchführe funzt auch alles wunderbar.
Eigentlich müsste es doch völlig egal sein, wenn der Pin auf Masse
liegt.
Dann liegt der Pin nicht auf Masse. Vielleicht offen. Direkt am
Controller nachmessen - sowohl gegen GND als auch gegen VCC messen, denn
gegen GND messen zeigt offene Pins als low an, gegen VCC als high.
>Eigentlich müsste es doch völlig egal sein, wenn der Pin auf Masse>liegt.
Das stimmt. Ist der Pin dann auch unbeschaltet?
Also nur ein Eingang und sonst nix mehr dran?
Nicht das du da deinen Sensor kurzschliesst.
Vieleicht legst du deinen Pin ja auch gar nicht an Masse.
Also Osci dran!
Schmeiss mal den LCD-Kram aus der ISR raus und häng nur eine Zeile rein,
die einen bisher unbenutzten Output-Pin komplementiert. Dann Oszi oder
Messgerät da dran. Wenn der munter wackelt (Oszi) oder irgendwo mitten
zwischen GND und VCC liegt (Messgerät), dann hast du eine muntere
Interrupt-Quelle am Laufen.
Du hast schon für Mega32 übersetzt, und nicht zufällig für irgendwen
anders?
>Dann ist entweder dein Controller defekt (unwahrscheinlich) oder eine>deiner Aussagen oder Annahmen ist falsch.
Das würde ich jetzt auch sagen. Auch wenn oben im Code was anderes
steht könnte es das sein:
ISC11=0, ISC10=0
The low level of INT1 generates an interrupt request.
Das würde die Sache jedenfalls erklären.
ISR (INT1_vect)
{
PORTB ^= (1<<PB0);
PORTB |= (1<<PB1);
}
Hab mal eine LED an PB0 gehängt. Diese wird getoggelt.
Die andere an PB1 ist dauerhaft an.
Wenn ich den controller resette, sind beide an...die getoggelte ein
bischen dunkler.
Dann muss da ja irgendwas in Sachen Interrupt laufen.
Habe den PD3 nun mal auf High gelegt...Programm hakt nicht mehr.
Keine der LEDs ist an.
Das heisst ja irgendwo wird mein MCUCR ungewollt manipuliert.
Ich suche mal.
Daniel schrieb:
> Wenn ich den controller resette, sind beide an...die getoggelte ein> bischen dunkler.
Die leuchten beide während gedrücktem Reset (egal wie hell)???
Oh man es geht...
Es war tatsachlich so, dass der Interrupt auf LOW stand.
Die Funkuhrroutine, welche ich nutze hatte über all mein MCUCR so
ungefähr
MCUCR=0b00000001; überschrieben.
Hatte damit nicht gerechnet, da sonst alles vom feinsten mit define und
allem pipapo sauber geschrieben war.
Danke nochmal an alle!