Stránka 3 z 6

Napsal: 03 bře 2018, 14:13
od pettter
Tak ďalšia noob otázka!
MCU PIC16F88, SW MPLAB X IDE, Assembler

Mám direktívy:

Kód: Vybrat vše

            RRF   DELAY, f              ;alebo
             DECF DELAY, f
Čo znamená to ´f´ v týchto príkazoch?

Dík.

Napsal: 03 bře 2018, 14:44
od MiloPS3
Atlan píše:Stiahni si cesky preklad pre pic 16f84.
ty sis ten DS ani neotevrel !

tohle neni direktiva,to sou zakladni prikazy, je jich cca 30, tak si otevri ds a precti si co znamenaj

http://pic16fxx.sweb.cz/programovani/in ... -16fxx.pdf

Napsal: 03 bře 2018, 16:29
od pettter
MiloPS3 píše:...ty sis ten DS ani neotevrel...


Ale čítal neboj, už ma z toho riť bolí... lenže tam čítam veci ktorým nerozumiem...
MiloPS3 píše:...tohle neni direktiva,to sou zakladni prikazy...
Pochop že tápem aj v takýchto základoch ako je rozdiel medzi výrazom: "direktíva" a "základný príkaz". Tak si mi nadhodil hneď na ďalšiu noobku. Aký je rozdiel vo výrazoch "direktíva" a "príkaz"?

K tej mojej otázke na ´f´... v DS je k príkazu napr. RRF uvedené:
Syntaxe: návěští SUBWF f, d; komentář
Operandy: f = (0-127)

d=(0,1)
Obsah registru je posunut o jeden bit doprava přes C – příznak přenosu CARRY (rotace probíhá přes devět bitů). Výsledek je umístěn do střadače pro d=0 nebo do registru pro d=1.

K príkazu DECF je zas uvedené:
Syntaxe: návěští DECF f, d; komentář
Operandy: f = (0-127)

d=(0,1)
Operace: (f) - 1 → (cílový registr)
Ovlivňované příznaky: Z
Popis: Od obsahu registru je odečtena jednička a výsledek je uložen do střadače pro d=0 nebo do registru pro d=1.


A "moje přetrhdílo" vypadá takto:

Kód: Vybrat vše

             RRF   DELAY, f              ;alebo
             DECF DELAY, f
Chápem že to moje ´f´ je vlastne ´d´ z DS. Lenže čo reprezentuje to ´f´ z môjho přetrhdíla, či 0, či 1, tak z toho som v riti. Lebo aj v DS sú obe možnosti. Čo určuje hodnotu toho môjho ´f´???

Napsal: 03 bře 2018, 17:01
od MiloPS3
urcite si si vsiml ze kdyz mas treba

Kód: Vybrat vše

movlw   petter 
a nikde toho petra nemas nijak zadefinovanyho tak ti to vyhodi chybu
to samy treba s f,w,POTRA,PORTx,STATUS,TMR1 atd
to vsechno je uvedeny v soubore k prislusnemu procesoru tady v p16f88.inc
otevres to v obycejnym textaku

jinak je to vzdy
prikaz - registr - odkat dam

takze to tvoje f (popripade w) je na miste toho d v DS , hodnotu toho f a w zjistis v tom *.inc
Pseudoinstrukce představují tzv. direktivy překladače. Protože tyto pseudoinstrukce nejsou řádnými intrukcemi mikroprocesoru, při běhu programu se nevykonávají - plní svojí funkci pouze při překladu zdroj. programu a říkají překladači, co má při překladu dělat. Tzn. K procesoru se nedostane. Pseudoinstrukce se používají i k mnoha dalším činnostem, můžeme pomocí nich dělat následující: přiřazovat symboly konkrétním objektům, inicializovat nebo rezervovat paměťový prostor, ovládat čítač instrukcí (PC) atd.
napr: CBLOCK,ENDC,CONFIG,DE,DEFINE,DT,DW,EQU,ERROR, ENDIF,INCLUDE,LIST, NOLIST,ORG, ,UNDEFINE,BANKSEL,PAGESEL,BANKISEL,MOVFW ....

