Programování pic pro robota Minisumo
Moderátor: Moderátoři
-
Argonisius
Programování pic pro robota Minisumo
'robot
'#pragma DATA _CONFIG2H, _WDT_OFF_2H & _WDTPS_128_2H
#pragma DATA _CONFIG1H, _OSCS_OFF_1H & _HSPLL_OSC_1H
#pragma DATA _CONFIG2L, _BOR_ON_2L & _BORV_42_2L & _PWRT_ON_2L
#pragma DATA _CONFIG2H, _WDT_OFF_2H & _WDTPS_128_2H
#pragma DATA _CONFIG3H, _CCP2MX_OFF_3H
#pragma DATA _CONFIG4L, _STVR_ON_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
#pragma DATA _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L & _CP2_ON_5L & _CP3_ON_5L
#pragma DATA _CONFIG5H, _CPB_ON_5H & _CPD_ON_5H
#pragma DATA _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
#pragma DATA _CONFIG6H, _WRTC_ON_6H & _WRTB_ON_6H & _WRTD_OFF_6H
#pragma DATA _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
#pragma DATA _CONFIG7H, _EBTRB_ON_7H
#pragma CLOCK_FREQ 40000000
Function receive() As Byte
If (rcsta & (1 << OERR)) = 0 Then
rcsta = rcsta & ~(1 << CREN)
rcsta = rcsta | (1 << CREN)
End If
'Do While pir1 & (1 << RCIF) Loop //-puvodni, opraveno nize !
Do While (pir1 & (1 << RCIF)) = 0 Loop
receive = rcreg
End Function
Sub send(c As Byte)
Do while (pir1 & (1 << TXIF)) = 0 Loop
txreg = c
End Sub
Sub main()
Dim motors As Byte
Dim sensors As Byte
Dim leds As Byte
Dim buttons As Byte
'NASTAVENI IO
lata=0xFF
latb=0
latc=0xFF
trisa=0xF0
trisb=0x3F
trisc=0x9F
'VYPNOUT ADC
adcon1=0xC6
adcon0=0xC0
'UART 9600bps
spbrg=64
txsta = txsta & ~(1 << BRGH)
txsta = txsta | (1 << TXEN)
rcsta = rcsta | (1 << CREN)
rcsta = rcsta | (1 << SPEN)
motors = 0
Do while 1
'nacteni stavu tlacitek
buttons = portb
'tlacitko je stisknuto, pokud je prislusny bit v 0
'prirazeni bitu v bajtu buttons k tlacitkum
'BIT0 LEVE HORNI
'BIT1 LEVE STREDNI
'BIT2 PRAVE DOLNI
'BIT3 LEVE DOLNI
'BIT4 PRAVE STREDNI
'BIT5 PRAVE HORNI
'BIT6 REZERVOVAN
'BIT7 REZERVOVAN
'pokud je stisknuto jakekoli tlacitko, robot zastavi
If (buttons & 0x3F)<>0x3F Then
motors = 0
End If
'Bity v bajtu motors
'BIT7=LEVY MOTOR vpred(0)/vzad(1),BIT6 az 4=LEVY MOTOR RYCHLOST 0 az 7
'BIT3=PRAVY MOTOR vpred(0)/vzad(1),BIT2 az 0=PRAVY MOTOR RYCHLOST 0 az 7
Call send(motors) 'vysli jak se maji tocit motory
sensors = Call receive() 'prijmi stav cidel senzoru
'Bity v bajtu sensors
'BIT3=LEVE SPODNI, BIT2=PRAVE SPODNI, BIT1=LEVE PREDNI, BIT0=PRAVE PREDNI
'prislusny bit v nule znamena aktivni senzor
leds = 0xFF 'zadna LED nema svitit
If (sensors & (1 << 0))=0 Then
'pravy predni senzor aktivni
motors=0xC4 'binarne 11000100
'rozsvit prislusnou LED k senzoru, zatim jen v promenne
leds = leds & ~(1 << 1) 'led sviti, kdyz se ji bit znuluje
ElseIf (sensors & (1 << 1))=0 Then
'levy predni senzor aktivni
motors=0x4C 'binarne 01001100
'rozsvit prislusnou LED k senzoru, zatim jen v promenne
leds = leds & ~(1 << 2) 'led sviti, kdyz se ji bit znuluje
Else
motors=0x77
End If
If (sensors & (1 << 2))=0 Then
'pravy spodni senzor aktivni
' motors=0 'zastav oba motory, vidim dole bilou
'rozsvit prislusnou LED k senzoru, zatim jen v promenne
leds = leds & ~(1 << 0) 'led sviti, kdyz se ji bit znuluje
End If
If (sensors & (1 << 3))=0 Then
'levy spodni senzor aktivni
' motors=0 'zastav oba motory, vidim dole bilou
'rozsvit prislusnou LED k senzoru, zatim jen v promenne
leds = leds & ~(1 << 3) 'led sviti, kdyz se ji bit znuluje
End If
'fyzicky led rozsvitit nebo zhasnout, vsechny zaroven podle promenne leds
lata = leds
Loop
End Sub
Je v basicu (asi Visual Basicu, já se v tom nevyznám) Ale vůbec nechápu ty instrukce. Mohl byste mi někdo objasnit jak to funguje? Jsou tam potřeba ta vrchní řádky (#pragma DATA_CONFIG..... atd.)? Uvítal bych třeba nějaký příklad, že by třeba jen robot jel dopředu a otočil se. (pro snazší pochopení)
Díky. Argonisius
[/code]
- Přílohy
-
- brain252_4.asm
- Toto by měla být nějaká testovací aplikace pro tohoto robota, samotná aplikace je mezi ;bootloader a ;end of bootloader
- (9.5 KiB) Staženo 148 x