začiatočník v assembleri

Moderátori: psichac, Moderátori

bebeno28
Stály člen
Stály člen
Príspevky: 204
Dátum registrácie: 16 Sep 2012, 21:34
Bydlisko: Trnava

Re: začiatočník v assembleri

Príspevok od používateľa bebeno28 » 23 Máj 2013, 07:35

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 .
0

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: začiatočník v assembleri

Príspevok od používateľa jaromir » 23 Máj 2013, 08:30

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).
0

bebeno28
Stály člen
Stály člen
Príspevky: 204
Dátum registrácie: 16 Sep 2012, 21:34
Bydlisko: Trnava

Re: začiatočník v assembleri

Príspevok od používateľa bebeno28 » 23 Máj 2013, 09:09

Ak som ta spravne pochopil tak bude zle nastaveny ten Adcon1
0

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: začiatočník v assembleri

Príspevok od používateľa jaromir » 23 Máj 2013, 09:15

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.
0

bebeno28
Stály člen
Stály člen
Príspevky: 204
Dátum registrácie: 16 Sep 2012, 21:34
Bydlisko: Trnava

Re: začiatočník v assembleri

Príspevok od používateľa bebeno28 » 24 Máj 2013, 00:50

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.
Prílohy
FUNGUJE.asm
(4.2 KiB) 82 stiahnutí
NEFUNGUJE.asm
(4.2 KiB) 86 stiahnutí
0

mato3000
Power user
Power user
Príspevky: 9767
Dátum registrácie: 04 Jan 2009, 00:00
Bydlisko: BA

Re: začiatočník v assembleri

Príspevok od používateľa mato3000 » 24 Máj 2013, 10:58

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 :D

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.
0

bebeno28
Stály člen
Stály člen
Príspevky: 204
Dátum registrácie: 16 Sep 2012, 21:34
Bydlisko: Trnava

Re: začiatočník v assembleri

Príspevok od používateľa bebeno28 » 24 Máj 2013, 11:33

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
0

mato3000
Power user
Power user
Príspevky: 9767
Dátum registrácie: 04 Jan 2009, 00:00
Bydlisko: BA

Re: začiatočník v assembleri

Príspevok od používateľa mato3000 » 24 Máj 2013, 11:55

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š.
0

bebeno28
Stály člen
Stály člen
Príspevky: 204
Dátum registrácie: 16 Sep 2012, 21:34
Bydlisko: Trnava

Re: začiatočník v assembleri

Príspevok od používateľa bebeno28 » 24 Máj 2013, 12:38

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 ?
0

mato3000
Power user
Power user
Príspevky: 9767
Dátum registrácie: 04 Jan 2009, 00:00
Bydlisko: BA

Re: začiatočník v assembleri

Príspevok od používateľa mato3000 » 24 Máj 2013, 14:15

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.
0

bebeno28
Stály člen
Stály člen
Príspevky: 204
Dátum registrácie: 16 Sep 2012, 21:34
Bydlisko: Trnava

Re: začiatočník v assembleri

Príspevok od používateľa bebeno28 » 24 Máj 2013, 14:54

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?
0

mato3000
Power user
Power user
Príspevky: 9767
Dátum registrácie: 04 Jan 2009, 00:00
Bydlisko: BA

Re: začiatočník v assembleri

Príspevok od používateľa mato3000 » 24 Máj 2013, 18:05

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
0

MiloPS3
Stály člen
Stály člen
Príspevky: 479
Dátum registrácie: 20 Apr 2011, 00:00
Bydlisko: Lazne Kynzvart / CZ

Re: začiatočník v assembleri

Príspevok od používateľa MiloPS3 » 24 Máj 2013, 18:52

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
0

Používateľov profilový obrázok
danhard
Ultimate člen
Ultimate člen
Príspevky: 3226
Dátum registrácie: 15 Apr 2009, 00:00
Bydlisko: Jesenice u Prahy
Vek: 68

Re: začiatočník v assembleri

Príspevok od používateľa danhard » 08 Jún 2013, 21:00

Ř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	;
0

cmeliak
Nový člen
Nový člen
Príspevky: 81
Dátum registrácie: 14 Jún 2011, 00:00
Bydlisko: Veľký Krtíš
Vek: 29

Re: začiatočník v assembleri

Príspevok od používateľa cmeliak » 08 Júl 2013, 01:13

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

Kód: Vybrať všetko

_INTRC_IO
č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é

Kód: Vybrať všetko

instruction frequency = 1MHz
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.
Prílohy
Bez názvu.png
0

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: začiatočník v assembleri

Príspevok od používateľa jaromir » 08 Júl 2013, 08:46

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.
0

cmeliak
Nový člen
Nový člen
Príspevky: 81
Dátum registrácie: 14 Jún 2011, 00:00
Bydlisko: Veľký Krtíš
Vek: 29

Re: začiatočník v assembleri

Príspevok od používateľa cmeliak » 13 Júl 2013, 21:04

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
0

cmeliak
Nový člen
Nový člen
Príspevky: 81
Dátum registrácie: 14 Jún 2011, 00:00
Bydlisko: Veľký Krtíš
Vek: 29

Re: začiatočník v assembleri

Príspevok od používateľa cmeliak » 14 Júl 2013, 12:23

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.
Prílohy
Zapojenie
Zapojenie
0

Používateľov profilový obrázok
danhard
Ultimate člen
Ultimate člen
Príspevky: 3226
Dátum registrácie: 15 Apr 2009, 00:00
Bydlisko: Jesenice u Prahy
Vek: 68

Re: začiatočník v assembleri

Príspevok od používateľa danhard » 14 Júl 2013, 13:59

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ů ?
0

cmeliak
Nový člen
Nový člen
Príspevky: 81
Dátum registrácie: 14 Jún 2011, 00:00
Bydlisko: Veľký Krtíš
Vek: 29

Re: začiatočník v assembleri

Príspevok od používateľa cmeliak » 14 Júl 2013, 14:08

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.
0

Napísať odpoveď