froginho
22.01.2010, 17:50
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:
$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
der komplettheit halber habe ich mal das ganze programm aufgelistet.
*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:
$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.
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:
$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
der komplettheit halber habe ich mal das ganze programm aufgelistet.
*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:
$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.