Externer interrupt INT1 -> ständiger interrupt?

Gast #1447131
Lesenswert?

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!
Gast #1447142
Lesenswert?

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.
#1447148
Lesenswert?

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.
Gast #1447152
Lesenswert?

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.
#1447156
Lesenswert?

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?
Gast #1447162
Lesenswert?

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.
Gast #1447170
Lesenswert?

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.
Gast #1447183
Lesenswert?

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.
Gast #1447192
Lesenswert?

>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!
#1447202
Lesenswert?

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?
Gast #1447203
Lesenswert?

>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.
Gast #1447225
Lesenswert?

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.
Gast #1447264
Lesenswert?

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!

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