godFather89 Postat Martie 23, 2011 Partajează Postat Martie 23, 2011 cu ce gresesc ? nu imi ies if-urile ... if ((PORTB | (1<<3)) >>3){ k = "1"; } PORTB este folosit pentru iesiri iar PINB pentru intrari.pentru a verifica daca un bit este setat pe 0 se face asa:if ((PINB & (1<<3)) == 0) ... atingand cu mana pinii de input de la liniile tastaturii am vazut ca este destul pentru a reactiona. pull-up-ul nu trebuia sa scape de problema asta ?Depinde de pullup. Il folosesti cel intern? Este de 100k. Incearca cu un pullup extern de 4.7k. Link spre comentariu
Mad_Turnip Postat Martie 23, 2011 Autor Partajează Postat Martie 23, 2011 da, folosesc pull-up-ul intern. ajung acasa si testez codul. Mersi Link spre comentariu
Mad_Turnip Postat Martie 23, 2011 Autor Partajează Postat Martie 23, 2011 a iesti asa char kb_read(){ PORTB = 0b01111110; if ((PINB & (1<<3)) == 0){ k = "1"; } if ((PINB & (1<<4)) == 0){ k = "4"; } if ((PINB & (1<<5)) == 0){ k = "7"; } if ((PINB & (1<<6)) == 0){ k = "*"; } PORTB = 0b01111101; if ((PINB & (1<<3)) == 0){ k = "2"; } if ((PINB & (1<<4)) == 0){ k = "5"; } if ((PINB & (1<<5)) == 0){ k = "8"; } if ((PINB & (1<<6)) == 0){ k = "0"; } PORTB = 0b01111011; if ((PINB & (1<<3)) == 0){ k = "3"; } if ((PINB & (1<<4)) == 0){ k = "6"; } if ((PINB & (1<<5)) == 0){ k = "9"; } if ((PINB & (1<<6)) == 0){ k = "#"; } return k;} functioneaza aproape bine, numai ca in loc de 1 este 2(PB0 cu PB3), in loc de 2 este 3(PB1 cu PB3) si in loc de 3 este 1(PB2 cu PB3). restul combinatiilor merg ok. Link spre comentariu
godFather89 Postat Martie 24, 2011 Partajează Postat Martie 24, 2011 functioneaza aproape bine, numai ca in loc de 1 este 2(PB0 cu PB3), in loc de 2 este 3(PB1 cu PB3) si in loc de 3 este 1(PB2 cu PB3). restul combinatiilor merg ok.Nu am inteles ce vrei sa zici...E o practica buna sa folosesti si else-uri, astfel devine ceva mai rapida functia. Link spre comentariu
Mad_Turnip Postat Martie 24, 2011 Autor Partajează Postat Martie 24, 2011 aha, voi modifica cu else-uri :)vreau sa zic ca toate tastele functioneaza numai ca daca apas 1 apare 2, daca apas 2 apare 3 si daca apas 3 apare 1, restul functionand corect. am scos tastatura si conectam PB0 cu PB3 adica corespunzator cifrei 1 de pe tastatura, rezulta cifra 2 pe ecran. si tot asa la PB1 cu PB3 da 3 si PB2 cu PB3 da 1. nu-mi dau seama de unde poate fi. Link spre comentariu
Mad_Turnip Postat Martie 27, 2011 Autor Partajează Postat Martie 27, 2011 studiind codul am ajuns la concluzia ca ii trebuie un mic delay intre PORT si citirea pinilor, am incropit asa ceva: #include<avr/io.h>#include <util/delay.h>#include <hd44780.h>#include <string.h>uint16_t a,b,c,u;char k,k1,x;char line1[20],line2[20],line3[20],line4[20];char password,input_password;void delay_pir(){ lcd_goto(2); lcd_puts("* INITIALIZARE *"); lcd_goto(40); lcd_puts("Initializare PIR-uri 2 minute"); for(a=1;a<=120;a++){ _delay_ms(10); } lcd_clrscr();}void kb_init(){ DDRB = 0b00000111; PORTB = 0b01111111;}char kb_read(){ k = ""; PORTB = 0b01111110; _delay_ms(10); if ((PINB & (1<<3)) == 0){ k = "1"; } else { k = k; } if ((PINB & (1<<4)) == 0){ k = "4"; } else { k = k; } if ((PINB & (1<<5)) == 0){ k = "7"; } else { k = k; } if ((PINB & (1<<6)) == 0){ k = "*"; } else { k = k; } PORTB = 0b01111101; _delay_ms(10); if ((PINB & (1<<3)) == 0){ k = "2"; } else { k = k; } if ((PINB & (1<<4)) == 0){ k = "5"; } else { k = k; } if ((PINB & (1<<5)) == 0){ k = "8"; } else { k = k; } if ((PINB & (1<<6)) == 0){ k = "0"; } else { k = k; } PORTB = 0b01111011; _delay_ms(10); if ((PINB & (1<<3)) == 0){ k = "3"; } else { k = k; } if ((PINB & (1<<4)) == 0){ k = "6"; } else { k = k; } if ((PINB & (1<<5)) == 0){ k = "9"; } else { k = k; } if ((PINB & (1<<6)) == 0){ k = "#"; } else { k = k; } _delay_ms(20); k1 = k; if(k==k1){ return k;}}char kb_up(){ while(strcmp(kb_read(),"")==0){ _delay_ms(20); }}void load_menu(){ k = kb_read(); for(a=1;a<=500;a++){ _delay_ms(10); } k1 = kb_read(); if(k == k1){ lcd_clrscr(); lcd_puts("MENU"); } else { }}char main(void){DDRD = 0b00000110;PORTD = 0b00000001;password = "15";lcd_init();kb_init();lcd_clrscr();delay_pir();while(1){x = kb_read(); if(x==""){ lcd_puts("11:14:23 22.03.2011"); lcd_goto(0x40); lcd_puts("Status: NIGHT"); lcd_goto(0x14); lcd_puts("*Menu | Power GOOD"); lcd_goto(0x54); lcd_puts("SENZORI: A A R R A "); } else { if(x =="*"){ load_menu(); } else { while(x != "#"){ x = kb_read(); input_password = strcat(input_password,x); for(b=0;b<=20;b++){ _delay_ms(10); } kb_up(); } if(strcmp(password,input_password)==0){ lcd_clrscr(); lcd_puts(input_password); input_password = ""; } else { lcd_goto(0x40); lcd_puts(input_password); input_password = ""; for(b=0;b<=500;b++){ _delay_ms(20); } } } }}} din pacate nu prea functioneaza partea cu cititul codului si nu stiu cum sa fac compararea + citirea sirului de caractere .... Link spre comentariu
electronunervos Postat Septembrie 13, 2011 Partajează Postat Septembrie 13, 2011 Intrebare. am pus firele corespunzator, l-am alimentat prin programator. este prima programare a lui attitiny 13V 10PU. exetreme burnerul nu imi gaseste ic-ul, dar imi gaseste programatorul, iar Khazama AVR Programmer imi da eroarea ca "error setting usbasp isp clock, asta chiar si fara ic pus. Ce e de facut?In prealabil am mai programat cu usbasp-ul si alte atmeluri si a mers, dar acuma nu stiu ce are! Am pierdut deja o juma de zi incercand tot ce se putea, dar el batman. Vreau sa pun un amarat de hex in el si sa mearga.... Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum