PIC16F628A - zmena hodnoty v registroch
Moderátor: Moderátoři
Tak som skusil okomentovat B1.Ostane Bcka su rovnake, rozdiel je v inych hodnotach vkladanych do registrov a odkazuju na ine navestia pri stlaceni UP, alebo DOWN.
A1 az Ax su to iste ,akurat sa v nich navyse testuje tlacidlo WELD, ktore zavola podprogram samotnej sekvencie zvarania. Tu sa vkladaju hodnoty do registrov samotneho zvarania.
Da sa teda ulozit nazov navestia, alebo cislo riadku ako hodnota do registra? - Alebo sa pytam blbost?
Nie je to nic, co by som nutne potreboval,len ma to zaujima.
Teraz ak chcem nastavit predzvar, stlacim simultalne UP/DPWN a skocim do B1(10ms). Tam preskacem do B3(30ms) a stade sa vratim na A.
Pri opetovnej potrebe nastavenia predzvaru vsak opet skocim na B1.
Rad by som vsak skocil na B3, aby som vedel aka bola posledna nastavena hodnota.
No moja myslienka je taka,ze pri opustani B3, si niekde ulozim ze som z neho vyskocil a pri novom skoku z A do B si tuto hodnotu nacitam.
A1 az Ax su to iste ,akurat sa v nich navyse testuje tlacidlo WELD, ktore zavola podprogram samotnej sekvencie zvarania. Tu sa vkladaju hodnoty do registrov samotneho zvarania.
Da sa teda ulozit nazov navestia, alebo cislo riadku ako hodnota do registra? - Alebo sa pytam blbost?
Nie je to nic, co by som nutne potreboval,len ma to zaujima.
Teraz ak chcem nastavit predzvar, stlacim simultalne UP/DPWN a skocim do B1(10ms). Tam preskacem do B3(30ms) a stade sa vratim na A.
Pri opetovnej potrebe nastavenia predzvaru vsak opet skocim na B1.
Rad by som vsak skocil na B3, aby som vedel aka bola posledna nastavena hodnota.
No moja myslienka je taka,ze pri opustani B3, si niekde ulozim ze som z neho vyskocil a pri novom skoku z A do B si tuto hodnotu nacitam.
Kód: Vybrat vše
PRE10 CALL PRESTEST ;PODPROGRAM TESTUJUCI SIMULTANNE STLACENIE UP/DOWN.
MOVLW 0XCF ;VLOZENIE HODNOTY DO REGISTRA CASOVEJ SMYCKY PREDZVARU
MOVWF Z1 ;
MOVLW 0X08 ;
MOVWF Z2 ;
MOVLW 0X1 ;
MOVWF Z3 ;VLOZENIE HODNOTY DO REGISTRA CASOVEJ SMYCKY PREDZVARU
MOVLW 0X7F ;MULTIPLEX DYSPLAY - ZOBRAZENA HODNOTA 10ms
MOVWF PORTB ;
MOVWF PD1 ;
BSF D1 ;
CALL TIME1 ;
BCF D1 ;
MOVLW 0X4F ;
MOVWF PORTB ;
MOVWF PD2 ;
BSF D2 ;
CALL TIME1 ;
BCF D2 ;
MOVLW 0X40 ;
MOVWF PORTB ;
MOVWF PD3 ;
BSF D3 ;
CALL TIME1 ;
BCF D3 ;MULTIPLEX DYSPLAY - ZOBRAZENA HODNOTA 10ms
BTFSS UP ;TEST TLACIDLA UP, AK JE STLACENE ZAVOLAJ 20(B2)
CALL PRE20
BTFSS DOWN ;TEST TLACIDLA DOWN, AK JE STLACENE ZAVOLAJ 0(B0)
CALL PRE0
CALL PRE10 ;NEBOLO STLACENE NIC,VRAT SA NA ZACIATOK A VSETKO ZNOVA.
- Přílohy
-
- Bodovacka.png
- (20.94 KiB) Staženo 67 x
Tak teoreticky vies skocit kde len chces instrukciou GOTO $-x kde x cislo o ktore sa to posunie, znamienko predtym udava ci bude skok v pred alebo v zad. Inak strasna pracascina.
Nechapem preco si to tak komplikujes a pouzivas dve tlacidla a to ako fakt.
pouzitie 4 tlacidiel je ok a na takych hovadinach sa nesetri.
Daj schemu mam. To simultane tlacenie vyhod daj tam este jedno tlacisdlo a cez 2 diody ho zapoj na tie dva piny.
Cely tvoj problem je hlavne ze tam mas malo tlacidiel.
Ale je aka moznost zapnes to a nacitas z registra pre *predzvar hodnotu do nejakej premenej X dalej vies tu hodnotu X menit tlacidlami hore dole tj zvecsovat zmensovat, po opetovnom simultalnom stlaceni tlacidiel horedole, i tu premenu X prekopirujes do registra *predzvar.
Teraz si nacitas hodnotu z registra pre *zvar do premenej Y a tu zase vies upravovat tlacidlami hore dole, po spolocnom stlaceni horedole zober hodnoty Y a zapis do registra *zvar
MPlab umoznu je definovat hodnoty pr iinicialixzacii, tak ze vies nadefinovat napr zvar=20 a predzvar=40 tym padom v programe pri prvom zapnuti budes nastavovat casi od tychto hodnot co je prakticke (ak das osvecene hodnoty tak nebudes nastavovat len hned zvarat)[/b]
Nechapem preco si to tak komplikujes a pouzivas dve tlacidla a to ako fakt.
pouzitie 4 tlacidiel je ok a na takych hovadinach sa nesetri.
Daj schemu mam. To simultane tlacenie vyhod daj tam este jedno tlacisdlo a cez 2 diody ho zapoj na tie dva piny.
Cely tvoj problem je hlavne ze tam mas malo tlacidiel.
Ale je aka moznost zapnes to a nacitas z registra pre *predzvar hodnotu do nejakej premenej X dalej vies tu hodnotu X menit tlacidlami hore dole tj zvecsovat zmensovat, po opetovnom simultalnom stlaceni tlacidiel horedole, i tu premenu X prekopirujes do registra *predzvar.
Teraz si nacitas hodnotu z registra pre *zvar do premenej Y a tu zase vies upravovat tlacidlami hore dole, po spolocnom stlaceni horedole zober hodnoty Y a zapis do registra *zvar
MPlab umoznu je definovat hodnoty pr iinicialixzacii, tak ze vies nadefinovat napr zvar=20 a predzvar=40 tym padom v programe pri prvom zapnuti budes nastavovat casi od tychto hodnot co je prakticke (ak das osvecene hodnoty tak nebudes nastavovat len hned zvarat)[/b]
Ano, program není dobře napsaný. Protože ale nevíme, zda je toto tvůj první a poslední program nebo se tím hodláš zabývat i dál, tak nyní vezmu v potaz jen to, že jsi nějak došel k cíli a další start už nebude
... tedy vyřešíme jen tento program. Tvoje potřeba je po zajetí do sekce B skočit na takové Bx, ze kterého bylo naposledy vyskočeno. Berme v potaz, že používáš všude GOTO, což je vzhledem k tvému řešení programu "dobře". Tedy principiálně to uděláš tak, že po skoku na B se zeptáš, jaká byla poslední svářecí hodnota a dle ní skočíš do příslučného Bx. Místo hodnoty svářecího času si můžeš udělat registr třeba "Last_prog" a tam si při výstupu z Ax či Bx uložiš číslo, na které se budeš ptát v A nebo B a dle toho skočíš do Ax nebo Bx. Kapíš to?
![Laughing :lol:](./images/smilies/icon_lol.gif)
Žádnej učenej z nebe nespadl ...
Atlan - schema v prilohe. Hardware je uz hotovy, cize tlacidlo pridavat nebudem. Ja som povodne zacinal s verziou 10polohoveho prepinaca pre casy zvaru, samotny predzvar bol konstantny. Potom som si povedal ze skusim display.Pri prvych pokusoch zvarania som zistil, ze rozsah zvaracich casov ma byt rozsiahlejsi. Taktiez samotny predzvar je dobre mat regulovatelny - hoci to nie je nijak kriticke. A tak som sa dopracoval az sem.
Jeejda - datasheet k MCU uz mam davno, za ten MPLAB vdaka, je tam vela veci, ktorim som nerozumel a este ani nerozumiem, ale tu to je popisane. Mam co studovat.
Chenzze - Je to presne tak ako pises. Toto je moj prvy program. Ja som sa aj pytal, ci by mi niekto nenacrtol vyvojovy diagram, ale par ludi mi napisalo len ich predstavu v texte, comu som vobec nerozumel. Tak som zacal, ako som vedel - so zobrazenim cislice na LED displeji, Multiplex atd...V ramci hobby uz planujem dalsi projekt, ale ak by som sa tomu chcel venovat profesionalne, tak by som celkom urcite isiel na nejaky kurz. Vo forme samouky je to zlozite a clovek si lahko spravi zle navyky v zakladoch - asi to najhorsie ,co sa pri uceni sa novych veci moze stat. Stale mi vrtalo v hlave, ako moze procesor na zaklade 0 a 1, robit take uzasne veci. Teraz ma to posunulo, do pozicie ,kde mi to uz hlavu netrapi.
Skusal som instrukciu
Kde Z je register do ktoreho ukladam hodnotu pri vyskoceni z Bx, ale nefunguje to.
![Pako :pako:](./images/smilies/icon_kz.gif)
Jeejda - datasheet k MCU uz mam davno, za ten MPLAB vdaka, je tam vela veci, ktorim som nerozumel a este ani nerozumiem, ale tu to je popisane. Mam co studovat.
Chenzze - Je to presne tak ako pises. Toto je moj prvy program. Ja som sa aj pytal, ci by mi niekto nenacrtol vyvojovy diagram, ale par ludi mi napisalo len ich predstavu v texte, comu som vobec nerozumel. Tak som zacal, ako som vedel - so zobrazenim cislice na LED displeji, Multiplex atd...V ramci hobby uz planujem dalsi projekt, ale ak by som sa tomu chcel venovat profesionalne, tak by som celkom urcite isiel na nejaky kurz. Vo forme samouky je to zlozite a clovek si lahko spravi zle navyky v zakladoch - asi to najhorsie ,co sa pri uceni sa novych veci moze stat. Stale mi vrtalo v hlave, ako moze procesor na zaklade 0 a 1, robit take uzasne veci. Teraz ma to posunulo, do pozicie ,kde mi to uz hlavu netrapi.
Skusal som instrukciu
Kód: Vybrat vše
goto $+Z
Toto spravim akou instrukciou ? Pozeral som sa, ale neprisiel som na nic rozumne - len same neuspesne pokusy - uz druhy denTedy principiálně to uděláš tak, že po skoku na B se zeptáš, jaká byla poslední svářecí hodnota a dle ní skočíš do příslučného Bx
![Pako :pako:](./images/smilies/icon_kz.gif)
- Přílohy
-
- xxx_373.png
- (29.69 KiB) Staženo 77 x
V RAM si jeden register vyhraď pre program A a jeden pre B
napr. STA a STB. Môžeš potom uložiť až 256 programov A a 256 programov B. Pri menšom počte je to jednoduchšie. PCHL reg stačí vynulovať. Ako uvádzam nižšie od adresy 0x0080 sa zmestí 64 A-programov a 64 B-programov.
Niekde si uložíš GOTO tabuľlu (jedno za druhým) pre programy A a potom aj pre programy B
Samozrejme STA a STB si ukladáš v prebiehajúcom programe.
Edit:
Aj toto sa mi zdá byť zbytočné komplikovanie.
Všetky tie "programy sú rovnaké, iba sa menia konštanty. Nevidím dôvod, aby ich obsluhovali rôzne programy.
Treba sa naučiť ukladať premenné do EERAM a späť načítavať po reštarte do RAM.
Ten multiplex segmentov by pekne mohol robiť v isr module (prerušovací systém) , podobne aj ohľadávanie tlačitok by mohlo byť od programu nezávislé (spolu s filtrovaním).
Ak by ešte aj časovanie (počítanie) bolo vyriešené prerušovacím systémom cca po 10ms (dá sa zvoliť), aj časy by sa mohli nastavovať plynule a zobrazovať v reáli o 0 po 990ms.
edit 2
A po tej schéme tu bude kopec múdrujúcich
Zrejme ten MOC 3023 v spojení s PORTA,5 moc nefunguje.
edit 3 Asi to bude s MOC3033/3053 bez ZC
napr. STA a STB. Môžeš potom uložiť až 256 programov A a 256 programov B. Pri menšom počte je to jednoduchšie. PCHL reg stačí vynulovať. Ako uvádzam nižšie od adresy 0x0080 sa zmestí 64 A-programov a 64 B-programov.
Niekde si uložíš GOTO tabuľlu (jedno za druhým) pre programy A a potom aj pre programy B
Kód: Vybrat vše
ORG 0x0080
TAB_A GOTO PROGA0
GOTO PROGA1
.
.
TAB_B GOTO PROGB0
GOTO PROGB1
.
.
; v aktualnom programe B použijes súcet STA + TAB_A takto:
MOVLW TAB_A
ADDWF STA,w
CLRF PCHL
MOVWF PCL ; teraz sa prepíše PCL novou hodnotou a zároveň sa presunie PCHL do PCH.
; nasledovať bude inšrukcia s tabuľky TAB
Edit:
Aj toto sa mi zdá byť zbytočné komplikovanie.
Všetky tie "programy sú rovnaké, iba sa menia konštanty. Nevidím dôvod, aby ich obsluhovali rôzne programy.
Treba sa naučiť ukladať premenné do EERAM a späť načítavať po reštarte do RAM.
Ten multiplex segmentov by pekne mohol robiť v isr module (prerušovací systém) , podobne aj ohľadávanie tlačitok by mohlo byť od programu nezávislé (spolu s filtrovaním).
Ak by ešte aj časovanie (počítanie) bolo vyriešené prerušovacím systémom cca po 10ms (dá sa zvoliť), aj časy by sa mohli nastavovať plynule a zobrazovať v reáli o 0 po 990ms.
edit 2
A po tej schéme tu bude kopec múdrujúcich
![Very Happy :D](./images/smilies/icon_biggrin.gif)
Zrejme ten MOC 3023 v spojení s PORTA,5 moc nefunguje.
edit 3 Asi to bude s MOC3033/3053 bez ZC
No toto mi bolo jasne - skor som sa pytal prave na to,ako sa to da spravit v assemblery
.
Jeejda - nejak som to nepochopil - to by bolo vhodnejsie pouzit interny pull up?
procesor - schemu bez s rezervou. Ano mas pravdu je tam iny optoclen - randoom phase detector. Hardware je funkncny, nakolko som uz nejake akupacky pozvaral a spinanie vyzera byt v maxime - prudove narazy a bliknutie svetiel v dielni tomu nasvedcuju...
Ok,tak skusim spravit uplne novy program.
Preruseniu som sa nejako snazil vyhnut, asi kvoli tomu,ze mu uplne nerozumiem...Ale vidim ze prave prerusenie sa vyuziva velmi casto.
Ok cize:
-Hlavna smycka
-Nastavim casovac1 na 10ms a povolim prerusenie od tohoto casovaca
-po preteceni dojde k preruseniu kde mi z hlavnej smycky skoci program na urcene miesto
-na tomto mieste spravim mutiplex a otestujem tlacidla
- pri stlaceno tlacidle :
- up,skoci program na miesto kde pripocita hodnotu 10 do registra DISPLAY
-down, skoci program na miesto kde odpocita hodnotu 10 od registra DISPLAY
-weld,skoci program na miesto kde prebehne sekvencia zvaru
-register DISPLAY sa bude pouzivat pre zobrazenie hodnoty na displeji a zaroven na casy zvarania.
Takto nejako moze byt?
![Smile :)](./images/smilies/icon_smile.gif)
Jeejda - nejak som to nepochopil - to by bolo vhodnejsie pouzit interny pull up?
procesor - schemu bez s rezervou. Ano mas pravdu je tam iny optoclen - randoom phase detector. Hardware je funkncny, nakolko som uz nejake akupacky pozvaral a spinanie vyzera byt v maxime - prudove narazy a bliknutie svetiel v dielni tomu nasvedcuju...
Ok,tak skusim spravit uplne novy program.
Preruseniu som sa nejako snazil vyhnut, asi kvoli tomu,ze mu uplne nerozumiem...Ale vidim ze prave prerusenie sa vyuziva velmi casto.
Ok cize:
-Hlavna smycka
Kód: Vybrat vše
start
goto $-1
-po preteceni dojde k preruseniu kde mi z hlavnej smycky skoci program na urcene miesto
-na tomto mieste spravim mutiplex a otestujem tlacidla
- pri stlaceno tlacidle :
- up,skoci program na miesto kde pripocita hodnotu 10 do registra DISPLAY
-down, skoci program na miesto kde odpocita hodnotu 10 od registra DISPLAY
-weld,skoci program na miesto kde prebehne sekvencia zvaru
-register DISPLAY sa bude pouzivat pre zobrazenie hodnoty na displeji a zaroven na casy zvarania.
Takto nejako moze byt?
Tym filtrovanim myslis co?Ten multiplex segmentov by pekne mohol robiť v isr module (prerušovací systém) , podobne aj ohľadávanie tlačitok by mohlo byť od programu nezávislé (spolu s filtrovaním).
Filtrovanie...zákmity tlačidla. To môže trvať aj dlhšie ako 20ms. Tlačidlá je dobré ošahať a stav uložiť do registra. Hlavý program si to v registri nájde, vykoná čo treba. Po každom prebehu riadiaceho cyklu si môžeš stav tlačidiel (register) presunúť do druhého registra, čím získaš info v nasledujúcom cykle štyri-info o tom tlačidle:
1- čerstvo stlačené
2-už dlhšie stlačené
3-čerstvo pustené
4-dlhšie pustené
Hlavný program beží v slučke
Podľa tlačidiel zapína porty, nastavuje časovače, zapisuje segmetové registre,vypína porty.
Stále dokola.
IT routina aktualizované časovače dekremetuje, a posiela segmetové registre na port-mux, trebárs každých 10ms, alebo aj pomalšie.
Toto používam pre začiatok a koniec IT rutiny
Uloží sa kontext programu (STATUS, W reg, PCHL) a potom sa všetko vráti späť, aby hlavý program mohol nerušene pokračovať.
Tie registre (w_temp, status_temp, pchl_temp) je dobré umiestniť v oblasti GPS od 0x70 aby sa nemuselo riešiť "bank-ovanie" zložito, pretože prerušenie môže vzniknúť a v inom stave ako BANK0.
Samotná IT rutina môže byť aj v inom PAGESEL0 pri väčších pamätiach, preto je tam aj inštukcia
V prerušovacom programe dekrementuj čítače (môžeš ich mať aj viac pre rôzne použitie).
V hlavnom programe nastavíš hodnotu čítača a potom sleduješ kedy sa dopočíta k nule a vykonáš čo potrebuješ. Ku každému čítaču je dobré mať aj indikátor, že sa požaduje po uplynutí času nejaká akcia. Pri zahájení akcie sa ten indikátor zhodí (vynuluje)
Takéto macro používam v IT routine. Trebárs aj 16 časovačov TIMn =TIM0....TIM15 ( n funguje až do 32)
Každému TIMeru je priradených v registri TER0 a TER1 32 bitové pole pre do ktorého sa po dočítaní čítača zapíše jednotka.
Hlavný program sleduje tento byt (timer-flag) a vie že časovač práve dočítal.
V hlavnom programe sa časovač štartuje zase ako makro ak hodnoty časovačov sú uložené v EERAM
EEData_Read je funkcia, ktorá vyberie z pamäte EERAM príslusnú hodnotu daného časovača. Na záver makra sa hodnota zapíše do časovača a vymaže sa (pre istotu) príslušný timer-flag-bit v registri TER0/1.
Zápis makra je zložitý, lebo platí pre každý TIM0...31 s príslušným flagom.
V programe je potom jednoduché
Vyššie popísané makro casovača v IT_routine sa zapíšu napr. takto.
Na úpravu rozsahov je v príklade ešte použité ďalšie delenie pre čítače 7,8,9 a ďalšie pre 10,11,12 a tiež pomalšie pre 13, 14, 15
Makrá sú výhodné pri častom používaní rovnakých algoritmov nad rôznymi registrami a adresami, prípadne aj bitmi. Takéto adresovanie však je možné iba počas prekladu. Prekladač je schopný matematickými a logickými operáciami vygenerovať podľa parametrov makra adresy registrov a adresy návestí, prípadne aj bitov v registroch.
1- čerstvo stlačené
2-už dlhšie stlačené
3-čerstvo pustené
4-dlhšie pustené
Hlavný program beží v slučke
Podľa tlačidiel zapína porty, nastavuje časovače, zapisuje segmetové registre,vypína porty.
Stále dokola.
IT routina aktualizované časovače dekremetuje, a posiela segmetové registre na port-mux, trebárs každých 10ms, alebo aj pomalšie.
Toto používam pre začiatok a koniec IT rutiny
Kód: Vybrat vše
;**********************************************************************************
;
itvector ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register
swapf STATUS,W ; STATUS save to W
clrf STATUS ; banky do 0
movwf status_temp ; save off contents of STATUS register
movfw PCLATH
movwf pclath_temp
clrf PCLATH
if ITUP == 1
pagesel _IntRout
goto _IntRout
else
;==================================================================================
#include <Tgit60502sr.inc> ;TU JE PRERUŠOVACIA ROUTINA
;==================================================================================
endif
RetItRut
movfw pclath_temp
movwf PCLATH
swapf status_temp,w
movwf STATUS
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt set up GIE
Tie registre (w_temp, status_temp, pchl_temp) je dobré umiestniť v oblasti GPS od 0x70 aby sa nemuselo riešiť "bank-ovanie" zložito, pretože prerušenie môže vzniknúť a v inom stave ako BANK0.
Samotná IT rutina môže byť aj v inom PAGESEL0 pri väčších pamätiach, preto je tam aj inštukcia
Kód: Vybrat vše
pagesel IntRout
goto IntRout
V hlavnom programe nastavíš hodnotu čítača a potom sleduješ kedy sa dopočíta k nule a vykonáš čo potrebuješ. Ku každému čítaču je dobré mať aj indikátor, že sa požaduje po uplynutí času nejaká akcia. Pri zahájení akcie sa ten indikátor zhodí (vynuluje)
Takéto macro používam v IT routine. Trebárs aj 16 časovačov TIMn =TIM0....TIM15 ( n funguje až do 32)
Každému TIMeru je priradených v registri TER0 a TER1 32 bitové pole pre do ktorého sa po dočítaní čítača zapíše jednotka.
Hlavný program sleduje tento byt (timer-flag) a vie že časovač práve dočítal.
Kód: Vybrat vše
; CASOVAC TIMn pre interupt rutinu
RTM_M macro n
tstf TIM#v(n)
BZ GoTIM#v(n+1)
decf TIM#v(n),F
_Z_TSC
bsf TER#v(n/8),#v(n-(n/8)*8)
GoTIM#v(n+1)
endm
Kód: Vybrat vše
; Code pre Start casovaca TIM(timer) s konstantou TK(tk)
START_TIM_M macro timer,tk
StartTIM#v(timer)TK#v(tk)
movlw TK#v(tk)-H'2100'
LETR#v($)
if LETR#v($)/2048 == 0
call EEData_Read
else
pagesel p0
call EEData_Read
pagesel p1
endif
movwf TIM#v(timer)
bcf TER#v(timer/8),#v(timer-(timer/8)*8)
endm
Zápis makra je zložitý, lebo platí pre každý TIM0...31 s príslušným flagom.
V programe je potom jednoduché
Kód: Vybrat vše
.
.
JeVozNaIS ;staci ak na jednej slucke je voz - nahod TIM2,tk2 ;
call StartTIM2TK2 ; tk2 cca ( 0,25 - 0,5 sekundy doporuceny )
NaEndIS
.
.
call StartTIM12TK12
.
.
;******************************************
; SLUCKY
START_TIM_M 2,2 ; staci 0,5sek
return
;testovanie fotosyst
START_TIM_M 12,12 ;
return
;******************************************
Na úpravu rozsahov je v príklade ešte použité ďalšie delenie pre čítače 7,8,9 a ďalšie pre 10,11,12 a tiež pomalšie pre 13, 14, 15
Kód: Vybrat vše
CasovaceIt
; takt osc/4
;compare na hodnotu nastavenu pri inicializacii
;CCPIF
banksel WTCON1 ; preddelicka
decf WTCON1,F
BNZ WEndCas
movlw WTCON1K ; obnov reddelicku
movwf WTCON1
STWCas
clrwdt
incf WTCON,F ; 62,5ms
W1Cas ; CWC1 CWC2
movfw WTCON ; max T 32 64 128 256 512
andlw CW1C ;konstanta pre W2Cas 0X00 / 0X01 / 0X03 / 0X07 / 0X0F /
_Z_TSS ; 1/2 1/4 1/8
goto WEndCas
; konstanta pre CWC1 0x01
RTM_M 0 ; ***31,875sek.*** krok 0,125s
RTM_M 1 ;
RTM_M 2
RTM_M 3
RTM_M 4
RTM_M 5
RTM_M 6
W2Cas
movfw WTCON
andlw CW2C ;konstanta pre W2Cas 0x07
_Z_TSS
goto WEndCas
RTM_M 7 ; max. ***127,5sek. krok 0,5sek
RTM_M 8
RTM_M 9
W3Cas
movfw WTCON
andlw CW3C ;konstanta pre W3Cas 0x1F
_Z_TSS
goto WEndCas
RTM_M 10 ; max. ***510sek. krok 2
RTM_M 11
RTM_M 12
W4Cas
movfw WTCON
andlw CW4C ;konstanta pre W4Cas 0x3F
_Z_TSS
goto WEndCas
RTM_M 13 ;***1020sek.=**8,5min krok 4s
RTM_M 14 ; 4s krok max 1000s/ 16min
RTM_M 15
W5Cas
; RTM_M 16 ;
; RTM_M 17 ;
; RTM_M 18 ;
; RTM_M 19 ;
; RTM_M 20 ;
; RTM_M 21 ;
; RTM_M 22 ;
; RTM_M 23 ;
;
WEndCas
_TACT_S ; idikacia ze preslo 0.125 sec / 0.0625sec
bcf PORTA,0
_TMR1IF_C ; povodne sysytemy pracovali bez CCP
_CCP1IF_C ; CCP sa nastavi na lub. dlzku TMR1
; mozno tak urychlovat cyklus riadenia
; pri 14
EndItRout
banksel 0
if ITUP == 1
pagesel 0
goto RetItRut
endif
Naposledy upravil(a) procesor dne 26 úno 2016, 20:04, celkem upraveno 1 x.
Tak zde to je. Neber to jako nejlepší řešení ale jedno z více a takové, které v tuto chvíli vstřebáš. Elegantní je to přes tu tabulku, jak bylo uvedeno výše.
Kód: Vybrat vše
LAST_PROG EQU 0x7F
;--------------------------
MOVLW 0x01 ; ZDE SI ZADEJ CISLO PROGRAMU, KAM CHCES SKOCIT (0-3)
MOVWF LAST_PROG
MOVLW 0x01
;--------------------------
INCF LAST_PROG,F
SUBWF LAST_PROG,F
BTFSC STATUS,Z
GOTO LAST_PROG_0
SUBWF LAST_PROG,F
BTFSC STATUS,Z
GOTO LAST_PROG_1
SUBWF LAST_PROG,F
BTFSC STATUS,Z
GOTO LAST_PROG_2
SUBWF LAST_PROG,F
BTFSC STATUS,Z
GOTO LAST_PROG_3
LAST_PROG_0
NOP
LAST_PROG_1
NOP
LAST_PROG_2
NOP
LAST_PROG_3
NOP
Žádnej učenej z nebe nespadl ...