Der Wahnsinn kommt wieder über mich selbst das Einfachst Programm zum Abfahren einer Strecke funktioniert nicht. Ich weiß keinen rat mehr weiß einer
Wo ein Fehler stecken könnte ?
DankeCode:$regfile = "m128def.dat" 'es handelt sich um einen ATmega128 $framesize = 42 $swstack = 32 $hwstack = 32 $crystal = 14745600 'Systemtakt 14.7456 MHZ Encoderled Alias Portb.0 'es wird auf beide Encoder der Radencoder Config Encoderled = Output 'zugegriffen Encoderleft Alias Pine.7 Config Encoderleft = Input Encoderleft = 1 Encoderright Alias Pine.6 Config Encoderright = Input Encoderright = 1 Motorleft Alias Portb.6 'Motor-PWM-Leitung-Links Config Motorleft = Output Motorright Alias Portb.5 'Motor-PWM-Leitung-Rechts Config Motorright = Output Motorenable Alias Portb.7 'Motorenable Config Motorenable = Output Encoderled = 0 'Die Encoder-Leds sind wieder über Ground Angeschlossen Motorenable = 0 'Motoren sind aus Declare Sub Moveatspeed(byval Sleft As Byte , Byval Sright As Byte) 'Stelt die Motor-PWM ein Declare Sub Encled(byval Status As Byte) 'schaltet die Encoder-Led bei 1 ein Declare Sub Intodometrie() 'konfiguriert die Encoder der Odmetrie Declare Sub Go(byval Speed As Byte , Byval Dis As Word) 'Roboter fährt eine bestimmte Strecke in cm Dim Encleft As Word 'der Zwischenspeicher für die Werte des linken Odometrie Encoders Dim Encright As Word 'der Zwischenspeicher für die Werte des rechten Odmetrie Encoders Dim Encoderenable As Byte 'nur wenn diese Varriable 1 werden die Odometrie-Encoder-Impulse gezählt Encoderenable = 1 'Die Odometrie-Encoder-Impulse werden im Grundzustand gezählt Call Intodometrie() Call Go(220 , 1000) Do Loop End Sub Encled(byval Status As Byte) 'Eigentlich unnötig aber der Vollständigkeit halber If Status = 1 Then Encoderled = 1 Elseif Status = 0 Then Encoderled = 1 End If End Sub Sub Intodometrie() 'Konfiguriert die Odometrie Encleft = 0 'Encleft wird zurückgesetzt Encright = 0 'Encright wird zurückgesetzt Encoderenable = 1 'die Odometrie-Encoder-Impulse können nun gezählt werden Call Encled(1) 'die Encoder-Leds werden eingeschaltet On Int7 Encoleft 'wenn ein Impuls vom linken Encoder kommt zu Encoleft springen On Int6 Encoright 'wenn ein Impuls vom rechten Encoder kommt zu Encoright springen Config Int7 = Falling 'springen wenn Ground ist Config Int6 = Falling 'springen wenn Ground ist Enable Int7 'Int7 freischalten Enable Int6 'Int6 freischalten Enable Interrupts 'Interrups aktivieren End Sub Sub Moveatspeed(byval Sleft As Byte , Byval Sright As Byte) 'Sub zur Regelung der Motorgeschwindikeiten Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1 'Timer 1 wird als zwei 8-Bit PWM Leitungen mit dem Prescaler 1 konfiguriert Start Timer1 'Timer 1 wird gestartet Motorenable = 1 'Motoren werden entsperrt Compare1a = Sright 'PMW-A entspricht der linken Geschwindikeit Compare1b = Sleft 'PWM-B entspricht der rechten Geschwindikeit End Sub Sub Go(byval Speed As Byte , Byval Dis As Byte) Local Strecke As Long Local Relencoder As Long Local Encodersp As Long Call Moveatspeed(speed , Speed) Encleft = 0 Encright = 0 Strecke = Dis / 12 Strecke = Strecke * 6 Strecke = Strecke * 2 Do Relencoder = Encleft + Encright Relencoder = Relencoder / 2 Loop Until Relencoder >= Strecke Call Moveatspeed(128 , 128) Waitms 10 End Sub Encoleft: 'Interrupt-Rotine die ausgelöst wird wenn links ein Odometrie-Encoder-Impuls kommt If Encoderenable = 1 Then Encleft = Encleft + 1 End If Return Encoright: 'Interrupt-Rotine die ausgelöst wird wenn rechts ein Odometrie-Encoder-Impuls kommt If Encoderenable = 1 Then Encright = Encright + 1 End If Return







Zitieren

Lesezeichen