[ conver @ 25.06.2009. 12:47 ] @
Pozdrav svima!
Danima pokusavam da resim jedan problemcic iz digitalne elektronike kojom se inace bavim iz hobija! Dakle: zelim da mi se na malom LCD ekranu ispise znacenje lampice na tabli automobila! Na primer, zasvetli mi lampica za ulje, na LCD da ispise da je nedostatak ulja problem! Stvar je jasna, imam ulazni signal od 12V sa lampice onog trenutka kad se upali, ali kako da taj signal ubacim u mikrokontroler koji cu isprogramirati tako da kada taj signal stigne u njega on posalje output na LCD sa zeljenim natpisom!
[ vukboban @ 25.06.2009. 15:15 ] @
sta ti nije jasno,kako da pretvoris 12 V u 5 V ili ne znas da programiras mikrokontroler?
za ono prvo napravi razdelnik napona,dva otpornika na red(5K i 7K)otprilike,pa ovaj od 5k vezes na zajednicku masu,a ovaj od 7K na lampicu.
sa srednje tacke dovodis 5V na ulazni pin.LCD spajes na izlazne pinove prema datasheet-u.
program napises nekako ovako:
ako"ulaz1" onda "LCD-ulje"
ako"ulaz2" onda "LCD-temperatura"

itd...

pa sve vrtis u beskonacnoj petlji
[ conver @ 25.06.2009. 21:40 ] @
Hvala na ovako brzom odgovoru, nisam se nadao! Vidi relativno skoro sam poceo da se bavim digitalnom elektronikom iz hobija, nije mi to struka, tako da ne zameri ako nesto pitam a cini ti se glupo! :) nije mi jasno dali tih 12v moram da oborim na 5v ili mogu da direktno pustim na ulaz mikrokontrolera 12v a da ga ne sprzim? koji mi mikrokontroler savetujete posto cu imati jedno 15tak lampica? hvala jos jednom!
[ JECHAM @ 25.06.2009. 22:01 ] @
Napon MORAS da spustis na 5V.
U tvom slucaju bi ti trbao mikrokontroler sa 15 ulaza i + izlazi za displej.
Mnogo je bolje koristiti neki pretvarac heksadecimalni na BCD (multiplekser) i onda koristis samo 4 ulaza.
[ conver @ 25.06.2009. 22:40 ] @
Nikad nisam koristio taj multiplexer ali od prilike znam kako radi, ne znam samo kako bi povezao to! A sto se tice mikrokontrolera jel bi ovaj mogao da zavrsi posao:

PIC16F887-I/P (DIP40/20MHz)
[ Struja01 @ 25.06.2009. 23:08 ] @
Citat:
conver: Nikad nisam koristio taj multiplexer ali od prilike znam kako radi, ne znam samo kako bi povezao to! A sto se tice mikrokontrolera jel bi ovaj mogao da zavrsi posao:

PIC16F887-I/P (DIP40/20MHz)


