wz
  Janulo's  homepage
| +--> Blue
| ---> Blue2
| | |--> Popis
| | |--> Video
| +--> Koleso
| +--> SIR3
| |--> Trimot
+--> Práce
+--> Autor
Počítadlo:
(freezed)
1.gif0.gif6.gif6.gif1.gif7.gif
1led.gif0led.gif6led.gif6led.gif1led.gif7led.gif
od 9.4.2003
AmatFest 2008 - Festival amatérskych filmov
Blue2
Program:

Programové vybavenie dosky motorov

Celý program sa skladá z komunikačnej a výkonnej časti. Komunikácia je naprogramovaná ako ošetrenie prerušenia od prijímacieho a vysielacieho kanála integrovanej sériovej linky procesora 8051. Prijaté znaky sa ukladajú do zásobníka a po načítaní potrebného počtu znakov sa nastaví príznak o prijatí rámca. Tento príznak sa vyhodnotí v hlavnej slučke programu, kde sa prečíta a vyhodnotí celý rámec a vykoná sa príslušná akcia podľa dát v rámci. Pri potrebe vrátiť nejaké dáta mastrovi sa naplní zásobník a ten sa odvysiela. Pri vysielaní sa generuje CRC zabezpečenie a pri prijímaní sa kontroluje.

protocol_send:				;vysielanie paketu
push 1 ;uschovanie použitých registrov
push 0
call protocol_add_crc ;generuj CRC
mov @r0,b ;ulož na ďalšiu pozíciu v pakete
pop 0
pop 1
mov a,r1 ;v r1 je dĺžka správy a adresa
call cout ;odvysielaj znak
mov a,r1 ;zober dĺžku správy
inc acc
mov r1,a ;v r1 je počet znakov ktoré treba odvysielať
protocol_send1:
mov a,@r0 ;zober znak z pamäte
inc r0 ;zvýš ukazovátko
call cout ;odvysielaj
djnz r1,protocol_send1
ret
protocol_receive:
clr protocol_error
call num_recv ;zisti koľko znakov je v zásobníku
jz protocol_receive4 ;ak je prázdny skonči
push 0
call cin ;zober znak zo zásobníka
mov @r0,a ;ulož do pamäte
inc r0 ;zvýš ukazovátko
inc acc ;prvý znak je dĺžka správy
mov r1,a ;do r1 daj počet znakov na prijatie
push 1
protocol_receive1:
call cin ;načítaj znak zo zásobníka
mov @r0,a ;ulož do pamäte
inc r0 ;zvýš ukazovátko
djnz r1,protocol_receive1 ;opakuj potrebný počet krát
pop 1
pop 0
inc r0
call protocol_add_crc ;zisti CRC
mov a,@r0
cjne a,b,protocol_receive2
jmp protocol_receive3 ;zisti zhodnosť CRC
protocol_receive2:
setb protocol_error
protocol_receive3:
pop 0
mov a,@r0 ;zober si adresný znak s paketu
anl a,#0f0h
swap a
cjne a,#device_addres,protocol_receive4
setb protocol_4me ;porovnaj či je spáva určená mne
ret
protocol_receive4:
clr protocol_4me ;správa nie je pre mňa
ret

Riadenie krokových motorov je pomocou postupného vysielania dát na brány procesora, celé riadenie je v prerušení časovača T0, pri každom prerušení sa inkrementuje register rýchlosti a porovnáva sa s nastavenou hodnotou, pri zhode sa vykoná zmena zopnutia fáz, čo spôsobí pootočenie motora o jeden elementárny krok, to sa vykonáva stále dookola pre všetky štyri motory.

Ako ďalšia možnosť pohonu jednosmernými motormi je na doske realizované softvérové PWM riadenie dvoch jednosmerných motorov. Realizácie nebola cieľom ale len pokusom možnosti riadenia jednosmerných motorov použitým procesorom, iné typy procesorov majú PWM integrované priamo na čipe.

Vstupná frekvencia od prerušenia časovača T0 je základná frekvencia kroku PWM, inkrementuje register frekvencie PWM, pri prekročení nastavenej hodnoty, zistenej experimentálne, sa vynuluje a čítanie sa robí znova. Ďalej sa porovnáva napočítaná hodnota so žiadanou hodnotou rýchlosti, ak je menšia, na výstupe je log.1, inak sa nastaví nula. Potom keď sa začína čítať sú oba PWM výstupy na logickej jednotke, pri načítaní hodnoty rovnakej ako je nastavená sa výstup preklopí do nuly.

tim0:	push	psw
push acc
inc pwmf_tmp ;inkrementácia registra rýchlosti
mov a,pwmf_tmp
cjne a,pwmf,tim0_pwm1 ;porovnanie s nastavenou frekvenciou
mov pwmf_tmp,#0h ;nulovanie, nastalo pretečenie
tim0_pwm1:
mov a,pwmf_tmp
clr c
subb a,speed_pwm1 ;porovnanie s nastavenou hodnotou
jc tim0_pwm2 ;ak je menší skáč
clr en12 ;nastav log.0
jmp tim0_pwm3
tim0_pwm2:
setb en12 ;nastav log.1
tim0_pwm3:

Programové vybavenie dosky snímačov

Aj pri tomto procesore máme komunikačnú a výkonnú časť, komunikačná bola popísaná v predošlej kapitole, sú tu nadefinované iné funkcie a akcie k nim popísané v kapitole o komunikácii.

Samotná výkonná časť je riadená časovými intervalmi generované časovačom T0, v obsluhe prerušenia sa sníma vstupný paralelný port a posielajú sa dáta na výstupný paralelný port, je riadená perióda, s ktorou sa vykonáva meranie a/d prevodu, meranie frekvencie a meranie vzdialenosti pomocou ultrazvuku.

Všetky funkcie sa spúšťajú v tejto obsluhe prerušenia okrem a/d prevodu, nastaví sa príznak merania a v hlavnej slučke sa vykoná meranie. Pretože procesor AT89C2051 nemá integrovaný a/d prevodník, použili sme softvérovú integračnú metódu. Pomocou RC článku a integrovaného komparátora sa dosiahne presnosť podľa použitého kondenzátora zhruba 2%, získame tak veľmi lacný ale pomalý osembitový a/d prevodník. Na začiatku merania sa vybije kondenzátor zapísaním nuly na pin portu, čo vlastne skratuje kondenzátor tranzistorom na čipe, potom akonáhle povolíme nabíjanie, meráme čas, kým sa nepreklopí komparátor, podľa času potrebného na preklopenie vieme aké je vstupné napätie. Inšpirácia na toto zapojenie je uverejnená na www.hw.cz, odkiaľ sme čerpali.

adc:	clr	tr0			;zastav časovač T0
mov tl0,#00h ;vynuluj časovač T0
mov th0,#0ffh
clr adcend ;vynuluj príznak ukončenia prevodu
clr timeout ;vynukuj príznak časového pretečenia
clr es ;zakáž prerušenia od sériového portu
clr rcclen ;vybitie kondenzátoru
nop ;oneskorenie na vybitie
nop
nop
setb rcclen ;zahájenie nabíjania
setb TR0 ;štart čítania
adc_1: jb timeout,adc_2 ;ak sa komparátor nepreklopil
jb compar,adc_1 ;čakanie na preklopenie komparátora
clr TR0 ;zastavenie čítača
mov a,TL0 ;prenos stavu čítača
jmp adc_3
adc_2: mov a,#00h ;nastavenie príznaku neúspechu
mov a,status0
setb acc.0
mov status0,a
clr a
adc_3:setb es ;znovu povoľ prerušenie pre sériový kanál
mov tl0,#0h ;nulovanie obsahu čítača
mov th0,#0h
setb adcend ;nastav príznak ukončenia prevodu
clr measure ;nastav príznak o ukončení merania
ret

