 |
forum.kvetakov.net Květákov.NET - diskuzní fórum
|
|


|
| Zobrazit předchozí téma :: Zobrazit následující téma |
| Autor |
Zpráva |
xp Lama
Založen: 30.3.2008 Příspěvky: 7
|
Zaslal: ne březen 30, 2008 3:58 pm Předmět: omezení 8051 při přerušení |
|
|
| Zdravím, mám AT89S52 a dělám robota. Mám v něm 4 zdroje přerušení(timer0, seiový port, vnější 0). U všech podprogramů zálohuji registry, akumulátor, psw. Problém nastane když dojde k přerušení od sériového kanálu a vnější přerušenéí tak program se přestane chovat korektně. Po několika dnech pátrání jsem zjistil, že na to má vliv počet do sebe vnořených programů v přerušení od sériového kanálu(pro test jsem zkusil i prázdný podprogram a chovalo se to stějně). Je nějaké omezení v počtu do sebe vnořovaných podprogramů během přerušení? Kolik hodnot lze maximálně uložit do zásobníku aniž by přetekl(tipuji 256)? Lze nějakým způsobem získat adresu právě prováděné instrukce?díky |
|
| Návrat nahoru |
|
 |
Karri Lama

Založen: 18.10.2007 Příspěvky: 19 Bydliště: Pardubice
|
Zaslal: ne březen 30, 2008 11:17 pm Předmět: |
|
|
Nevím zda jsem pochopil správně dostaz. Při obsluze přerušení platí oběcně následujícíc pravidla:
| kód: |
Korektně nastavený Zásobník před voláním jkékoliv rutiny a jakékoliv obsluhy přerušení
Obsluha přerušení se musí bezpečně vykonat před vyvoláním dalšího přerušení (stejného). |
Z druhé podmínky vyplývá, že pokud vznikne přerušení od sériové linky, probíhá jeho obsluha a zároveň nastane například externí přerušení s vyšší priritou, je nutné aby součet časů obluh obou přeeušení byl určitě kratší než doba mezi možnými vzniky údálostí vedoucích k přerušení.
Situaci si lze samozřejmě odsumulovat na simulátoru uvedeném na tomto webu. _________________ Slovem OPERAČNÍ je zdůrazněna skutečnost, že práce s Windows se podobá těžké operaci bez umrtvení.
Slovo SYSTEM bylo pravděpodobně zvoleno zcela náhodně, zrovna tak mohlo být použito slovo Chaos.
Slovo WINDOWS charakterizuje vlastnost systému ničit počítačová data. Vychází se slangového výrazu pro ztrátu paměti - mít okno. |
|
| Návrat nahoru |
|
 |
xp Lama
Založen: 30.3.2008 Příspěvky: 7
|
Zaslal: so duben 05, 2008 7:06 pm Předmět: |
|
|
omlouvám se, že jsem tu nebyl, měl jsem průblémy s internetem,
s délka a frekvence přerušení si myslím, že bude v pořádku: frekvence přerušení od sériové linky je 10Hz(délka desítky us), externí přerušení 350Hz(cca 200us), časovač 100Hz(do 50us)
- jak jsem psal problém nastal pokud jsem měl v sobě více vnořených programů např. | kód: | org 023h
call rs232
reti
rs232:
...
call pr1
...
ret
pr1:
...
call pr2
...
ret
pr2:
...
ret |
jestliže jsem kód z podprogramů zkopíroval do nadřazeného, pak vše začalo chodit správně
- prohledal jsem všechny články, ale na zmiňovaný simulátor jsem nenarazil, můžeš uvést odkaz?
díky |
|
| Návrat nahoru |
|
 |
Karri Lama

Založen: 18.10.2007 Příspěvky: 19 Bydliště: Pardubice
|
Zaslal: so duben 05, 2008 9:35 pm Předmět: |
|
|
Tak už asi vím co je špatně:
Při obsluze přerušení nepoužívej call a na jeho konci ret, ale jmp a reti...
| kód: |
org 023h
jmp rs232
reti
rs232:
...
call pr1
...
reti
pr1:
...
call pr2
...
ret
pr2:
...
ret
|
_________________ Slovem OPERAČNÍ je zdůrazněna skutečnost, že práce s Windows se podobá těžké operaci bez umrtvení.
Slovo SYSTEM bylo pravděpodobně zvoleno zcela náhodně, zrovna tak mohlo být použito slovo Chaos.
Slovo WINDOWS charakterizuje vlastnost systému ničit počítačová data. Vychází se slangového výrazu pro ztrátu paměti - mít okno. |
|
| Návrat nahoru |
|
 |