hehe pa taj mikrokontroler je i vise nego sto ti treba
Mogu ja da ti sastavim shemu bez ikakve naknade, samo mi reci ako imas vec neki mikrokontroler i ako hoces mogu ti ubaciti jos neke operacije.
Ako si zainteresiran javi se na pp
Pozdrav
[ conver @ 26.06.2009. 08:50 ] @
Hvala puno Milovane, nema nista bez naknade, moze barem pivce ;)
Dobro bi mi dosla ta sema jer sam relativno nov u ovome! Ja koristim Proteus 7 Professional za crtkanje toga pa ako i ti koristis isto samo sacuvaj projekat i sibni na [email protected]
Nisam mogao na PP jer sam morao da budem malo duze registrovan na ovom forumu :(
[ vukboban @ 26.06.2009. 11:31 ] @
multiplekser jeste dobro resenje,ali ima jedno"ali"...
sta ako se pojave dva kvara istovremeno?(malo verovatno,ali moguce je)
kontroler ce to da prepozna kao jedan,dok drugi ignorise.
inace,ja sam pravio multiplekser od obicnih dioda,i radi odlicno(koristio sam 7 tastera na samo 3 ulazna pina),samo ne prepoznaje kad recimo stisnes 2 odjednom;sto meni nije ni trebalo.
ako nesto zapne,pisi...
[ Struja01 @ 26.06.2009. 12:10 ] @
OK uradicu u Proteus 7 P. i poslati Vam na mail. Poslacu Vam i program uz to. Nisam bas siguran kad cu tacno da stignem da uradim, posto sam u guzvi, ali ocekujte danas ili sutra.
Koji mikrokontroler da koristim? I sta da pise na LCD displeju u ta 2 slucaja? Da li znate da ubacite program u mikrokontroler, imate li programator?
Pozdrav
[ conver @ 26.06.2009. 13:27 ] @
@VukBoban

VRLO JE VEROVATNO da se dogode 2 kvara! Na primer: na tabli postoje 2 indikatorske lampice za kocioni sistem! Jedna sluzi za ABS sistem i pali se onda kada ABS otkaze (abs moze otkazati a da auto i dalje koci normalno, on zapravo sluzi da vam tockovi pri kocenju ne zablokiraju. Dakle kada on otkaze auto koci klasicno) a druga lampica sluzi za kocioni sistem generalno (manjak ulja za kocenje u rezervoaru,slab pritisak u kocionom cilindru itd...) tako da kada se upali ta lampica za kocioni sistem generalno (sa znakom uzvika je inace), automatski ce se upaliti i lampica ABS sistema jer on ne moze da funkcionise ako prethodno navedene stvari na kocionom sistemu ne rade! znaci definitivno multiplekser otpada!
Druga stvar samo kad okrenete kljuc i date kontak na tabli ce vam se upaliti sve lampice radi provere , sto je normalno! Tako da opet multiplexer definitivno otpada!

@Milovan

Mikrokontroler planiram onaj gore sto sam naveo! Programator cu nabaviti od drugara, a sto se tice ispisivanja planiram "Character LCD 4x20" jer pretpostavljam da je izrada menija i koriscenje touchscreen-a jako komplikovano pa cu sve onda smestiti na nega samog!
[ conver @ 01.07.2009. 10:13 ] @
kako naj prostije povezati PIC16F887 i 4x20 Character LCD display?
[ Sepa011 @ 01.07.2009. 17:31 ] @
Citat:
conver: kako naj prostije povezati PIC16F887 i 4x20 Character LCD display?


Paa... provodnicima, naravno

Sale malo, povezes ga cetvorobitno (D4..D7 displeja na pola jednog porta mikrokontrolera), trebaju ti jos linije RS (Register Select) i EN(able), R/W liniju displeja 'zabodes' na masu (osim ukoliko nemas nameru da nesto iscitavas iz samog displeja) i to ti je to.

Da li je displej 1x16, 2x16, 2x20, 4x20, to nema nikakve veze.
[ barum @ 01.07.2009. 22:00 ] @
Citat:
conver: kako naj prostije povezati PIC16F887 i 4x20 Character LCD display?






[ conver @ 03.07.2009. 14:23 ] @
Ljudovi, jel ovo dobro???????

[ barum @ 03.07.2009. 19:18 ] @
Potreban je i potenciometar za kontrast na pin 3 LCD-a.
Pin 4 ne treba da bude spojen sa masom već samo sa pinom porta.

Pozdrav
[ rsinisa @ 03.07.2009. 23:41 ] @
Umesto potenciometra možeš da probaš i sa fixnim otpornikom, bar ja tako radim.

Pozdrav.
Sinisha
[ conver @ 10.07.2009. 10:10 ] @
Ok hvala!



Znaci to je sad to? Ovi kondenzatori su svi ok? oscilator? sad je sve na mestu? samo da ucitam program?

I da, glavno pitanje! Kako da pokrenem simulaciju na proteusu kad ucitam hex u PIC???
Ja kad je pokrenem LCD samo pozeleni ali nista ne ispisuje :/
[ rsinisa @ 10.07.2009. 20:59 ] @
Da bi ti simulacija radila potrebno je da u PIC učitaš HEX i klikneš na PLAY. Ako se ne pojavi ništa na displeju, ili nešto nije dobro povezano, ili program nije dobar.

Pozdrav.
Sinisha

P.S. NE treba ti oscilatorno kolo kada simuliraš neki MCU jer se taj oscilator ionako ne koristi u simulaciji, već se u PIC propertis upiše frekvenca. Taj deo sa X1, C1 i C2 slobodno obriši.
[ rsinisa @ 10.07.2009. 21:09 ] @
Citat:
JECHAM: Napon MORAS da spustis na 5V.

Pa i ne mora jer na svakom pinu postoje zaštitne diode koje sprovedu razliku potencijala ka plusu ili masi tako da je dovoljan i jedan redni otpornik koji zavisi od napona. Sad napamet ne znam koliku struju podnose te diode, ali pretpostavljam da bi 10K otpornik bio više nego dovoljan za 12V.

Pozdrav.
Sinisha
[ conver @ 11.07.2009. 18:17 ] @
A gde treba da postavim prekidac recimo kad hocu da palim ili gasim pozadinsko osvetljenje?
[ rsinisa @ 11.07.2009. 19:42 ] @
U PROTEUS-u? Kao prvo - nigde. Kao drugo, ne vidim čemu bi to služilo u simulaciji. Mislim da su njegovi autori stavili svetliju boju pozadine u radnom režimu čisto da bi korisnik bio siguran, ako mu se ništa ne pojavi na displeju, da li je bar napajanje ispravno povezano, odn. da li radi sam displej u simulatoru.

Pozdrav.
Sinisha
[ conver @ 11.07.2009. 20:26 ] @
Opet frka sa Proteusom :(

Postavio sam komponente prema slici gore!
Evo programa koji se iskompajlirao u MikroC'u bez greske!


char *text = "Misko!!!";

void main()
{

TRISA=1;
TRISB=1;
TRISD=0;
TRISC=0;

Lcd_Init(&PORTD);
Lcd_Cmd(Lcd_CLEAR);
Lcd_Cmd(Lcd_CURSOR_OFF);
Lcd_Out(1, 1, text);


}

Ubacim HEX u PIC kliknem plaz... LCD samo poyeleni... ne ispisuje mi text! :( HELP!
[ rsinisa @ 11.07.2009. 20:57 ] @
To što je kompajler preveo bez greške program, ne znači da je sve u redu. Ne govorim Mikro-C (a ni makro), ali pretpostavljam da je greška u "obaveštavanju" kompajlera na koje pinove je priključen LCD. Pogledaj malo uputstvo za Mikro-C i vidi koje su unapred definisane linije za LCD (ljubitelji engleskog zovu to "default vrednosti"); velika je šansa da nisu one koje si ti povezao pa ili preveži pinove LCD-a ili upotrebi naredbe za definisanje pinova LCD displeja.

Pozdrav.
Sinisha
[ rsinisa @ 11.07.2009. 21:56 ] @
Zaboravio sam još jednu sitnicu: pošto si kontrolne linije povezao na port A, moraš da ga prebaciš u digitalni režim pošto se po uključenju on "budi" sa analognim funkcijama.

Pozdrav.
Sinisha
[ conver @ 12.07.2009. 18:38 ] @
Jeste Sinisa, bio si u pravu... LCD se inicijalizuje po default-u na portu B, to sam video u help-u mikroC-a! Posto nisam znao kako to da promenim :) prevezao sam pinove sa PortaD na PortB, ucitao program ali opet nista! :-(
Nisam te skapirao ovo... kako da prebacim to iz analognog u digitalni?
[ rsinisa @ 12.07.2009. 19:10 ] @
Hm, imam neki utisak da nisi čitao dokumentaciju ni za Mikro-C ni za PIC koji koristiš. Evo, pogledao sam upravo uputstvo za Mikro-C i predlažem ti da ga pogledaš i ti počev od strane 236, tamo ti sve piše; ja ne radim u C-u i po tom pitanju više ne mogu da ti pomognem.
Što se tiče A porta, pogledaj dokumentaciju za PIC16F887, strana 39, imaš primer u ASM-u kako se port A prebacuje iz analognog u digitalni režim. Suština je u resetovanju registra ANSEL; u PBP-u se to radi jednostavno "ANSEL=0", a za Mikro-C ne bih znao.

Pozdrav.
Sinisha
[ barum @ 14.07.2009. 23:05 ] @
Evo minimalnog koda za mikro C

Code:

void main() {
    ANSELH = 0; // PIC16F887
    Lcd_Init(&PORTB);
    Lcd_Cmd(Lcd_CLEAR);
    Lcd_Cmd(Lcd_CURSOR_OFF);
    LCD_Out(1,1,"proba...");
}


I minimalnog povezivanja u Proteus-u za ovaj primer i kako izgleda kada se pokrene (F12).



[Ovu poruku je menjao barum dana 15.07.2009. u 12:08 GMT+1]
[ conver @ 20.07.2009. 17:19 ] @
Hvala puno, shema mi je dosta pomogla... Sada i moja radi! ;-)
evo moje:


E sad pitanjce... kako da kad na PortE0 dovedem +5V na lcd pored tog sadasnjeg teksta dopise mi jos i rec "Laza"?
Evo mog koda, ali nesto nece! :-(

Nesto me buni ova konfiguracija pinova... ako neko zna, pliz help!


****************************************************

char Mika[] = "Mika!";
char Laza[] = "Laza";



void main()
{
TRISB = 0;
PORTB = 0xFF;
TRISB = 0xFF;
ANSEL // Configure AN pins as digital I/O
ANSELH = 0; STA ZNACI OVA FUNKCIJA?

TRISE = 1;



Lcd_Init(); // Initialize LCD

Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Lcd_Out(1,1,Mika);

if(RE0==1) //ako je na PORTA.1 dovedena log1 menja se meni
{
Lcd_Out(2,1,Laza);

}
[ rsinisa @ 20.07.2009. 17:56 ] @
Citat:
conver
ANSEL // Configure AN pins as digital I/O
ANSELH = 0; STA ZNACI OVA FUNKCIJA?

Ti baš ne voliš da čitaš uputstva, zar ne? Da si potražio u uputstvu našao bi da je na strani 47 uputstva za 16F887 objašnjen ANSELH registar.

Citat:
conver:E sad pitanjce... kako da kad na PortE0 dovedem +5V na lcd pored tog sadasnjeg teksta dopise mi jos i rec "Laza"?
Evo mog koda, ali nesto nece! :-(

Ako ti je ovo ceo program onda je sasvim jasno zašto neće - program ti se jednostavno završi na zadnjoj instrukciji i tu se zakuca u mrtvoj petlji, tj. samo jednom kada prodje kroz program ispita stanje tog pina. Moraš da napraviš petlju na neki od načina tako da program stalno prolazi kroz tu pitalicu.

Pozdrav.
Sinisha
[ conver @ 20.07.2009. 18:54 ] @
Pomozi druze, kako da napravim tu petlju? ispravi mi kod! i ti si nekad bio pocetnik.... :)
[ barum @ 20.07.2009. 21:31 ] @
Citat:
conver: Hvala puno, shema mi je dosta pomogla... Sada i moja radi! ;-)
evo moje:

!
Ove veze nisu ni slične. Po dokumentaciji D<7:4> se vezuje na PORTx<7:4> a ti si vezao na PORTx<3:0>.
Jesi li siguran da radi i kada si vezao na svoj način?

Citat:
Pomozi druze, kako da napravim tu petlju


Paj'sad:

Code:

    while( 1 )
    {
        if(PORTE & 0b00000001) LCD_Out(2,1,Laza);
    }



Citat:
ANSEL // Configure AN pins as digital I/O
ANSELH = 0; STA ZNACI OVA FUNKCIJA?

Otvoriš pdf za 16F887 pritisneš CTRL+SHIFT+F zatim kucaš ANSELH i sve će ti se samo kasti. :)


[ rsinisa @ 20.07.2009. 21:46 ] @
Citat:
conver: Pomozi druze, kako da napravim tu petlju? ispravi mi kod! i ti si nekad bio pocetnik.... :)

Pa ja se trudim da ti pomognem više nego što ti pokušavaš sam sebi da pomogneš. Znači, moraš prvo dobro da proučiš dokumentaciju za PIC koji koristiš i za Mikro C, pošto njega koristiš, ali ti jednostavno misliš da ćeš da naučiš nešto tako što će drugi da ti reše problem. Ja zaista mogu da zaključim da si krenuo u sve ovo ne pročitavši skoro ništa od dokumentcije čim ti ne znaš šta je ANSELH (nisam ni ja znao do danas, ali sam pogledao u dokumentaciju), a ne znaš ni kako da napraviš neku od petlji. Za C sam par puta rekao da ga ne znam i da u tome ne mogu da ti pomognem. Elem, da skratim, moj DOBRONAMERAN savet je da prvo proučiš C do detalja, probaš prvo neke osnovne primere (kojih je, verujem, pun internet) i da pratiš MikroE forum gde ćeš verovatno naći već rešene probleme sa kojima se ti sad susrećeš. Znači, kreni od lakših primera i ČITAJ dokumentaciju, veruj mi da će ti se taj trud i vreme brzo isplatiti.

Pozdrav.
Sinisha
[ vukboban @ 21.07.2009. 16:25 ] @
Citat:
if(RE0==1) //ako je na PORTA.1 dovedena log1 menja se meni


jel si ti to doveo na porte.0 ili porta.1?
a koliko vidim nedostaje ti jedna } na kraju
[ conver @ 21.07.2009. 22:48 ] @
zagradu sam ispustio na copy/paste!
Sve jedno da je dovedem na E ili A ne funkcionise!
Problem je sada sto na svim pinovima ja vec imam stanje 1!
I da me Sinisa ne bi grdio vise, krenuo sam da citam ove datasheet-ove! :-) Mada treba mi vremena da skapiram ovu logiku ANSEL i ANSELH i povezem sa TRIS i PORT-ovim...
[ rsinisa @ 21.07.2009. 23:09 ] @
Citat:
conver:I da me Sinisa ne bi grdio vise, krenuo sam da citam ove datasheet-ove! :-) Mada treba mi vremena da skapiram ovu logiku ANSEL i ANSELH i povezem sa TRIS i PORT-ovim...

