Obsah fóra forum.kvetakov.net forum.kvetakov.net
Květákov.NET - diskuzní fórum
 
Soukromé zprávySoukromé zprávy

PřihlášeníPřihlášení  RegistraceRegistrace


Profil  Hledat  Seznam uživatelů  FAQ  Uživatelské skupiny
omezení 8051 při přerušení

 
Přidat nové téma   Zaslat odpověď    Obsah fóra forum.kvetakov.net -> Programování uProcesorů
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

PříspěvekZaslal: ne březen 30, 2008 3:58 pm    Předmět: omezení 8051 při přerušení Citovat

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Karri
Lama


Založen: 18.10.2007
Příspěvky: 19
Bydliště: Pardubice

PříspěvekZaslal: ne březen 30, 2008 11:17 pm    Předmět: Citovat

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
xp
Lama


Založen: 30.3.2008
Příspěvky: 7

PříspěvekZaslal: so duben 05, 2008 7:06 pm    Předmět: Citovat

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Karri
Lama


Založen: 18.10.2007
Příspěvky: 19
Bydliště: Pardubice

PříspěvekZaslal: so duben 05, 2008 9:35 pm    Předmět: Citovat

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
xp
Lama


Založen: 30.3.2008
Příspěvky: 7

PříspěvekZaslal: so duben 05, 2008 10:33 pm    Předmět: Citovat

to nebude ono, to jsem se jenom upsal Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Karri
Lama


Založen: 18.10.2007
Příspěvky: 19
Bydliště: Pardubice

PříspěvekZaslal: ne duben 06, 2008 10:33 pm    Předmět: Citovat

xp napsal:
to nebude ono, to jsem se jenom upsal Smile


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
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
xp
Lama


Založen: 30.3.2008
Příspěvky: 7

PříspěvekZaslal: po duben 07, 2008 4:18 pm    Předmět: Citovat

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Karri
Lama


Založen: 18.10.2007
Příspěvky: 19
Bydliště: Pardubice

PříspěvekZaslal: čt duben 10, 2008 1:16 pm    Předmět: Citovat

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
xp
Lama


Založen: 30.3.2008
Příspěvky: 7

PříspěvekZaslal: út duben 15, 2008 7:21 am    Předmět: Citovat

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Karri
Lama


Založen: 18.10.2007
Příspěvky: 19
Bydliště: Pardubice

PříspěvekZaslal: út duben 15, 2008 8:17 pm    Předmět: Citovat

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
xp
Lama


Založen: 30.3.2008
Příspěvky: 7

PříspěvekZaslal: út duben 15, 2008 9:24 pm    Předmět: Citovat

Zásobník se nějak nastavuje Shocked Embarassed ?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Karri
Lama


Založen: 18.10.2007
Příspěvky: 19
Bydliště: Pardubice

PříspěvekZaslal: čt duben 17, 2008 3:43 pm    Předmět: Citovat

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:
kód:

mov  SP,#60H

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ý Smile
_________________
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
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
xp
Lama


Založen: 30.3.2008
Příspěvky: 7

PříspěvekZaslal: ne duben 27, 2008 8:54 am    Předmět: Citovat

díky, bylo to tím
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Karri
Lama


Založen: 18.10.2007
Příspěvky: 19
Bydliště: Pardubice

PříspěvekZaslal: po duben 28, 2008 9:00 pm    Předmět: Citovat

Tak to je fajn Smile
_________________
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
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď    Obsah fóra forum.kvetakov.net -> Programování uProcesorů Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
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.

phpBB "skin" by DewChugr


Powered by phpBB © 2001, 2005 phpBB Group
Český překlad phpBB Czech - www.phpbbcz.com