Napsal: 03 bře 2018, 20:17
od pettter
MiloPS3 píše:...to vsechno je uvedeny v soubore k prislusnemu procesoru tady v p16f88.inc...
Tak do toho .inc pozerám ako hus do piva a... hmm... ako by som to... som z toho oné... magor?
Neviem čo máš Ty v tom .inc, ale ja tam mám len hex hodnoty pridelené k výrazom (EQU). Príde mi to ako tabuľka s cenami za výrazy, akurát sú tie ceny v kryptomene HEX a to bez DPH.
Napr.:

Kód: Vybrat vše

;       Register Definitions
W                EQU  H'0000'
F                EQU  H'0001'
;----- Register Files -----------------------------------------------------

;-----Bank0------------------
INDF             EQU  H'0000'
TMR0             EQU  H'0001'
PCL              EQU  H'0002'
STATUS           EQU  H'0003'
Aha teraz mi došlo, že k znaku w je priradená hodnota 0000h, alebo 0000 0000b, alebo 0dec. A k znaku f je priradená hodnota 0001h, či 0000 0001b, či 1dec. Takže ak je uvedené:

Kód: Vybrat vše

INCF   DELAY, f
znamená to že ak predpokladáme že DELAY má hodnotu pred príkazom napr.: 0010h, tak po príkaze bude mať hodnotu 0011h?

AK by som použil:

Kód: Vybrat vše

INCF   DELAY, w
tak mi pridá nič, nulu a teda je to akoby som zadal NOP?

Napsal: 03 bře 2018, 20:40
od MiloPS3
jak je uvedeno pro DECF
Od obsahu registru je odečtena jednička a výsledek je uložen do střadače pro d=0 nebo do registru pro d=1.
stridacen je myslen registr W ( ma adresu 0) neboli pracovni registr, pres nej se toci vsechny hodnoty,
takze pokud je v prikazu W neboli 0 tak se vysledek ulozi do W a registr zustane nezmenen -> incf "10" , W -> v registru 10 v W 11
pokud tam bude F neboli 1 tak se ulozi vysledek do registru -> incf "10" , F -> v registru 11

Napsal: 03 bře 2018, 21:07
od pettter
Aha, takže to w a f na konci nie je hodnota, ktorá sa pričíta, alebo odčíta, ale parameter ktorý určí v ktorej časti MCU sa výsledok objaví, či uloží??? V reg. W ake je použitý znak w, alebo v mnou zadanom registri aj je požitý znak f.

A príkaz INCF a DECF zvýši, alebo zníži výsledok vždy o jedničku???

Začína mi svitať, ja som sa totiž domnieval, že tým parametrom (w, f) môžem určiť koľko sa pričítava, či odčítava a za boha som nevedel ako a kde zadám koľko sa má odčítať...

Napsal: 04 bře 2018, 06:36
od MiloPS3
ano
ano

Napsal: 04 bře 2018, 12:29
od pettter
Díky. Zas o jednu puzzlu viac v obrázku...

Ešte ma napadlo, že ak namiesto ´w´ zadám 0, alebo namiesto ´f´ zadám 1, tak je to to isté.

Teda:

Kód: Vybrat vše

DECF   NIEČO, f
DECF   NIEČO, w
je to isté ako:

Kód: Vybrat vše

DECF   NIEČO, 1
DECF   NIEČO, 0
???

Som to skúsil a debuger to pri simulácii nevyhodnotil ako chybu.

Napsal: 04 bře 2018, 13:27
od MiloPS3
Prekladac na miste od kud kam ocekava 0 nebo 1 a v jaky podobe mu to podas je uplne burt

Kód: Vybrat vše

leva_kapsa EQU 0
prava_kapsa EQU 0b1