U pravu si, grdim te, i treba, zaslužio si :). U psihologiji postoji nešto što se zove "AHA!" efekat i kad budeš više puta pročitao ono što ti je nejasno, probao u praksi i shvatio, znaćeš šta je taj efekat. U svakom slučaju budi uporan, a ako nešto zapne, tu sam.

Pozdrav.
Sinisha
[ vukboban @ 22.07.2009. 21:52 ] @
aj da probamo ovako:
TRIS registar je registar smera podataka,odnosno on odredjuje da li je neki pin ulazni ili izlazni.
Znaci ako je neki bit u TRIS registru na HIGH onda ce odgovarajuci pin biti ulazni i obrnuto,ako je bit u TRIS registru LOW,onda je odgovarajuci pin izlazni.recimo TRISA=178 ili binarno TRISA=0b10110010 sto znaci da ce pinovi A0,A2,A3 i A6 biti ulazni,a pinovi A1,A4,A5,A7 ce biti izlazni.
AKO je neki pin postavljen kao ulazni,onda moramo da definisemo kakav signal ce da se dovede na ulaz;da li digitalni(HIGH ili LOW) ili analogni (bilo koja vrednost napona izmedju 0V i 5V-recimo 2V ili 3,7V itd).
887 ima ukupno 14 pinova na koje mozemo da dovedemo i digitalni,ali i analogni signal.
registar ANSEL i ANSELH odredjuje da li je signal na ovih 14 pinova digitalni ili analogni.Ako je neki bit u registru ANSEL na HIGH onda je odgovarajuci pin postavljen kao ANALOGNI ulaz,a ako je pin na LOW,onda je pin postavljen kao DIGITALNI ulaz.
ANSEL je za prvih 8 bitova,a ANSELH za ostalih 6.
Ukratko:prvo sa TRIS registrom odredis da li je pin ulaz ili izlaz,a zatim sa ANSEL registrom odredis da li je taj ulaz analogni ili digitalni.
Koji bit odgovara kom pinu moras da vidis u datasheetu(recimo ANSEL.AN0 odredjuje da li je pin PORTA.RA0 digitalni ulaz ili analogni ulaz;ako si u registru TRISA postavio da je TRISA.TRISA0=0-odnosno da je taj pin izlazni- onda bit ANSEL.AN0 nema nikakvu ulogu,ali ako si stavio TRISA.TRISA0=1 odnosno pin je ulazni,onda bit ANSEL.AN0 odredjuje da li je taj ulaz analogni ili digitalni)

