Program ve visual basicu   zodpovězená otázka

Offtopic

Dobrý den,

jsem naprostý laik v tomto oboru a tak mne velice zaskočilo, když jsem obdržel program na ovládání robota minisumo, který je napsán ve visual basicu. Vůbec tomu nerozumím, a k tomu abych mohl tohoto robota naprogramovat musím alespoň vědět, jak tento program funguje.

Mohl byste mi někdo prosím popsat a vysvětlit tento program?

Program vypadá takto, měl by získávat a posílat data druhému procesoru s kterým je spojen sériovou linkou...

'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 

Každému, kdo mi pomůže tento program pochopit předem děkuji.

Argonisius

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Snad si nemyslíte, že vám tohle bude někdo dekódovat a vysvětlovat, speciálně když je to hardwarová záležitost vytržená z kontextu...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Chcem v krátkosti zareagovať, že to nie je vytrhnuté z kontextu. Je to naozaj úplný program na zabezpečenie chodu robota. Len neviem či naozaj funkčný. To by sa musel pochváliť ten robot.

Ešte som ale takýto program nevidel v Basicu....

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Je to jednoduché vysvětlení - robot má motorky, senzory, tlačítka a LED signálky. Je ovládán programem, který není ve Visual Basic, pracuje s informacemi po bitech. Překladač programu má spostu nastavení.

A konkrétně jak na problém:

- co program dělá je zřejmé z komentářů - to jsou srozumitelné texty začínající apostrofem ' - kdybyste kód vložil s použitím "VB code" - komentáře by byly zelené - část z kódu:

' if je podmínka:
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 
 

- opatřete si manuál k robotu obsahující programové instrukce

- zvládněte alespoň základy programu - s tím jste zde správně

- teprve potom zkuste robota programovat

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Kód už jsem ručně označil.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Keďže vidím, že s radami sa vrece nepretrhlo, prispejem svojou troškou.

Pred časom som sa zaoberal programovaním mikročipov, v podstate zo zaujímavosti, nech mám prehľad lebo profesne sa zaoberám priemyselnou automatizáciou a programovaním.

Asi Vám neposkytnem úplný výklad programu, ale Vaša úspešnosť bude do veľkej miery závislá od Vášho odhodlania a záujmu "trošku sa s tým pohrať". V prvom rade neviem akým spôsobom tento hotový program chcete dostať "do" robota, resp. aké máte k tomu komponenty a možnosti na testovanie, alebo či je to otázka len teoretická. Takisto neviem či je možné použiť na tento účel VB.NET (narovinu, zrejme nie), pretože hotový program je potrebné napáliť priamo do mikročipu robota a teda použitý kompilátor musí poznať typ procesora (mikročipu) a jeho inštrukčnú sadu. Na vývoj a napaľovanie programov takýchto mikročipov sa používajú vývojové dosky, ktoré to umožňujú. Vy ale (zrejme) máte možnosť programovať mikročip robota prostredníctvom tej sériovej linky, ktorú spomínate.

Takže k veci. Takéto programy väčšinou bežia vo vnútri mikročipu. Dokonca celý program je tam ako sa hovorí "napálený" a môže spolupracovať ešte s množstvom iných mikročipov a takisto s vnútornou pamäťou EEPROM. Celkovú zostavu zrejme nemôžete poznať, lebo predpokladám, že robota ste nerozoberali. Niektoré piny mikročipu sú nazvem ich systémové, do čoho spadá jeho napájanie plus piny súvisiace s prepojením na oscilátor zabezpečujúci oživenie procesora taktovacou frekvenciou. Funkcia všetkých ostatných pinov je programovateľná. Samozrejme existujú rôzne mikročipy s rôznym počtom pinov a ďalej 8, 16 aj 32 bitové. Váš program, ktorý máte k dispozícii by Vám mohol dosť napovedať, keby ste mali aspoň nejaké teoretické znalosti. Priznám sa, ja by som sa s tým určite (zo zaujímavosti) rád pohral.

