Stránka 1 z 1

podprogram pro LED displej

Napsal: 18 úno 2014, 20:10
od toMajstr
Dobrý den, nemáte někdo podprogram pro PIC co by zjistil hodnotu z W a následně ji ukázal na LED displeji?

Napsal: 18 úno 2014, 23:10
od monterjirka
Někdy v roce 2002 - 2003 vycházel v KTE magazínu dobře udělaný kurz základů programování PIC zaměřený na přípravek CHIPON, tam je popsaná komunikace PIC s displejem,...
http://www.gmelectronic.eu/index.php/cz ... o-plus-kte

Napsal: 20 úno 2014, 20:32
od toMajstr
KTE nepomohlo (nejspíš neumím hledat) v jiném programovacím jazyce bych to udělal asi nějak takto:
if(w == 1)
porta = 00000110
else if(w == 2)
porta = 01011011
atd...
ale nevím jak udělal takovou podmínku v asembleru

Napsal: 21 úno 2014, 05:20
od Chenzee
Doufám, ze LED displejem myslíš sedmisegmentovku. Pokud ne, tak tento příspěvek možná nebude splňovat to, co jsi chtěl.
K tomuto účelu se používá tabulka.

Kód: Vybrat vše

TAB_ZNAKU   ;TADY SE PREVEDE CISLO ci HODNOTA NA 8-BITOVE CISLO, KTEREMU ODPOVIDA ZOBRAZENI NA 7.SEGMENTOVCE
;      ;V NEGATIVNI LOGICE - TZN. LOG.0 = SVITI , LOG.1 = NESVITI
   ADDWF   PCL,F

ZN0   RETLW   B'01010000'   ;0   
ZN1   RETLW   B'01011111'   ;1   
ZN2   RETLW   B'00110010'   ;2   
ZN3   RETLW   B'00010110'   ;3   
ZN4   RETLW   B'00011101'   ;4   
ZN5   RETLW   B'10010100'   ;5   
ZN6   RETLW   B'10010000'   ;6   
ZN7   RETLW   B'01011110'   ;7   
ZN8   RETLW   B'00010000'   ;8   
ZN9   RETLW   B'00011100'   ;9   

ZNA   RETLW   B'00011000'   ;10 
ZNB   RETLW   B'10000011'   ;11 
ZNC   RETLW   B'11110000'   ;12 
ZND   RETLW   B'00010011'   ;13 
ZNE   RETLW   B'10110000'   ;14 
ZNF   RETLW   B'10111000'   ;15 
ZNX   RETLW   B'11111111'   ;16 
ZNST   RETLW   B'00111100'   ;17 
ZNS   RETLW   B'10010100'   ;18 
ZNU   RETLW   B'01010001'   ;19 
ZNN   RETLW   B'10011011'   ;20 
ZNR   RETLW   B'10111011'   ;21 
ZNMINUS RETLW   B'10111111'   ;22 
ZNT   RETLW   B'10110001'   ;23 
ZNJ   RETLW   B'01010011'   ;24 
ZNO   RETLW   B'10010011'   ;25 
ZNH   RETLW   B'00011001'   ;26 
ZNY   RETLW   B'00111001'   ;27 
ZNL   RETLW   B'11110001'   ;28 


Tabulku musis mit hned nekde na zacatku programu. Ber to jen jako vytazek z meho kodu. Ty si ji nastav jak potrebujes.
Pokud chces zobrazit viceciferne cislo, musis toto cislo nejprve rozdelit na BCD kod.

Kód: Vybrat vše

PREVODBCD   ;PREVADENA HODNOTA MUSI BYT VE W REG.      
   CLRF   BCD1
   CLRF   BCD10
   CLRF   BCD100
;STOVKY         
   movwf   TMP0      ;NACTI HODNOTU Z W (PREVADENE CISLO) DO TMP0
        clrf    TMP1      ;VYMAZ TMP1
   movlw   .100      ;100dec do W reg.
STOVKY   incf   TMP1,F      ;PRICTI 1 V reg. TMP1
   subwf   TMP0,F      ;ODECTI TMP0-W A ULOZ DO TMP0
   btfsc   STATUS,C   ;TEST, ZDA ODECET BYL PRES 0
   goto    STOVKY      ;VRAT SE NA STOVKY
   decf   TMP1,W      ;PRICTI JEDNA DO TMP1 A VYSLEDEK ULOZ DO W
   movwf   BCD100      ;VYSLEDEK OPERACE (vWreg.) PRESUN DO reg.BCD100
;DESITKY
   movlw   .100      ;100dec do W reg.
   addwf   TMP0,F
        clrf    TMP1
   movlw   .10      ;10dec do W reg.
