PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt bei H/L Flanke



Static
28.12.2004, 22:45
Nabend,
ich benutze einen Mega32 AVR und möchte damit das Signal von meiner Lichtschranke auswerten. Mit Assembler funktionierts schon, allerdings krieg ich da das LCD nicht zum laufen und die LEDs reichen nichtmehr aus. Also habe ich es mit Bascom Probiert:


$regfile = "m32def.dat"
$crystal = 16000000

Config Portd = Input
Config Portc = Output

Dim Zahler As Integer

On Int0 Unterbrechung
Config Int0 = Falling 'Interrupt 0 bei H/L-Flanke auslösen
Enable Int0 'Externen Interrupt 0 einschalten
Enable Interrupts 'Interrupts global zulassen


Do 'Hauptschleife

Loop
'---------------------------------------------------------
Unterbrechung: 'Int0-Routine
If Pind.3 = 0 Then
Incr Zahler
Else
Decr Zahler
End If
Return
Bei einem Wechsel von High auf Low soll die Interruptroutine "Unterbrechung" aufgerufen werden, die dann etscheidet was weiter zu tun ist. Doch soweit kommt es nicht, denn Bascom meldet beim Kompilieren:
"Error: 219 Line: 11 INT0-INT3 are always low level triggered in the MEGA"
Was meiner Meinung falsch ist, denn Assembler kann den Intterupt ja auch bei einer H/L Flanke auslösen... Was soll ich denn mit einem Low Level Interrupt? Meint der das ernst, oder verstehe ich diese Fehlermeldung falsch?

RCO
28.12.2004, 23:39
Das verstehe ich auch nicht, aber du bist scheinbar nciht der einzige mit diesem Problem:

http://www.grote.net/bascom/msg20413.html

Bei mir erscheint die selbe Fehlermeldung. Bei anderen Programmen von mir kann ich das beliebig setzen, scheint ein Problem der Megas zu sein oder nur des Mega32.

Aber wie die Fehlermeldung sagt, sollte das kein Problem sein, denn "Low level triggert" heißt doch eine H/L-Flnake oder?

MFG Moritz

Static
29.12.2004, 06:29
ja, wenn man eine andere *def.dat einfügt geht es. Ich weiß nich aber wenn er low level Triggered ist, wird der Interrupt doch immer dann ausgelöst wenn der zugehörige Port 0 ist. Ist das das selbe wie H/L Triggered?

sebastian.heyn
29.12.2004, 08:28
Hallo,
mit dem MEGA8 und MEGA128 funktionierts. Das ist komisch, naja aber wenn du unbedingt diesen MEGA benutzen willst mach doch ne einfache Emitterstufe davor, also das du ne 180° Phasendrehung kriegst.

Static
29.12.2004, 11:20
Hmmm, merkwürdig. Dann ist wohl die m32.def Fehlerhaft. Wie gesagt in Assembler gehts sehr gut, also liegts nicht am Mega32 bzw. Bascom hat eigentlich keinen Grund diese Meldung zu geben ....
Dann werde ich wohl den Zählerstand über UART in Assembler an den Pc schicken, allerdings muss ich so oder so irgendwann Bascom benutzen.
Oder ist es vielleicht möglich das Assembler Programm parallel zu nem Basic Programm laufen zu lassen \:D/ ? lol

sebastian.heyn
29.12.2004, 12:37
Ich glaube du kannst in Bascom auch assembler-code laufen lassen

RCO
29.12.2004, 13:25
Probier doch erstmal aus, ob das nicht mit dem Low level triggert genau das ist was du willst, also H/L. Würde mich nämlich auch für spätere Projekte interessieren ;-)

MFG Moritz

vish
29.12.2004, 13:28
Du brauchst dem Bascom - Compiler noch nicht einmal zu sagen, dass es sich um Assemblerbefehle handelt. Du kannst, also Basiccode mit Assemblercode mischen. Du solltest nur auf die Lesbarkeit und darauf achten, dass du bei den Assemblerbefehlen SUB, SWAP und OUT ein "!" davor stellst, ansonsten interpretiert der Compiler sie als normale Basic Befehle.

Eine weiter Möglichkeit wäre, die Compilerdirektiven $asm und $end Asm zu benutzen.

$asm
[hier steht ganz viel Assemblercode]
$end Asm

Funktioniert beides gleich gut, jedoch finde ich letzteres übersichtlicher.

uwe2
29.12.2004, 15:56
So jetzt hab ich mich hier auch mal angemeldet.
Zu Deinem Problem: Das scheint wirklich ein Fehler in der m32def zu sein. Du kannst ihn aber leicht umgehen, wenn Du die Einstellung direkt in dem entspr. Register vornimmst und zwar so:
Die Zeile Config Int0=Falling löschen und dafür
mcucr.0=0
mcucr.1=1
Das bewirkt genau das gleiche.
Ob mit "Low Level Triggered" das gleiche gemeint ist kann ich nicht sagen, es gibt aber einen Modus, da wird der Interrupt solange ausgeführt wie der Pegel Low ist, also ständig wiederholt(Ich glaube das ist die Grundeinstellung nach einem Reset.)

Gruß
Uwe

Static
29.12.2004, 15:59
lol, vielen Dank das man Assembler in Bascom benutzen kann könnte nochmal nützlich werden. Aber diesmal ging es auch einfacher. Bascom meint zwar die Interrupts wären low level triggered, aber wenn ich in dem Entsprechenden Register die Intterupts auf H/L triggered stelle gehts trotzdem \:D/
wenn ihr versteht was ich meine...
Hab das also so gemacht:

Mcucr = 00001010 'Interrupt 0 und 1 bei H/L-Flanke auslösen

Jetzt funktioniert mein Drehsensor endlich, freu =P~

stonymontana
28.11.2007, 10:27
Halli hallo ... ich hätte dazu auch noch mal eine Frage und wollte nicht gleich n neuen topic dafür aufmachen.

Ich habe einen Atmel Mega 8 und eine OPB708 Reflektionslichtschranke und möchte gerne damit eine Drehzahlmessung basteln. Programmieren würde ich das ganz gerne in C wo ich aber auch noch in den Kinderschuhen stecke. Das Hell/Dunke-Raster befindet sich am Umfang eines Plattenspielertellers und die Rotationsgeschwindigkeit wird auch in dem Rahmen ablaufen.

Meine erste Frage wäre, wie berechne ich den Vorschaltwiderstand welchen ich ja wahrscheinlich brauche ???

Hat einer einen fertigen Quelltext für eine solche Drehzahlerfassung welchen ich mir anschauen könnte um davon zu lernen und auf meinen uController zu übertragen ???

Wäre super wenn mir einer weiterhelfen könnte.

Lg René