P.S.sad sam video da si napisao :if(RE0==1)
ovako ne moze da se pise u C
mora da pise : if(PORTE.RE0==1)

i kao sto kaze Sinisa moras da napravis petlju.
void main()
{
TRISB = 0;//PORTB je ceo izlazni
PORTB = 0xFF;//i svi pinovi su na HIGH
ANSEL=0; // sve je digitalno
ANSELH = 0; //nista analogno
TRISE = 255;//PORTE je ceo ulazni
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Lcd_Out(1,1,Mika);
while(1) {
if (PORTE.RE0==1)
{
Lcd_Out(2,1,Laza);
}
}
}




[Ovu poruku je menjao vukboban dana 22.07.2009. u 23:05 GMT+1]
[ conver @ 24.07.2009. 10:45 ] @
Hvala Bobane... ono šljaka super!
Pokušao sam da napišem funkciju na MIKRO C koja će mi na LCD-u ispisati koliko sam puta pritisnuo prekidač, tj. doveo stanje 1. na RE2! Može pomoć?
ono što sam ja uspeo nije ni za šta...
Kad mi je stanje 1 on broji i ode u beskonačnost... u jednom trenutku sam dobio neki čudan karakter na displeju!
[ vukboban @ 24.07.2009. 15:19 ] @
zbog treperenja kontakata ne mozes samo prosto da brojis,jer za jedan pritisak tastera ti najmanje 50-100 puta promenis stanje na pinu.
Proguglaj malo"debouncing"
Imas u mikroC komandu Button,u kojoj zadajes koliku pauzu u ms pravis izmedju dva ispitivanja da li je taster pritisnut.
Ili jednostavno stavis pauzu od 100 ili 200 ms izmadju svakog brojanja.
I nesto mi nije bas jasno;u kom vremenskom periodu brojis koliko puta je pritisnut?
Ajde evo ti nesto na brzinu:

int i;
int brojac=0;
void main() {
for(i=1;i<50000;i++){//zavisi od takta oscilatora koliko traje,mislim da je ovo oko 5 sec,eksperimentisi
if(PORTE.RE2==1) brojac++;
Delay_ms(200);//za 200 ms ce se smiriti taster,ili probaj sa 300 ako opet brlja
}
dalje ispisujes to na LCD.
ako hoces stalno da to radi onda moras da stavis petlju(moja omiljena je while(1)),i da resetujes brojac na 0

Postoji i hardverski debouncing,stavis jedan kondenzator izmedju pina i gnd,mislim da treba par stotina nF(nemoj da me drzis za rec) i onda on drzi log1 kad se prvi put napuni sve dok ne pustis taster.
Ali dovoljno ti je ovo softversko resenje sa delay,samo moras da znas koliko cesto se ocekuje impuls na ulazu,pa prema tome stavljas i delay(ako impuls dovodis svakih 100 ms,onda nema smisla praviti delay od 200!)

[Ovu poruku je menjao vukboban dana 24.07.2009. u 16:29 GMT+1]
[ conver @ 24.07.2009. 17:58 ] @
Jok... ne pije vodu... brljavi!!!

Evo kako sam ja to pokusao da resim! Tacnije trebao mi je taj brojac da bi napravio meni!!!
Ali meni mi brljavi... verovatno mi ide neka komanda preko komande...
Evo sta sam do sad napravio, mozete ovde da preuzmete ko ima ideju!

http://www.megaupload.com/?d=IEV8R7HJ
to je sa proteusom i kodom zip pakovanje

a evo koda:

// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections

int MPC = 0; //MenuPositionCounter
char MeniMika[] = " <- Mika ->";
char MeniLaza[] = " <- Laza ->";
char MeniPera[] = " <- Pera ->";
char MeniAca[] = " <- Aca ->";

void MainMenuFunction ()
{
Lcd_Out(1,1,MeniMika);
while (PORTE.RE2==1)
{
if (PORTE.RE2 ==1)
{
MPC=MPC +1;
}
}

while (1)
{
if (MPC=1 &&Button (PORTB,RE2,1,0))
{
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,MeniLaza);
}
if (MPC=2 &&Button (PORTB,RE2,1,0))
{
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,MeniPera);
}

}


}