Meranie frekvencie sa robí tak, že sa meria počet inkrementov časovača T0 počasjednej periódy vstupného signálu. Na začiatku sa nastavia všetky potrebné registrea pri prvom prerušení od externého vstupu INT1 sa začne odpočítavanie a pri druhomprerušení, kedy končí perióda signálu sa celý proces zastaví a nastavia sa príslušnépríznaky. Potom v registroch časovača T0 je nameraná hodnota úmerná perióde vstupnéhosignálu. Na ošetrenie stavu, kedy na vstupe nie je žiadna frekvencia sa časovač spustíešte pred prvým prerušením, keby sa nedostavilo prerušenie od INT1, nastane pretečeniea ukončí sa meranie.

frek_start:				;nastavenie a pripravenie na meranie 
clr tr0 ;zastav T0 ak beží
mov tl0,#0h ;nulovanie obsahu citaca
mov th0,#0h
setb tr0 ;spusti časovač, ako ochrana
clr frekend ;nulovanie príznakov
clr timeout
clr frektwo
clr ie1
setb ex1 ;povoľ prerušenie od INT1
ret

frek_end:
jnb timeout,frek_end_1 ;ak bol nastavený príznak pretečenia
mov a,status0 ;nastavenie príznaku o neúspechu
setb acc.1
mov status0,a
mov tl0,#0h ;nulovanie obsahu čítača
mov th0,#0h
frek_end_1:
clr ex1 ;zakáž prerušenie od INT1
clr tr0 ;zastav časovač
mov measure_tmph,th0 ;ulož nameranú hodnotu
mov measure_tmpl,tl0
mov tl0,#0h ;nulovanie obsahu čítača
mov th0,#0h
ret

exint1: ;obsluha prerušenia INT1
clr tr0 ;zastav časovač
jnb frektwo,exint1a ;ak to nebolo druhý krát pokračuj
setb frekend ;príznak o ukončení merania
clr measure
clr ex1 ;zakázanie ďalšieho prerušenia
jmp exint1b
exint1a:
mov th0,#0h ;nulovanie časovača
mov tl0,#0h
setb tr0 ;spustenie časovača
setb frektwo ;nastav riadiaci príznak
exint1b:reti

Na meranie vzdialenosti ultrazvukom na začiatku programovo generujeme frekvenciu40kHz povolíme príslušné prerušenia a čakáme na prerušenie INT0, kedy čelo impulzudorazilo späť, celú dobu merania máme spustený časovač T0, keby sa nedostavilo prerušenie,čo znamená, že nebol detekovaný odraz, nastane pretečenie a meranie sa ukončí.

sonar_start:				;úvodné inicializovanie pre ultrazvuk
clr sonarend
clr timeout
clr tr0
mov th0,#27h ;nastav timeout, maximalna vzdialenosť
mov tl0,#00h
clr es ;zakáž sériovú linku
radar: mov r6,#8 ;nastav premenné na generovanie vlny
radar0: mov r7,#5
setb son ;generovanie frekvencie 40kHz
radar1: djnz r7,radar1
mov r7,#4
clr son
radar2: djnz r7,radar2
nop
djnz r6,radar0
setb es ;povoľ sériovú linku
setb tr0 ;spusti časovač
clr ie0 ;nastav citlivosť
setb ex0 ;povoľ prerušenie od INT0
ret

sonar_end:
jnb timeout,sonar6 ;skoč ak nenastalo pretečenie
clr tr0 ;zastav časovač
clr ex0 ;zakáž prerušenie od INT0
mov a,status0 ;nastav príznak o neúspechu
setb acc.2
mov status0,a
mov measure_tmph,#00h
mov measure_tmpl,#00h
sonar7:
mov th0,#00h
mov tl0,#00h
ret
sonar6:
mov a,th0 ;načítaj hodnotu z časovača
clr c
subb a,#27h ;upraj ju a ulož
mov measure_tmph,a
mov measure_tmpl,tl0
jmp sonar7

exint0: ;prerušenie od INT0
clr tr0 ;zastav T0
clr ex0 ;zakáž ďalšie prerušenie
setb sonarend ;nastav príznaky o ukončení
clr measure
exint0a:reti

Download::blue2.zip



Janulo © 2003 janulo@pobox.sk   Aktuálny čas:   Ľuboš, Ľubor 24-09-2020 meniny má 1    Pridať do obľúbených   Čas načítania: 0.013 sekúnd   06:51 18:56    Table 'janulo.counter' doesn't exist