[ noterry94 @ 04.11.2016. 19:26 ] @
Pozdrav svima,
Dakle problematika je sledeca potrebno je da u MikroC-u ispisem "Brojac dogadjaja" (odnosno 2 kom) koji se ispisuje(u) na LCD-u (2x16) (njegovoj gornjoj polovini), na donjoj polovini potrebno je da se prikazuje odnos ta dva brojaca (njihove vrednosti), dakle <,>, ==, potrebno je da postavim tastere za inkrementaciju, resetovanje brojaca. Počeo sam da ga radim ali pošto sam početnik u ovome nije mi konkretno jasno šta taj brojač dogadjaja predstavlja uopste u fizickom smislu. Mislio sam da nekako treba da koristim tajmer (koji se opisuje kao brojac dogadjaja), Znam neke osnove tako da bi mi svake smernice dobro dosli, ili ideja, ispisan kod itd...

Code:

sbit LCD_RS at PORTA2_bit;
sbit LCD_EN at PORTA3_bit;
sbit LCD_D4 at PORTA4_bit;
sbit LCD_D5 at PORTA5_bit;
sbit LCD_D6 at PORTA6_bit;
sbit LCD_D7 at PORTA7_bit;

sbit LCD_RS_Direction at DDA2_bit;
sbit LCD_EN_Direction at DDA3_bit;
sbit LCD_D4_Direction at DDA4_bit;
sbit LCD_D5_Direction at DDA5_bit;
sbit LCD_D6_Direction at DDA6_bit;
sbit LCD_D7_Direction at DDA7_bit;


void main() {
     Lcd_init();
     Lcd_Cmd(_LCD_CURSOR_OFF);
     Lcd_Out(1, 2, i);
     Lcd_Out(1, 4, j);
     Delay_ms(2);
     Lcd_Out(2, 2, z);
     }

}
[ goran_68 @ 04.11.2016. 19:46 ] @
Možeš imati dva tastera i brojati koliko su puta pritisnuti (nezavisno jedan i drugi). Treći neka bude reset i on treba da oba vrati na početnu vrednost, nula recimo. Zamisli da imaš ljude koji čekaju u dva reda i da im je zadatak da pritisnu taster kada prodju pored njega. Dogadjaj može da bude bilo šta. Tajmer ti je tu nepotreban za neku osnovnu primenu ali možeš recimo uvesti i njega za slučaj da želiš brojati dogadjaje u nekom vremenskom intervalu.
[ noterry94 @ 04.11.2016. 21:35 ] @
Tako sam i ja shvatio, ali sam dosao u problem sa while petljama, stavio sam dve petlje i nisam izasao na kraj sa logikom dobro. Iskompajlirao sam ga bez greske, ali sam proverio program u AVR simulatoru i on bukvalno nije nista radio.
Podesio sam dugme za inkrementaciju isto u while petlji, nesto kao while(PINB.b0)...
Ako neko mozda ima neki slican program ili je vican u c-u ili konkretno u ovome, dosta bi mi znacilo.
[ shpiki @ 05.11.2016. 00:23 ] @
Ajmo polako:

1) Koji kontroler koristis?
2) Koja je hardverska konfiguracija koju imas/zelis?
3) Zasto mikroC?
4) Ako vec mikroC, da li za PIC ili za Atmel (AVR)?
5) Daj ceo kôd koji si napisao
6) Guglaj "external interrupt" (dodaj PIC ili AVR ili model kontrolera koji koristis)
7) Guglaj "Interrupt on change" ( -||- )
...
while kao na PC zaboravi, jedini while() koji ti je potreban je while(1) (ili for( ; ; ) ), svaki drugi while se resava na drugi/drugaciji nacin.

HINT: Guglaj "mikroC external interrupt", dobices i diskusije i gotove kodove. kao na primer...

* Poenta je da ukapiras sta ti treba i kako da trazis/pitas, sve ostalo je piece of cake...

Mikrokontroler ima "dogadjaje" (interrupts) i ima flagove koje podesava (postavi na 1) kada se desi odredjeni dogadjaj. Tvoj zadatak je da nateras kontroler da prati da li se desio dogadjaj (interrupt) koji tebi odgovara (externi/spoljni, interni/unutrasnji) i da pratis sta se desilo sa flagovima. Nakon svakog dogadjaja, nakon sto ustanovis da se dogadjaj desio (flag = 1) bitno je da OBRISES/ponistis flag da bi kasnije opet mogao da detektujes dogadjaj.
...
Za dalje pitaj sta ti nije jasno, ne mogu napamet da odgovaram

