Ich hab jetzt eigentlich alles fertig ausser die Funktionen zur regullierten Fahrt. Mir macht die funktion zum Feradefahren zu schaffen. Er will einfach nicht gerade fahren. Kann irgendtjemand einen Fehler finden. danke.
Code:$regfile = "m128def.dat" 'es handelt sich um einen ATmega128 $framesize = 42 $swstack = 32 $hwstack = 32 $crystal = 14745600 'Systemtakt 14.7456 MHZ $baud = 19200 'UART Übertragungsgeschwindigkeit Encoderled Alias Portb.0 'es wird auf beide Encoder der Radencoder Config Encoderled = Output 'zugegriffen 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 und setzt Encleft und encright auf null Declare Sub Geradefahren() 'vergleicht die Odometriewerte und regelt nach 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 Dim Sw0ys As Long 'Stopwatch 0 wird für die Sub Gerdefahren benötigt Dim Sw0ms As Long Config Timer3 = Timer , Prescale = 8 'Timer 3 (Stopwatches) wird als Timer eingestellt und mit den Prescaler 8 versehen Timer3 = 63693 'Timer 3 wird auf 63693 eingestellt dies passiert auch nach jedem Interrupt On Ovf3 On_ovf3 'wenn Timer 3 überläuft springt das Programm zu On_ovf3 Enable Ovf3 'der Overflow von Timer 3 wird aktiviert Enable Interrupts 'Interrups werden eingeschaltet Start Timer3 'Timer 3 wird gestartet Call Intodometrie() Do Call Moveatspeed(240 , 240) Call Geradefahren() 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 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 ein Impuls abgeschlossen ist Config Int6 = Falling 'springen wenn ein Impuls abgeschlossen ist Enable Int7 'Int7 freischalten Enable Int6 'Int6 freischalten Enable Interrupts 'Interrups aktivieren End Sub Sub Geradefahren() 'Sub für die Gerade Fahrt des Roboters Local Encdif As Integer 'Lokale Varriable für den Unterschied von Encleft und Encright Local Encregler As Integer 'Lokale Varriable für das nachregeln der Geschwindigkeit Sw0ms = Sw0ys / 10 'die ys von Stopwatch 0 werden in ms umgewandelt If Sw0ms = 10 Then 'sind 10ms vergangen ? Sw0ys = 0 'Stopwatch 0 zurück setzen If Encleft > Encright Then 'werden mehr Odometrie-Encoder-Impulse links gezählt ? Encdif = Encleft. - Encright 'Encoder Differenz berechnen Encregler = Encdif * 0.1 'Nachregelungsvarriable berechnen, diese berechnet sich aus 10% der Encoder Differenz Compare1a = Compare1a + Encregler 'PWM-Links um Nachregelungsvarriable erhöhen Compare1b = Compare1b - Encregler 'PWM-Rechts um Nachregelungsvarriable verringern Encleft = 0 Encright = 0 Elseif Encleft < Encright Then 'werden mehr Odometrie-Encoder-Impulse rechts gezählt? Encdif = Encright - Encleft 'Encoder Differenz berechnen Encregler = Encdif * 0.1 'Nachregelungsvarriable berechnen Compare1a = Compare1a - Encregler 'PWM-Links um Nachregelungsvarriable verringern Compare1b = Compare1b + Encregler 'PWM-Rechts um Nachregelungsvarriable erhöhen Encleft = 0 Encright = 0 End If End If 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 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 On_ovf3: 'Hierher wird wenn Timer 3 überläuft Timer3 = 63693 Sw0ys = Sw0ys + 1 If Sw1enable = 1 Then Sw1ys = Sw1ys + 1 End If Return







Zitieren

Lesezeichen