TT als Linienfolger
von
am 05.05.2011 um 21:49 (4948 Hits)
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