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 ?
Code:
$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
Danke
Lesezeichen