PDA

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



Jason07
21.03.2013, 09:27
Hallo leute,
habe gestern versucht eine Interrupt Routine zu Programmieren, doch sie Funktioniert weder im Simulator noch mit dem richtigen Chip. Ich weiß einfach nicht an was es liegt.
Hier mein Code:


.include "m32def.inc"

.def temp1 = r16

.org 0x000
rjmp main
.org 0x002
rjmp int0_handler ;IRQ0 Handle

int0_handler:
ldi temp1, 0b00010000 ;PortC5 HIGH, rest LOW
out PortC, temp1
reti

main:
ldi temp1, 0xFF ;Port D auf Ausgang
out DDRD, temp1
ldi temp1, 0x00 ;Port D auf LOW
out PORTD, temp1

ldi temp1, 0xFF ; PortC auf Ausgang
out DDRC, temp1
ldi temp1, 0b00000000 ;PortC LOW
out PortC, temp1

in temp1, GICR
ori temp1, 0b01000000 ;INT0 = 1
andi temp1, 0b11111101 ;IVSEL = 0
out GICR, temp1
in temp1, MCUCR ;INT0 Aktivieren
ori temp1, 0b00000011 ; rising Edge
out MCUCR, temp1
sei

ende: rjmp ende


Die GICR Maske ist gesetzt, die MCUCR Bits sind aktiviert und das I Flag ist aktiv, dass müsste doch dann eigentlich Funktionieren wenn der Port D2 (Int0) dann von Low auf high gesetzt wird oder? In meinem Datenblatt vom AtMega32 steht, dass der Interrupt auch funktioniert wenn der Port auf output steht, also hab ich ihn auf low gestellt.

Wäre nett wenn ihr mir helfen könntet.

LG

Jason07

Searcher
21.03.2013, 09:52
dass müsste doch dann eigentlich Funktionieren wenn der Port D2 (Int0) dann von Low auf high gesetzt wird oder?

Wo oder wie wird den PD2 high? Im Programm kann ich das nicht finden? und wenn es extern gemacht wird gibt es Kurzschluß, da ja PD2 als Ausgang praktisch niederohmig auf GND liegt.

Gruß
Searcher

Jason07
21.03.2013, 09:56
Es geschieht extern, ich entneme dem Board die 5V Versorgungspannung, habe dann eine Spannungsteiler mit 2 Widerständen 470 Ohm und 1kOhm und geh dann wieder an den Ground vom Board. Parallel zu dem 1k Widerstand liegt ein Taster, der dann mit dem Port D2 Verbunden ist. Aber wenn ich gerade so überlge bleibt die Spannung ja dann trotzdem auf low am Port D2 oder? Durch das schließen des Tasters dürfte doch die Gesamte Spannung am 470 Ohm Widerstandbfallen ?! Lieg ich da richtig?

Searcher
21.03.2013, 10:06
Also ich verstehe, daß ein 1k Widerstand von VCC (+5V) nach PD2 geschaltet ist. Von PD2 ein 470 Ohm dann nach GND.
Parallel zum 1k liegt der Taster. Wenn der Taster geschlossen wird, wird VCC auf den PD2 geschaltet.
Das ist nicht gut!!! Dann fließt ein hoher Strom von VCC über den Taster nach PD2 und innerhalb vom µC nach GND (PD2 ist Ausgang und low). Der 470 Ohm Widerstand macht nichts, da über den PD2 nach GND überbrückt/kurzgeschlossen.

