PIC16f690 4-bit LCD + PWM na spolocnom porte

Zdravím,
samozrejme, ak to robíte tak, ako to popisujete, je veľmi možné, že niekedy si prepíšete stav bitu RC4, záleží, aký je skutočný výstup z PWM a či sa 4-tý bit vo W registri rovná RC4, alebo nie.
Myslím, že by bolo vhodné, pred tým, ak niečo zapíšete na port C testovať stav bitu RC4 (môže sa použiť inštrukcia btss, alebo btsc) a podľa stavu RC4 nahodiť, alebo zhodiť 4-tý bit vo W registri a potom ho poslať na port inštrukciou MOVWF PORTC.
Druhá možnosť je, že pred zápisom na port otestujete stav bitu RC4 a po zápise na port nastavíte, alebo zhodíte bit RC4 inštrukciou BSF PORTC,4; resp. BCF PORTC,4.
Teda skrátka a dobre musíte po zápise na LCD zachovať stav bitu RC4, potom Vám komunikácia s LCD nebude ovplyvňovať PWM. Neviem, ako máte robenú PWM, ale musíte rátať s tým, že použitím týchto “nadbytočných” inštrukcií sa máličko môže pozmeniť časovanie PWM.
Prajem Vám veľa úspechov. :smiley:

Nastavuj postupně bity RC0-RC3 po jednom, bez ovlinění ostatních. Nebo to snad PICy neumí ?

  1. Trochu málo údajů - nevidím tu jak program, tak ani informaci, na jakém taktu/frekvenci je to celé provozováno (jak MCU, tak PWM)

  2. Možná se hodí vědět informaci, že MCU interně provádí zápis na pin tím způsobem, že pokud obdrží tuto instrukci (zápis na jeden pin) tak vezme stav celého portu, změní obsah toho konkrétního bitu a zase celý port zapíše zpátky. Na první pohled to nepůsobí nijak divně, ale když tohle člověk ví a trochu se nad tím zamyslí tak mu dojde, že pokud nechá dvě hw jednotky ve stejném čase navzájem se přetahovat o jeden port, tak to prostě dobrotu dělat nebude (jedna jednotka je MCU core, druhá PWM modul/čítač/časovač) => Přesuň display na jiný port.

Chceš tím říct, že když napíšu RC0 = 1; nebo RC0 = 0; (případně PORTC |= (1<<RC0); nebo PORTC &= ~(1<<RC0); ) a na RC4 je aktivní HW generátor PWM, tak je to problém ? Přeci pokud MCU začne vykonávat tuto instrukci (i když pracuje s celým portem), tak k tomuto portu po dobu celé operace PWM modul nepustí, ne ? Na druhou stranu - není to tak, že PWM jednotka interně odpojí pin od výstupního registru (PORTC) a převezme řízení tohoto pinu sama ? Pak by bylo úplně jedno, co se na daný pin příkazem PORTC = XXX zapíše. PWM pin to neovlivní.

A ještě něco :

To dělá PIC, když dostane ASM instrukci pro změnu pinu interně nebo to tak jenom překládá C do ASM ? V tom je veliký rozdíl.

  1. Není potřeba citovat některé mé věty hned dvakrát

  2. A ty víš jistě že mluví o hardwarovém PWM? Mluvil jsem o něm já, ale na mě nesejde, pořád nemáme potvrzeno, co přesně tu vlastně řešíme (proto jsem předtím zvolil pořadí těch odpovědí tak, jak jsem jej zvolil).

  3. Čemu přesně nerozumíš na slovním spojení „MCU interně provádí…”?

To Mahoney: ad 2) Nechtěl jsem se Tě dotknout - nebylo to myšleno nějak zle, ale už jsem se s tím setkal, že (jak píšeš) “mcu interně provádí” znamenalo “překladač to překládá jako …”. Proto jsem se ptal. Ale je faktem, že to vzniklo tím, že jsem si úvodní Dybbukův dotaz nepřečetl úplně pozorně. Pak bych tam nepsal o C-čku, zůstal bych v assembleru a nevzniklo by tohle nedorozumění.

Jinak :

Tohle jsem měl na mysli, jak udělat (třeba i bit po bitu na 4 krát). Jestli Dybbuk měl na mysli HW PWM modul nevím - PICy neznám. Kdo je zná, by to mohl odvodit od umístění signálu na portu. Pokud se generuje HW, pak by snad mělo být úplně jedno, co na bránu zapíšu, pokud HW PWM jednotka přebírá kontrolu na pinem (opět bude vědět PICař). Takže poradit Dybbukovi :

