PDA

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



Jens81
14.10.2006, 16:03
Hi,

ich benutze das Board RN-Control 1.4 mit MEGA32 und habe mir folgenden Code zum testen des externen Interrupts überlegt:


#include <avr/io.h>
#include <avr/interrupt.h>


int main(){
//Initialisierung der LED's
DDRC = 0xff;
PORTC = 0x0f;

// Initialisierung PORTD (INT0)
DDRD &= ~(1<<PIN2);
PORTD |= (1<<PIN2);

//INT0 aktivieren, auf fallende Flanke reagieren
GIMSK |= (1 << INT0);
MCUCR |= (1 << ISC01);
MCUCR &= ~(1<<ISC00);

//Interrupts global aktivieren
sei();

for(;;){
}

return 0;
}

//ISR Routine
ISR(INT0_vect){

PORTC ^= 0xf0;
}

Jetzt zu meinem Problem: Eigentlich sollte sich beim drücken des Tasters an PD2 der Status der oberen 4 LED's ändern, jedoch passiert bei mir nichts. Sie leuchten dauerhaft.

Hoffe ihr könnt mir helfen

Jens

linux_80
14.10.2006, 18:06
Hallo,

wie hast Du den Schalter verkabelt,
vielleicht schaut es nur so aus als wenn die immer an sind weil der Kontakt flattert :-k

robocat
14.10.2006, 18:41
mit "for(;;)return 0;" schickst du das programm doch sofort ins nirwana? und setzt damit die leds erneut auf leuchten? macht das nix?

kA, ob es daran liegen kann..

linux_80
14.10.2006, 19:46
@robocat
nach dem for kommt aber noch ein Block in geschweifter Klammer, so wird das return nicht erreicht.

robocat
14.10.2006, 20:02
ja-.-
komisch vorhin war das anders?!
oder war ich nur nicht aufmerksam genug?
sry jedenfalls, so is ok.

Jens81
14.10.2006, 21:18
Ein Pin des Schalters habe ich an PD2 angeschlossen und den anderen an Masse.
Habe auch schon mal anstatt PORTC ^= 0xf0;
PORTC = 0x00 stehen.
Dann sollte er ja eigentlich nach dem ersten mal drücken die LED's immer an haben.

Muss man vielleicht ein bestimmtes Fuse Bit gesetzt sein?

linux_80
14.10.2006, 22:15
Also der Pin ist als Eingang definiert, und der Schalter geht gegen Masse,
was ist wenn der Schalter nicht gedrückt ist ?
Es muss doch eigentlich irgendwo ein High-Pegel herkommen, den man auf Masse ziehen kann, der dann als INT erkannt wird.
Da würde sich ein Pullup gut machen, so wie das auch bei einem Resetschalter gemacht wird.

Jens81
14.10.2006, 22:36
ich habe doch den internen PULLUP aktiviert.

oder meinst du das so, dass ich einen 100k widerstand mit gegen 5v schalte, so wie beim reset.

linux_80
15.10.2006, 01:09
Hallo,
so, jetzt hab ich das selber probiert mit der RN-Control, und das Programm von ganz oben funktioniert bei mir, die LEDs flackern halt ein wenig wenn man den Kontakt betätigt, ohne externen Pullup.

Evtl. kannst Du mal messen, ob an dem Pin ca. 5V anliegen, wenn der Taster nicht betätigt ist.

ogni42
15.10.2006, 07:57
Kenne das RN 1.4 nicht. Aber sind die Taster entprellt?

Ausserdem sollte das in der ISR wahrscheinlich


PORTC ^= 0x0f;

heissen, oder?

Jens81
15.10.2006, 09:10
@linux_80 Ich messe an PD2 eine Spannung von 4,5 V. Kann es vielleicht an Fusebits liegen? Kann man die Fuse Bits auf Werkseinstelung oder so setzen?

@ogni42 Mit dem Entrprellen wirst du recht haben, aber trotzdem sollte man was sehen, zumal ich es ja auch schon mit PORTC = 0x00 probiert habe.