xp Lama
Založen: 30.3.2008 Příspěvky: 7
|
Zaslal: so duben 05, 2008 10:33 pm Předmět: |
|
|
to nebude ono, to jsem se jenom upsal  |
|
| Návrat nahoru |
|
 |
Karri Lama

Založen: 18.10.2007 Příspěvky: 19 Bydliště: Pardubice
|
Zaslal: ne duben 06, 2008 10:33 pm Předmět: |
|
|
| xp napsal: | to nebude ono, to jsem se jenom upsal  |
Tak sem šoupni celej program _________________ Slovem OPERAČNÍ je zdůrazněna skutečnost, že práce s Windows se podobá těžké operaci bez umrtvení.
Slovo SYSTEM bylo pravděpodobně zvoleno zcela náhodně, zrovna tak mohlo být použito slovo Chaos.
Slovo WINDOWS charakterizuje vlastnost systému ničit počítačová data. Vychází se slangového výrazu pro ztrátu paměti - mít okno. |
|
| Návrat nahoru |
|
 |
xp Lama
Založen: 30.3.2008 Příspěvky: 7
|
Zaslal: po duben 07, 2008 4:18 pm Předmět: |
|
|
| kód: | ;*******************************;
; RIDICI PROGRAM ROBOTA RX1 ;
; VERZE: 1.0 ;
;*******************************;
;************ DEKLARACE *************
;POHONNA CAST - rizeni 2 motoru
; - inkrementalni snimac polohy spojky
; - 2 koncove snimace spojky
;=S54 - pseudoinstrukce pro Generation memory map
;=S51
;I/O PORTY
DIR_C BIT P3.4
PULS_C BIT P3.2
SEN_C1 BIT P3.7 ;senzor - spojka vpravo
SEN_C2 BIT P3.6 ;senzor - spojka vlevo
SEN_C3 BIT P3.3 ;senzor - spojka uprostřed
EN_M1 BIT P1.0
DIR_M1 BIT P1.1
EN_M2 BIT P1.3
DIR_M2 BIT P1.2
drive EQU 20h
;POHON ROBOTA
EnMov BIT 20h.0 ;0/1 - robot nejede/jede
DirMov BIT 20h.1 ;0/1 - pohyb robota dozadu/vpýed
;SPOJKA
EnClu BIT 20h.2 ;0/1 - spojka(clutch) - vykonej akci ne/ano
;akce
LClu BIT 20h.3 ;0/1 - nastav spojku doleva ne/ano
FClu BIT 20h.4 ;0/1 - nastav spojdu doprostred ne/ano
RClu BIT 20h.5 ;0/1 - nastav spojku doprava ne/ano
;aktualni poloha spojky
ir1 BIT 20h.6 ;0/1 - poloha vlevo ne/ano
ir2 BIT 20h.7 ;0/1 - poloha vpravo ne/ano
;ir1&ir2 : 1&1 - uprostýed
;ir1&ir2 : 0&0 - neznama poloha - nutna
; oprava polohy
incL EQU 30h ;dolni a horni polovina 16bit promŘn‚
incH EQU 31h ;pro uchov nˇ poźtu puls… z inkrement. snˇmace
POSL_H EQU 08h ;poloha vlevo 2170
POSL_L EQU 7Ah
POSC_H EQU 07h ;poloha uprostred: 1830
POSC_L EQU 26h
POSR_H EQU 05h ;poloha vpravo: 1530
POSR_L EQU 0FAh
CluGO BIT 21h.0 ;0/1 - spojka je prave v pohybu ne/ano
;kontrolni bit podprogramu clutch
lastb1 BIT 21h.1 ;bity signalizujici posledni stav cidel
lastb2 BIT 21h.2
brake BIT 21h.3 ;brzda spojky
pulsate BIT 21h.4 ;pulsovat pohonem pokud stoji
lastPos BIT 21h.5
tmrBrk EQU 32h ;cas(nasobek)pro brzdu
tmrPuls EQU 33h
;senzory překážek
tmrSen EQU 34h ;doba detekce překážky = 10ms x tmrSen
limSen EQU 35h ;minimální hranice počtu pulsů pro vyhodnocení překážky
sen_L EQU 36h ;2B, počet pulsů
sen_H EQU 37h
senPuls BIT P0.2 ;čítané pulsy
EnSen BIT P0.6 ;aktivace senzoru
adrA BIT P0.3 ;adresa senzorů (1-8)
adrB BIT P0.4
adrC BIT P0.5
bum1 BIT p2.7 ;prave tlacitko narazniku
bum2 bit p2.6 ;leve tlacitko narazniku
sen0 BIT 23h.0
sen1 BIT 23h.1
sen6 BIT 23h.6
sen7 BIT 23h.7
sensor equ 23h
;kompas
SDA BIT P0.1
SCL BIT P0.0
ACK BIT 20h.5 ;1/0 - chyba komunikace/komunikace ok
WAIT EQU 1 ;prodleva v us mezi jednotlivými bity
ATEMPT EQU 100 ;pocet opakovani vysilani/prijmu bajtu pri jeho
;nedoruceni(slave nenastavi ACK do 0)
start BIT 24h.0
Si2c_1 EQU 38h
Si2c_2 EQU 39h
Ri2c_1 EQU 3Ah
timer1 equ 3Bh
send bit 25h.4
rnd EQU 3ch ;### prepsany z c na e
auto BIT 21h.6
;RS232
SBuff equ 40h ;odesílací buffer - 16b, využito 12b
RBuff equ 50h ;příjímací buffer - 16b
tmrOut equ 3dh ;pomocna promena pro ulozeni doby cekani na prijem packetu
timeOut bit 25h.1 ;povoleni casovani timeoutu
recByte equ 3eh ;uložení počtu přijatych bajtů
RECPAC equ 7 ;délka packetu z PC -> mcu
SENDPAC equ 10 ;délka packeku z mcu -> PC
TIMEOUT equ 100 ;timeout[ms] = TIMEOUT x 10ms,
LastState bit 25h.2
;globalni
errors EQU 22h
err0 BIT 22h.0 ;signalizace chyby v systému
err1 BIT 22h.1 ;porucha inkrementálního senzoru spojky
err2 BIT 22h.2 ;selhani prednich cidel
err3 BIT 22h.3 ;porucha inkrementálního senzoru pohonu
err4 BIT 22h.4 ;selhani komunikace s kompasem
err5 bit 22h.5 ;CRC nesouhlasi - RS232
err6 bit 22h.6 ;časový limit pro přijetí packetu vypršel - timeout RS232
hex bit 25h.0
;************** PRERUSENI ****************
ORG 0
JMP INIT
ORG 03h ;vnější přerušení - inkrementální snímač
CALL clutch
RETI
ORG 0bh ;přerušení od časovače 0
CALL timer0
RETI
ORG 23h ;přerušení od sériového kanálu
call compas
call serial
CLR RI
RETI
;************ INICIALIZACE ***************
INIT: MOV drive,#00010110b ;nastaveni pohonu, zadost o nastaveni
;spojky doprostred
MOV errors,#0
MOV 21h,#0
SETB EN_M2
SETB IT0 ;citlivt na sestupnou hranu
SETB ET0
SETB EA
MOV TMOD,#00100001b ;nastavení časovače 0 na 10ms
MOV TH0,#0B1h
MOV TL0,#0E0h
SETB TR0
CLR TF0
MOV tmrBrk,#17 ;nastavení doby aktivace brzdy na 170ms
MOV tmrPuls,#20 ;doba zapnutí motoru na jednu stranu - 400ms
;serial
mov th1,#243
mov scon,#01010000b
setb es
setb tr1
mov pcon,#10000000b
mov tmrOut,#TIMEOUT
clr timeOut
mov recByte,#0
clr send
setb LastState
;nastavení senzorů překážek
MOV tmrSen,#6
CLR adrA ;aktivni senzor 0, nevysílat
CLR adrB
CLR adrC
MOV sen_H,#11110000b
MOV sen_L,#00001111b
MOV limSen,#3
SETB auto
clr p1.4
JB p2.7,$
setb p1.4
clr start
call startS
;************ HLAVNI PROGRAM *************
MAIN: call optSen
; mov c,CluGO
;mov p1.4,C
JNB auto,jMan ;auto mód
call automat
jmp MAIN
jMan: call setClutch
JMP MAIN
startS: ;kontrola připojení kompasu
;kontrola funkce generátoru pseudonáhodných čísel
jStart: CALL setClutch
JNB start,jStart
clr CluGO
clr EN_M1
clr DIR_M1
RET
;************* PODPROGRAMY ***************
setClutch: JB CluGO,endCl ;kontrola, zda se prave nenastavuje poloha spojky(contC - CONTinue Clutch)
SETB CluGO
MOV A,#11000000b
ANL A,drive
JNZ test2C ;zjisteni polohy a jeji pripadna fixace
CALL setM1
JB SEN_C3,right ;test zda cidlo hlasi pozici spojky vlevo
CLR lastb1
CLR DIR_M2 ;zapnuti motoru doprava spojky
CLR EN_M2
SETB EX0
endCl: JMP endCl1
right: SETB DIR_M2 ;zapnuti motoru doleva
SETB lastb1
CLR EN_M2
SETB EX0
JMP endCl1
test2C: JNB LClu,test3C ;test na polohu vlevo
CJNE A,#64,contC1 ;kontrola zda se aktualni a zadana poloha neshoduje
JMP endCl0
contC1: CALL setM1
SETB DIR_M2 ;zapnuti motoru doleva spojky
SETB ir1
CLR ir2
CLR EN_M2
SETB EX0
JMP endCl1
test3C: JNB FClu,test4C ;test na polohu uprostred
CJNE A,#192,contC2 ;kontrola zda se aktualni a zadana poloho neshoduje
JMP endCl0
contC2: CALL setM1
MOV C,ir2
MOV lastPos,C
SETB ir1
SETB ir2
JNB lastPos,elseC ;zjisteni aktualni polohy
SETB DIR_M2 ;spojka vpravo -> jed doleva
CLR EN_M2
SETB EX0
JMP endCl1
elseC: CLR DIR_M2 ;spojka vpravo -> jed doleva
CLR EN_M2
SETB EX0
JMP endCl1
test4C: JNB RClu,endCl1 ;poloha vpravo,test zda se aktualni a zadana poloha neshoduje
CJNE A,#128,contC3 ;kontrola zda se aktualni a zadana poloha neshoduje
JMP endCl0
contC3: CALL setM1
CLR DIR_M2
CLR ir1
SETB ir2
CLR EN_M2 ;zapnuti motoru doprava spojky
SETB EX0
JMP endCl1
endCl0: CLR EX0
CLR CluGO
endCl1: RET
setM1: MOV tmrPuls,#40 ;doba zapnutí motoru na jednu stranu - 400ms
SETB pulsate
CLR EN_M1
RET
;---------------------------------------------------------------------
clutch: JNB CluGO,endCou1
PUSH 0E0h ;zaloha akumulatoru
PUSH 0h ;zaloha R0
PUSH 1h ;zaloha R1
PUSH 2h ;zaloha R2
push 3h
push psw
MOV A,#11000000b
ANL A,drive
JNZ norm
CALL repair
JMP endCou2
norm: CALL normal
endCou2: pop psw
pop 3h
POP 2h
POP 1h
POP 0h
POP 0E0h
endCou1: RET
repair: JB lastb1,jRep ;pro spojku jedouci doprava
CALL getS3 ;přečte stav senzoru 3 (středový)
JNC endRep ;při projetí senzoru 3 zprava doleva
SETB DIR_M2
JMP endRep0
jRep: CALL getS3 ;pro spojku jedouci doleva
JC endRep ;při projetí senzoru 3 zleva doprava
CLR DIR_M2
endRep0: CLR EX0
setb ir1
setb ir2
anl drive,#11000011b;nastaveni systému po nastavení spojky do středové polohy
SETB brake
CLR pulsate
SETB EN_M1
endRep: RET
getS1: MOV R0,#3 ;ulozen stav snimace
MOV R1,#3 ;pocet opakovani mereni
j2GS1: MOV R2,#20 ;doba do dalsiho mereni v us
JB SEN_C1,j1GS1
DEC R0
JMP tGS1
j1GS1: INC R0
tGS1: DJNZ R2,$
DJNZ R1,j2GS1
CJNE R0,#0,j3GS1
CLR C
RET
j3GS1: CJNE R0,#6,getS1
SETB C
RET
getS2: MOV R0,#3 ;ulozen stav snimace
MOV R1,#3 ;pocet opakovani mereni
j2GS2: MOV R2,#20 ;doba do dalsiho mereni v us
JB SEN_C2,j1GS2
DEC R0
JMP tGS2
j1GS2: INC R0
tGS2: DJNZ R2,$
DJNZ R1,j2GS2
CJNE R0,#0,j3GS2
CLR C
RET
j3GS2: CJNE R0,#6,getS2
SETB C
RET
getS3: MOV R0,#3 ;ulozen stav snimace
MOV R1,#3 ;pocet opakovani mereni
j2GS3: MOV R2,#20 ;doba do dalsiho mereni v us
JB SEN_C3,j1GS3
DEC R0
JMP tGS3
j1GS3: INC R0
tGS3: DJNZ R2,$
DJNZ R1,j2GS3
CJNE R0,#0,j3GS3
CLR C
RET
j3GS3: CJNE R0,#6,getS3
SETB C
RET
;zde se kontroluje zda zadana poloho se rovna aktualni poloze spojky
normal: JNB ir1,test3N ;brzda pro polohu uprostred
JNB ir2,test3N
JNB lastPos,elseN ;ir2 ;zjisteni aktualni polohy
call getS3 ;získá stav senzoru 2
JC endNor ;test projetí senzorem
CLR DIR_M2 ;spojka vpravo -> jede doleva -> brzda doprava
JMP endNor1
elseN: call getS3 ;získá stav senzoru 2
JNC endNor ;test projetí senzorem
SETB DIR_M2 ;spojka vpravo -> jede doprava -> brzda doleva
JMP endNor1
test3N: JNB ir1,test4N ;test spojky vlevo
call getS2 ;získá stav senzoru 2
JNC endNor ;test projetí senzorem
CLR DIR_M2 ;spojka vlevo -> jede doleva -> brzda doprava
JMP endNor1
test4N: JNB ir2,endNor ;test spojky vpravo
call getS1 ;získá stav senzoru 1
JNC endNor ;test projetí senzorem
SETB DIR_M2 ;spojka vpravo -> jede doprava -> brzda doleva
endNor1: clr EX0
CLR pulsate ;spojka nastavena - ukončení puslovaní pohonu
SETB brake
SETB EN_M1
endNor:
RET
;------------------------------------------------------------------
timer0: PUSH 0h ;záloha regitru R0
push 0e0h
push psw
MOV TH0,#0B1h ;nastavení timeru na 10ms
MOV TL0,#0E0h
SETB TR0
JB RI,jTmr00 ;neinkrementuje hodnotu při příjmu/odeslani dat po RS232
inc timer1
jTmr00: JNB timeOut,jTmr0 ;timeout RS232
djnz tmrOut,jTmr0 ;testuje zda časový limit vypršel
setb err6 ;nastaví chybu RS232 - vypršení doby pro příjem packetu
mov recByte,#0
mov tmrOut,#TIMEOUT
clr p1.4
clr timeOut
jTmr0: JNB pulsate,jTmr1
;JB EN_M1,jTmr50 ;motor s 50% výkonem
; setb EN_M1
;jmp jTmr51
; jTmr50: clr EN_M1
jTmr51: DJNZ tmrPuls,jTmr1
MOV tmrPuls,#25 ;doba zapnutí motoru na jednu stranu - 400ms
JB DIR_M1,toSide2
SETB DIR_M1
JMP jTmr1
toSide2: CLR DIR_M1
jTmr1: JNB brake,jTmr2 ;brzda
DJNZ tmrBrk,jTmr2
SETB EN_M2
CLR EX0
CLR brake
SETB start
CLR CluGO
MOV tmrBrk,#17 ;nastavení doby aktivace brzdy na 170ms
jTmr2: JB EnSen,endTmr
DJNZ tmrSen,endTmr
SETB EnSen
MOV tmrSen,#6
endTmr: pop psw
pop 0e0h
POP 0h
RET
INCLUDE(INS16b.asm)
INCLUDE(sensors.asm)
INCLUDE(CMPS03.asm)
INCLUDE(I2C.asm)
INCLUDE(auto.asm)
include(rs232.asm)
include(time.asm)
;INCLUDE(debug.asm)
END
|
| kód: | RS232.asm
; mov th1,#243
; mov tmod,#00100000b
; mov scon,#01000000b
; setb tr1
; mov pcon,#10000000b
;R0 - adresa bufferu
;R1 - délka dat
RAuto BIT 26h.4
serial: PUSH 0E0h ;zaloha akumulatoru
PUSH 0h ;zaloha R0
PUSH 1h ;zaloha R1
PUSH 2h ;zaloha R2
PUSH 3h
PUSH 4H
PUSH 5h
PUSH 6h
PUSH 7h
PUSH PSW
SETB timeOut
MOV A,#RBuff ;adresa přijímacího bufferu
ADD A,recByte ;vypočítá adresu přijateho bajtu v bufferu
MOV R0,A
MOV @R0,SBUF ;uloží přijatá data do bufferu
INC recByte ;ukládá počet přijatých bajtů
MOV A, recByte
CJNE A,#RECPAC,endRecRS ;kontrola zda přijal celý packet
MOV R0,#RBuff ;předá adresu přijímacího bufferu
MOV R1,#RECPAC - 1 ;délka přijatého packetu mínus bajt s CRC
CALL calcCRC ;vypočítá CRC
MOV A,@R0 ;přečte přijatý CRC z bufferu
MOV recByte,#0
MOV tmrOut,#TIMEOUT
CJNE A,1h,end2RecRS ;porovná vypočítaný CRC v R1 - 0H s přijatým v A
CLR timeOut
CALL SepareData
;************* pokud tato část je v dalším podporgramu a zároveň je přerušení od spojky(clutch - EX0), pak se celý program chová nedefinovaně***********
MOV 40h,RBuff ;odešle indentifikační čislo přijateho packetu
MOV 41h,Ri2c_1 ;udaj o hodnote v kompasu
MOV 42h,#0 ;rezervní bajt pro druhou hodnotu z kompasu
MOV 43h,errors ;odešle chyby robota
MOV 44h,#0 ;rezervní bajt pro chyby
MOV 45h,sensor ;odešle udaj o stavu senzoru
mov c, EN_M1 ;získá údaje o stavu hlavního pohonu
cpl c
mov EnMov,c
mov c, DIR_M1
cpl c
mov DirMov,c
MOV 46h,drive ;odešle udaj o pohybu robota
MOV 47h,#0 ;rezervní 2bajty
MOV 48h,#0
MOV R0,#SBuff
MOV R1,#SENDPAC - 1
CALL calcCRC
MOV A,R1
MOV @R0,A
CALL sendPac
;********************************************************
jmp endRecRS
end2RecRS: SETB err5
endRecRS: POP PSW
Pop 7h
Pop 6h
POP 5h
POP 4h
POP 3h
POP 2h
POP 1h
POP 0h
POP 0E0h
RET
SepareData: MOV 26h,RBuff + 1
MOV C,RAuto
MOV auto,C
MOV P0.7,C
JNC sepMan
JB LastState,endSep
clr DIR_M1
clr EN_M1
jmp endSep
sepMan: ;JNB LastState,jSep0
;clr CluGO
;jSep0:
MOV A,26h
RRC A
JNC jSep1 ;test zda má jet robot rovně dopřrdu
clr DIR_M1
clr EN_M1
JMP endSep
jSep1: RRC A
JNC jSep2 ;test zda má jet robot rovně dozadu
SETB DIR_M1
clr EN_M1
JMP endSep
jSep2: anl drive,#11000111b ;vynuluje minulé nastaveni spojky
;clr CluGO
RRC A
JNC jSep3
setb LClu
setb EnClu
jmp endSep
jSep3: RRC A
JNC jSep4
setb RClu
setb EnClu
jmp endSep
jSep4: setb EN_M1
endSep: mov c,auto
mov LastState,c
RET
;odesilany packet: 1B index/2B kompas/2B chyby /1B senzory /1B řizení/ 2B reservovány/CRC
sendRS232: MOV 40h,RBuff ;odešle indentifikační čislo přijateho packetu
MOV 41h,Ri2c_1 ;udaj o hodnote v kompasu
MOV 42h,#0 ;rezervní bajt pro druhou hodnotu z kompasu
MOV 43h,errors ;odešle chyby robota
MOV 44h,#0 ;rezervní bajt pro chyby
MOV 45h,sensor ;odešle udaj o stavu senzoru
MOV 46h,drive ;odešle udaj o pohybu robota
MOV 47h,#0 ;rezervní 2bajty
MOV 48h,#0
MOV R0,#SBuff
MOV R1,#SENDPAC - 1
CALL calcCRC
MOV A,R1
MOV @R0,A
CALL sendPac
RET
sendPac: MOV R0,#SBuff
MOV R1,#SENDPAC
CLR ES ;vypne přerušení od sériového portu
sendS: MOV SBUF,@R0 ;odešle adresu v hexa
JNB TI,$
CLR TI
INC R0
DJNZ R1,sendS
SETB ES ;zapne přerušení od sériového portu
RET
;R0 - adresa bufferu
;R1 - délka dat
;výsledek CRC vrací v R1 a adtesa CRC v bufferu je v r0
calcCRC: MOV A,R1
MOV R4,A
MOV R1,#0
MOV R3,#0
MOV R5,#0 ;Součet = suma(data)
sum: MOV A,@R0 ;získá hodnotu 1.B bufferu
MOV R2,A ;parametru instrukce ADD16, dolní bajt 2. operandu
INC R0 ;zvýší adresu bufferu
MOV A,R0 ;vymění hodnoty mezi registry R0,R5, protoze
XCH A,R5 ;R0 je také použit jako dolní bajt 1. opernadu instrukce ADD16
XCH A,R0
CALL ADD16 ;přičte hodnotu z registru R2
MOV A,R0 ;vymění hodnoty mezi registry R0,R5
XCH A,R5
XCH A,R0 ;sečte všechny bajty bufferu
DJNZ R4,sum ;horní bajt je v r1 a dolní v r5
MOV A,R1 ;CRC = FFh - [HB+DB] + 1
ADD A,R5
MOV R1,A
MOV A,#0ffh
CLR C
SUBB A,R1
INC A
MOV R1,A
RET
|
| kód: | INS16b.asm
;******************************************************;
;*-------------- 16 bitové instrukce -----------------*;
;******************************************************;
;----------------------- ROZDÍL -----------------------
;operand 1: R0 - dolní bajt, R1 - horní bajt
;opernad 2: R2 - dolní bajt, R3 - horní bajt
;result : R0 - dolní bajt, R1 - horní bajt
SUBB16: CLR C
MOV A,R0
SUBB A,R2
MOV R0,A
MOV A,R1
SUBB A,R3
MOV R1,A
RET
;----------------------- SOUČET ------------------------
;operand 1: R0 - dolní bajt, R1 - horní bajt
;opernad 2: R2 - dolní bajt, R3 - horní bajt
;result : R0 - dolní bajt, R1 - horní bajt
ADD16: MOV A,R0
ADD A,R2
MOV R0,A
MOV A,R1
ADDC A,R3
MOV R1,A
RET
;---------------------- INKREMENT -----------------------
;operand: adresa dolního bajtu v R0
INC16: MOV A,@R0
INC @R0
CJNE A,#0FFh,inc0
INC R0
INC @R0
inc0: RET
;---------------------- DEKREMENT -----------------------
;operand: adresa dolního bajtu v R0
DEC16: MOV A,@R0
DEC @R0
CJNE A,#0,dec0
INC R0
DEC @R0
dec0: RET
|
|
|
| Návrat nahoru |
|
 |
Karri Lama

Založen: 18.10.2007 Příspěvky: 19 Bydliště: Pardubice
|
Zaslal: čt duben 10, 2008 1:16 pm Předmět: |
|
|
Zdravím, tak než by tohle celé rozluštil, asi by to pár let trvalo. Bohužel... _________________ Slovem OPERAČNÍ je zdůrazněna skutečnost, že práce s Windows se podobá těžké operaci bez umrtvení.
Slovo SYSTEM bylo pravděpodobně zvoleno zcela náhodně, zrovna tak mohlo být použito slovo Chaos.
Slovo WINDOWS charakterizuje vlastnost systému ničit počítačová data. Vychází se slangového výrazu pro ztrátu paměti - mít okno. |
|
| Návrat nahoru |
|
 |
xp Lama
Založen: 30.3.2008 Příspěvky: 7
|
Zaslal: út duben 15, 2008 7:21 am Předmět: |
|
|
| tady tak nejde o pochopení programu jak přesně funguje, protože program jako takový by měl být v pořádku, ale zajímá mě proč když dám část programu odeslání dat do podprogramu z popdprogramu RS232 a budu jej z RS232 volat, čímž dojde k dalšímu vnoření podprogramů, tak se program přestane chovat koretně (problémy nastanou i když vložím několik prázdních podprogramů, jak jsem psal v předcházejícím příspěvku. |
|
| Návrat nahoru |
|
 |
Karri Lama

Založen: 18.10.2007 Příspěvky: 19 Bydliště: Pardubice
|
Zaslal: út duben 15, 2008 8:17 pm Předmět: |
|
|
A kde nastavuješ zásobník? _________________ Slovem OPERAČNÍ je zdůrazněna skutečnost, že práce s Windows se podobá těžké operaci bez umrtvení.
Slovo SYSTEM bylo pravděpodobně zvoleno zcela náhodně, zrovna tak mohlo být použito slovo Chaos.
Slovo WINDOWS charakterizuje vlastnost systému ničit počítačová data. Vychází se slangového výrazu pro ztrátu paměti - mít okno. |
|
| Návrat nahoru |
|
 |
xp Lama
Založen: 30.3.2008 Příspěvky: 7
|
Zaslal: út duben 15, 2008 9:24 pm Předmět: |
|
|
Zásobník se nějak nastavuje ? |
|
| Návrat nahoru |
|
 |
Karri Lama

Založen: 18.10.2007 Příspěvky: 19 Bydliště: Pardubice
|
Zaslal: čt duben 17, 2008 3:43 pm Předmět: |
|
|
No jasně, musí se nastavit, jinak ti může jít do registrů který si měníš a tím se ti program dostane kam nemá. A to bude možná ono.
Zkus:
hodit hned za návěští INIT (prostě na zařátek výkonnýho kódu)
SP si můžeš nastavit kamkoliv jinam od adresy 30h vejš (já ho mám u jednoho programu na 60h). Hlavně si musíš dát pozor, abys ho neumístil na jiný proměnný  _________________ Slovem OPERAČNÍ je zdůrazněna skutečnost, že práce s Windows se podobá těžké operaci bez umrtvení.
Slovo SYSTEM bylo pravděpodobně zvoleno zcela náhodně, zrovna tak mohlo být použito slovo Chaos.
Slovo WINDOWS charakterizuje vlastnost systému ničit počítačová data. Vychází se slangového výrazu pro ztrátu paměti - mít okno. |
|
| Návrat nahoru |
|
 |
xp Lama
Založen: 30.3.2008 Příspěvky: 7
|
Zaslal: ne duben 27, 2008 8:54 am Předmět: |
|
|
| díky, bylo to tím |
|
| Návrat nahoru |
|
 |
Karri Lama

Založen: 18.10.2007 Příspěvky: 19 Bydliště: Pardubice
|
Zaslal: po duben 28, 2008 9:00 pm Předmět: |
|
|
Tak to je fajn  _________________ Slovem OPERAČNÍ je zdůrazněna skutečnost, že práce s Windows se podobá těžké operaci bez umrtvení.
Slovo SYSTEM bylo pravděpodobně zvoleno zcela náhodně, zrovna tak mohlo být použito slovo Chaos.
Slovo WINDOWS charakterizuje vlastnost systému ničit počítačová data. Vychází se slangového výrazu pro ztrátu paměti - mít okno. |
|
| Návrat nahoru |
|
 |
|
|
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru.
|
|