**Procesory rodiny 8051:
setb P3.0 (nastavení bitu 0 brány 3) - Set Bit P3.0
jbc P3.0, $+1 (vymazání bitu 0 brány 3) - Jump if Bit is set and Clear bit P3.0, skok na následující instrukci.

Procesory AVR:
sbi PORTC, 0 (nastavení bitu 0 brány C)
cbi PORTC, 0 (vymazání bitu 0 brány C)

Procesory PIC:
???
???
**

Prostě něco, co neovlivní ostatní bity.

V pohodě, nic se neděje. Obvykle to dělá opravdu PIC uvnitř, protože na výstupu je jako poslední (většinou) latch - ale sám jsem se tady něco přiučil, protože jsem se podíval do datasheetu tohoto konkrétního brouka na ten konkrétní vývod a zrovna u tady to tak není (tedy na tom zmiňovaném vývodu), na konci je MUX a PWM modul si opravdu převezme kontrolu nad pinem úplně (takže by to mělo fungovat tak jak jsi psal a mělo by to být v případě HW PWM jedno). Je to nějaký „extra special” PWM brouk, umí řídit i full bridge můstek, doteď jsem ho neznal.

S tím zapisováním po jednotlivých bitech - ono by to určitě šlo, ale bude to mít jistou časovou režii, a to jsme opět u toho programu a konfigurace PICu zpátky, protože nevíme co všechno a jak u toho dělá, takže nedokážeme přesně posoudit, jestli by to v konkrétním případě vadilo nebo ne. Jinak teda zajímavá myšlenka, akorát mě osobně to tedy svádí k tomu že „když už bit-banging, tak pořádně” a přilepil bych si k tomu ještě posuvný registr. Zkusit to ale může samozřejmě i bez něj.

Každopádně bez programu stejně nepoznáme kde je chyba, v podstatě neznáme ani účel. To mě vždycky v diskusích překvapí - embedded world je o tom, že stavíme věci. Konkrétní věci ke konkrétnímu účelu a k tomu, aby nám ty věci pomáhaly ve specifických oblastech - ovšem tazatelé co chtějí radu ve fóru s tímto obecně dělají doslova strašné tajnosti, vymámit z nich co přesně se vlastně řeší je mnohdy nadlidský úkol. Jak chceš ale radit konkrétně, když máš jen obecný popis a nevíš, co ta věc má vlastně ve finále dělat… (to není osobně k tobě, to jen tak debatíme). V podstatě ani nevíme, jestli něco staví sám a nebo upravuje už nějaké existující zařízení (čili jestli má např. možnost měnit zapojení nebo ne apod).

U PIC18F při HW PWM nemá zápis na PWM výstup žádný vliv. PWM je odpojen od výstupních PORTx a LATx, ale je připojen na vstupní a čte PORTx.

Zdravim, vdaka za vsetky odpovede, da sa povedat ze ste mi pomohli, takze momentalne vyskusam nasledovne:

  1. skusim data poslat postupne bit po bite na RC0-RC3, avsak obavam sa ze to LCD nespracuje
  2. asi sa teda vyberem cestou presunu LCD na iny port
    Co sa tyka HW vs. SW PWM, tak v tom nemam celkom jasno zatial, uvitam nejaky strucny koment ohladom toho aky je medzi nimy rozdiel u PIC, pripadne si to vygooglim potom niekedy, co sa môjho riesenia tyka, tak to mam nasledovne:
  • frekvencia do PR2
  • dlzka log.1 do CCPR1L:CCP1CON
  • PWM mod tiez do CCP1CON
  • timer preddelicka do T2CON
  • a BSF T2CON, TMR2ON ;Start PWM

Cize asi SW PWM…

kdyby jsi sem dal kod bylo by to lepsi ale mas HW PWM,
nech to jak to mas a vyskousej to , podle me nebude mit vliv zapis na portc na HW PWM , na 690 to nemam vyskouseny ale na 628a ano,tam s tim neni problem

nevim proc by LCD nesprecoval nastavovani bitu po sobe , stejne si je cte az po tiku na E…

HW PWM : nastavis si casovac + modul CCP na PWM rezim a pak jen zapisujes hodnotu do registru pro zmenu stridy pwmka kdyz je treba

