PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt problem!



Jannek
12.05.2007, 18:23
Hallo liebe Robotergemeinde!
Heute mal mein erster post hier. Habe schon sehr viel hier gelesen und muss sagen WOW.
Aber nun zu meinen Problem.
Spiele momentan ein wenig mit Bascom rum und Bastele momentan an einen kleinen Projekt. Damit der Code auch wann funzt Arbeite ich gernen immer zuerst kleine Teile des Programmes aus um mich mit Bascom etc genauer vertraut zu machen.


Kurz zur Funktion:
Der Kontroller macht nichts aus das am LCD "in Schleife "steht. Bis ein Interrupt an INT0 kommt. Dann soll es ausgeben Interrupt und soll bei jeden Interrupt eine Var erhöhen und im gleichen anzeigen. Das Problem ist das er bei jedem Interrupt die Variable um 2 erhöht und nicht um 1.
hier der Code:


$regfile = "m8def.dat" '
$crystal = 10000000 'Quarz: 10,0 MHz

'---Config für LCD -----------------
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , Rs = Portb.4 , E = Portb.5
Config Lcdbus = 4
Config Lcdmode = Port
Cursor On

'******** Initialisierung ********
Dim A As Byte
Enable Interrupts
Config Int0 = Falling
Enable Int0
On Int0 Irq

Config Portd.2 = Input 'interrupt

'Debounce Portd.2 , 1 , Irq


'******** Hauptprogramm ********

Do
Cls
Locate 1 , 1
Lcd "in schleife"
Wait 2

Loop


'******** Unterprogramme ********
Irq:
Cls
Incr A
Locate 1 , 1
Lcd " Interrupt"
Lowerline
Lcd " A = " ; A ; ""
Wait 1
Return
End


würde mich freuen wenn ich von euch ein wenig hilfe bekommen könnte.

mfg Jannek

Vitis
13.05.2007, 22:32
könnte an Tastenprellen liegen,
such mal im Forum unter entprellen.

Jannek
13.05.2007, 22:37
Das mit dem Entprellen habe ich mir auch schon gedacht aber verstehe nicht warum das so sein soll. Und wie soll man den einen Interrupt Entprellen?
Stellt man zb den INT0 auf Rising so springt er doch sofort nach der steigenden Flanke in das Interruptprogramm. Läßt man dort das Programm zb eine sek. pausieren, so wäre das mit dem Prellen ja nicht ganz möglich oder?

mir fällt auch nichts mehr zu dem Problem ein, hab schon sehr viel versucht...

würde mich noch über witere Hilfen freuen.
mfg Jannek

Ratber
13.05.2007, 22:45
Ja,denkt man :D

Bau mal aus Spaß einen weiteren Zähler ein der dir anzeigt wie oft die Interruptroutine angesprungen wird.

Jannek
13.05.2007, 23:02
Also habe gerade noch mal geschaut und so wie ich es am anfang hatte, wurde die Interruptroutine IMMER 2 mal aufgerufen.
Habe es jetzt mal so ausprobiert das in der Interruptroutine ein Debouncebefehl steht der dann sofort weiterverweißt. Funktioniert komischerweise. Zwar nicht ganz die feine Art aber ist ja mal ein ansatz.

Vitis
13.05.2007, 23:07
die ISR wird vermutlich 2-mal nacheinander angesprungen,
weil seine ISR mit den LCD-Befehlen ja im Verhältnis
ewig lange ist und eben während der ISR der Int durch Prellen
nochmal ausgelöst wird.
Der Event wird dann nach Verlassen der ersten Runde gleich
wieder angesprungen.
Währ die ISR kürzer ging der Zähler vermutlich auf 50 oder was
hoch durchs Prellen.

Ratber
13.05.2007, 23:12
@Jannek

Na also,jetzt hast du sicher auch einen weiteren Wissensbaustein aufgenommen.

Ein IRQ kann auch in einer INT-Routine aufgerufen werden.
Deswegen müllt man diese nicht mit Zeitraubenden Befehlen (zb. LCD-Ausgaben) voll sondern nur mit dem allernötigsten (Am besten nur "Flags" setzen und raus) und erledigt die Auswertung ausserhalb.

Es ginge auch wenn du am Anfang der INT-Routine den INT0 abschaltest und am Ende wieder ein.
Dann kann dir wenigstens kein weiterer INT0 in die Quere kommen bis die Routine erledigt ist.

Das Entprellen nimmt dir das natürlich nicht ab,da mußt du selber noch nachlegen.
Es geht auch "Oldscool" händisch ohne "Debounce.....".
Das würde ich aber auch "Extern" erledigen weil....................



........"Im INT gilt das gleiche wie am Telefon.Fasse dich kurz" ;)

Gute Nacht.

Jannek
13.05.2007, 23:26
Erst mal danke für die Antworten!! Das man sich im IRQ kurz fassen sollte wußte ich bereits. Aber da bei meiner ziel Anwendung sehr viel Zeit zur verfügung steht (ca 20 sek) dachte ich, das ich damit so Arbeiten könnte... sollte ja nicht so sein!
werde dann schon mal die nächste Frage erstellen dann zum Thema EEPROM.
Ja da komme ich leider auch nicht weiter und habe da die ein oder andere Frage warum mein Ansatz nicht Funktioniert!!

mfg Jannek