podprogram pro LED displej

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
toMajstr
Příspěvky: 332
Registrován: 10 lis 2013, 01:00

podprogram pro LED displej

#1 Příspěvek 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?

Uživatelský avatar
monterjirka
Příspěvky: 2761
Registrován: 14 čer 2003, 02:00
Bydliště: Blížejov

#2 Příspěvek 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

Uživatelský avatar
toMajstr
Příspěvky: 332
Registrován: 10 lis 2013, 01:00

#3 Příspěvek 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

Uživatelský avatar
Chenzee
Příspěvky: 464
Registrován: 26 čer 2007, 02:00
Bydliště: Vysočina

#4 Příspěvek 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
Žádnej učenej z nebe nespadl ...

Uživatelský avatar
Niki31
Zablokován
Zablokován
Příspěvky: 131
Registrován: 05 črc 2008, 02:00

#5 Příspěvek 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.

Uživatelský avatar
toMajstr
Příspěvky: 332
Registrován: 10 lis 2013, 01:00

#6 Příspěvek 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ě)

Uživatelský avatar
toMajstr
Příspěvky: 332
Registrován: 10 lis 2013, 01:00

#7 Příspěvek 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 (,)

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#8 Příspěvek 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
   ...

Uživatelský avatar
toMajstr
Příspěvky: 332
Registrován: 10 lis 2013, 01:00

#9 Příspěvek od toMajstr »

takže to umí pracovat jen s konstantami?

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#10 Příspěvek 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.

Uživatelský avatar
toMajstr
Příspěvky: 332
Registrován: 10 lis 2013, 01:00

#11 Příspěvek od toMajstr »

a na zjištění hodnoty z W to půjde?

Uživatelský avatar
MiloPS3
Příspěvky: 259
Registrován: 07 srp 2010, 02:00

#12 Příspěvek 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

Uživatelský avatar
toMajstr
Příspěvky: 332
Registrován: 10 lis 2013, 01:00

#13 Příspěvek od toMajstr »

ve W budou čísla 1-9 (později možná vyší) a podle toho se na LED displeji zobrazí číslo 1-9

Uživatelský avatar
MiloPS3
Příspěvky: 259
Registrován: 07 srp 2010, 02:00

#14 Příspěvek 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:

Uživatelský avatar
toMajstr
Příspěvky: 332
Registrován: 10 lis 2013, 01:00

#15 Příspěvek 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

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“