Jason07
21.03.2013, 10:17
Zwischen Vcc und PD 2 ist ja der 470 Ohm Widerstand, es dürften also ca. 10 mA fließen. Es kommt erst der 470 Ohm Widerstand, dann parallel der Taster und der 1k Widerstand. Der Taster ende am PD2 und der 1k Widerstand am Gnd. Somit fließt ein Strom über PD 2 der nicht bedenklich ist, da der Controller an dem Pin 20 mA verträgt. Jedoch erhöht sich wie ich in meine letzen Beitrag die Spannung nicht oder? Sie fällt durch das schliessen des Tasters dann Komplett am 470 Ohm Widerstand ab und der Pin ist immer noch auf Low und somit dann auch kein Interrupt oder? Also müsste ich den pin auf eingang schalten mit Pullup auf Gnd oder? Aber wie funktionier dann ein Interrupt wenn der Port auf Ausgang steht? Er hat ja immer einen Wert, High oder Low.

Searcher
21.03.2013, 10:28
Ich blick immer noch nicht durch die Beschaltung durch. Mach besser eine Skizze.

Also wenn Du PD2 nie direkt nach VCC mit dem Taster schaltest, sondern immer mindestens den 470 Ohm Widerstand zwischen VCC und PD2 hast, geht schon mal nichts kaputt.

Du wirst aber den PD2 nicht auf high ziehen können, da der ja praktisch mit GND verbunden ist (weil ja Ausgang und auf low geschaltet)

Die Funktion mit Auslösen des INT, wenn der Pin auf Ausgang geschaltet ist, ist wohl eher für andere Zwecke gedacht:
zB könnte ich mir vorstellen, daß über den Ausgang eine Zeitmeßhardware eingeschaltet wird. Intern wird durch die Pegeländerung am Pin der Interrupt ausgelöst. In der ISR wird die Zeitmessung im µC SW-mäßig gestartet ... oder so etwas.

Für Deine Anwendung sollte der PD2 als Input geschaltet sein.

Gruß
Searcher

Jason07
21.03.2013, 10:31
Also irgendwas stimmt da garnicht, mir fällt gerade auf der Taster bewirkt garnichts weil ja von dem 470 Ohm Widerstand direkt ein Kabel geht, also fließt einfach immer ein Strom über den Port. Jedoch habe ich grade gemessen und es besteht zwischen PD2 und VCC keine Spannung das kann ja nicht sein wenn der Port als ausgang auf Low geschaltet ist. Ampermeter zeigt auch 0 A. Ich muss nachher nochmal die Schaltung überabreiten is is was völlig verquer, aber warum funktioniert es im Avr Studio im Simulator nicht? Wenn ich dort das Bit von High auf Low schalte müsster er ja eigentlich in die Interrupt Routine springen oder?

Searcher
21.03.2013, 10:39
Also irgendwas stimmt da garnicht, mir fällt gerade auf der Taster bewirkt garnichts weil ja von dem 470 Ohm Widerstand direkt ein Kabel geht, ...
Mach 'ne Skizze!


... aber warum funktioniert es im Avr Studio im Simulator nicht? Wenn ich dort das Bit von High auf Low schalte müsster er ja eigentlich in die Interrupt Routine springen oder?
Nein, Du hast doch auf "rising edge" konfiguriert. (ich kenn mich mit dem AVR Simulator aber nicht aus)

Jason07
21.03.2013, 10:45
Ähm ich meine ja von Low auf High sry verschrieben ^^. Aber der Code ist deiner Ansicht nach richtig? Ich hab nen Schaltplan nur auf nem anderen Pc muss aber jetzt erst mal weg ich lad ihn nachher hoch und werd danach nochmal was umbauen.

Danke schonmal für deine Hilfe :)

Searcher
21.03.2013, 10:47
Gerne. Hast Du meinen Post von hier https://www.roboternetz.de/community/threads/61365-INT0-Interrupt-funktioniert-nicht?p=574353&viewfull=1#post574353 schon gelesen :confused:

