Forum: Mikrocontroller und Digitale Elektronik ADU-Motor Drehsinn


von Manu (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.