Tak som zmenil skoro vsetky GOTO na CALL, ale je to v podstate jedno, lebo nepouzivam RETURN.
Ja totiz idem z :
A1 na A0,alebo A2.
A2 na A1,alebo A3.
Atd...
To vnorenie mam max. 3-urovnove.
Skusim sa spyta inac - je mozne ulozit do registrov nazov navestia? Alebo cislo riadku v programe?
Založen: May 10, 2004 Příspěvky: 4513 Bydliště: Košice
Zaslal: st únor 24 2016, 7:06 Předmět:
Nastuduj si vyvojove diagramy lebo z toho nikto nevyjde. Na test tlacidiel si urob podprogram a volaj hoo call return. Multiplex displeja maj v preruseni kludne odvodenom od sinusovky.
Proste mas zlu koncepciu. Program sa ma pisat od od vyvojoveho diagramu.
Neviem co je B1 a B2 tak ze tazko radit.
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.
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.
Založen: May 10, 2004 Příspěvky: 4513 Bydliště: Košice
Zaslal: st únor 24 2016, 10:34 Předmět:
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]
Založen: Jun 26, 2007 Příspěvky: 464 Bydliště: Vysočina
Zaslal: čt únor 25 2016, 5:32 Předmět:
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? _________________ Žá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
kód:
goto $+Z
Kde Z je register do ktoreho ukladam hodnotu pri vyskoceni z Bx, ale nefunguje to.
citace:
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
Toto spravim akou instrukciou ? Pozeral som sa, ale neprisiel som na nic rozumne - len same neuspesne pokusy - uz druhy den
Založen: Oct 02, 2009 Příspěvky: 5286 Bydliště: PO
Zaslal: čt únor 25 2016, 10:03 Předmět:
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
.
.
; 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
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
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
kód:
start
goto $-1
-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?
citace:
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).
Založen: Oct 02, 2009 Příspěvky: 5286 Bydliště: PO
Zaslal: pá únor 26 2016, 18:46 Předmět:
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
kód:
;**********************************************************************************
;
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
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
kód:
pagesel IntRout
goto IntRout
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.
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é
kód:
.
.
JeVozNaIS ;staci ak na jednej slucke je voz - nahod TIM2,tk2 ;
call StartTIM2TK2 ; tk2 cca ( 0,25 - 0,5 sekundy doporuceny )
NaEndIS
.
.
call StartTIM12TK12
.
.
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
kód:
CasovaceIt
; takt osc/4
;compare na hodnotu nastavenu pri inicializacii
;CCPIF
banksel WTCON1 ; preddelicka
decf WTCON1,F
BNZ WEndCas
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.
Naposledy upravil procesor dne pá únor 26 2016, 20:04, celkově upraveno 1 krát.
Založen: Jun 26, 2007 Příspěvky: 464 Bydliště: Vysočina
Zaslal: pá únor 26 2016, 19:21 Předmět:
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:
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
Založen: Oct 02, 2009 Příspěvky: 5286 Bydliště: PO
Zaslal: pá únor 26 2016, 20:19 Předmět:
Pozor na pretečenie tabuľky GOTO Prog_01.... cez hranicu adriey 0x00FF. Na uplnú nezávislosť je potrebné predom upraviť aj PCLATH pri pretečení PCL. Takže-tak.
Časy uváděny v GMT + 1 hodina Jdi na stránku Předchozí1, 2, 3, 4Další
Strana 3 z 4
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. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.