[Ovu poruku je menjao shpiki dana 05.11.2016. u 01:36 GMT+1]
[ goran_68 @ 05.11.2016. 08:37 ] @
Ne while(PINB.b0) već:

if(PINB.b0) uvećaj brojač 1

if(PINB.b1) uvećaj brojač 2

if(PINB.b2) vrati oba brojača na nulu.

Ovo uz uslov da je Taster1 na pinu b0, Taster2 na pinu b1 i reset Taster3 na pinu b2.


[ noterry94 @ 05.11.2016. 10:08 ] @
Citat:
shpiki:
Ajmo polako:

1) Koji kontroler koristis?
2) Koja je hardverska konfiguracija koju imas/zelis?
3) Zasto mikroC?
4) Ako vec mikroC, da li za PIC ili za Atmel (AVR)?
5) Daj ceo kôd koji si napisao
6) Guglaj "external interrupt" (dodaj PIC ili AVR ili model kontrolera koji koristis)
7) Guglaj "Interrupt on change" ( -||- )
...
while kao na PC zaboravi, jedini while() koji ti je potreban je while(1) (ili for( ; ; ) ), svaki drugi while se resava na drugi/drugaciji nacin.

HINT: Guglaj "mikroC external interrupt", dobices i diskusije i gotove kodove. kao na primer...

* Poenta je da ukapiras sta ti treba i kako da trazis/pitas, sve ostalo je piece of cake...

Mikrokontroler ima "dogadjaje" (interrupts) i ima flagove koje podesava (postavi na 1) kada se desi odredjeni dogadjaj. Tvoj zadatak je da nateras kontroler da prati da li se desio dogadjaj (interrupt) koji tebi odgovara (externi/spoljni, interni/unutrasnji) i da pratis sta se desilo sa flagovima. Nakon svakog dogadjaja, nakon sto ustanovis da se dogadjaj desio (flag = 1) bitno je da OBRISES/ponistis flag da bi kasnije opet mogao da detektujes dogadjaj.
...
Za dalje pitaj sta ti nije jasno, ne mogu napamet da odgovaram :)

[Ovu poruku je menjao shpiki dana 05.11.2016. u 01:36 GMT+1]


1)ATMEGA16
2)Bitan mi je samo taj LCD displej, gde cu ocitavati izlazni signal, sve ostalo je ATMega za potrebe ucenja
3)Dobio sam da radim na njemu, imam taj program i na njemu radim, ucim
4)Atmel-avr
5)Manje vise i nemam kod, jer logika koju sam koristio iz (slabijeg) znanja C-a, nije bila dobra.
7)
8)Guuglam hvala puno
Probacu nesto da napisem, pa da vidim na simulatoru da li sam bilo sta uradio.
[ shpiki @ 05.11.2016. 10:46 ] @
Ok, za sada ostani na mikroC (jeste nas, ali je odvratan) da ne gubis i volju i vreme za prelazak na nesto drugo (normalnije).

*** HINT: za sada zaboravi LCD!

Za dalje ti je potrebno:
1) ATmega16
2) taster
3) LED
4) otpornik 390R (330R, 470R, sta nadjes)

Prvo nauci da koristis interrupte (najbitnija stvar), povezi LED na neki izlazni pin (koji god ti se dopada ), povezi taster na PD2 (pin 16), guglaj atmega16 int0, citaj primere i pokusavaj.
[ noterry94 @ 06.11.2016. 10:19 ] @
Evo dokle sam stigao ali ne dobijam zeljeni izlaz :/
Code:

void main() {

int i=0;
int j=0;

char txt1[]="";
char txt2[]="";
char txt3[]="";

while(1){
     Lcd_init();
     while(PINC.b0=1) i++;
     ByteToStr(i, txt1);
     Lcd_Out(1, 3, txt1);
     
     while(PINC.b1=1) j++;
     ByteToStr(j, txt2);
     Lcd_Out(1, 9, txt2);
     
     
     if(i<j) Lcd_Out(2, 8, "<");
     if(i>j) Lcd_Out(2, 8, ">");
     if(i==j) Lcd_Out(2, 8, "=");
     Lcd_Cmd(_LCD_CURSOR_OFF);
     }
}

[ noterry94 @ 06.11.2016. 10:45 ] @
Hvala na pomoci, izleda mi da sad mkontr radi ono sto sam hteo, eventualno su potrebne manje izmene, ipak nisam koristio interrupst kao sto je shipki napisao, verovatno je njegovao ideja bolje=tacnija, ja sam nekako uradio sam mojim nivoom znanja ali videcemo da li bas ovo treba da radi, pa bih kasnije probao i sa interruptom. U svakom slucaju hvala puno, pomogli ste mi u kom smeru treba da idem. Probao sam samo na AVR simulatoru, kada probam na ploci to cu izmeniti, evo konacnog koda:

