Hallo, ich wollte eigentlich einen Steuerung Programmierern die es
möglichst macht meinen Motor rechts und links laufen zulassen.
Hardware: Zwei Poti als Spanungsteiler aufgebaut mit mittel abrief und
(Ua 2,5V bis 4,9V) an ADC0 angeschlossen und wenn sich die potis bewegen
soll der Motor der ATmega16 erkennen ob die Spannungsteiler oder sinkt.
Problem ab einer schwellspannung von 3.95V schaltet die LED2 ein und der
ist es egal ob die Spannung steigt oder sinkt und das gleiche unter
3.95V bei LED1.
Programm:
.include "m16def.inc" ;Header Atmega16
rjmp Init ;ueberschringen der Interrupt
;- Laden des Ausgabe PortC0-1
;- Initialisieren des ADU-ADC0
;- ADU- Vorteiler 64 bei 16Mhz
;- Rechtschiebendes Low High Reg.
Init: LDI r16,255
OUT ddrC,R16
OUT ddrd,R16
OUT portd,R16 ;Test Leuten
LDI r16,0b01000000
OUT adMUX,r16
LDI r16,0b10000110
OUT adcSR,r16
;- Programm Starten
;- ADU Starten und warten bis die Wandelung abgeschlossen ist
Adu: SBI adcSR,6
Warte: IN r16,adcSR
SBRS r16,4
rjmp Warte
;- Vergleichen des Vorgaengerwertes
;- Wenn Vorgaengerwerte vorhanden dann Sprung zu Vergleichen der High
Reg.
;- Wenn keiner da ist dann in R0-R1 Init. und Bit setzen in r30
CPI r30,1
BREQ VergH
LDI r30,1
IN r0,adcL
IN r1,adcH
rjmp Adu
;- Vorgangswert - Aktueller wert ;==;=-;=+
;- bei == muss das Lowbitreg. noch verglichen (Sprung VergL) werden
ansonsten reicht
;- das aus um die Drehrichtung zu bestimmen
VergH: IN r2,adcL
IN r3,adcH
CP r1,r3
BREQ VergL
;- Pruefen des High Speichers <;> des Vorwertes
SUB r3,r1 ;- Aktueller wert - Vorhergehender wert
BRMI OutL ;- Aktueller wert < Vorhergehender wert = Linkslauf
BRPL OutR ;- Aktueller wert > Vorhergehender wert = Rechtslauf
;- Vergleichen Lowbitreg. bei == Motor aus und neu messen
VergL: CP r2,r0
BRNE LowSub
LDI r16,0
OUT portC,r16
rjmp Adu
;- Pruefen des Low Speichers <;> des Vorwertes
LowSub: SUB r2,r0 ;- Aktueller wert - Vorhergehender wert
BRMI OutL ;- Aktueller wert < Vorhergehender wert = Linkslauf
BRPL OutR ;- Aktueller wert > Vorhergehender wert = Rechtslauf
;- Ausgabe Linkslauf == 1; Rechtslauf == 2
OutL: LDI r16,1
OUT portC,r16
rjmp Adu
OutR: LDI r16,2
OUT portC,r16
rjmp Adu
Danke für eure Hilfe im Voraus
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.