Sziasztok!
Adott egy PIC18F4520 típusú mikrovezérlő. A kérdés olyan 7 szegmenses multiplexer részre vonatkozik ami közös Anódos.
En készítettem egy részt Basic nyelvben amit itt bemutatok. Az a baj vele ,hogy a PROTEUS szimulátor szerint csúnyán vibrál.
A multiplexer kiosztásai : PORTB<0:6> a hét szegmens . PORTD<4:7> a közös anod vezérlők.(PNP tranzisztorokat vezérel).
Íme a program részlet :
'multiplexer eljárás
dim lepesneg as byte 'lépés komplementere (negáltja)
dim lepes as byte 'közösanodok léptetése
dim led as byte[5] 'tömb array a 4 digit tárolására
dim v as byte ' ezen ciklus fő változója
sub procedure Display7seg() 'multiplexer eljárás itt kezdődik
lepes = 16 'a léptetés PORTD.4-ről indul és PORTD.7 a vége
for v = 0 to 3 'multiplexer ciklus
lepes = not lepesneg 'lepes komplementerének képzése a PNP-K miatt.
PORTD = lepesneg 'léptetés megjelenítése a PORD<4:7>
PORTB = lepes[v] 'itt veszi fel a 7 szegm értéket
Delay_ms(1) 'késleltetés
lepes = lepes << 1 'léptetés tényleges
if lepes = 1 then ' HA RD.0 -ra ugrik akkor RD.4 az érvényes
lepes = 16
end if
PORTB = $FF 'KIJELZO KIOLTÁS
PORTD.4 = 1 'RENDRE az PORTD -re állításával kikapcsolom
PORTD.5 = 1 ' a kijelzőt
PORTD.6 = 1
PORTD.7 = 1
next v 'ciklus vége
end sub 'eljárás vége
Tisztelettel szeretném meg kérdezni,hogy jó e így?
A válaszokat a leg nagyobb tisztelettel mindenkinek köszönöm.
Üdv: Lengyel József
Sziasztok!
Szeretném megköszönni mindenkinek a segítséget.
-Az a probléma,hogy alacsony az 32768Hz óra jel. Megnövelt Óra jellel a kijelző RENDESEN MÜKÖDIK.
Most is tanultam ,pedig azt,hogy bizonyos feladatoknál amelyek időkritikusak mint a display multiplexer az óra jel rendkivül fontos.
Meg kaptam a leckét. Két napot probálkoztam.
**FONTOS !!
AZ ,HOGY MOST MÜKÖDIK A KIJELZŐ ---A HOZZÁSZOLÓK SEGÍTSÉGÉVEL ÚTMUTATÁSOKKAL,JAVASLATOKAL SIKERÜLT !
NAGYON KÖSZÖNÖM MINDNKINEK !
A leg nagyobb tisztelettel : Lengyel József
0
Üdv
Nálam CCSC-ben ennyi. Annyi a lényeg, hogy a programot úgy kell megírni, hogy, ha esetleg késleltetés kell, akkor a kijelző "órajelét" felhasználva kell számoltatni.
output_low(PIN_c7);
output_d (one);
delay_ms(delay);
output_high(PIN_c7);
output_d(0b11111111);
output_low(PIN_c4);
output_d (two);
delay_ms(delay);
output_high(PIN_c4);
output_d(0b11111111);
output_low(PIN_c6);
output_d (tri);
delay_ms(delay);
output_high(PIN_c6);
output_d(0b11111111);
output_low(PIN_c2);
output_d (fou);
delay_ms(delay);
output_high(PIN_c2);
output_d(0b11111111);
0
Szia,agressiv !
A Köszönöm szépen a jó tanácsot,a program részletet.
Úgy látszik a probléma az alacsony óra jel miatt van . A PIC18F4520-ra egy 32768Hz-es kvarcot rakott a kedves ügyfél. Ám ez bizony alacsony mert a PIC tényleges Óra jele Fosc/4.Esetemben 32768/4 = 8192Hz és ez nagyon alacsony!
A szimulátorokban meg emeltem a frekvenciát. Le fordítottam a forrásfájlt a megnövelt frekivel. És láss csodát nem vibrál a kijelző !!
Ez úttal szeretném neked is megköszönni a segítséget,javaslatokat !
Üdv : Lengyel József
0
Üdv
Én belső 8MHz-es oszcillátorról is járattam és nem volt gond.
0
Szia,agresiv!
Köszönöm szépen .A megnövelt órajel bevált,Müködik a szimulátor szerint.
A leg nagyobb tisztelettel : Lengyel József
0
A megszakítás használata valószínűleg szükséges, az assembler kódé BIZTOS HOGY NEM.
Konkrét Basic kóddal nem tudok segíteni, inkább a tervezésben, strukturálásban.
Nem írtad, hogy milyen sebességen járatod a processzort. Ha jól látom belső oszcillátorról tud 32MHz-et.
Ez bőven elég a kijelző meghajtására.
Visszafele kezdenék el számolni.
pl. Ha a cél az 50Hz-es frissítés -> 20ms/4 digit -> 5ms/digit
Tehát az egy szegmens frissítését végző rutinnak max. 5ms-ként le kell futnia.
A rutinon belül lehetőleg minél kevesebb ideig tartson a tényleges írás a port lábakra, de 10us senkinek a szemét nem fogja bántani. Utána a következő hívásig ne állítsa semmi a port lábakat.
Egyébként meg érdemes lenne összerakni azt a pár alkatrészt és megtudni, hogy csak a szimulátor vibrál vagy a kijelző is.
üdv, ty
0
Szia,ty !
Az órajel frekvencia 32768Hz.Így kérte az ügyfél.Egyébként egy óra lenne ,szoftveres ora tehát semmiféle speciális valós idejü orával nem kommunikál sajnos.
Nagyon szépen köszönöm a javaslatokat.Be fogom égetni a PIC-ben egy teszt szoftvert ,multiplexer teszt. Ezt szeretném elsőnek be égetni ,és megfigyelni,hogy tényleg vibrál ,vagy a szimulátor így fut.
Amit közöltem program részletet annak az a lényege,hogy a multiplexer frekvencia 180 Hz körül van ,20% kitöltési tényezővel.
A lényeg,hogy a javaslatodat és azt ,hogy a strukturálásban ,ha jól értettem segítséget tudnál nyújtani azt figyelemben veszem esetleg privátban értekezünk a dologról.
Köszi szépen mégegyszer !
Üdv : Lengyel József
0
Bár valószínűleg enélkül is elboldogulnál vele, de saját szórakoztatásomra had szóljak hozzá még egyszer;
"32768Hz" :hmmm:
Ebben az esetben magamat kell javítsam:
Assembler használata
biztos nem szükségesesetleg megkerülhető.A 32768Hz olyan szinten korlátozná le az erőforrásokat mintha egy időutazást tennénk a régmúltba.
Ez kb. 0.1ms utasítás időnek felel meg, amivel nem egyszerű 5ms-ként frissíteni egy digitet. A szimulátor által jelzett villogás jó eséllyel valós probléma.
Elgondolkoznék azon, hogy valamelyik timert (pl. Timer0) járassam a 32.768-as külső órajelről, a procit pedig a 8MHz belső oszcillátorról.
0
Szia,ty !
Még egy kérdés tisztelettel :
-hogyan tudom konfigurálni a PIC18F4520-ast Úgy ahogy írtad?
A proci óra jele : 8MHz ; Timer0 =32768Hz.
A helyzet,hogy az ügyfél így adta a panelt ebben "kellene lelket " varázsolni.
Nekem van egy órám ami a sajátom ,ebben egy PCF8583 -as van(RTC I2C buszos) és kommunikál egy PIC16F887-el. A PIC az én órámban 10MHz-el jár.
Vissza térve , a konfigurálásra a két ora jelesre amit a fentiekben kérdeztem azt megköszönném.
Minden segítségedet előre is köszönöm !
Közbe eszembe jutott valami :
A 32768Hz jelet egy külső oszcillátorral állítanám elő és rá kapcsolnám a TMR1 bemenetére (bár itt van lehetőség oszcillátor konfigurálásra is).
A 8MHz mint internal oszcillator lenne konfigurálva ahogy írtad.Lehet,hogy nem jó a gondolat menetem.
Üdv : Lengyel József
0
Én megpróbálnám kicsit tologatni a kiindulási feltételeket.
Mi a megrendelő elvárása? Napi egy másodperces pontosság? Heti egy másodpereces pontosság?
(Nem megyek tovább, gondolom nem atomóra lesz...)
Ezek valószínűleg elérhetőek egy 20MHz quartz használatával és szoftveres kompenzációval.
Akkor pedig ebbe az irányba mennék, mert nekem ez tűnik a legegyszerűbbnek.
A szoftveres kompenzációt úgy képzelem el, hogy egy magas prioritású interruptban futtatod az órát kiszolgáló timert.
Ezt beállítod a lehető legpontosabbra, majd megállapítod, hogy napi 1.7 másodpercet késik az órád.
Ezek után óránként kompenzálod ennek az értéknek az 1/24-ed részével és az órád máris meg fog felelni az elvárt pontosságnak.
Mert ha a HW adott akkor a quartz bekötése is adott. Ha az osc1,osc2 lábakra van kötve, ott a 32kHz az neked nem jó.
Viszont egy quartzot kicserélni egy másik értékűre az még nem toldozás-foltozás.
Csatoltam egy hasonló alkalmazás miatt két quartz-os proci bekötését.
ui. Egyébként a korábban írtakkal ellentétben nem Tmr0 hanem a Timer1 az aminek saját oszcillátor blokkja van, erről is csatoltam egy rajzot.
(18F4520_39631E.pdf / 131. oldal)
Tehát ha mindenképpen a 32kHz irányba akarnál menni akkor T1CON regiszter beállítását érdemes megnézni.
bit3 / T1OSCEN / Timer1 Oscillator Enable bit
bit1 / TMR1CS / Timer1 Clock Source Select bit
Üdv, ty
0
Szia,ty !
Millió köszönet a segítségért,a kimerítő magyarázatért.Rengeteget jelentenek ezek az információk.
Sajnos a kvarc nem a TMR1 pontjaira van kötve,hanem az osc1 és osc2-re kötötte a kedves ügyfél.
De meg oldom,hogy oda kerüljön a TMR1 pontjaira.
A szimulátorban és a compiler-ben meg emeltem az óra jelet és láss csodát MŰKÖDIK SZÉPEN.
Nagyon szépen köszönök mindent még egyszer !
A legnagyobb tisztelettel : Lengyel József
0
Szia!
Mindenképp megszakítással csináld szerintem is, és célszerű ASM kóddal megírni, nem sok az egész.
Anno csináltam egy órát 4db hétszegmenses led, és egy 2X16 karakteres lcd kijelzővel 16F73 (óra ic RS5C372A) köré. LED meghajtás CD4543-mal, így csak 4+4 port kell hozzá.
megszakításba:
;--- ora kijelzes ---
LDISP_START
BTFSS LED_DIGIT,3 ;ora tizesek
GOTO LDISP100
BCF PORTC,2 ;ora egyes kijelzot kikapcsoljuk
MOVFW LED_ORA
ANDLW B'11110000' ;felso nibble tartalmazza a tizeseket
MOVWF PORTC
ANDLW B'11110000'
BTFSS STATUS,Z ;ha 0 akkor nem kapcsoljuk be a kijelzot
BSF PORTC,3 ;ora tizes kijelzot bekapcsoljuk
GOTO DISPOK
LDISP100
BTFSS LED_DIGIT,2 ;ora egyesek
GOTO LDISP10
BCF PORTC,1 ;perc tizes kijelzot kikapcsoljuk
SWAPF LED_ORA,W ;megforditjuk, mert az also nibble tartalmazza a egyeseket
ANDLW B'11110000'
MOVWF PORTC
NOP
BSF PORTC,2 ;ora egyes kijelzot bekapcsoljuk
GOTO DISPOK
LDISP10
BTFSS LED_DIGIT,1 ;perc tizesek
GOTO LDISP1
BCF PORTC,0 ;perc egyes kijelzot kikapcsoljuk
MOVFW LED_PERC
ANDLW B'11110000' ;felso nibble tartalmazza a tizeseket
MOVWF PORTC
NOP
BSF PORTC,1 ;perc tizes kijelzot bekapcsoljuk
GOTO DISPOK
LDISP1
BCF PORTC,3 ;ora tizes kijelzot kikapcsoljuk
SWAPF LED_PERC,W ;megforditjuk, mert az also nibble tartalmazza a egyeseket
ANDLW B'11110000'
MOVWF PORTC
BSF PORTC,0 ;perc egyes kijelzot bekapcsoljuk
DISPOK
BCF STATUS,C ;carry-t toroljuk nehogy beleszemeteljen
RLF LED_DIGIT,F ;balra forgatunk egyet
BTFSS LED_DIGIT,4 ;ha 1, akkor perc egyes a kovetkezo!
GOTO DISPEND
MOVLW .1
MOVWF LED_DIGIT
DISPEND
BCF INTCON,T0IF ;TIMER0 megszakitas nullazas
GOTO INTR_END
;--- ora kijelzes vege ---
Ennyi az egész:)
Üdv.: Emil
(ez így elég csúnyán néz ki sajna, a tabok eltűntek, viszont szerkesztésnél jól látszik)
0
Szia,rainbow555!
Nagyon szépen köszönöm ,az assembler részletet.Éppen tanulmányoztam, és ha szükséges alkalmazni fogom.
A kapcsolás egyébként itt is egy ora,szoftveres ora.Tehát sajnos nem kommunikál specialís pontos idő IC-vel mint PCF8583 vagy hasonló.Így kérte az ügyfél.
Nagyon,nagyon köszönöm a segítséget mert már két napja kinlodók vele.
Ki kell deritenem,hogy a szimulátor vibrál vagy ténylegesen a PIC így vezérli a kijelzőt.
Mindent nagyon köszönök !
Üdv : Lengyel József
0
Sziasztok!
Ha korrekt megoldást szeretnél, akkor assembly-ben ird meg, és timer-es megszakitást használj. Gyorsabb és rövidebb rutint kapsz, ami kevésbé függ a program többi részletétől. Így a főprogram függetlenül müködhet, csak a kijelzendő adatokat kell a megfelelő változókba beírnod.
0
Szia,gadenes !
Köszönöm szépen a javaslatot. Viszont a megszakítással vigyáznom kell ,hogy a megszakítás és fő program "futási időaránya" ne boruljon fel. A fő programnak elegendő idő kell a futáshoz.
Nagyon szépen köszönöm, a javaslatot még egyszer ,meg próbálom ahogyan te javasoltad.
Üdv : Lengyel József
0
Szia !
Elég nagy esélyed van rá, hogy vibrálni fog sajnos ezen az órajelen.
Másik dolog, hogy nagyon pontatlan lesz RTC nélkül.
Üdv.
0
Szia,AzzA !
Így van ahogy írtad.Bizony pontatlan.
-Nagyon szépen köszönöm a segítséget. A vibrálást ,hogy ki tudom-e szedni ? Az jó kérdés. Az igazság az ,hogy még kezdő vagyok a PIC területen. Persze nem mentegetözni akarok.
Nagyon szépen köszönöm a véleményedet.Méltányolni fogom .
Üdv : Lengyel József
0