Code:
sbit LCD_RS at PORTA2_bit;
sbit LCD_EN at PORTA3_bit;
sbit LCD_D4 at PORTA4_bit;
sbit LCD_D5 at PORTA5_bit;
sbit LCD_D6 at PORTA6_bit;
sbit LCD_D7 at PORTA7_bit;

sbit LCD_RS_Direction at DDA2_bit;
sbit LCD_EN_Direction at DDA3_bit;
sbit LCD_D4_Direction at DDA4_bit;
sbit LCD_D5_Direction at DDA5_bit;
sbit LCD_D6_Direction at DDA6_bit;
sbit LCD_D7_Direction at DDA7_bit;

void main() {

int i=0;
int j=0;

char txt1[]="";
char txt2[]="";

while(1){
     Lcd_init();
     if(PINC.b0=1) i++;  // C0 dugme za inkrementaciju 1. dogadjaja
     if(PINC.b2=1) i=0; // C2 reset dugme 1. dogadjaja
     ByteToStr(i, txt1);
     Lcd_Out(1, 3, txt1);
     
     if(PINC.b1=1) j++;  // C1 dugme za inkrementaciju 2. dogadjaja
     if(PINC.b3=1) j=0; // C3 reset dugme 2. dogadjaja
     ByteToStr(j, txt2);
     Lcd_Out(1, 9, txt2);
     
     
     if(i<j) Lcd_Out(2, 8, "<");
     if(i>j) Lcd_Out(2, 8, ">");
     if(i==j) Lcd_Out(2, 8, "=");
     Lcd_Cmd(_LCD_CURSOR_OFF);
     }
}

[ shpiki @ 06.11.2016. 21:11 ] @
Da li si negde možda čekirao "Interrupt on Change" ili "Pin Change Interrupt" ili slično?
Ovako kako je napisano ne može da radi, nemaš podešavanja ni portova, ni pinova (ulazni/izlazni), ni registara, tj. možda i imaš ali ne znaš da imaš
(to je ono kad sam rekao da je MikroC obično G****, jer ti nemaš uvid u kom trenutku i šta on radi "za tebe", nemaš uvid ni u jednu biblioteku... a to će ti kasnije samo stvarati probleme).
Javi se ovde molim te kad istestiraš program na pravom hardveru da diskutujemo
[ noterry94 @ 06.11.2016. 22:19 ] @
Nisam jos radio sa interruptom, googlao sam malo i citao ono sto si mi poslao.
Ne znam ucitao sam ga na AVR simulator i radio mi je ok, malo sam korigovao kod zbog switch buttona za inkrementaciju, jer nisu lepo radili ono sto sam hteo.
Sto se tice podesavanja portova i pinova, potrebni su mi samo izlazni za LCD to sam definisao, za dugmice za inkrementaciju i reset ulazni koji su takvi po defaltu pa ih ne definisem. Izvini ako previse lajicki objasnjavam ili odgovaram jos sam bas puki pocetnik u ovome. :)
Naravno postavljam, sutra prekosutra kad se domognem ploce.
Evo malo modifikovanog koda:
Code:
sbit LCD_RS at PORTA2_bit;
sbit LCD_EN at PORTA3_bit;
sbit LCD_D4 at PORTA4_bit;
sbit LCD_D5 at PORTA5_bit;
sbit LCD_D6 at PORTA6_bit;
sbit LCD_D7 at PORTA7_bit;

sbit LCD_RS_Direction at DDA2_bit;
sbit LCD_EN_Direction at DDA3_bit;
sbit LCD_D4_Direction at DDA4_bit;
sbit LCD_D5_Direction at DDA5_bit;
sbit LCD_D6_Direction at DDA6_bit;
sbit LCD_D7_Direction at DDA7_bit;

void main() {

int i;
int j;
int x=0, y=0;

char txt1[4];
char txt2[4];

while(1){
     Lcd_init();
     if(PINC.b0==1) i=x+1; else x=i;// C0 dugme za inkrementaciju 1. dogadjaja
     if(PINC.b2==1) i=0; // C2 reset dugme 1. dogadjaja
     ByteToStr(i, txt1);
     Lcd_Out(1, 3, txt1);
     //Delay_us(10);
     
     if(PINC.b1==1) j=y+1;  // C1 dugme za inkrementaciju 2. dogadjaja
     else y=j;
     if(PINC.b3==1) j=0; // C3 reset dugme 2. dogadjaja
     ByteToStr(j, txt2);
     Lcd_Out(1, 9, txt2);
     //Delay_us(10);
     
     if(i<j) Lcd_Out(2, 8, "<");
     //Delay_us(10);}
     if(i>j) Lcd_Out(2, 8, ">");
     //Delay_us(10);}
     if(i==j) Lcd_Out(2, 8, "=");
     //Delay_us(10);}
     Lcd_Cmd(_LCD_CURSOR_OFF);
     }
     Delay_us(10);
}


