-         
RSS-Feed anzeigen

Searcher

TT als Linienfolger

Bewerten
Hab das Programm nochmal überarbeitet und ein Video eingestellt. Denke, daß man den TT schon als Linienfolger durchgehen lassen könnte
Code:
'#################################################  ##############################
'File: RC5_Linie_05.bas
'noch nicht ausgereifte Funktionen:
'1. Fernbedienung eines Dreirades mit RC5 Fernbedienung
'2. Linienfolgung
'IDE: BASCOM-AVR Demoversion 1.11.9.8
'
'HW circuit: Linienfolger_mit_FB.aac
'PWM Erzeugung mit Timer1
'TSOP an PB3. BASCOM Kommando Getrc5 nutzt Timer0 !!!
'#################################################  ##############################

$regfile = "attiny45.dat"
$eepleave
$framesize = 32                         'default?
$swstack = 32                           'default?
$hwstack = 36
$crystal = 8000000
$lib "mcsbyte.lbx"                      'only byte operations

Dim Address As Byte , Command As Byte   'variables for getrc5
Dim Rc5_flag As Byte

Dim Average_speed As Byte
Average_speed = 0                       'Durchschittsgeschwindigkeit mit 0 initialisieren

Dim Adc_low As Byte                     'variables for adc result

Config Portb = Input                    'ports initialisieren
Portb = Portb Or &H1F                   'ports mit pullups auf definierten Pegel

Config Rc5 = Pinb.3                     'TSOP at PB3
Config Portb.4 = Output                 'PB4 as output, OC1B, MotorX
Config Portb.1 = Output                 'PB1 as output, OC1A, MotorY

Tccr1 = Tccr1 Or &B01100000             'set PWM1A & OC1A (PB1)
Gtccr = Gtccr Or &B01100000             'set PWM1B & OC1B (PB4) clear TCNT1 on OCR1C match
Ocr1a = 0                               'initialise OCR1A -> low, no pulses at OC1A
Ocr1b = 0                               'initialise OCR1B -> low, no pulses at OC1B
Ocr1c = 249                             'set pwm frq. 8Mhz / 4 / (249 + 1)= 8kHz
Tccr1 = Tccr1 Or &B00000011             'Einschalten TIMER1 - prescaler = 4

Didr0 = &B00110100                      'ADC power save PB2,4,5. PB3 (TSOP) nicht abschalten
Admux = &B10101011                      '1,1V internal reference, ADLAR=1 (left adjusted), PB5 PB2 gain 20
Adcsrb.7 = 1                            'bipolar mode

Adcsra = Adcsra Or &B00001110           'ADC Int. enable, ADC prescaler auf 64 (125000Hz at 8MHz systemclock)
Adcsra.7 = 1                            'turn on ADC

Pcmsk = Pcmsk Or &B00001000             'Pin Change Interrupt PCINT3 auf Pin PB3 TSOP erlauben
Enable Pcint0                           'Setzt PCIE (Pin Change Interrupt Enable) in GIMSK Register

On Adc Adcmessung_to_pwm                'Wenn Messung fertig -> Interrupt
On Pcint0 Set_rc5_flag                  'ISR wenn Pin Change Int. Flag von PB3 TSOP kommt

Enable Interrupts                       'Interrupts generell erlauben


Do                                      'Hauptschleife
   If Average_speed <> 0 Then Power Adcnoise       'Wenn PWM eingeschaltet dann Sensoren messen
                                                   'im noise reduction mode des µC
'hier könnte sich noch ein Bug verstecken, da man nach Datenblatt vorher sicherstellen soll, daß keine Messung läuft

   If Rc5_flag = 1 Then                 'nach interrupt durch TSOP
      Gosub Get_rc5                     'lies RC5 CMD
      Rc5_flag = 0
      Pcmsk = Pcmsk Or &B00001000       'enable interrupts von PB3 (disabled in ISR)
   End If
Loop


Adcmessung_to_pwm:                      'ISR f. ADC Auslesen und Setzen der PWM
   Adc_low = Adch                       'nur 8 bit der Messung nutzen
   If Adc_low.7 = 1 Then                'negativer Wert vom ADC
         Adc_low = Not Adc_low          'umsetzen des 2er Komplements
         Adc_low = Adc_low + 1          'umsetzen des 2er Komplements
         Shift Adc_low , Right , 1      'Trimmen des Meßwertes/Abschneiden Meßschwankungen
         Ocr1a = Average_speed - Adc_low       'PWM Pulsweite setzen
         Ocr1b = Average_speed + Adc_low       'PWM Pulsweite setzen
      Else                              'Meßwert positiv - keine Umwandlung
         Shift Adc_low , Right , 1      'Trimmen
         Ocr1a = Average_speed + Adc_low       'PWM Pulsweite setzen
         Ocr1b = Average_speed - Adc_low       'PWM Pulsweite setzen
   End If
Return

Set_rc5_flag:                           'ISR Pin Change interrupt durch tsop - setzt flag
   Pcmsk = Pcmsk And &B11110111         'disable weitere interrupts von PB3
   Rc5_flag = 1
Return

Get_rc5:                                'Unterprogramm zum FB Kommando auswerten
      Getrc5(address , Command)         'procedure returns FF FF if no RC5 message
      If Address <> &HFF Then           'RC5 Nachricht empfangen then...
         Command = Command And &B01111111       'toggle bit auf Null
         Select Case Command
            Case &H1D : Average_speed = 0       'stop bei home taste
                        Ocr1a = 0
                        Ocr1b = 0
            Case &H01 : Average_speed = 66       'verschiedene Fahrstufen
            Case &H02 : Average_speed = 72
            Case &H03 : Average_speed = 80
            Case &H04 : Average_speed = 90
            Case &H05 : Average_speed = 100
            Case &H06 : Average_speed = 110
            Case &H07 : Average_speed = 120
            Case &H08 : Average_speed = 130
            Case &H09 : Average_speed = 140
         End Select
      End If
Return

"TT als Linienfolger" bei Twitter speichern "TT als Linienfolger" bei Facebook speichern "TT als Linienfolger" bei Mister Wong speichern "TT als Linienfolger" bei YiGG.de speichern "TT als Linienfolger" bei Google speichern "TT als Linienfolger" bei del.icio.us speichern "TT als Linienfolger" bei Webnews speichern "TT als Linienfolger" bei My Yahoo speichern

Aktualisiert: 05.05.2011 um 22:54 von Searcher

Stichworte: - Stichworte bearbeiten
Kategorien
Projekte , ATtiny45 , Root , Linienfolger

Kommentare