DESITKY   
   incf   TMP1,F
   subwf   TMP0,F
   btfsc   STATUS,C
   goto    DESITKY
   decf   TMP1,W
   movwf   BCD10      ;VYSLEDEK OPERACE (vWreg.) PRESUN DO reg.BCD10
;JEDNOTKY   
   movlw   .10      ;10dec do W reg.
   addwf   TMP0,F
   clrf    TMP1
   movlw   .1      ;1dec do W reg.
JEDNOTKY
   incf   TMP1,F
   subwf   TMP0,F
   btfsc   STATUS,C
   goto    JEDNOTKY
   decf   TMP1,W
   movwf   BCD1      ;VYSLEDEK OPERACE (vWreg.) PRESUN DO reg.BCD1
   RETURN
;Vysledek operace je v registrech BCD100, BCD10, BCD1       

Toto pouzivam ja.
Hodne zdaru

Napsal: 21 úno 2014, 07:23
od Niki31
Není nutné aby to bylo na začátku programu.Taky je možno
před danou poslopnost příkazu napsat direktivu např. ORG 256
a překladač umístí tento kód od adresy H100,tedy na začátek
druhé stránky paměti programu.Pak stačí před voláním přepnout stánku
a volat dekódování znaku.

ToMastře ,ta podmínka v ASSEMBLERU se napíše přesně tak jak jsi
ji napsal.Assembler zná mnohem víc příkazů než jen samotné instrukce
mikrokontroléru.If,else ... jsou jedny z nich.

Napsal: 21 úno 2014, 20:47
od toMajstr
když jsem napsal:
if(W = 00000001)
PORTA == 01011111
if(W == 00000010)
PORTA = 00110010
atd...
tak mi pickit2 (software) hlásil že nemám konfigurační slovo v .HEX souboru (ale bylo tam a bez "IFů" to šlo normálně)

Napsal: 22 úno 2014, 11:19
od toMajstr
konfigurační slovo jsem vyřešil ale když dám if(TLAC == 1) (TLAC jsem definoval nahoře jako PORTB,0) tak to píše Error[108] C:\USERS\TOSCHIBA\DOCUMENTS\PIC16F876A_TEST.ASM 22 : Illegal character (,)

Napsal: 22 úno 2014, 18:04
od AB1
ale když dám if(TLAC == 1)

To nejde.
if - else - endif jsou direktivy překladače pro podmíněný překlad.

Příklad části kódu, která je jiná pro pic16xx a pic18xx.

Kód: Vybrat vše

#define pic 16 
;#define pic 18

;kód:
...
...
if(pic==16) ;pic musí být konstanta, známá v době překladu
   MOVLW 1
   ...
   ...
else
   MOVLW 5
   ...
   ...
endif
   ...

Napsal: 22 úno 2014, 20:29
od toMajstr
takže to umí pracovat jen s konstantami?

Napsal: 23 úno 2014, 06:11
od AB1
Zkrátka if() nejde použít v kódu pro testování bitů nebo registrů.
Musíš použít výhradně instrukce z instrukční sady.

Např.

Kód: Vybrat vše

if(PORTB.0 == 0)
   W = 5
else
   W = 10

Napíšeš takto

Kód: Vybrat vše

BTFSS PORTB,0
GOTO B
MOVLW 10
GOTO END

B: MOVLW 5
END:

Snad to mám dobře, dávno tomu co jsem dělal s Picama.

Napsal: 23 úno 2014, 08:23
od toMajstr
a na zjištění hodnoty z W to půjde?

Napsal: 23 úno 2014, 08:51
od MiloPS3
toMajstr: napis co to ma delat ,jaky hodnoty z W bude zobrazovat a kolik ?
pak ti muzem rict jestly bude tabulka lepsi nebo btfsX...

AB1: PIC v asm nema za navestim 2tecku,hlave pro ostatni co pouzivaj ctrl+c/ctrl+v

Napsal: 23 úno 2014, 09:07
od toMajstr
ve W budou čísla 1-9 (později možná vyší) a podle toho se na LED displeji zobrazí číslo 1-9

Napsal: 23 úno 2014, 09:17
od MiloPS3
pres tabulku jak psal vyse Chenzee, jinak pro normalni tudis bezne zobrazeni se pouziva tabulka pro 0-9 znaku netreba vic, zbytek se vypocitava...

jen tak pro zajimavost , co to bude az to bude ? zobrazeni hodnoty z W :roll:

Napsal: 23 úno 2014, 09:47
od toMajstr
měl by to být časovač ale chtěl bych aby se to dalo pomocí ctrl+c, ctrl+v použít i jinde