Každý mikročip má v sebe zabudovaných niekoľko, myslím že vždy aspoň 2 porty. Dajme tomu, že máme nejaký jednoduchý mikročip, ktorý má dva porty po 8 bitov. PortA a PortB. Každý bit portov A a B zodpovedá jednému fyzickému pinu (nožičke) mikročipu. Môže ako každý bit nadobúdať hodnoty 0 a 1.

Teraz si predstavme, že na PorteA máme pripojených 8 vypínačov, z ktorých každý prepája jeden pin portu A s nulou (napájania). Pokiaľ je vypínač pripojený na nultý pin zapnutý, tak sa bude prejavovať na dotyčnom pine hodnota 0 (úroveň Low), ak vypnutý tak 1 (samozrejme len v tomto konkrétnom zapojení). Čiže v celom bajte portu A sa bude zrkadliť (prejavovať) stav dotyčných 8 vypínačov. Ak by sme prečítali PortA a dostali výsledný bajt 11110000, tak vieme, že prvé štyri vypinače sú zopnuté.

Celý vývoj takéhoto programu je úzko spätý s konfiguráciou programovaného zariadenia (koľko potrebuje súčastí na svoju funkčnosť) a tiež s fyzickým pripojením(kde je ktorý vstup či výstup naozaj pripojený). Čiže Váš robot má nejaké motory má nejaké senzory a takisto aj Led svietidlá a spínače. Každá súčasť má svoju charakteristiku z pohľadu smeru toku informácie, čiže sa dajú rozdeliť na vstupy alebo výstupy. Logicky teda tlačítka a senzory (nepoznám ich charakter ale predpokladám)sú vstupy. Led svietidlá sú výstupy, takisto ako aj motory.

Je potrebné si uvedomiť, že na začiatku behu programu musíme stanoviť, ktoré piny sú vstupy a ktoré výstupy a tie čo nevyužívame nastavíme tiež ako vstupy.

Aby som sa nemusel príliš zaoberať popisom štruktúry mikročipu, poviem len jednoducho, že PortA tak ako aj PortB majú každý k sebe prislúchajúci nastavovací port zvaný Tris (TrisA, TrisB). Ked nastavíme napr. TrisA bajt na 00001111, tak sme prikázali procesoru, aby nastavil prvé štyri piny Portu A ako vstupy a druhé ako výstupy. O tom prečo 0 znamená výstup, inokedy. Všetci dúfam vieme, že bity sa číslujú od 0 z prava (aj ja som si to práve pripomenul).

Takže v mojom príklade by sme celý port A nastavili ako vstupy pre zabezpečenie testovania stavu pripojených vypínačov na pinoch. Port B ako výstupy napr. pin 0 - zapnutie/vypnutie motor1, pin 1 - zap/vyp motor2, pin 2 - zap/vyp led1 ... atd. Hneď po nastavení I/O je potrebné zabezpečiť naplnenie výstupov (portu B) hodnotami ale myslím, aspoň podľa Vášho programu, že toto môže byť zabezpečené ešte pred nastavením I/O. Toto nastavenie súvisí hlavne so schémou zapojenia, či sú výstupy orientované smerom na kladný pól napájania alebo záporný. Toto popisujem len pre úplnosť aby Vás nezmiatol fakt, že nastavením portu B na 11111111 sa 8 pripojených výstupných led (kupodivu)zhasne.

Ako vidíte, všetka činnosť o ktorej som doteraz hovoril súvisí úzko s daným hardvérom a jeho konkrétnym zapojením. V tejto časti priloženého programu by som Vám nedoporučoval nič meniť. Mohli by ste rozhasiť správne základné nastavenie pre prácu mikročipu.

Neviem do akej miery ste zdatný v programovaní, ale najbežnejší jazyk na programovanie takýchto mikročipov je assembler a C.