Dein Code sieht für mich nicht falsch aus. Kann ich aber nicht nachtesten :(

oberallgeier
21.03.2013, 11:03
... nen Schaltplan ... lad ihn nachher hoch und werd danach nochmal was umbauen ...Diese Reihenfolge finde ich etwas verwirrend. Zumindest wäre es gut, wenn Du beim Hochladen des Schaltplans GLEICH dazuschreibst, welche Änderung Du warum machstplanstnötigfindest - dann muss man nicht so ins Blaue raten.

Jason07
21.03.2013, 15:21
24883Ahh okay, dass erklärt es gut danke, irgendwie ist der Post vorhin untergegangen.

- - - Aktualisiert - - -

So hier ist der aktuelle Schaltplan, die Änderungen sind schon gemacht. Jetzt ist auch am Port 2D eine Rising Edge von 0V auf 3,8 V Messbar, aber es gibt trotzdem kein Interrupt.

Hier noch der neue Code mit D als Eingang:


.include "m32def.inc"

.def temp1 = r16

.org 0x000
rjmp main
.org 0x002
rjmp int0_handler ;IRQ0 Handle

int0_handler:
ldi temp1, 0b00010000 ;PortC5 HIGH, rest LOW
out PortC, temp1
reti

main:
ldi temp1, 0x00 ;Port D auf Ausgang
out DDRD, temp1
ldi temp1, 0x00 ;Port D auf LOW
out PORTD, temp1

ldi temp1, 0xFF ; PortC auf Ausgang
out DDRC, temp1
ldi temp1, 0b00000000 ;PortC Pullup LOW
out PortC, temp1

in temp1, GICR
ori temp1, 0b01000000 ;INT0 = 1
andi temp1, 0b11111101 ;IVSEL = 0
out GICR, temp1
in temp1, MCUCR ;INT0 Aktivieren
ori temp1, 0b00000011 ; rising Edge
out MCUCR, temp1
sei

ende: rjmp ende



Gibt das Komplikationen dass ich den ganzen Port auf Ausgang gesetzt habe? Weil PortD Pin 0 und 1 für die Rs232 Schnitstelle und pin 4 und 5 für den Motortreiber genutzt werden.

Sry für das durcheinander ;)

Searcher
22.03.2013, 07:58
Gibt das Komplikationen dass ich den ganzen Port auf Ausgang gesetzt habe?
Für alle Ports, die nicht genutzt werden, würde ich vorschlagen, sie auf Input zu konfigurieren -sind sie sowiso schon nach Power On Reset und zusätzlich den Pullup Widerstand einzuschalten um den Eingang auf definiertes Potential zu legen. Dann können auch unabsichtliche Berührungen oder falsche Beschaltungen den Port nicht so leicht zerstören.

Zur Schaltung: "Normalschaltung" für den Taster ist: PD2 - Taster - GND, PD2 als Input, Pullup für PD2 einschalten. Dann legt der Taster bei Betätigen das GND Potential an den PD2. Müßte der INT0 dann auf falling edge konfiguriert werden.

Wenn der Taster aber wie im Schaltbild VCC schalten soll, kannst Du den 1k Widerstand durch einen viel größeren ersetzen. zB 10k oder noch besser 22k. Dann werden auch die gemessenen 3,8V näher an die 5V rankommen. Der 1k bzw 22k ist als Pulldown Widerstand eingesetzt, der bei offenem Taster ja nur dem PD2 ein definiertes Potential geben soll.


Hab mir Dein letztes Programm nicht genauer angeschaut. Nimm Dein zuerst gepostetes und laß folgende Zeilen weg und benutz obige Schaltung mit dem 10k oder 22k Pulldown.:


ldi temp1, 0xFF ;Port D auf Ausgang
out DDRD, temp1
ldi temp1, 0x00 ;Port D auf LOW
out PORTD, temp1

Wie erkennst Du daß kein Interrupt ausgeführt wird. An das Abschalten des Jtags hast du gedacht:confused: - der benutzt PC4.


ldi temp1, 0b00010000 ;PortC5 HIGH, rest LOW
Das ist nicht wie im Kommentar angegeben der PC5 sondern PC4

Gruß
Searcher