[ strš @ 23.10.2012. 17:58 ] @
Poštovanje.
Interesuje me na koji način se rešava da displej koji ima 4 sedmosegmentne cifre svetli istim intezitetom i kada je uključena jedna cifra ili sve cifre? Probao sam sa više različitih vrednosti otpornika i u vezi između displeja i PIC-a kao i između tranzistora i PIC-a. Uspevam da dobijem dobar intezitet kada je jedna cifra uključena ali kada uključim sve cifre smanji se intezitet svih cifara (bled displej). Probao sam i u programu da produžim vreme trajanja jedne cifre kao i da ubrzam ili smanjim osvežavanje istog ali nisam uspeo da dobijem uvek isti intezitet kada je jedna cifra i kada su sve cifre uključene. Takođe sam proverio napajanje koje je uredu i ne pada kada su uključene sve cifre. Pitam uopšteno šta se radi u ovakvim slučajevima jer program sam tek počeo da pišem a ovo mi je prva stavka tako da ako imate neke predloge, napišite a ja ću da ih sprovedem u delo i da vam napišem šta se dogodilo. Tražio sam na net-u odgovor ali izgleda da nisam uspeo da nađem što ne znači da ga nema.
Unapred se zahvaljujem.
[ ZAS011 @ 23.10.2012. 18:06 ] @
Postavi šemu da vidimo kako su displeji povezani, ovako, ne "javlja" mi se zašto imaš promenu intenziteta.
[ bogdan.kecman @ 23.10.2012. 18:58 ] @
moras da stavis otpornik na svaki segment a ne na zajednicku anodu/katodu

dakle za 4 cifre ti treba 32 otpornika (ako imaju tacke ili 28 ako nemaju)

takodje ako ih multipleksiras trandze na zajednickoj anodi/katodi moraju da budu adekvatne i konfigurisane kako treba

[Ovu poruku je menjao bogdan.kecman dana 23.10.2012. u 20:28 GMT+1]
[ strš @ 23.10.2012. 19:28 ] @
Ovo je slika koju sam našao na net-u pošto sam svoju šemu pravio direktno za PCB plocicu tako da je nemam kao klasičnu šemu ali ova šema je isto ono što sam ja uradio. Nadam se da razumete šta sam rekao.
[ ZAS011 @ 23.10.2012. 20:52 ] @
Nadam se da su ti emiteri tranzistora vezani za masu
Ako nisu, eto ti razloga lošeg rada.
[ strš @ 23.10.2012. 21:44 ] @
Jesu. Kad namestim otpornicima da displej sa svim ciframa sija dobro, onda imam problem da kad uključim samo jednu cifru on sija jako. Rekao bih da je šema uredu jer na net-u većinom ovakav je način povezivanja. Nisam rekao da mi tranzistori nisu iste oznake ali smatram da mi to ne može stvarati problem za celokupni displej već samo za pojedinačnu cifru.

[Ovu poruku je menjao strš dana 23.10.2012. u 22:58 GMT+1]
[ bogdan.kecman @ 23.10.2012. 22:07 ] @
ajde slikaj pcb posto ako si vezao po ovoj semi nema sanse da imas razliku u intenzitetu izmedju 1 i 2 segmenta