Prinzipiell sollte das mit PORTC ^= 0xf0 stimmen, da ich ja den Status der oberen 4 LED's dauernd ändern will.

linux_80
15.10.2006, 12:02
Von den Fusebits beim M32 wäre mir jetzt nix bekannt, was hier dazwischenfunken könnte !
Solange das JTAG aus ist, aber das hast Du ja anscheinend, sonst könntest Du nicht alle Pins von PortC ansteuern.

Ich hab zum testen einfach einen Draht von PD2 auf Masse gehalten, und schon haben die LEDs geflackert, das Problem liegt also nicht Grundsätzlich am entprellen oder am RN-Control selber !

Jens81
15.10.2006, 12:23
Dachte das der PORT vielleicht defekt ist, aber mit folgendem Programm leuchten die LED's, wenn ich den Taster betätige:


#include <avr/io.h>

int main(){
DDRC = 0xff;
DDRD = 0x00;
PORTD = 0xff;

for (;;){
if bit_is_clear(PIND, PIND2)
PORTC = 0x00;
else
PORTC = 0xff;
}
return 0;
}

Versteh das nicht, warum funktioniert das denn bei dir?

@linux_80: danke für deine mühe

linux_80
15.10.2006, 16:15
Hallo,
probier mal das, das kommt raus wenn ich das compiliere,
als Hex-Datei speichern:

:100000000C942A000C945C000C9445000C94450060
:100010000C9445000C9445000C9445000C9445004C
:100020000C9445000C9445000C9445000C9445003C
:100030000C9445000C9445000C9445000C9445002C
:100040000C9445000C9445000C9445000C9445001C
:100050000C94450011241FBECFE5D8E0DEBFCDBF14
:1000600010E0A0E6B0E0ECEDF0E002C005900D92EB
:10007000A036B107D9F710E0A0E6B0E001C01D92AC
:10008000A036B107E1F70C9447000C940000CFE5CF
:10009000D8E0DEBFCDBF8FEF84BB8FE085BB8A98F1
:1000A000929A8BB780648BBF85B7826085BF85B716
:1000B0008E7F85BF7894FFCF1F920F920FB60F925D
:1000C00011248F939F9385B390EF892785BB9F91D0
:0C00D0008F910F900FBE0F901F9018959D
:00000001FF
ist für einen M32, sonst keine besonderen Anforderungen.

Wenn das auch nicht geht, kannst Du ja mal auf INT1 oder INT2 ausweichen.

Jens81
15.10.2006, 16:47
Hi,

Welches Programm benutzt du zum programmieren? Kann es vielleicht an dem Makefile liegen oder wird es der Compiler sein?

EDIT: Vergessen zu sagen, dass es bei mir mit deiner hex Datei funktioniert.

linux_80
15.10.2006, 20:59
Ich habs im AVRStudio mit WinAVR gemacht.
Dann alles angekreuzt was an Optionen da ist,
bei Optimization hab ich -Os ausgewählt,
das war's schon, geflasht mit Pony.

Jens81
15.10.2006, 21:29
Ich benutze derzeit nur Programmers Notepad.

Wie kann man in AVRStudio WinAVR einbinden.
Und wo kann man da dann häckchen machen? Gibts dann da sowas wie make all?

linux_80
15.10.2006, 22:06
Wie kann man in AVRStudio WinAVR einbinden.
Einfach Installieren, wenn WinAVR schon drauf ist.
Es ist dann WinAVR ins Studio eingebunden.


Und wo kann man da dann häckchen machen? Gibts dann da sowas wie make all?
Wenn man ein neus Project erstellt kann man aussuchen ob es ASM oder mit GCC sein soll, zum übersetzen ist dann oben ein Button in der Menüleiste,
auch für die Optionen.
Makefile muss man nicht direkt selber bauen, einfach alles angeben, oder ankreuzen.
Wenn man lust hat kann man aber auch ein eigenes Makefile hernehmen.

Jens81
16.10.2006, 18:48
Habe mir mal die neuste Version von WinAVR und AVR Studio geladen, und siehe da jetzt klappt es auch bei mir. ***freu*** \:D/

Vielen lieben Dank an linux_80.