olá!
es geht um den prozessor 80C537.
ich will ein fahrzeug so steuern, daß es einer linie folgt.
an der unterseite befinden sich drei dicht nebeneinander liegende optische sensoren.
ich lasse im normalfall das fahrzeug geradeaus laufen.
bekommt der rechte sensor kein signal (von der linie abgekommen; zb. kurve), lasse ich das fahrzeug links laufen; bekommt der linke sensor kein signal, lasse ich das fahrzeug rechts laufen. bis alle Sensoren wieder auf der linie sind und das fahrzeug geradeaus weiterfährt.
mit ner 'normalen' abfrage der Sensoren habe ich das auch einigermaßen hinbekommen. nun will ich das aber über interrupts regeln.
da klappt das dann nicht mehr.
das fahrzeug fährt geradeaus auf der linie; bekommt ein sensor kein signal (von der linie) mehr, hält das fahrzeug komplett an, statt rechts bzw links zu laufen.
hier mal mein quell_code:
der komplettheit halber habe ich mal das ganze programm aufgelistet.Code:$processor(80537) ljmp 8100h org 0003h ljmp LINKS org 0013h ljmp RECHTS org 8100h setb EX0 setb EX1 mov ip0, #03h mov ip1, #03h setb EAL *MAIN* lcall ZEIT cpl p1.0 cpl p1.1 lcall ZEIT cpl p1.2 cpl p1.3 ljmp MAIN *LINKS* lcall SLOW cpl p1.0 lcall SLOW cpl p1.2 reti *RECHTS* lcall SLOW cpl p1.1 lcall SLOW cpl p1.3 reti *ZEIT* mov R3, #73h *ZWO* mov R2, #73h djnz R2, $ djnz R3, ZWO ret *SLOW* mov R3, #99h *DRE* mov R2, #99h djnz R2, $ djnz R3, DRE ret end
*main* ist das eigentliche hauptprogramm, mit dem die zwei Schrittmotoren angesteuert werden; im interruptfall sollen die unterprogramme *LINKS* oder *RECHTS* aufgerufen werden.
*ZEIT* und *SLOW* sind einfach zwei unterprogramme, die eine warteschleife beinhalten, um den motor richtig laufen zu lassen.
die programme zur motorsteuerung laufen (habs ja in einem anderen programm erfolgreich getestet).
ich hab nur diese interruptgeschichte (zu beginn des programms) irgendwie falsch gemacht.
oder im interrupt-fall müssen die unterprogramme einfach anders eingebunden werden, als bei einer 'normalen' abfrage.
also der fehler ist irgendwo hier:
Code:$processor(80537) ljmp 8100h org 0003h ljmp LINKS org 0013h ljmp RECHTS org 8100h setb EX0 setb EX1 mov ip0, #03h mov ip1, #03h setb EAL
mit setb EX0 bzw EX1 lasse ich die interrupts von port 3.2 und 3.2 zu.
mit den mov-befehlen regel ich die priorität (versuche es; hab da kaum ahnung).
mit setb EAL erlaube ich grundsätzlich das ausführen von interrupts.
mit org 0003h und dem anschliessendem ljmp-befehl, rufe ich im interruptfall das entsprechende programm auf.
hoffe, daß das einigermaßen verständlich war.
ansonsten gerne nochmal fragen.
danke und grüße.
Lesezeichen