V princípe je to jedno, ale pre procesor je dôležitý až výstupný strojový kód. Čiže naozaj neviem či máte k dispozícii Basicovský kompilátor pre Vášho robota a bez základných znalostí aspoň procedurálneho programovania (v tomto prípade úplne postačuje) nemáte zrejme šancu uspieť. Nič to zato, sám som vyrastal na Comodore 64, a s drvivou väčšinou princípov som sa zaoberal už v rámci toho levelu. Až ma z toho chytá nostalgia (zlaté to časy).

Takže všetko podstatné čo sa v programe za jeho behu odohráva začína procedúre Main(). Ked sa na to dobre mrknete nájdete tam "večný" cyklus While 1.

To je nikdynekončiaci cyklus, ktorého definícia končí kľúčovým slovom Loop pred koncom procedúry Main. V podobnom cykle bežia všetky programy pre takéto mikročipy. Všetko až po tento cyklus While nechajte tak a pracujte len s kódom vo vnútri While. Tak by ste nemali nič pokaziť. (Program končí až vypnutím napájania mikročipu)

Dá sa odraziť od tejto inicializácie

'NASTAVENI IO

lata=0xFF ' naplni port A hodnotou 11111111

latb=0 ' naplni port B hodnotou 00000000

latc=0xFF ' naplni port C hodnotou 11111111

trisa=0xF0 ' binárne 11110000 nastavi prve 4 piny ako vystupy

trisb=0x3F ' binárne 00111111 prvych 6 pinov ako vstupy

trisc=0x9F ' binárne 10011111 toto už nekomentujem

Ako vidíte, Váš mikročip má až tri porty A, B a C

Prvá inštrukcia v cykle While je

buttons = portb 'obraz portuB sa naplní do premennej buttons

Presne máte pod tým okomentované čo ktorý bit znamená. Do premennej buttons typu byte sa vlastne naplní hodnota portuB. Čiže získame "obraz" vstupov, ktorý následne testujeme v cykle až do konca cyklu While a podľa indikácie stlačenia niektorého tlačidla a stavu senzorov sa vykonajú príslušné činnosti robota (Spustí či vypne motor rozsvieti led atd). Nechce sa mi presne vŕtať sa v tom dopodrobna, lebo nemám toho robota, ale ako som povedal na začiatku si to niečo od Vás vyžaduje, ale ako zábavka je to dobré odhliadnuc od toho že človek môže získať cenné skúsenosti, pretože veľmi podobným spôsobom (v princípe)sa programujú profesionálne automatizačné systémy.

Môžem Vás ešte mierne navigovať, sú tam definované

funkcia Receive a procedúra Send

Ako vidíte aj podľa komentáru v tele cyklu While, na čo vlastne slúžia

sensors = Call receive() 'prijmi stav cidel senzoru

Call send(motors) 'vysli jak se maji tocit motory

Funkcia send si berie ako parameter premennu "motors" a na jej základe spúšťa motory.

lata = leds

tento kúsok kódu je z konca cyklu While a presne zabezpečuje to, že naplní bajt portuA premennou leds. Čiže fyzicky rozsvieti všetky potrebné led. A cyklus ide znovu. Z tohoto nám je jasné, že všetky bity portuA sú nastavené ako výstupy a sú pripojené na nejaké svetelné diódy, ktoré môžeme rozsvietiť napr. aj programovo keby ste tam namiesto tohto kódu napísali

lata = 0xff 'binarne 11111111 v závislosti od zapojenia schémy, ako som už spomenul, by to mohlo ledky aj vypnúť čiže v tom prípade treba

lata = 0 ' snad to nemusim prepisat do binarneho tvaru

Myslím, že táto téma príliš nezapadá do kontextu tohto webu, ale niečo je tu povedané a je to k veci a dúfam, že som pomohol.

Ak máte všetko potrebné, prajem Vám príjemnú zábavu. Prípadne by ma zaujímalo, či sa Vám s tým podarilo pohnúť.

S pozdravom

Virus

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback