Pro-bot 128 Bascom Libary:

Bascom- Lib
Hier die Lib zu downloaden
Pro-Bot128Lib.txt
Text Dokument 15.2 KB

'Pro-Bot 128 Libary für Bascom von Martinius11
'Ich danke allen die mir dabei geholfen haben diese Lib zuschreiben
'Besonderrst Radbruch möchte ich für seine unermüdliche Hilfe 'danken
'Diese Lib ist Open Source darf kopiert und geändert werden
'dafür hab ich sie ja schließlich geschrieben





$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

Tsop Alias Pind.2       'Der Tosp ist im Grundzustand High man 'muss nach low
Config Tsop = Input       'abfragen

Ir Alias Porte.3       'PWM-Kanal der Ir-Dioden
Config Ir = Output

Encoderled Alias Portb.0       'es wird auf beide Encoder der 'Radencoder
Config Encoderled = Output       'zugegriffen

Frontled Alias Portc.4       'Linien-Led
Config Frontled = Output

Frontlled Alias Portc.3       'Led vorne links
Config Frontlled = Output

Frontrled Alias Portc.2
Config Frontrled = Output       'Led vorne rechts

Backlled Alias Portc.1       'Led hinten links
Config Backlled = Output

Backrled Alias Portc.0       'Led hinten rechts
Config Backrled = Output

Buzzer Alias Portb.4       'Der Bruzzer
Config Buzzer = Output

Irledleft Alias Portd.3       'Man schaltet den Ausgang auf Ground 'um die Ir-Leds
Config Irledleft = Output       'zum leuchten zubringen, wenn der 'Pwm-Pin High ist

Irledright Alias Portd.5       'Siehe Irledleft
Config Irledright = Output


Taster Alias Pine.4       'Der Boot-Taster kann hier mit abgefragt 'werden
Config Taster = Input
Porte.4 = 1       'interner Pull-Up wird eingeschaltet

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





Declare Sub Intprobot()
Declare Sub Moveatspeed(byval Sleft As Byte , Byval Sright As Byte)       'Stelt die Motor-PWM ein
Declare Sub Lineled(byval Status As Byte)       'schaltet die Lienen 'Led bei 1 ein
Declare Sub Flled(byval Status As Byte)       'schaltet die vordere 'linke bei 1 Led ein
Declare Sub Frled(byval Status As Byte)       'schaltet die vordere 'rechte bei 1 Led ein
Declare Sub Blled(byval Status As Byte)       'schaltet die hintere 'linke bei 1 Led ein
Declare Sub Brled(byval Status As Byte)       'schaltet die hintere 'rechte bei 1 Led ein
Declare Sub Encled(byval Status As Byte)       'schaltet die 'Encoder-Led bei 1 ein
Declare Sub Bruzzer(byval Ton As Byte , Byval Laenge As Byte)       'gibt einen Ton über den Bruzzer aus
Declare Sub Intodometrie()       'konfiguriert die Encoder der 'Odmetrie
Declare Sub Motorstop()       'setzt Motor-PWM auf 128,128
Declare Sub Geradefahren()       'vergleicht die Odometriewerte und 'regelt nach
Declare Sub Acslow()       'setzt die Acs-Reichweite auf Low
Declare Sub Acsmid()       'setzt die Acs-Reichweite auf Middle
Declare Sub Acshigh()       'setzt die Acs-Reichweite auf High
Declare Sub Acsoff()       'setzt beide Acs-Led-Eingänge auf High
Declare Sub Sw1stop()       'Stoppt Stoppuhr1
Declare Sub Sw1start()       'Startet Stoppuhr 1
Declare Sub Sw1reset()       'Resetet Stoppuhr 1
Declare Sub Go(byval Speed As Byte , Byval Dis As Word)       'Roboter fährt eine bestimmte Strecke in cm

Declare Function Getmicro() As Word       'frägt das Micro ab
Declare Function Getlsl() As Word       'frägt den linken Lichtsensor
Declare Function Getlsr() As Word       'frägt den rechten 'Lichtsensor ab
Declare Function Getlinel() As Word       'frägt den linken Linien-'Sensor ab
Declare Function Getliner() As Word       'frägt den rechten Linien-'Sensor an
Declare Function Getakku() As Word       'frägt die Akku-Spannung 'ab
Declare Function Acsleft() As Byte       'frägt ab ob links ein Objekt 'ist
Declare Function Acsright() As Byte       'frägt ab ob rechts ein 'Objekt ist
Declare Function Sw1ms() As Long       'rechnet Sw1 in Ms um
Declare Function Sw1s() As Word       'rechnet Sw1 in Sekunden 'um
Declare Function Sw1m() As Byte       'rechnet Sw1 in Minuten um
Dim Acspwm As Byte       'für das Acs wird ein 8-bit Timer 'verwendet
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 Sw0ys As Long       'Stopwatch 0 wird für die Sub Gerdefahren 'benötigt
Dim Sw0ms As Long       'der ys-Wert der Stopwatch0 wird in 'dieser Varriablen gespeichert
Dim Pulsanzahl As Byte       'nötig für das einpendeln des 'Acs-Impulses (Danke Radbruch)
Dim Sw1ys As Long       'der Speicher der Stopwatch1 Timer3 'erhöht diese Variable jede ys
Dim Sw1enable As Byte       'nur wenn diese Varriable 1 ist erhöht 'Timer 3 Sw1ys
Dim Encoderenable As Byte       'nur wenn diese Varriable 1 werden 'die Odometrie-Encoder-Impulse gezählt






Sub Intprobot()
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

Config Timer2 = Timer , Prescale = 8       'Timer 2 (Acs-PWM) wird 'als Timer eingestellt und mit dem Rescaler 8 versehen
Timer2 = Acspwm       'Timer 2 wird auf die Varriable Acspwm 'eingestellt um die Reichweite verändern zu können
On Ovf2 On_ovf2       'wenn Timer 2 überläuft springt das 'Programm zu On_ovf2
Enable Ovf2       'der Overflow von Timer 2 wird aktiviert
Enable Interrupts       'Interrups werden eingeschaltet
Start Timer2       'Timer 2 wird gestartet

Sw1enable = 0       'Stopwatch 1 ist im Grundzustand aus
Encoderenable = 1       'Die Odometrie-Encoder-Impulse werden im 'Grundzustand gezählt
Irledleft = 1
Irledright = 1
Frontled = 1       'Da die Leds über Vcc angeschlossen wird sind die 'Leds somit aus
Frontlled = 1
Frontrled = 1
Backlled = 1
Backrled = 1
Encoderled = 0       'Die Encoder-Leds sind wieder über Ground 'Angeschlossen
Motorenable = 0       'Motoren sind aus
End Sub




Sub Lineled(byval Status As Byte)       'da die Leds über Vcc 'angschlossen sind sind sie bei low ein und high aus diese Sub 'korrigiert das


If Status = 1 Then       'Wenn 1 dann soll die Led ein sein also Frontled = 0

   Frontled = 0

   Elseif Status = 0 Then       'Das ganze anderst herum

    Frontled = 1
    End If

End Sub




Sub Flled(byval Status As Byte)       'siehe Lineled(Status)

If Status = 1 Then

   Frontlled = 0

   Elseif Status = 0 Then

   Frontlled = 1

 End If

End Sub





Sub Frled(byval Status As Byte)       'siehe Lineled(Status)

   If Status = 1 Then

   Frontrled = 0

   Elseif Status = 0 Then

   Frontrled = 1

   End If

End Sub




 Sub Blled(byval Status As Byte)       'siehe Lineled(Status)
  If Status = 1 Then
  Backlled = 0
  Elseif Status = 0 Then
  Backlled = 1
  End If

End Sub




Sub Brled(byval Status As Byte)       'siehe Lineled(Status)

If Status = 1 Then
Backrled = 0
Elseif Status = 0 Then
Backrled = 1
End If
End Sub

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 Motorstop()
Call Moveatspeed(128 , 128)       'Stoppt den Motor da bei 128 das 'Teillungsverhältniss der Motor-PWM gleich ist das Interpretiert der 'Treibe als Aus
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 Bruzzer(byval Ton As Byte , Laenge As Byte)       'Sub um 'einen Ton über den Bruzzer auszugeben
Local Count As Byte       'Licale Varriable um die Länge zu zählen
For Count = 0 To Laenge       'For-Schleife für die Länge des Tones
Config Timer0 = Timer , Prescale = 8       'Timer 0 (Bruzzer) wird 'als Timer eingestellt und mit dem Prescaler 8 versehen
Timer0 = Ton       'Timer 0 ird mit dem Ton eingestellt (nicht immer 'hörbar!!)
On Ovf0 On_ovf0       'wenn Timer 0 überläuft zu On_ovf0 springen
Enable Ovf0       'Overflow von Timer 0 aktivieren
Enable Interrupts       'Interrups aktivieren
Start Timer0       'Timer 0 starten
Waitms 1  'kurze Verzögerung
Next Laenge       ' Ende der For-Schleife
End Sub


Sub Geradefahren()       'Sub für die Gerade Fahrt des Roboters
Dim Encdif As Integer       'Lokale Varriable für den Unterschied von Encleft und Encright
Dim Encregler As Integer       'Lokale Varriable für das nachregeln
der Geschwindigkeit
Dim Encleftsp As Integer
Dim Encrightsp As Integer
Encleftsp = Encleftsp + Encleft
Encrightsp = Encrightsp + Encright
   