jedini nacin da imas razliku je ako ti segmenti vuku preko 25mA pa da opteretis mikrokontroler da nemas dovoljno struje ukupno … ako su to neke velike cifrke onda moras jos 7 tranzistora, ali za obicne 5-10mA segmente nema sanse da ima problem ako si vezao po semi
[ strš @ 23.10.2012. 22:32 ] @
Šema je ista kao i na slici, definitivno. Samo ako možeš da mi razjasniš oko struje. 25mA po cifri ili po jednom segmentu ili po nožici MCU-a? Nosim se mišlju da sam preterao sa strujom i da mi problem stvara sam MCU iako sam vrednosti otpornika postavio kao što je na slici.
Unapred hvala.
[ HeYoo @ 23.10.2012. 22:38 ] @
Verovatnije je da je softverski problem sa multipleksiranjem, tj nacin na koji je realizovano.
Ako ne koristis tajmer vec ti ispis trci kroz petlju sa sve delay(), takvo ponasanje je ocekivano.
[ strš @ 23.10.2012. 22:55 ] @
Sugestija je na mestu. Program pišem u C-u, MCU je 16f886, kristal je 20MHz a displej sa zajedničkom katodom. Pošto to radim na poslu program ću napisati sutra jer je sad kasno za to ali ako sad imaš neku sugestiju na koji se to način radi, napiši da bih probao sutra i odmah da napišem šta se dogodilo. Moja ideja ( i realizacija) kojom se vodim je, da prvo pošaljem na port B informaciju koji broj ispisujem a odmah potom da uključim cifru koju hoću (katoda na nulu preko tranzistora), pa da sačekam 1ms i da isključim cifru pa onda tako sledeću cifru i tako redom. Ako je koncepcija pogrešna reci gde grešim. Unapred hvala.
[ strš @ 23.10.2012. 23:03 ] @
Pošto si dopunio odgovor pre nego što sam završo sa mojim, interesuje me da li možeš da mi daš predlog na koji način se koristi tajmer u realizaciji prikazivanja displeja jer sam relativno nov u ovome. Ako imaš neki sajt gde mogu da te primere vidim napiši mi jer ti je lakše tako nego da te smaram sa podpitanjima.
Pošto je kasno "čujemo" se sutra.
Pozdrav.

[Ovu poruku je menjao strš dana 24.10.2012. u 00:20 GMT+1]
[ YuMERA @ 24.10.2012. 00:41 ] @
Ako imas cetri cifre onda njihove vrednosti (c1,c2..c4) dodeljujes (izracunavas) u main programu a displej osvezavas (prikazujes te cifre) nekim vremenskim intervalom od 5ms tako sto ces TMR0 da setujes da se interrupt na prekoracenje TMR0 desi svaki 5 ms.

[Ovu poruku je menjao YuMERA dana 24.10.2012. u 01:53 GMT+1]
[ bogdan.kecman @ 24.10.2012. 01:07 ] @
HeYoo, odlican ubod :D .. meni nikad ne bi palo na pamet da vrti u while petlji ispisivanje ..

strs. jednostavan primer: http://www.mcuexamples.com/PIC-Seven-Segment-Displays.php

a imas i primer za hi-tech c na sajtu sa kog si skinuo onu semu:
http://extremeelectronics.co.i...-pic-microcontroller-tutorial/

[ rsinisa @ 24.10.2012. 09:12 ] @
Smanji otpornike R5 do R11 na 100 do 150 oma i smanji R1 do R4 na 1K. Imaš na mom sajtu PIC panel pa pogledaj primer tamo, jeste da je u BASIC-u i ASM-u, ali mislim da nije problem da se snadješ.

http://sinel.freehostia.com/picpanel/index.html

Pozdrav.
Sinisha

P.S. Sad videh da već imaš linkove ka primerima u C-u, tako da nema potreba da gledaš onaj moj PBP.
[ strš @ 24.10.2012. 21:33 ] @
Zahvaljujem na odgovorima i pošto sam nov u ovome potrebno mi je malo više vremena da shvatim šta je napisano u drugom jeziku pošto i C još učim. Ideja je na mestu da prvo dodelim vrednosti ciframa u main programu a posle u petlji? da osvežavam uključenje istih.Pokušao sam sa smanjivanjem vrednosti otpornika ali i dalje je bila razlika u osvetljaju kad je jedna cifra i kad su dve ili četiri. Uspeo sam danas da svedem da ciframa intezitet bude isti, tako što osvežavanje cifara se razlikuje u zavisnosti koliko je istih uključeno (glupo ali deluje). Probaću sutra ideju koju ste mi dali. Možda se udaljavam od teme ali me interesuje postoji li i u čemu je razlika ako radim sa TMRO ili sa for petljom ( primer for(x=0;x<100;x++) ). U fazi sam učenja pa ne zamerite na (možda) glupom, početničkom pitanju jer još nisam savladao vremena već se igram sa osnovnim naredbama (while,for,if...).
Pozdrav.
[ bogdan.kecman @ 24.10.2012. 23:34 ] @
kada radis sa interaptom svaka cifra svetli isto vremena
kada radis u for petlji zavisno kako napises petlju svasta mozes da uradis pogresno

