PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Externer Interrupt will nicht :(



Lionic
03.10.2005, 16:02
Hallo mitsammen, dies ist mein erster Besuch und gleich schon mit einer Frage :(

Ich nutze den PORTB.
es kommt mir vor, als würde sofort nach dem Einschalten ein IRQ
auftreten, und auch danach in sehr kurzen abständen (10ms?).
Ich habe eine LED angehängt und die scheint zeitweise zu flackern (für
ein paar Sekunden) dann leuchtet sie wieder durchgehend (auch wieder
ein paar Sekunden).

der Code ist folgender:



#include <avr/io.h>
#include <avr/interrupt.h> // sei()
#include <avr/signal.h> // SIGNAL

#define XTAL 1000000

int ab = 0x00;

int main(void) {

// configure all PortB bits as output
DDRB = 0xff;
PORTB = 0x00;

//configure the external interrupt
GICR |= (1<<INT0);
MCUCR |= (1<<ISC00) | (1<<ISC01);


// enable interrupts
sei();
while(1);
return 0;
}

SIGNAL (SIG_INTERRUPT0) {
if (ab == 0x00)
{
PORTB = 0xff;
ab = 0xff;
}
else
{
PORTB = 0x00;
ab = 0x00;
}
}


Nun zur eigentlichen Frage: warum ist das so? Ein IRQ sollte doch erst
bei Überschreiten eines gewissen Pegels auftreten .. oder? - Mein
Multimeter zeigt eigentlich schöne 0,00V (Low) und 4,3V (High) an.
Das Ganze hängt an einem FT245 - kann hier das Problem liegen?

Dino Dieter
03.10.2005, 17:31
Hallo

Was ich erstmal vermisse ist, das den INT0 Pin als Eingang schaltest.

Der Rest sollte sich im AVR Studio leicht nachvollziehen lassen.

MFG
Dieter

kater
03.10.2005, 18:08
Der INT0 ist automatisch ein Eingang wenn er als INT geschaltet wird. Du solltest die Variable "ab" direkt in der INT Schleife deklarieren oder wenn du sie auch ausserhalb brauchst, noch ein volatile davor schreiben. Also volatile int ab = 0.

Dino Dieter
03.10.2005, 18:19
Hallo


Der INT0 ist automatisch ein Eingang wenn er als INT geschaltet wird.

Kannst du das belegen.Wäre mir neu.

Da hast natürlich Recht, das der Pin beim starten als Eingang geschaltet ist, womit meine Aussage nichtig ist.

Das mit dem volatile ist schon richtig, sowas sieht man doch gut mit AVR Studio.

MFG
Dieter

Lionic
03.10.2005, 18:37
so .. ich erklär mal kurz worum es geht:
Es geht darum, mittels eines FT245BM im BitBang Modus die INT0 Leitung des Atmega8 auf High zu setzen. Mittels eines kleinen Programmes, welches ich in C# geschrieben habe, kann ich die 8 Data - Ports des FTDI Chips getrennt steuern.

Nun hat der FT245BM am Ausgang ca. 4,3V.


ich habe nun die Änderung (volatile) gemacht und es wird immer mysteriöser.

Wenn ich auf einem Low Signal bin (0,0) und dann auf High gehe, schaltet sich die LED ein. Wenn ich nun auf High bin, und noch des öfteren ein High auf die Ports schreibe, schaltet sich die LED irgendwann (nach dem 2ten oder 3ten mal) wieder aus .. dann noch ein paar mal 0xff auf die ports schreiben und die LED geht wieder an ...

Wohlgemerkt: Ich gehe in der Zwischenzeit nicht einmal auf Low :(

kater
04.10.2005, 17:18
@Dino Dieter. Aus dem ATMega8 Datenblatt Seite 65.

Activity on the pin will couse an interrupt request even if INT0 is configured as an output

@Lionic. Das Programm sieht sauber aus also denke ich es liegt an deiner Elektronik.

Lionic
04.10.2005, 18:17
@kater:

Danke für die Antwort

Ich habe jetztmal einfach versucht das Signal abwechselnd direkt am Steckbrett auf Low/High zu setzen, aber keine Chance, dasselbe. Somit liegts wohl nicht am FT245er ...

Werde - wenn ich heute abend dazu komme - mal die Schaltung neu aufbauen und evtl. den uC austauschen - vielleicht passt ja damit was nicht .. ich meld mich jedenfalls wieder :)

Dino Dieter
04.10.2005, 18:30
Hallo

@Kater



Activity on the pin will couse an interrupt request even if INT0 is configured as an output

Heißt aber nicht, das der PIN dann Eigang ist, sondern nur, das der INT auch auslöst, wenn der PIN als Ausgang geschaltet ist und ein wechsel des Signals vorkommt. Möglichkeit eines Software Int.

Kann eine böse Falle sein , das so zu deuten, das der Pin automatisch
als Eingang geschaltet wird.

MFG
Dieter