If Sw0ms > 100 Then       'sind 10ms vergangen ?
Sw0ys = 0 'Stopwatch 0 zurück setzen
If Encleftsp > Encrightsp Then       'werden mehr Odometrie-'Encoder-Impulse links gezählt ?
Encdif = Encleftsp - Encrightsp       'Encoder Differenz berechnen
Encregler = Encdif * 0.3       '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
Encleftsp = 0
Encrightsp = 0
Elseif Encleftsp < Encrightsp Then       'werden mehr Odometrie-Encoder-Impulse rechts gezählt?
Encdif = Encrightsp - Encleftsp       'Encoder Differenz berechnen
Encregler = Encdif * 0.3       'Nachregelungsvarriable berechnen
Compare1a = Compare1a - Encregler       'PWM-Links um 'Nachregelungsvarriable verringern
Compare1b = Compare1b + Encregler       'PWM-Rechts um 'Nachregelungsvarriable erhöhen
Encleftsp = 0
Encrightsp = 0
End If
End If
Encleft = 0
Encright = 0
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
Local Encoderleftsp As Long
Local Encoderrightsp As Long
Call Moveatspeed(speed , Speed)
Encleft = 0
Encright = 0
Strecke = Dis / 12
Strecke = Strecke * 6
Strecke = Strecke * 2


Do
While Encleft = 0
!Nop
Wend
While Encright = 0
!Nop
Wend
Encoderleftsp = Encleft + Encoderleftsp
Encoderrightsp = Encoderrightsp + Encright
Call Geradefahren()
Relencoder = Encoderrightsp + Encoderleftsp
Relencoder = Relencoder / 2
Encleft = 0
Encright = 0


Loop Until Relencoder >= Strecke
Call Moveatspeed(128 , 128)
Waitms 10



End Sub




Sub Acslow()       'Sub um die ACS-Rechweite auf geringe 'Reichweite zu setzen
Acspwm = 225
End Sub

Sub Acsmid()       'Sub um die ACS-Reichweite auf mittlere 'Reichweite zu setzen
Acspwm = 228
End Sub

Sub Acshigh()       'Sub um die ACS-Reichweite auf hohe Reichweite 'zu setzen
Acspwm = 231
End Sub

Sub Acsoff()       'Sub um das ACS Auszuschalten
Irledleft = 1
Irledright = 1
End Sub

Sub Sw1stop()       'Sub um Stopwachtch 1 zu pausieren
Sw1enable = 0

End Sub

Sub Sw1start()       'Sub um Stopwatch 1 wieder zu aktivieren
Sw1enable = 1

End Sub

Sub Sw1reset()       'Sub um Stopwatch zu reseten und anzuhalten
Sw1enable = 0
Sw1ys = 0
End Sub

Function Sw1ms()       'Funktion die ys der Stopwatch 1 in ms 'umzurechnen
Sw1ms = Sw1ys / 10
End Function

Function Sw1s()       'Funktion die ys der Stopwatch 1 in s 'umzurechen
Sw1s = Sw1ys / 1000
End Function


Function Sw1m()       'Funktion die ys der Stopwatch 1 in m 'umzurechnen
Sw1m = Sw1ys / 60000
End Function


Function Acsleft()       'Funktion um zu bestimmen ob links ein 'Objekt ist
Irledleft = 0
Irledright = 1
Pulsanzahl = 20
While Pulsanzahl > 0
Wend
If Tsop = 0 Then
Acsleft = 1
End If
Irledleft = 1
Irledright = 1
End Function

Function Acsright()       'Funktion um zu bestimmen ob rechts ein 'Objekt ist
Irledleft = 1
Irledright = 0
Pulsanzahl = 20
While Pulsanzahl > 0
Wend
If Tsop = 0 Then
Acsright = 1
End If
Irledleft = 1
Irledright = 1
End Function

Function Getmicro()       'Funktion um das Mirco abzufragen
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Getmicro = Getadc(3)
End Function

Function Getlsl()       'Funktion um den linken Lichtsensor 'abzufragen
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Getlsl = Getadc(4)
End Function

Function Getlsr()       'Funktion um den rechten Lichtsensor 'abzufragen
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Getlsr = Getadc(5)
End Function

Function Getlinel()       'Funktion um den linken Linensensor 'abzufragen
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Getlinel = Getadc(1)
End Function

Function Getliner()       'Funktion um den rechten Liniensensor 'abzufagen
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Getliner = Getadc(2)
End Function

Function Getakku()       'Funktion um die Akkuspannung abzufragen
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Getakku = Getadc(0)
End Function

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_ovf0:  'Hierher wird gesprungen wenn Timer 0 überläuft
   Toggle Buzzer
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

On_ovf2:  'Hierher wird gesprungen wenn Timer 2 überläuft
Timer2 = Acspwm
Toggle Ir
If Pulsanzahl > 0 Then
 Pulsanzahl = Pulsanzahl - 1
End If
Return

Kommentar schreiben

Kommentare: 0