void main() {
TRISB = 0;
PORTB = 0xFF;

ANSEL = 0;
ANSELH = 0;

TRISE=255;

Lcd_Init();

Lcd_Cmd(_LCD_CURSOR_OFF);

Lcd_Cmd(_LCD_CLEAR);


Lcd_Out(2,5,"Moj Meni :-)");


Delay_ms(2000);

Lcd_Cmd(_LCD_CLEAR);

MainMenuFunction ();

}

[ vukboban @ 24.07.2009. 19:44 ] @
Citat:
while (PORTE.RE2==1)
{
if (PORTE.RE2 ==1)
{
MPC=MPC +1;
}
}


ovde si stavio while petlju "dok je re2=1" pa u njoj ispitujes da li je re2=1???

malo besmisleno

Sad kad malo bolje pogledam ti nikad i ne udjes u while(1) petlju.
Odradis onu inicijalizaciju u main,jednom pozoves funkciju MainMenuFunction (),u kojoj imas while "nesto" pa if "nesto",vratis se iz nje i kraj programa!
[ conver @ 24.07.2009. 21:40 ] @
a paj sad ovo sto sam uradio:

void MainMenuFunction ()
{
Lcd_Out(1,1,MeniMika);

while (1)
{

if (MPC=0 && Button(&PORTE, RE2, 1, 1))
{
MPC =1;
Delay_ms(600);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out (1,1,MeniLaza);
}
if (MPC=1 && Button(&PORTE,RE2,1,0))
{
MPC=2;
}
if (MPC=2 && Button(&PORTE, RE2, 1, 1))
{
MPC=3;
Delay_ms(600);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out (1,1,MeniPera);
}
if (MPC=3 && Button(&PORTE,RE2,1,0))
{
MPC = 4;
}
if (MPC=4 && Button(&PORTE,RE2,1,1))
{
MPC=5;
Delay_ms(600);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out (1,1,MeniAca);
}
if (MPC=5 && Button(&PORTE,RE2,1,0))
{
MPC=0;
Delay_ms(600);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out (1,1,MeniMika);
}
}
}

samo sto ni ovo ne pije vodu.. jer mi while uslov proverava to beskonacno puta u krug pa mi posle dovodjena 1 na RE2, prebaci na sledece stanje (sa Mike na peru :) ) ali posle 600ms vrati me na Miku...
Razbijam glavu celo popodne kako da napisem ovaj meni!
[ rsinisa @ 25.07.2009. 12:12 ] @
Ajde probaj da objasniš šta ti je ideja, koji je cilj, šta tačno hoćeš da postigneš, možda grešiš u pristupu problemu.

Pozdrav.
Sinisha
[ conver @ 25.07.2009. 17:07 ] @
Pa napisao sam na prosloj strani... :) cak sam i kod sa proteusovim fajlom okacio u zip-u!
Hocu da napravim klasican meni sa tri tastera! Levo , Desno i Potvrdni (enter) taster! Negde gresim uporno...
Imam solidnog iskustva u programiranju aplikacija za racunar u C-u ali u MikroC-u za mikrokontrolere i nemam, tako da ne izvaljujem gresku!

Dakle LEVO (RE1 = 1), DESNO (RE2 = 1), i POTVRDNI taster (RE0 = 1)
Hvala! ;)
[ rsinisa @ 25.07.2009. 22:08 ] @
Ja bih to ovako napravio (pošto ne znam C, napisaću opisno):
definisao bih promenljivu koaj se zove "meni" i dodelio joj neku početnu vrednost u delu za inicijalizaciju zavisno od toga koja treba da bude prva opcija menija.
Napravio bih potprogram koji bi se zvao "ispis" koji bi na displeju ispisivo tekst u zavisnosti od stanja promenljive "meni".

potprogram
ispis:
if meni=1 piši "Mika"
if meni=2 piši "Pera"
if meni=3 piši "Laza"
return

inicijalizacija:
meni=1
gosub ispis

glavna_petlja:
da li je pritisnut neki taster?
ako ne, idi na "glavna petlja"