Uradi jednostavan primer

bez ikakve petlje, kontrolisi samo jednu cifru i vidi da li svetli razlicito ako prikazuje 1 ili ako prikazuje 8, dakle bez multiplexiranja ... ako tu imas problem sa osvetljenjem ne valja ti kako si spojio komponente, ako nemas problem (razliku osvetljenja) onda ti je jasno da je problem zasto je nesto svetlije a nesto tamnije vreme koliko to nesto svetli ..

glup primer koji ispisuje 1234 na 4 7seg-a (dakle ovako NE TREBA raditi)

Code:

//...
#define POZICIJA LATA
#define CIFRA LATB
unsigned char n[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98}; 
//...
for (int i=0;i<32000;i++){
  POZICIJA = 0b00000000; 
  CIFRA = n[4];
  POZICIJA = 0b00000001; 

  POZICIJA = 0b00000000; 
  CIFRA = n[3];
  POZICIJA = 0b00000010; 

  POZICIJA = 0b00000000; 
  CIFRA = n[2];
  POZICIJA = 0b00000100; 

  POZICIJA = 0b00000000; 
  CIFRA = n[1];
  POZICIJA = 0b00001000; 
}
//...


prva cifra (pozicija 0x08) ce biti svetlija od ostalih 3-4 puta!!!

[ rsinisa @ 25.10.2012. 11:51 ] @
@ bogdan.kecman
Vidiš Bogdane, i ja sam, kao i to, protumačio da njemu svetli različito kad mu je upaljeno 1 i 8. Medjutim, sad sam ponovo pročitao njegove poruke i shvatio da je problem da li svetli jedna cifra ili više (ne segment).

@ strš
Vidi, obzirom da napajaš LED direktno iz kontrolera, a max. struja koju može jedan pin da isporuči je 25 mA, što je malko više od potrebne za jednu LED (ti daješ i manje jer je ograničena rednim otpornikom), to je sasvim normalno, jer u multipleksu moraš LED da napajaš sa N X In, gde je N broj displeja u multipleksu, a In nominalna struja za jendu LED, što bi značilo da moraš da obezbediš oko 80 mA u svakom trenutku za svaku LED, a to tako neće moći. Jedino rešenje je da i LED napajaš preko posebnih tranzistora, kao što ti je rekao Bogdan u njegovoj drugoj poruci.
Jer kad uključuješ samo jednu cifru, sva struja svo vreme ide samo u taj displej, a čim počneš da deliš struju, normalno da će slabije da svetli jer se fiksna količina struje sada deli na više potrošača. Zato ti treba izvor koji može da obezbedi više struje.

Pozdrav.
Sinisha
[ bogdan.kecman @ 25.10.2012. 14:28 ] @
Citat:
rsinisa:  Medjutim, sad sam ponovo pročitao njegove poruke i shvatio da je problem da li svetli jedna cifra ili više (ne segment).


da i ja sam tek skontao kada je HeYoo hintovao problem sa brzinom multipleksiranja ... on u for petlji kada vrti samo jednu cifru ona dobija struju 100% vremena (nema multiplexiranja), kada vrti 2 dobijaju 50% vremena znaci duplo slabije svetle, kada vrti 4 one ce da svetle 4x slabije .. dodatno sa for petljom ima delay na kraju (ili pocetku zavisi od kompajlera) petlje zbog cega ce jedna cifra uvek da svetli jace...

zato lepo interapt, jednu po jednu cifru, moze da bira koliok brzo ce da trce i to je to :D

ja do duse kada radim 7seg turim lepo 595 i vozim ih tako, ne zato sto ne volem multiplexiranje nego zato sto cesto moram da slikam/snimim to sto radim a onda multiplexirane brojke izgledaju ocajno / netacno ... tako da sa 4x595 resim problem + ne smaram mcu sa osvezavanjem ekrana :D, da ne spominjem da onda mogu da menjam brightness ako zelim (preko enable pin-a koji okacim na pwm)
[ strš @ 25.10.2012. 17:35 ] @
U pravu ste za struju koja je potrebna za displej jer nije ista struja za jedan i za četiri cifre a sve ide preko otpornika. Ovo je deo kako sam ja napisao prikazivanje displeja:
Code:

.
.
.
byte const cifra[18] = {0x6f,0x60,0xCB,0xE3,0xE4,0xA7,0xAF,0x62,0xEF,0xE7,0x0F,0x8F,0x88,0x0D,0xCE,0xE9,0xA8,0x00};

void prikaz()
{    
    OUTPUT_B(cifra[a]);
    output_bit( PIN_C4, 1);
    delay_us(500);
    output_bit( PIN_C4, 0);

    OUTPUT_B(cifra[b]);
    output_bit( PIN_C5, 1);
    delay_us(500);
    output_bit( PIN_C5, 0);

    OUTPUT_B(cifra[c]);
    output_bit( PIN_C6, 1);
    delay_us(500);
    output_bit( PIN_C6, 0);

    OUTPUT_B(cifra[d]);
    output_bit( PIN_C7, 1);
    delay_us(500);
    output_bit( PIN_C7, 0);    
}

Ovo je podprogram koji pozivam svaki put kad treba da ispišem nešto na displeju s'tim da moram da ga pozivam češće ako želim da displej svetli intezivnije. Znam da mi govorite da radim sa interaptom ali nisam se još oprobao sa tim jer mislim da mi je za sada komplikovano. Čitam, ali još uvek ne shvatam. Nedoumica mi je u tome što ako pozovem displej da prikaže rezultat i u tome mi po cifri treba 5ms smatram da mi je preveliko vreme jer dok to radi ne posmatra mi spoljne parametre (np. temperaturu, prekidač...) ili grešim. Interesuje me da li kad uključim interapt on u "sebi" broji a dok "broji" mogu u glavnom programu da mu zadam da nešto drugo radi a kad dođe do prekida (prekoračenje vremena) on prekida glavni program i uradi ono što sam mu zadao pa se vrati na glavni program. Šta je tačno prvo,drugo ili nijedno? Usputno pitanje je, kako da AD konverziju, posle isčitavanja napona, da dobijem decimalni zapis srazmeran pročitanom naponu (np. ulazni napon 1,54V a decimalni zapis bude 154). Posle toga znam da razložim 154 na pojedinačne cifre (1,5,4) i njih da prenesem na displej. Znam da širim temu ali šta ću kad se pitanja sama nameću a vi srećom imate (nemate?) strpljenja za mene. Unapred hvala.
[ HeYoo @ 25.10.2012. 17:48 ] @
Neki drugar imao slican problem pa sam se setio :) Covek imao neku kit igracku i hteo da nabudzi jos jednu cifru. Lepo on to namestio i sve radilo sem sto je displej sarao sa intenzitetom. Pogledali kod kad ono sve odradjeno u petlji sa delay naredbama i if ovo.. if ono. Izbrisemo dodatnu cifru sve radi lepo. Zamenimo mesta ciframa da bi skontali da nije neka slucajno falicna, sve radi. Pokusamo da sracunamo nove delay vrednosti kako bi radilo ok sa dodatom cifrom i posle par pokusaja skontali da je lakse prepisati porgram tako da koristi interapt za osvezavanje.

@strš
Dakle moguce je nabudziti osvezavanje displeja i bez tajmera ali je to neprakticno, traljavo i ne vodi nikud. Posle odredjene tacke postaje kompleksno racunati kasnjenja, a osim toga ne znas sta sve kompajler optimizuje i sta se desava unutar samog mcu. Za vreme dok nesto iole konkretnije od blinkanja na taj nacin zbudzis mozes izuciti kako isto to uraditi na ispravan nacin. Iako je na prvu loptu odbojno bahtati se sa konfigurisanjem tajmera, brzo se skonta koliko su u stvari korisni i realno za bilo kakvu ozbiljnijije bavljenje sa mcu neophodni. Za konkretne primere pretrazi net. Ima dosta materijala, a ako naidjes na "zid" siguran sam da ovde ima dosta ljudi koji bi rado pomogli i kojima su konkretno PIC kontroleri bliski.
[ HeYoo @ 25.10.2012. 17:57 ] @
Citat:
Nedoumica mi je u tome što ako pozovem displej da prikaže rezultat i u tome mi po cifri treba 5ms smatram da mi je preveliko vreme jer dok to radi ne posmatra mi spoljne parametre (np. temperaturu, prekidač...) ili grešim. Interesuje me da li kad uključim interapt on u "sebi" broji a dok "broji" mogu u glavnom programu da mu zadam da nešto drugo radi a kad dođe do prekida (prekoračenje vremena) on prekida glavni program i uradi ono što sam mu zadao pa se vrati na glavni program. Šta je tačno prvo,drugo ili nijedno? Usputno pitanje je, kako da AD konverziju, posle isčitavanja napona, da dobijem decimalni zapis srazmeran pročitanom naponu (np. ulazni napon 1,54V a decimalni zapis bude 154). Posle toga znam da razložim 154 na pojedinačne cifre (1,5,4) i njih da prenesem na displej. Znam da širim temu ali šta ću kad se pitanja sama nameću a vi srećom imate (nemate?) strpljenja za mene. Unapred hvala.


Hmm, glavni program se izvrsava sve dok ne dodje do prekida(interupt). On moze biti spoljasnji (npr pritisak na taster) ili unutrasnju (signal da je recimo AD konverzija zavrsena ili da je tajmer odbrojao svoje). Kada dodje do prekida glavni program privremeno staje i krene da se izvrsava prekidna rutina, tj sta je u njoj definisano. Kada se prekidna rutina zavrsi glavni program nastavlja da se izvrsava tacno tamo gde je stao. Upravo je u tome prednost interapta jer ne "zaglupljujes" mcu sa for petljom. Brojanje prepustas tajmeru, a za to vreme ti mozes nesto korisno odraditi u glavnom programu.
[ bogdan.kecman @ 25.10.2012. 18:47 ] @
Citat:
strš:
Ovo je podprogram koji pozivam svaki put kad treba da ispišem nešto na displeju s'tim da moram da ga pozivam češće ako želim da displej svetli intezivnije. Znam da mi govorite da radim sa interaptom ali nisam se još oprobao sa tim jer mislim da mi je za sada komplikovano. Čitam, ali još uvek ne shvatam.


gledas na mcu "pogresno" :)

glavna prednost MCU-a u odnosu na "procesor" je sto pored procesora sam MCU ima jos cudo raznog hw-a koji radi nezavisno od samog procesora tako da ti mozes da zadas tom hardweru da nesto radi dok ti radis nesto drugo ... na primer slanje bajta preko seriskog porta moze dugo da traje, posebno ako je komunikacija na niskoj brziji 2400 ili 9600 boda .. zato ako trosis serisku komunikaciju uzmes mcu koji ima hardwerski uart ... ti tom hardweru kazes "posalji ovaj bajt" i ti picis dalje a on salje bajt koliko mu treba da ga posalje ... ista prica za tajmer, ti setujes tajmer da te "zovne" svakih 5ms ili svakih 1ms ili svakih ... on te "zove" tako sto napravi "interrupt" ..

interrupt ti je lako da skontas.. imas jednu funkciju koja je "interrupt handler", kada god se desi neki interrupt procesor stane, baci na stek svoje sadasnje stanje i krene da izvrsava tu funkciju. Kada zavrsi sta je u toj funkciji vrati staro stanje sa steka i nastavi tacno tamo gde je bio prekinut. Ti sada u toj interapt rutini / interrupt hendleru / interrapt funkicji na pocetku pitas "koji te je interapt pozvao" (sta se to desilo) i u odnosu na to uradis sta god zelis da uradis. Ti na pocetku svog programa (ili u sredini ili ..) kazes koja sve desavanja ce da prave interapt i to je to ..

To ti je prosto objasnjenje, sa "jacim" mcu-ima mozes da imas vise nivoa interapta sa razlicitim prioritetima etc etc ali to te za pocetak ne zanima, za pocetak te samo zanima ovaj jedan, pa ces dalje lako ... inace cest termin na koji ces nailaziti je "interrapt vektor" a to je samo fancy naziv za adresu interapt funkcije

pogledaj one primere koje sam ti postavio, jako su jednostavni, nemoj da pravis gresku da na mcu gledas kao na cpu sto pravi vecina ljudi koji kao programeri pocinju sa hardwerom pa onda da bi odradili neke vrlo jednostavne stvari koriste razne RTOS-e koji im bloatuju vec vrlo lose napisan kod
[ HeYoo @ 25.10.2012. 20:27 ] @
@strš

http://www.elektronika.ftn.uns...ina/ume/predavanja/Prekidi.pdf
http://www.elektronika.ftn.uns.../Digitalni_Mikrokontroleri.pdf

Pogledaj ovo, mozda ti moze pomoci za neke uopstene stvari o mcu cisto da razumes ali ako ti je naporna terminologija zaobidji i svakako kreni da radis od laksih primera kao sto ti je Bogdan preporucio.


[ strš @ 25.10.2012. 21:13 ] @
Zahvalan sam na tačnim i konkretnim odgovorima. Potvrdili ste moje "sumlje" za interapt tako da mi je sledeći korak u učenju MCu-a prekidi i njihova primena. Sajtove ću da pregledam i detaljno da pročitam tako da sa ovom temom, za sada, možemo da stanemo. Mnogo više sada znam nego na početku teme zahvaljujući Vama. Još jednom veliko HVALA i ako mi bude potrebna podrška ponovo ću pisati. Inače sa ovog foruma počeo sam da učim o mikrokontrolerima i već imam neko predznanje koje treba da se oblikuje i uvećava.
E sad, kao što sam napisao u predhodnom postu interesuje me još jedno pitanje a to je pretvaranje iščitane AD konverzije u decimalni broj koji je isti kao isčitana vrednost (1,45V da bude decimalno 145). Ako sam previše dosadan sa pitanjima ili treba da otvorim novu temu "recite" da "ućutim ili otvorim novu temu.
Zahvalan vaš učenik.
[ rsinisa @ 25.10.2012. 22:12 ] @
Vidi ovo, možda ti pomogne.

http://www.elitesecurity.org/p3182023

Pročitaj i prvi pasus sledeće poruke.

Pozdrav.
Sinisha
[ YuMERA @ 25.10.2012. 23:10 ] @
Citat:
rsinisa: Vidi ovo, možda ti pomogne.

http://www.elitesecurity.org/p3182023

Pročitaj i prvi pasus sledeće poruke.

Pozdrav.
Sinisha

Uze mi taster sa tastature ("uze mi rec iz usta") :)

A ne bi bilo lose da se prijavi i za hardver http://www.elitesecurity.org/t454860-PIC-razvojni-sistem
[ bogdan.kecman @ 25.10.2012. 23:26 ] @
Citat:
strš:
Potvrdili ste moje "sumlje" za interapt tako da mi je sledeći korak u učenju MCu-a prekidi i njihova primena.


neki ljudi gledaju da zaobilaze interapte koliko god mogu i da na sve moguce nacine odrade posao osim kroz interapte .. ne znam iz cega to ide ali no .. 80+% upotrebe mikrokontrolera je upravljanje interaktivnim procesima. Za "linearne procese" su mehanicki programatori (seti se starih ves masina) odlicni a "digitalizacija" istih je obicno isla uz jedan paralelni eprom i malo 74### digitalije .. Kada su interaktivni procesi u pitanju periferija ne trigeruje desavanja uvek istim redosledom i procesna kontrola zavisi od mnogo cega .. da bi pravilno odgovorio na zahteve interaktivnog procesa interapt je jedini pravilan nacin za rad ... naravno, i dalje postoje procesi gde su interapti visak :) ali realno 80% procesa ih zahteva tako da je pravilno razumevanje interapta ubedjljivo najbitniji "princip/koncept" koji treba usvojiti kada je embedded razvoj u pitanju. Interapti kriju dosta "skrivenih problema" iliti sto bi Dave rekao "trap for young players", mora se brinuti o stvarima kao sto je optimizacija koda koju pravi kompajler (volatile promenljive), duzina trajanja interapt rutine, preklapanje interapata, prioriteti etc etc ... no to sve dodje polako vremenom, ne treba se plasiti u startu i treba se sa tim uhvatiti u kostac sto pre