SW PWM:nastavis si casovac a v preruseni si pocitas hodnotu stridy a porovnavas ji s pozadovanou hodnotou stridy a podle toho si nastavujes vystupni pin

Ked to budem mat fyzicky zapojene, svacnem to na osciloskop, zatial som to testoval v dvoch simulatoroch. V jednom mal zapis na port vplyv na PWM, v druhom nie. Mne ale prislo prirodzene ze nastava problem z rovnakeho dovodu ako pisal Mahoney. Avsak to co pisu Balů a JohnBoss dava velky zmysel, takze chce to jednoznacne realny test. Dam vediet.

Mas pravdu, spracuje, moju spravu som napisal skor ako som sa nad tym hlbsie zamyslel.

Ak by som v niecom este nemal jasno, tak vystruham nejak ten kod do zverejnitelnej podoby a poslem. Momentalne to je prilis dlhe, komplikovane a neupratane.

Takze po realnom zapojeni a odskusani a kontrole osciloskopom potvrdzujem ze zapis na LCD neovplyvni PWM na tom istom porte.
Problem bol v simulatore ze to zle zobrazoval. Dakujem.

zrejme pouzivas spatnej simulator, v cem si to skousel ?

Simulator v ktorom to robilo problem bol “Real PIC Simulator” od Digital Electro Soft ©2009.
Inak dobry jednoduchy simulator, ine problemy som s nim nemal.

Simulator v ktorom to islo ok bol “PIC Simulator IDE” od OshonSoft

delal sem to v simulatoru v MPLABu , a pak v realu na 628,v simulatoru se to chovalo jak v realu
se simulatorem v MLPABu sem problem nemel, a ani jinymu bych neveril…

Seruste,
uz som dal bokom simulator a pri realnom zapojeni je problem v podstate opacny. Nerozhasi sa PWM ale vypisovanie znakov na LCD.
Najprv kod:

MOVLW A'0'
CALL ZAPIS_DATA
MOVLW A'1'
CALL ZAPIS_DATA
MOVLW A'2'
CALL ZAPIS_DATA
MOVLW A'3'
CALL ZAPIS_DATA
;
CLRF TMR2
BSF T2CON, TMR2ON ;Start PWM
;
MOVLW A'4'
CALL ZAPIS_DATA
MOVLW A'5'
CALL ZAPIS_DATA
MOVLW A'6'
CALL ZAPIS_DATA
MOVLW A'7'
CALL ZAPIS_DATA

a vysledok je na obrazku 1.
Moja aktualna otazka smeruje k registru CCP1CON a bitom CCP1M. Vie mi niekto vysvetlit vyznam tychto bitov, lebo nejak to neviem z datasheetu pochopit. V mojom priklade mam CCP1M na hodnote 1100 a P1M = 11. PWM fici na P1B a ked zmenim hodnotu bitov CCP1M tak zmenia sa aj vypisane hieroglify po odstartovani PWM. No je toto normalne?
obr1.JPG

vyznam P1M<1:0> bitu je v FIGURE 11-4: , kolik potrebujes tech PWMek ?pokud jedno tak to mas spatne nastaveny , pokud vic tak to mas spatne zapojeny …
bity CCP1M<3:0> je teoreticky jedno jak mas , ty nastavujou jen jestly hodnota “0” bude minimum ci maximum (zjednodusene)

Co znamena ze to mam spatne zapojene? Displej je na RC0 - RC3 a na zvysku portu c nie je zapojene nic. PWM mi staci jedno, ale port P1A (RC5) mam odpaleny, takze povedzme, ze PWMiek potrebujem viac ako jedno.

P1M<1:0>: mas 11 coz je “Full-bridge output reverse; P1B modulated; P1C active; P1A, P1D inactive” coz je ze vsechny 4 piny jsou pripojeny k ECCP modulu tudis nejsou I/O, viz FIGURE 11-4:, a tudiz na nem nemuzes mit pripojeny LCD,

RC2/AN6/P1D RC2 ST CMOS General purpose I/O. AN6 AN — A/D Channel 6 input. P1D — CMOS PWM output. RC3/AN7/P1C RC3 ST CMOS General purpose I/O. AN7 AN — A/D Channel 7 input. P1C — CMOS PWM output.

Spravne. Teraz uz to dava zmysel.
Diky moc.