ako je pritisnut taster "meni levo" i meni > 1 onda smanji meni za 1
ako je pritisnut taster "meni desno" i meni < 3 onda uvećaj meni za 1
ako je pritisnut taster "meni izbor" radi to i to
gosub ispis
goto glavna_petlja

izbor:
.....
.....



To bi bilo otprilike to s tim da verovatno treba da se ispiše nešto novo ako se pritisne "meni izbor" tako da to treba prilagoditi.
Takodje u zavisnosti od tvojih planova možda je dobro na napišeš program kao tzv. "state machine" jer imaš više opcija menija, a možda imaš potrebe i za podmenijima.

Pozdrav.
Sinisha

[ barum @ 25.07.2009. 22:43 ] @
Citat:
conver: a paj sad ovo sto sam uradio:

...

samo sto ni ovo ne pije vodu.. jer mi while uslov proverava to beskonacno puta u krug pa mi posle dovodjena 1 na RE2, prebaci na sledece stanje (sa Mike na peru :) ) ali posle 600ms vrati me na Miku...
Razbijam glavu celo popodne kako da napisem ovaj meni!


Čiju glavu kad svuda imaš jedan znak jednako umesto dva?
[ conver @ 25.07.2009. 23:24 ] @
jedno ili dva znaka =, mikroCpro, sam prepozna i iskompajlira ga kako valja!
Problem je sto mi meni preskace, a ja ne znam zasto!
Danas sam malo konsultovao sinisu pa sam nesto ispravio ali ne mnogo:

Evo:

int MPC=0; //Brojac (MPC = MenuPositionCounter)

char MeniMika[] = " <- Mika ->";
char MeniLaza[] = " <- Laza ->";
char MeniPera[] = " <- Pera ->";
char MeniAca[] = " <- Aca ->";



void MainMenuFunction () //Funkcija za ispisivanje teksta u zavisnosti od vrednosti brojaca
{
if (MPC==0) //Ako je stanje brojaca = 0, ispisivace MIKA
{
Lcd_Cmd (_LCD_CLEAR);
Lcd_Out (1,1,MeniMika);
}
if (MPC==1) //Ako je stanje brojaca = 1, ispisivace LAZA
{
Lcd_Cmd (_LCD_CLEAR);
Lcd_Out (1,1,MeniLaza);
}
if (MPC==2) //Ako je stanje brojaca = 2, ispisivace PERA
{
Lcd_Cmd (_LCD_CLEAR);
Lcd_Out (1,1,MeniPera);
}
}

void GetKeyFunction() //funkcija za detekciju stanja na RE2
{
while(1) //Proverava stanja beskonacno puta
if(PORTE.RE2==1)
{
MPC = + 1; //Vrednost brojaca se uvecava za 1 ,onda kada se na RE2 dovede stanje 1
MainMenuFunction(); //Pozivanje funkcije za ispisivanje teksta menija sa predjasnjom vredoscu brojaca

}
else //u suprotnom kada nema stanja 1 (spustenog prekidaca na RE2)
{
MainMenuFunction(); // samo pozivam funkciju za ispisivanje pocetnog stanja menija... (kako je int MPC = 0, pocetna stavka menija mi je MIKA)
}
}



void main()
{
TRISB = 0;
PORTB = 0xFF;

ANSEL = 0;
ANSELH = 0;

TRISE=255;

Lcd_Init();

Lcd_Cmd(_LCD_CURSOR_OFF);

Lcd_Cmd(_LCD_CLEAR);


Lcd_Out(2,5,"Moj Meni :-)");


Delay_ms(2000);

Lcd_Cmd(_LCD_CLEAR);



GetKeyFunction();

}

