Strana 6 z 10
Re: začiatočník v assembleri
Napísané: 23 Máj 2013, 07:35
od používateľa bebeno28
to máš pravdu s tím Eaglom
aj na to príde čas.
Mám dve tie 818 robia to obe, takže odpálené nožičky by som vylúčil, to musí byť iba v programe a konfigurácii.
Práve pozerám datasheet a myslím že som niečo našiel, len moja angličtina je biedna. je to na strane 41.
Kongigurácia registra PORTA. a spomýnajúsa tam aj RA4 a RA7 .
Jaromír nepozrieš sa prosím ťa na to.
Ja to zatial chápem tak že je potrebné v tom registre nastaviť I/O ale ešte neviem ako .
Re: začiatočník v assembleri
Napísané: 23 Máj 2013, 08:30
od používateľa jaromir
U IO pinov plati toto:
Ak ma byt digitalny vystup, treba nastavit zodpovedajuci TRIS register do nuly. Potom zapisujes do PORT registra - ak je tam jednotka, IO je na jednotke, ak nula, tak je na nule
Ak ma byt digitalny vstup, tak treba nastavit zodpovedajuci TRIS do jednotky a zaroven mu vypnut analogovu funkciu - ak ju ma. Defaultne su analogove vstupy analogovymi (pocita sa s tym, ze tam moze byt privedene napatie muimo rozsah logickej jednotky alebo nuly), takze to treba vypnut. U starsich typov cez ADCON1 register - treba navolit spravnu kombinaciu analogovych a digitalnych vstupov - alebo u novsich cez ANSEL registre (tam sa to da zvolit uplne bez obmedzeni).
Re: začiatočník v assembleri
Napísané: 23 Máj 2013, 09:09
od používateľa bebeno28
Ak som ta spravne pochopil tak bude zle nastaveny ten Adcon1
Re: začiatočník v assembleri
Napísané: 23 Máj 2013, 09:15
od používateľa jaromir
Bez ohladu na anstavenie ADCON1 by pin vo funkcii vystupu mal fungovat ak sa nastavi TRIS.
Idealne by bolo, ak by si si to skusal na malom kusku kodu, aby si tam nemal kopu veci navyse.
Ono je vlastne uplny nezmysel napisat velky kod a ockavat, ze to bude fungovat - takto to robia bud absolutni totalni machri, ktori presne vedia co robia, alebo zaciatocnici. Kod sa buduje zospodu, po malickych kuskoch. Otestujes jeden, druhy, das ich dokopy. Tak si skladas postupne veci do vysky az nakoniec mas to, co potrebujes.
Re: začiatočník v assembleri
Napísané: 24 Máj 2013, 00:50
od používateľa bebeno28
Ahojte, tak postúpil som ďalej.
Port RA7 sa mi podarilo spojazdniť a priznám sa ani neviem ako
.
To je teraz jedno, pretože už mám napísaný celý program , funuje to ako som si predstavoval, ale nakoľko mám na zariadení segmentovku ktorú mi ovláda aj neščastný port RA4 tak mi to na display ukazuje hovadiny.
Tak a teraz ťažký bolehlav , ktorý ak sa nám podarí rozlúsknuť tak prídeme na problém.
Po dlhých skúšaniach s programom, a Jaromírovej rade začni od začiatku, som tak aj urobil a pozerajte na čo som prišiel.
Ak som neni včerajší, tak ak mám napísaný program beží mi celý program od začiatku až po konec ( kokiaľ tam neni nejaká sledovacia alebo čakacia slučka) a potom z koca ide opať na začiatok a tak dookola. Je to tak?
Prikladám dva súbory z názvami FUNKCNY A NEFUNKCNY.
Ked dám do picka (16F818 ) program s nefunkčným a zapnem to tak na porte RA4 sa mi tri krát zablikne ledka a potom zostane zhasnutá. Podotýkam že to blikanie je také že prvé je silná intenziata svitenia, druhé je slabšie a tretie je najslabšie. Rozostupy medzi balkiutím sú asi cca 1/4 sekundy .
Ked tam dám program FUNKCNY tak led krácne svieti ako má.
Všimnite si že prízak ktorý určuje že na RA4 má byť log 1 je pri nefunkčej verzii napísaná na začiatku programu a pri funkčnej verzii je na konci.
Nič iné nemení.
Toto ked mi niekto vysvetlí tak ho navrhne na nobelovu cenu
!!!
Ďakujem za rady.
Re: začiatočník v assembleri
Napísané: 24 Máj 2013, 10:58
od používateľa mato3000
bebeno28 napísal:... a potom z koca ide opať na začiatok a tak dookola. Je to tak?
nie, máš zle ukončenú hlavnú slučku, namiesto RETURN tam daj GOTO a návestie, ono ti to v podstate teraz funguje, ale keď začneš písať program tak ako sa má, teda budeš rozlišovať vektor prerušenia a bude ten program zložitejší, tak sa ti bude týmto spôsobom nulovať aj STACK a to ti bude blbnúť
aj tak je to sranda ako si to napísal, odsleduj si stack, a budeš vidieť čo ti ten program robí ako ti skáče hore dolu, úplne bezhlavo
a nefunguje ti a ni jeden, to že ti bliká tá LEDka je len náhoda, teda že ti preteká stack práve týmto spôsobom. hlavnú slučku uknončuješ GOTO a nie RETURN, ten používaš len keď sa vraciaš s podprogramu do ktorého si sa dostal príkazom call. naštuduj si možné skoky a návraty z nich. príkazy call, goto, return, retlw a pod.
keď buedš simulovať, nech ťa nezmýli že prvý cyklus ide tak ako má, lebo táto chyba sa prejaví až pri prejdení celého cyklu hlavnej slučky a následnom opakovaní, a po daľších 8 mich opakovaniach sa adresa mení, potom to ostane stabilné, ale nie v takom stave ako by si chcel, teda ako si to naprogramoval.
Re: začiatočník v assembleri
Napísané: 24 Máj 2013, 11:33
od používateľa bebeno28
Ahoj Maťo, mohol by si mi to vyznačiť v tom súbore kde som spravil chybu?
Moc som ti nerozumel.
Return sa vracia tam odkiaľ bol zavolaný s na ten daný podprogram, je to tak, či ?
A čo to je STACK?
Ďakujem
Re: začiatočník v assembleri
Napísané: 24 Máj 2013, 11:55
od používateľa mato3000
správne si napísal že return je návrat od call, ale dám ti namiesto presnej odpovede, ja otázku. odkiaľ máš zavolanú hlavnú slučku ? schválne si nájdi či máš niekde miesto , kde sa odvolávaš na návesti PRINT. ak ho nenájdeš tak nemôžeš použiť ani return.
takže celý tvoj problém je hlavná slučka a jej zacyklovanie, ešte ťa trochu nechám trápiť, aby si na to prišiel sám. v podstate som ti to povedal presne v prvom príspevk.
STACK je register, kde sa odkladá návratová adresa . totišto ak zavoláš napríklad call, tak MCU si musí zapametať pôvodnú adresu toho call, aby sa vedel po vykonaní rutiny vrátiť. teda keď narazí na príkaz RETURN,RETLW a pod, tak sa kukne do toho stacku a načíta si poslednú hodnotu tej adresy do PC a pokračuje od nej. týchto adries , ale v tvojom PICku je len 8, takže sa môžeš bezproblémovo vnoriť do programu 8x, potom nastávajú isté predvídateľné/nepredvídateľné stavy. ale najdôležitejšie je že vždy musíš dane vnorenie korektne ukončiť, inak sa ti zblbne ten návrat. proste koľko krát sa vnoríš, toľko krát musíš von, jednoducho povedané, kolko krát máš v danej rutine napr. CALL, tolko krát to musí byť uzavreté napr RETURN.
príkaz GOTO neovplyvnuje STACK - to je ako pomôcka pre teba
toto čo som ti písal , vidíš a môžeš to sledovať napríklad v MPLABE pri simulácii ( MPLAB SIM ) a to v okne Hardware Stack. tam vidíš presne v ktorom stacku a s akou adresou sa nachádzaš.
Re: začiatočník v assembleri
Napísané: 24 Máj 2013, 12:38
od používateľa bebeno28
Jasnééé už to vidííím
)))))
.
.
.
Call PRINT
PRINT MOVLW b'00000001'
SUBWF TEMPOR,0
BTFSC STATUS,Z
GOTO print1
.
.
.
print1 BSF BIN1
BCF BIN2
BCF BIN4
BCF BIN8
BCF STATUS,Z
RETURN
Tak to by to malo byť, že ano ?
Re: začiatočník v assembleri
Napísané: 24 Máj 2013, 14:15
od používateľa mato3000
nie , presne na opak
call PRINT1 .... - to bolo dobre, lebo to je rutina na ktorú sa odkazuješ z hlavného programu.
ešte raz si prečítaj poriadne moje príspevky, a skús si naštudovať tie skoky. uvidíš hneď to pochopíš, ale len tak strieľaním bez pochopenia to nespravíš.
identifikuj si kde ti začína a končí hlavná rutina.
Re: začiatočník v assembleri
Napísané: 24 Máj 2013, 14:54
od používateľa bebeno28
Asi myslím na niečo iné a zle som sa vyjadril a ty na niečo iné a preto ťa nechápem.
Ešte raz a bez ohladu na to čo bolo v prílohe ako enfunkčné.
PRIKLAD:
Mám hlavný program.
1, mám register v ktorom je určité číslo od 0-9.
2, zmením to číslo a potrebujem to vysvieťiť na segmentovke.
3, V hlavnom programe dám CALL Print
4,Skočí mi do podprogramu .
Začne zisťovať aké to je číslo. To čo som písal. Toto tam je rozpísané 10 krát ( 0-9 )
PRINT MOVLW b'00000001'
SUBWF TEMPOR,0
BTFSC STATUS,Z
GOTO print1
keĎ nájde správne tak pomocou Goto skočí na
print1 BSF BIN1
BCF BIN2
BCF BIN4
BCF BIN8
BCF STATUS,Z
RETURN
Stále som v podporgrame tak preto som dal teraz na koniec Return, pretože vysietil segment a vracia sa naspst do hlavného programu a pokračuje.
Toto je zle?
Re: začiatočník v assembleri
Napísané: 24 Máj 2013, 18:05
od používateľa mato3000
nemôžeš kombinovať GOTO a návrat RETURN!!!!!!
oba programy sú zlé, aj keď máš pocit, že tí jeden funguje, tak to neni pravda.
štve ma že namiesto aby si si niečo prečítal o tých prikazoch, tak strielaš na slepo
takže všetko vráť tak ako to bolo a zameň RETURN v hlavnej slučke za GOTO PRINT
Re: začiatočník v assembleri
Napísané: 24 Máj 2013, 18:52
od používateľa MiloPS3
Mám hlavný program.
prave ze nemas !
struktura programu by mela vypadat nejak takle..
Kód: Vybrať všetko
ORG 0x0
goto Start
ORG 0x04
goto Preruseni
;**********************
Preruseni goto $ ;neviuzito
;**********************
Inicializace nop ;nastaveni I/O a ostatnich periferii
return
;**********************
Pocitej nop ;podprogram
goto $+2
goto $+2
goto $-1
return
;**********************
Zobraz nop ;podprogram
goto $+2
goto $+2
goto $-1
return
;**********************
Start call Inicializace
;**********
Main call Pocitej
call Zobraz
goto Main
;**********
END
Re: začiatočník v assembleri
Napísané: 08 Jún 2013, 21:00
od používateľa danhard
Řekl bych, že hlavně to dekódovaní je dost hloupé, používá se rozskok ADD W+PC a RETLW.
Kód: Vybrať všetko
;****** dekoder 7 segmentove cislice **************
ORG 700 ;umisteni podprogramu
DEK ANDLW 0F ;maska na spodni 4 bity
ADDWF PCL ;dekoduj cislo segmenty pgfedcba
RETLW 0C0 ;0
RETLW 0F9 ;1
RETLW 0A4 ;2
RETLW 0B0 ;3
RETLW 99 ;4
RETLW 92 ;5
RETLW 82 ;6
RETLW 0F8 ;7
RETLW 80 ;8
RETLW 90 ;9
RETLW 0FF ;
RETLW 0FF ;
RETLW 0FF ;
RETLW 0FF ;
RETLW 0FF ;
RETLW 0FF ;
Re: začiatočník v assembleri
Napísané: 08 Júl 2013, 01:13
od používateľa cmeliak
Dobrý deň, mal by som zopár otázok na ktoré mi dúfam odpoviete
pracujem s týmto kódom
Kód: Vybrať všetko
list p=16f88
#include <p16f88.inc>
; Set configuration bits using definitions from the include file, p16f84.inc
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_ON & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
d1 EQU 0x7F
RESET ORG 0x0000
BANKSEL OSCCON
CLRF OSCCON
MOVLW .120
MOVWF OSCCON
BANKSEL PORTA
CLRF PORTA
CLRF PORTB
BANKSEL ANSEL
CLRF ANSEL
BSF ANSEL, ANS0
CLRF TRISA
BSF TRISA, RA0
CLRF TRISB
BANKSEL ADCON0
CLRF ADCON0
MOVLW .129
MOVWF ADCON0
BANKSEL ADCON1
CLRF ADCON1
MOVLW .128
MOVWF ADCON1
BANKSEL ADCON0
BSF ADCON0,2
LOP
BTFSC ADCON0,2
GOTO LOP
MOVF ADRESL, W
END
a aj po prehľadaní internetu stále neviem pochopiť nastavenie oscilátoru. V konfiguračnom slove nastavujem
čo je mód oscilátoru INTIO2 kde RA6 a RA7 sú normálne I/O. Pomocou OSCCON nastavujem frekvenciu oscilátora na 8Mhz cca. a taktiež nastavujem aj bit 3 čiže definujem že sa bude riadiť podľa konfiguračného slova. Tu však nastáva jeden problém že keď tento program simulujem tak ten bit sa nuluje a nechápem prečo ?
Ďalej na obrázku nižšie môžte vidieť print screen z MPLAB-u kde vpravo dole je napísané
a to taktiež nechápem o čo ide ? Keď som sa pozrel do nastavení oscilátora tak sú tam nastavenia ako na obrázku. Pracuje teda simulátor podľa frekvencie ktorá je nastavená v programe alebo tá ktorá je nastavená v nastaveniach ?
A čo vlastne je tá fervencia inštrukcie ?
Ešte uvediem čo viem a opravte ma ak sa mýlim : Ak mám napr. frekvenciu procesora 8 MHz tak jeden cyklus bude trvať 8/4= 2 MHz (čo by podľa mna mohla byť tá "instruction frequency") a 1/2 000 000 Hz=0,0000005=500ns.
Re: začiatočník v assembleri
Napísané: 08 Júl 2013, 08:46
od používateľa jaromir
Simulator pracuje podla toho ako ho nastavis. Nema tolko inteligencie, aby si z beziaceho programu precital ako mas nastaveny oscilator. Okrem toho, ak by bol nastaveny trebars XT oscilator, tak by bol uplne strateny, lebo nemoze vediet aky krystal pripojis zvonku
OSTS bit nie je zapisovatelny, preto zapis do neho nema nijaky efekt (ty to vidis ako ze sa naspat preklopi do povodneho stavu).
Instruction frequency je pre tvoje PICko frekvencia oscilatora/4. Ak mas 8MHz interny, tak Fcyc je 2MHz. Ak by si dal trebars 10MHz krystal (a zmensi konfiguracne bity na HS oscilator) tak mas 2,5MHz Fcyc.
Re: začiatočník v assembleri
Napísané: 13 Júl 2013, 21:04
od používateľa cmeliak
Dobrý deň,
pokúšam sa rozchodiť A/D prevodník pracujem s týmto kódom
Kód: Vybrať všetko
list p=16f88
#include <p16f88.inc>
; Set configuration bits using definitions from the include file, p16f84.inc
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_ON & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_OFF & _WDT_OFF & _INTRC_IO
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
d1 EQU 0x7F
RESET ORG 0x0000
BANKSEL OSCCON
CLRF OSCCON
MOVLW .120
MOVWF OSCCON ;nastavenie osci. na 8MHz
BANKSEL PORTA
CLRF PORTA
CLRF PORTB
BANKSEL ANSEL
CLRF ANSEL
BSF ANSEL, ANS0
BANKSEL TRISA
CLRF TRISA
BSF TRISA, RA0 ;A/D prevodník na kanály 0 vstup RA0
CLRF TRISB
BANKSEL ADCON0
CLRF ADCON0
MOVLW .129
MOVWF ADCON0 ;Tcy/32 čiže 8MHz/32=250000Hz=4us
BANKSEL ADCON1
CLRF ADCON1
MOVLW .128 ;Right justified - väčšina sa ukladá do ADRESAL
MOVWF ADCON1 ;referenčné napätie +5V a GND
PROGRAM
BANKSEL ADCON0
BSF ADCON0,2 ;spustenie
BTFSC ADCON0,2
GOTO $-1
BANKSEL ADRESL
MOVF ADRESL, W
BANKSEL PORTB
CLRF PORTB ;ADRESAL sa všetko prenesie na výstup
MOVWF PORTB
CALL PAUZA ;pauza potrebná pre nabitie kond. 8us je väčia
GOTO PROGRAM
PAUZA
MOVLW .15
MOVWF d1
PAUZA_0
DECFSZ d1, f
GOTO PAUZA_0
RETURN
END
v zapojení mám 5LED na výstupoch RB0 - RB4 po pripojení RA0 na GND všetky LEd sú zkasnuté čo je v poriadku. Keď pripojím na +5V tak LED na RB0 niekedy svieti inokedy nie ( podľa mna by mala jednoznačne svietit). Pomocou dvoch 10K rezistorov som spravil odporový delič kde som dostal 2,5V a ked pripojím vstup RA0 na toto napätie tak znovu nesvieti len LEd na RB0.
Kde je chyba ?
Ďakujem
Re: začiatočník v assembleri
Napísané: 14 Júl 2013, 12:23
od používateľa cmeliak
Ok problem solved. K´d som trošku pozmenil na left justified a presúval som z registra ADRESH a funguje to v poriadku. Asi to bolo pre mna zmätočné že som používal tie vrchné 8 bity.
Tak predsa len mi niečo nesedí
.
Zapojenie je ako na obrázku.
A/D prevodník je 10bitový, čiže podla mna v desiatkovej sústave 1023 predstavuje 5V. Čiže rozlíšenie je 0,0048V. Avšak ked všetko zapojím ako na obrázku a nastavím napätie napr. merák ukazuje 1,009V. Takže 1,009V/0,0048V=cca. 210; 210=(11010010).
Ale realita je (00110011)=51.
Re: začiatočník v assembleri
Napísané: 14 Júl 2013, 13:59
od používateľa danhard
A co čteš, horních 8 bitů toho 10-ti bitového převodníku ? a kde vidíš to rozlišení spodních dvou bitů ?
Re: začiatočník v assembleri
Napísané: 14 Júl 2013, 14:08
od používateľa cmeliak
tie vrchné 2 bity nevidím ale tie ma asi ani nezaujímajú pokým pracujem s menšími napätiami. Teraz už pracujem v môde Left justified. čiže väčšina je v ADRESH a vrchné 2 bity sú v ADRESL s ktorým nič nerobím.