Programování pic pro robota Minisumo

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Argonisius

Programování pic pro robota Minisumo

#1 Příspěvek od Argonisius »

Dobrý den, koupil jsem si již sestaveného robota minisumo, s tím, že si ho naprogramuju. Zkoušel jsem to, ale vůbec to nechápu. Má dva procesor spojené sériovou linkou. Bylo mi zděleno, že mám programovat jen jeden z nich a to PIC18F252. K tomu mi poslali tento program:

'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
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“