I opet mi se ista stvar desava...
kao da mi se negde preklapaju komande...
prvo mi se polako pojavljuje s leva na desno, pa se zatim brise sa desna u levo i tako sve u krug.... ne kontam ga... ko bi rekao da je ovako tesko napisati meni
Ako nekog ne mrzi , nek ucita ovaj hex u pic u proteusu koji se nalazi u ovom zip-u zajedno sa kodom, skontace o cemu pricam... stvarno ne znam kako da resim ovo! :(

http://www.megaupload.com/?d=NIV2GFP3
[ barum @ 26.07.2009. 00:26 ] @
Mi izgleda nemamo isti mikroC!
Ne mogu da pronađem projektni fajl a kada pokušam da iskompajliram kod ima preko trideset grešaka.

Ja koristim:

Citat:

mikroC, mikroElektronika C compiler
for Microchip PIC microcontrollers
Version: 8.1.0.0


Koja je vaša verzija?

Citat:
conver: jedno ili dva znaka =, mikroCpro, sam prepozna i iskompajlira ga kako valja!

Strašno!

Verovatno i ovo prepozna
Code:

MPC = +1;           //Vrednost brojaca se uvecava za 1

kao
Code:

MPC += 1;

[ conver @ 26.07.2009. 08:08 ] @
Izvinjavam se, ovo jeste stvarno moja greska:
MPC = +1;

mikroC PRO V2.50

ni ispravljanje ne pomaze...
[ conver @ 26.07.2009. 08:41 ] @
EVO JA GA NAPRAVIO!!!

Moze vam posluziti kao template ako nekad budete nesto pravili a zatreba vam meni

-------------------------------------------------------------------------------------
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections

int MPC=0; //Brojac (MPC = MenuPositionCounter)

char MenuItem1[] = " <- MenuItem 1 ->";
char MenuItem2[] = " <- MenuItem 2 ->";
char MenuItem3[] = " <- MenuItem 3 ->";
char SubMenuItem[] = " < SubMenuItem >";

void MainMenuFunction ()
{

if (MPC==0)
{
Lcd_Cmd (_LCD_CLEAR);
Lcd_Out (1,1,MenuItem1);
}
if (MPC==1)
{
Lcd_Cmd (_LCD_CLEAR);
Lcd_Out (1,1,MenuItem2);
}
if (MPC==2)
{
Lcd_Cmd (_LCD_CLEAR);
Lcd_Out (1,1,MenuItem3);
}
}

void MoveRightFunction()
{
MPC==MPC++;
MainMenuFunction();
}
void MoveLeftFunction()
{
MPC==MPC--;
MainMenuFunction();
}
void EnterFunction()
{
if (MPC==0||1||2)
{
Lcd_Cmd (_LCD_CLEAR);
Lcd_Out (1,1,SubMenuItem);
}
}


void GetKeyFunction()
{
MainMenuFunction();
while (1)
{
if(PORTE.RE2==1)
{
Delay_ms(500);
MoveRightFunction();
}

if(PORTE.RE1==1)
{
Delay_ms(500);
MoveLeftFunction();
}
if(PORTE.RE0==1)
{
Delay_ms(500);
EnterFunction();
}
}

}



void main()
{
TRISB = 0;
PORTB = 0xFF;

ANSEL = 0;
ANSELH = 0;

TRISE=255;

Lcd_Init();

Lcd_Cmd(_LCD_CURSOR_OFF);

Lcd_Cmd(_LCD_CLEAR);


Lcd_Out(2,5,"Moj Meni :-)");
Lcd_Out(3,5,"My Menu :-)");


Delay_ms(2000);

Lcd_Cmd(_LCD_CLEAR);



GetKeyFunction();

}
---------------------------------------------------------------------------------------
[ barum @ 26.07.2009. 11:01 ] @
Dobro je kad je proradilo.
Ja samo ne mogu da se načudim šta sve ovaj kompajler može da proguta:
Code:
MPC==MPC--;

Code:
if (MPC==0||1||2)

[ vukboban @ 26.07.2009. 11:51 ] @
Ja koliko znam kad ispitujes neki uslov(if) onda ide dva znaka =,a kad se necemu dodeljuje neka vrednost onda jedan.
Trebalo bi MPC=MPC--; ili jednostavnije MPC--;
Mada mozda taj pro i moze to da radi,imam ga,ali jos uvek radim u obicnom mikroC.
Vazno je da kod radi!(meni licno je malo cudan,ali bitno je da sljaka)

[ conver @ 26.07.2009. 13:00 ] @
@barum

if (MPC==0||1||2)

sta je ovde lose napisano???

ovo jeste:
treba da bude:
MPC = MPC--;
[ barum @ 26.07.2009. 22:14 ] @
Citat:
conver: @barum

if (MPC==0||1||2)

sta je ovde lose napisano???


To je tautologija.
Mislim da je pisac hteo da kaže:

Code:
if (  MPC==0  ||  MPC==1  ||  MPC==2  ) 
[ conver @ 15.12.2009. 19:21 ] @
Problem sa grafickim displejem i PIC-om!!! \

PIC 16F887 8Mhz

Povezao sam ovako:

// Glcd module connections
char GLCD_DataPort at PORTD;
sbit GLCD_CS1 at RB0_bit;
sbit GLCD_CS2 at RB1_bit;
sbit GLCD_RS at RB2_bit;
sbit GLCD_RW at RB3_bit;
sbit GLCD_EN at RB4_bit;
sbit GLCD_RST at RB5_bit;
sbit GLCD_CS1_Direction at TRISB0_bit;
sbit GLCD_CS2_Direction at TRISB1_bit;
sbit GLCD_RS_Direction at TRISB2_bit;
sbit GLCD_RW_Direction at TRISB3_bit;
sbit GLCD_EN_Direction at TRISB4_bit;
sbit GLCD_RST_Direction at TRISB5_bit;
// End Glcd module connections

dakle copy/paste iz Helpa za MikroCpro

kad iskompajliram, ubacim u proteus, izbaci mi gresku na lcd-u u vezi Busy Flag-a... ne kontam... kako da ga setujem off, pomoc ?