Kako to izgleda na AVR Simu:
http://prntscr.com/d3yjls
[ noterry94 @ 16.11.2016. 21:29 ] @
Nije loše prošlo ovo moje, ne može lepo da se radi bez interrupta, ali nisam znao da radim interrupte pa sam ovako jednostavno odradio...
Sad imam jedan zanimljiv projekat da uradim...
U pitanju je simulacija PIN i PUK koda. Dakle, potrebno je da uradim u MikroC simulaciju gde se pre ulaska u neki program (bilo koji... blinkalica obicna itd) traži unos PIN koda (4 cifre) koji je zadat u programa, a ukoliko se 3 puta pogreši traži unos PUK koda (8 cifara) takodje tri puta, nakon toga ne dozvoljava ulazak u program, dobro bi bilo kada bih mogao da promenim PIN kod nekako... Nemam ideju za to... Unos se vrši sa tastature 4x3 u interakciji sa LCD displejom. Radim preko MikroC na ploči EasyAVR5 sa ATmega16.
Svaka pomoć dobrodošla. Pozdrav.
[ shpiki @ 17.11.2016. 10:50 ] @
Rekao sam ti da moras da naucis interrupte.
Bez toga dalje neces moci...
To sto si sada zaobisao interrupte (ako si ih uopste zaobisao) ne resava stvar, stici ce te na sledecem projektu.
elem...
***************************************
Sto se drugog problema tice - guglaj guglaj guglaj!
http://www.engineersgarage.com...cts/interfacing-keypad-circuit
http://extremeelectronics.co.i...keypad-interface-avr-tutorial/

sa LCD si vec naucio da radis, mislim da nema potrebe o tome pisati (ako ima kazi, nacicemo i to).

Javljaj sta si uradio.
[ noterry94 @ 12.02.2017. 16:59 ] @
Nije me bilo neko vreme...
Shpiki hvala na pomoci, googlao sam i trazio... evo dokle sam stigao.

Code:

char keypadPort at PORTD;             //moduli za keypad 4x4
char keypadPort_Direction at DDRD;

sbit LCD_RS at PORTA2_bit;            //moduli za LCD displej
sbit LCD_EN at PORTA3_bit;
sbit LCD_D4 at PORTA4_bit;
sbit LCD_D5 at PORTA5_bit;
sbit LCD_D6 at PORTA6_bit;
sbit LCD_D7 at PORTA7_bit;

sbit LCD_RS_Direction at DDA2_bit;
sbit LCD_EN_Direction at DDA3_bit;
sbit LCD_D4_Direction at DDA4_bit;
sbit LCD_D5_Direction at DDA5_bit;
sbit LCD_D6_Direction at DDA6_bit;
sbit LCD_D7_Direction at DDA7_bit;


char PIN[4], pom[4], UPIN[4], PUK[8], UPUK[8];         //inicijalizacija promenjivih
unsigned short int k=0,znak=0, BNP=0, BNP2=0, p;

int Broj(unsigned short int k){  // f-ja koja vraca vrednost unetu sa tastature
     switch (k) {
      case  1: p = '1'; break;             // koju vrednost vraca keypad 4x3
      case  2: p = '2'; break;
      case  3: p = '3'; break;
      case  5: p = '4'; break;
      case  6: p = '5'; break;
      case  7: p = '6'; break;
      case  9: p = '7'; break;
      case  10: p = '8'; break;
      case  11: p = '9'; break;
      case  14: p = '0'; break;
    }
    return p;
}