DECF FSR,leva_kapsa
DECF FSR,prava_kapsa

Napsal: 04 bře 2018, 17:19
od Atlan
Este tak 3 strany asm, a dostaneme sa k deleniu a nasobeniu a vysledkom bude prechod na C jazyk.
Teda akho z toho. Nepicne uz pri porovnavani 2 res viacerych cisel.

Napsal: 10 bře 2018, 10:23
od pettter
Atlan píše:Este tak 3 strany asm, a dostaneme sa k deleniu a nasobeniu a vysledkom bude prechod na C jazyk...
Toto je starý a nikdy nekončiaci spor. Asi máš pravdu, že skončím na C. Ale čosi som o tom prečítal na Microchipe a ta o.i. uvádzajú:

"Kľúčovou výhodou používania jazyka na vysokej úrovni (napríklad C, Fortran alebo Basic) je to, že programátor nemusí chápať architektúru použitého mikroprocesora; znalosť architektúry je ponechaná kompilátorovi.
Napríklad ... osoba, ktorá píše program na vysokej úrovni, vie o správe pamäte málo alebo nič, táto úloha bola delegovaná na softvérového inžiniera, ktorý napísal kompilátor..."

Takže preto assembler, aby som poznal "zač je toho Loket"...

Napsal: 10 bře 2018, 15:26
od MiloPS3
pokud zustanes u mikrocipackyho Cka tak ten "citat" ber s velkou rezervou..

Napsal: 10 bře 2018, 15:31
od ZdenekHQ
Aplikace instrukce MUL a DIV způsobila kdysi docela zásadní "boj" mezi vyznavači 8-bit procesorů Intel vs. Microchip. Na co je na čipu třeba AD převodník, když tam chybí základní podpora matiky... A naopak.

Napsal: 24 bře 2018, 12:13
od pettter
PIC16F88
Assembler v MPLAB X IDE

Ďakujem Vám za Vaše poznámky a odpovede na moje noob´s questions...

A tak pridám ďalšiu!
Mocem sa okolo nepriameho adresovania. Takže soudruzi, kontrolní votázka:
- zápisom do INDF zapisujem vlastne do FSR+STATUS bit7 (výber BANK) ???
- FSR+STATUS bit7 si však dopredu musím nastaviť ???

Predpokladám, že je to tak a tak ďalšia otázka je, že ako sa postupne posúvam po bunkách pamete, ak chcem ukladať do, či čítať z buniek.
Napr. chcem uložiť hodnotu z:
- PORTA do bunky BANK0-0x20
- PORTB do bunky BANK0-0x21
- PORTC do bunky BANK0-0x23...

Ako dosiahnem to posunutie medzi bunkami? Inkrementáciou FSR?
Napr. takto?

Kód: Vybrat vše

MOVF   FSR,0x20   ;predpokladám že STATUS IRP = 0, takže BANK0
MOVF PORTA,W
MOVWF INDF
INCF FSR,f
MOVF PORTB,W
MOVWF INDF
INCF FSR,f
MOVF PORTC,W
MOVWF INDF
...
Iný príklad:
- FSR+STATUS bit7 mám nastavené na adresu 0x20 v BANK0 BCF STATUS,IRP (STATUS bit7 = 0 = BANK 0/1) MOVF FSR,0x20
- zápisom MOVF INDF,0x01 vložím hodnotu 01 hex (1 dec, 0000 0001 bin) do adresy 0x20 BANK0. Ako sa posuniem na adresu 0x21 BANK0?

Napr. takto?

Kód: Vybrat vše

MOVF   FSR,0x20   ;nastavím prvú adresu na 0x20
MOVF INDF,0x01   ;vrazím do nej hodnotu 1 dec
INCF FSR,f   ;posuniem sa na ďalšiu adresu, teda 0x21
...
A nezúrte, že nechápem niektoré prosté pochody, som predsa noob.