void main(){
            DDRA=255;
            DDRD=0;

            Keypad_init();                //inicijalizacija
            Lcd_Init();
            Lcd_Cmd(_LCD_CLEAR);
            Lcd_Cmd(_LCD_CURSOR_OFF);
            Lcd_Out(1,6,"PIN:");

            PIN[0]='1';          //postavljanje PIN-a
            PIN[1]='9';
            PIN[2]='0';
            PIN[3]='5';
            PUK[0]='1';
            PUK[1]='1';
            PUK[2]='1';
            PUK[3]='1';
            PUK[4]='1';
            PUK[5]='1';
            PUK[6]='1';
            PUK[7]='1';
            znak=0;
            while(1){                        // beskonacna petlja
                      if(BNP<3){
                                while(k<4){                        // petlja sa promeljivom k za Broj
                                           znak = Keypad_Key_Press();         //promeljivoj znak dodeljuje se vrednost koju vraca f-ja Keypad_Key_Press()
                                           Broj(znak);                        //f-ja koja transformise vrednost unetu sa tastature u realnu vrednost
                                           while(znak!=0){                 //unos PIN-a
                                                          UPIN[k]=p;                       //smestanje PIN-a u prom p
                                                          Lcd_Chr(2, k+1,'*');             //ispisuje se * na displeju
                                                          delay_ms(4);
                                                          znak=0;
                                                          k++;
                                           }
                                }
                                if(k==4){                      // unesen poslednji deo PIN-a
                                         k=0;                            //postavlja se brojac na nulu
                                         while(1){                       //beskonacna petlja
                                                  if(PIN[0]==UPIN[0] &&
                                                     PIN[1]==UPIN[1] &&
                                                     PIN[2]==UPIN[2] &&
                                                     PIN[3]==UPIN[3]){       // provera PIN-a sa UPIN-om
                                                                      delay_ms(2);
                                                                      Lcd_Cmd(_LCD_CLEAR);
                                                                      LCD_Out(1, 2, "PIN prihvacen");     // Ukoliko se PIN i UPIN poklapaju ispisuje se poruka na displeju
                                                                      LCD_Out(2, 3, "DOBRODOSLI");
                                                                      delay_ms(3);
                                                                      break;
                                                     } //eof if
                                                  else{                             // ukoliko se ne poklapaju                              // brojac pogresno unetih PIN-ova
                                                       Lcd_Cmd(_LCD_CLEAR);
                                                       LCD_Out(1, 1, "Pogresan PIN");      // ispis na LCD-u u slucaju pogresnog unosa PIN-a
                                                       LCD_Out(2, 1, "Pokusajte ponovo");
                                                       delay_ms(2);
                                                       Lcd_Cmd(_LCD_CLEAR);
                                                       Lcd_Cmd(_LCD_CURSOR_OFF);
                                                       BNP++;
                                                  } //eof else
                                                  break;
                                         } //eof druge While(1)
                                } //eof if(k==4)
                                Lcd_Out(1,6,"PIN:");
                      }
                      else if(BNP2<9){
                                      Lcd_Out(1,6,"PUK:");
                                      while(k<8){
                                                 znak = Keypad_Key_Press();         //promeljivoj znak dodeljuje se vrednost koju vraca f-ja Keypad_Key_Press()
                                                 Broj(znak);                        //f-ja koja transformise vrednost unetu sa tastature u realnu vrednost
                                                 while(znak!=0){                 //unos PIN-a
                                                                UPUK[k]=p;                       //smestanje PIN-a u prom p
                                                                Lcd_Chr(2, k+1,'*');             //ispisuje se * na displeju
                                                                delay_ms(4);
                                                                znak=0;
                                                                k++;
                                                 }
                                      }
                                      if(k==8){                      // unesen poslednji deo PIN-a
                                               k=0;                            //postavlja se brojac na nulu
                                               while(1){                       //beskonacna petlja
                                                        if(PUK[0]==UPUK[0] &&
                                                           PUK[1]==UPUK[1] &&
                                                           PUK[2]==UPUK[2] &&
                                                           PUK[3]==UPUK[3] &&
                                                           PUK[4]==UPUK[4] &&
                                                           PUK[5]==UPUK[5] &&
                                                           PUK[6]==UPUK[6] &&
                                                           PUK[7]==UPUK[7]) {       // provera PIN-a sa UPIN-om
                                                                             delay_ms(2);
                                                                             Lcd_Cmd(_LCD_CLEAR);
                                                                             LCD_Out(1, 2, "PUN prihvacen");     // Ukoliko se PIN i UPIN poklapaju ispisuje se poruka na displeju
                                                                             LCD_Out(2, 3, "DOBRODOSLI");
                                                                             delay_ms(3);
                                                                             break;
                                                        } //eof if

                                                        else{                             // ukoliko se ne poklapaju                              // brojac pogresno unetih PIN-ova
                                                             Lcd_Cmd(_LCD_CLEAR);
                                                             LCD_Out(1, 1, "Pogresan PUK");      // ispis na LCD-u u slucaju pogresnog unosa PIN-a
                                                             LCD_Out(2, 1, "Pokusajte ponovo");
                                                             delay_ms(2);
                                                             Lcd_Cmd(_LCD_CLEAR);
                                                             Lcd_Cmd(_LCD_CURSOR_OFF);
                                                             BNP2++;
                                                        } //eof else
                                                        break;
                                               }  // eof while(1)
                                      } // eof if
                                      Lcd_Out(1,6,"PUK:");
                      } //eof else if
                      else if(BNP==9){
                                      Lcd_Cmd(_LCD_CLEAR);
                                      LCD_Out(1, 2, "Pogresan PUK");
                                      LCD_Out(2, 3, "KARTICA BLOKIRANA");
            }
}


Problem mi predstavlja EEPROM koji ne mogu bas da shvatim, pa sam odlucio prvo da uradim bez njega pa kasnije da ga ubacim. Dakle EEPROM ce mi biti potreban za memorisanje BNP (Broj neuspelih pokusaja PIN-a) i BNP2 (Broj neuspelih pokusaja PUK-a). Citao sam i gledao sampleove ali ne znam gde i kako da ubacim u kod.
P.S zanemariti deo komentara kod PUK koda, samo su prekopirani jer je kod kopiran pa modifikovan :D
Ako moze neka konkretnija pomoc bio bih zahvalan... Pozdrav
[ goran_68 @ 12.02.2017. 19:20 ] @
Kada uvećaš BNP upiši ga u eeprom
Code:

BNP++;
WriteEEPROM(BNP, BNP_ADDR);


Isto to i za BNP2.
BNP_ADDR ti je adresa u eepromu na kojoj smeštaš BNP.

Na početku main pročitaj ove dve vrednosti iz eeproma i dodeli ih promenljivima BNP i BNP2. Tako si isključio mogućnost da neko beskonačno pokušava unos pin i puk gašenjem uređaja.
[ noterry94 @ 12.02.2017. 20:38 ] @
Hvala Gorane na odg. Tako sam nesto i mislio, samo me interesuje kako da izbegnem mogucnost da BNP i BNP2 dodelim vrednosti iz EEPROM-a koje su ranije korištene za neki drugi program. Dakle kako da "izbrišem" EEPROM, ali samo pri prvom korišćenju. Kako da izbegnem da dodelim neku pogresnu vrednost... To me remeti.

Dakle na početku main-a bih napisao sl

BNP=EEPROM_Read(0x01);
BNP2=EEPROM_Read(0x02);

dok bih nakon BNP++ i BNP2++ pisao u eprom

EEPROM_Write(0x01, BNP);
EEPROM_Write(0x02, BNP2);

?
[ goran_68 @ 12.02.2017. 20:42 ] @
Baš kako si i napisao.
Nema potrebe da brišeš išta. Kada upišeš prvi put u neku memorijsku lokaciju u njoj je smeštena vrednost sve dok ne upišeš novu.
[ bogdan.kecman @ 12.02.2017. 20:51 ] @
obrati samo paznju da eeprom nije namenjen da u njega besomucno
pises/brises!!

ako budes na svaki pokret upisivao u eeprom gde si ima crkne za metar
dana koristenja
[ scoolptor @ 12.02.2017. 21:16 ] @
Mudro zbori Bogdan.
Ako upotrebis eksterni F-RAM IC, mozes da zaboravis za taj problem, ali se moras obezbediti od gubitka podataka.
[ bogdan.kecman @ 12.02.2017. 21:31 ] @
>
Broj(znak); //f-ja koja transformise vrednost unetu sa tastature u realnu vrednost


fali ti ovde (na oba mesta) p= ... dakle


p = Broj(znak);


komentari u kodu su ti plac majke bozije :( .. lepo je da imas komentare
ali nema potrebe komentarisati ocigledne stvari, iritira u pm.. ovoliki
ident pravi kod uzasno necitljivim :( takodje
[ noterry94 @ 12.02.2017. 21:50 ] @
Hvala na sugestijama, ali nisam u mogucnosti da biram iz raznih okolnosti, a trazi mi se rad sa EEPROMom tako da nije stvar prakticne prirode. :D

Slazem se Bogdane ispravicu to...komentari su takodje zbog samog projekta gde se trazi opis koraka, doduse, vrv je previse detaljan.
[ bogdan.kecman @ 12.02.2017. 22:04 ] @
zavisi koliko imas upisa u eeprom, ako ces da brojis do 10 i to je to,
sledeci put procitas, vidis 10, kazes "pali majmune" to znaci imaces
ukupno 10 pisanja u eeprom i to nije problem .. ako ces pri svakoj
promeni da nesto brljas i pises tamo onda imas problem .. cisto reko da
budes svestan

sto se tice komentara, izbaci ocigledne stvari "ovde se dodeljuje
vrednost promenjljivoj" je tupav komentar, komentari treba da
komentarisu sta neki blok koda radi i zasto, ne sta jedna linija koda
radi, to se vidi iz te linije ... while(1) je svakako mrtva petlja, ko
to ne vidi nece mu pomoci komentar :D .. sa druge strane treba da
oznacis "ovde citam pin", "nisam dobio pin x puta, sad trazim puk"...
dakle komentarises sta neki blok koda radi i zasto, ne sta radi jedna
linija koda..

ono za Broj(), za pocetak nemoj nazivas funkcije velikim slovo uzasno
je, drugo to sto u funkciji imas "return p" ne znaci da ce da dodeli
vrednost van skopa te funkcije bilo cemu, znaci mora stagod funkcija(...) ..

ono sto je mnogo korisnije - daj varijablama pametna imena, varijabla
"p" je beskorisna...

aj samo napred lepo to ide za sada :D
[ noterry94 @ 26.02.2017. 18:34 ] @
Evo neka verzija blizu konačne...

Code:

char keypadPort at PORTD;             //inicijalizacija za keypad 4x4
char keypadPort_Direction at DDRD;

sbit LCD_RS at PORTA2_bit;            //inicijalizacija za LCD displej
sbit LCD_EN at PORTA3_bit;
sbit LCD_D4 at PORTA4_bit;
sbit LCD_D5 at PORTA5_bit;
sbit LCD_D6 at PORTA6_bit;
sbit LCD_D7 at PORTA7_bit;

sbit LCD_RS_Direction at DDA2_bit;
sbit LCD_EN_Direction at DDA3_bit;
sbit LCD_D4_Direction at DDA4_bit;
sbit LCD_D5_Direction at DDA5_bit;
sbit LCD_D6_Direction at DDA6_bit;
sbit LCD_D7_Direction at DDA7_bit;


char PIN[4], UPIN[4], PUK[8], UPUK[8], p, e;         //inicijalizacija promenjivih
unsigned short int k=0,znak=0, BNP=0, BNP2=0;

int Broj(unsigned short int k){  // f-ja koja vraca vrednost unetu sa tastature
     switch (k) {
      case  1: p = '1'; break;             // koju vrednost vraca keypad 4x3
      case  2: p = '2'; break;
      case  3: p = '3'; break;
      case  5: p = '4'; break;
      case  6: p = '5'; break;
      case  7: p = '6'; break;
      case  9: p = '7'; break;
      case  10: p = '8'; break;
      case  11: p = '9'; break;
      case  14: p = '0'; break;
    }
    return p;
}

void main(){
     DDRA=255;
     DDRD=0;

     Keypad_init();
     Lcd_Init();

     PIN[0]='1';          //postavljanje PIN-a
     PIN[1]='9';
     PIN[2]='0';
     PIN[3]='5';
     PUK[0]='1';
     PUK[1]='1';
     PUK[2]='1';
     PUK[3]='1';
     PUK[4]='1';
     PUK[5]='1';
     PUK[6]='1';
     PUK[7]='1';
     znak=0;
     
     e=EEPROM_Read(0x00);          //ucitavanje podataka sa EEPROM-a
     if(e=0xFF){                    //ukoliko je EEPROM prazan
        EEPROM_Write(0x00, BNP);
        EEPROM_Write(0x01, BNP2);
        }
     BNP=EEPROM_Read(0x00);
     BNP=EEPROM_Read(0x00);
     
     while(1){
           if(BNP<3){                    //ukoliko je br neuspesnih pokusaja unosa PIN-a manji od 3
              Lcd_Cmd(_LCD_CLEAR);
              Lcd_Cmd(_LCD_CURSOR_OFF);
              Lcd_Out(1,6,"PIN:");
              while(k<4){                   //unos PIN-a
                    znak = Keypad_Key_Press();         //promeljivoj znak dodeljuje se vrednost koju vraca f-ja Keypad_Key_Press()
                    Broj(znak);                        //f-ja koja transformise vrednost unetu sa tastature u realnu vrednost
                    while(znak!=0){                 //unos PIN-a
                          UPIN[k]=p;
                          Lcd_Chr(2, k+1,'*');
                          delay_ms(400);
                          znak=0;
                          k++;
                      }
                }
              if(k==4){                      // unesen poslednji deo PIN-a
                 k=0;                            //postavlja se brojac na nulu
                 while(1){                       //beskonacna petlja
                    if(PIN[0]==UPIN[0] &&
                       PIN[1]==UPIN[1] &&
                       PIN[2]==UPIN[2] &&
                       PIN[3]==UPIN[3]){       // provera PIN-a sa UPIN-om
                                  Lcd_Cmd(_LCD_CLEAR);
                                  while(1){
                                  LCD_Out(1, 2, "PIN prihvacen");     // Ukoliko se PIN i UPIN poklapaju ispisuje se poruka na displeju
                                  LCD_Out(2, 3, "DOBRODOSLI");
                                  delay_ms(3000);
                                    }
                           }
                    else{                             // ukoliko je PIN pogresan
                         Lcd_Cmd(_LCD_CLEAR);
                         LCD_Out(1, 1, "Pogresan PIN");
                         LCD_Out(2, 1, "Pokusajte ponovo");
                         delay_ms(3000);
                         Lcd_Cmd(_LCD_CLEAR);
                         Lcd_Cmd(_LCD_CURSOR_OFF);
                         BNP++;
                         EEPROM_Write(0x00, BNP);
                      }
                    break;
                    }
                  } //eof if(k==4)
                }  //eof if(BNP<3)
              else if(BNP2<9){
                   Lcd_Out(1,6,"PUK:");
                   while(k<8){
                        znak = Keypad_Key_Press();         //promeljivoj znak dodeljuje se vrednost koju vraca f-ja Keypad_Key_Press()
                        Broj(znak);                        //f-ja koja transformise vrednost unetu sa tastature u realnu vrednost
                        while(znak!=0){                 //unos PIN-a
                             UPUK[k]=p;
                             Lcd_Chr(2, k+1,'*');
                             delay_ms(400);
                             znak=0;
                             k++;
                             }
                        }
                   if(k==8){                      // unesen poslednji deo PIN-a
                   k=0;
                   while(1){
                       if(PUK[0]==UPUK[0] &&
                          PUK[1]==UPUK[1] &&
                          PUK[2]==UPUK[2] &&
                          PUK[3]==UPUK[3] &&
                          PUK[4]==UPUK[4] &&
                          PUK[5]==UPUK[5] &&
                          PUK[6]==UPUK[6] &&
                          PUK[7]==UPUK[7]) {       // provera PUK-a sa UPUK-om
                                  Lcd_Cmd(_LCD_CLEAR);
                                  while(1){
                                      LCD_Out(1, 2, "PUK prihvacen");
                                      LCD_Out(2, 3, "DOBRODOSLI");
                                      delay_ms(3000);
                                      }
                                  }
                       else{                             // pogresan unos PUK-a
                          Lcd_Cmd(_LCD_CLEAR);
                          LCD_Out(1, 1, "Pogresan PUK");
                          if(BNP2<8) LCD_Out(2, 1, "Pokusajte ponovo");
                          delay_ms(2000);
                          Lcd_Cmd(_LCD_CLEAR);
                          Lcd_Cmd(_LCD_CURSOR_OFF);
                          BNP2++;
                          EEPROM_Write(0x01, BNP2);
                        }
                        break;
                       }
                   }
              } //eof else if
           else if(BNP2==9){
               Lcd_Cmd(_LCD_CLEAR);
               while(1){
                  LCD_Out(1, 2, "Pogresan PUK");
                  LCD_Out(2, 1, "KARTICA BLOKIRANA");
                 }
            }
      } //eof while(1)
} //eof void main()


Prihvatio sam sugestioje, malo preuredio itd.
E sad mi se javlja jedan problem koji ne znam kako da ga resim, mozda sam ga i ranije pominjao.
Dakle, ploča nije moja, da kazem da je za javnu upotrebu, znaci na njoj i drugi razvijaju projekte itd. Tu se javlja moj problem zbog EEPROM-a (dakle EEPROM moram da koristim jer je jedini vid stalne memorije na ploči EASYAVR5 koju koristimo). Moj program bi trebalo da radi ako se uzme pretpostavka da je EEPROM prazan, dakle ili da pre toga nije korišćen ili da je bačen pod UV lampu. Pošto je mala mogućnost tako nečemu, ne znam ako da napravim da on može da radi i ako je npr na 0x00 upisano br 415 od ranijeg korišćenja. :/
[ goran_68 @ 26.02.2017. 19:22 ] @
Ovo ti nije dobro:

Code:
if(e=0xFF){


Treba:

Code:
if(e==0xFF){


U EEPROM-u moraš imati validnu vrednost za BNP ili ti pada koncepcija.
Jedno od rešenja je da na pritisnutu neku kombinaciju tastera uređaj briše u EEPROM-u sadržaj te lokacije i postavlja ga na nulu. Recimo, držiš pritisnuta dva ili tri tastera, uključiš uređaj i on postavi tu lokaciju u EEPROM-u na nulu.