Sari la conținut
ELFORUM - Forumul electronistilor

Conectare tastatura la Pic16f877a


Drk_alien

Postări Recomandate

Buna, doresc sa conectez o tastatura Ps2 la un microcontroler si sa afisez pe un afisor cu 7 seg. ultimul caracter tastat .Aici am niste nelamuriri: a) Tastatura trimite serial pe un singur pin al pic-ului codul 1c(H) la tastarea caracterului "A" .Cum retin acel cod binar ca apoi sa il procesez pt afisarea pe afisor?...stiu sa lucrez cu transmiterea paralela dar nu inteleg transmiterea seriala.b) De unde stie pic-ul cand datele pt caracterul tastat s-au transmis si sunt gata pt procesare spre afisare?

Link spre comentariu
  • Răspunsuri 8
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Drk_alien

    5

  • ratza

    2

  • Liviu M

    1

  • costi002

    1

Top autori în acest subiect

Transmisia multor biti pe putine sarme se cheama transmisie seriala. Exista mai multe protoacoale de comunicatie; in fiecare protocol se "impune" modul in care:

- se poate initia o transmisie (care trebuie sa fie starea liniilor de comunicatie ca sa poti transmite un nou pachet)

- cum incepe transmisia (de obicei cu un bit de start)

- cati biti se transmit "o data"

- eventuale metode de testare a validitatii datelor receptionate (de ex. bit de paritate)

- cum se termina mesajul (bit de stop).

In cazul tau, protocolul e descris aici.

 

Ca sa receptionez datele in PIC, in momentul in care detectezi date pe liniile seriale (poti folosi RB0 pentru clock si intreruperea INT0 ca sa detectezi bitul de start/fronturile semnalului de clock), incepi si salvezi datele de pe linia de date (din ce am vazut eu, poti salva pe frontul crescator al semnalului de ceas). Le salvezi intr-o variabila/un registru si le prelucrezi cum iti trebuie.

 

Asta daca nu cumva merge sa folosesti direct portul serial al PICului, caz in care se ocupa el de comunicatie, tu trebuind doar sa "potrivesti" baud rate-ul si sa citesti datele din bufferul de intrare cand sunt toate.

Link spre comentariu

O sa revin cu modelul de tastatura pe care vreau sa fac acea aplicatie pe duminica,cand o aduc din sat si imi reamintesc ce model e.(oricum ceva vechitura). Pare destul de complicata treaba.Sper sa ii dau de capat...O sa revin duminica si pana atunci am sa citesc protocolul care mi s-a indicat.

Link spre comentariu

Bun, am revenit.Nu stiu modelul de tastatura deoarece nu este inscriptionat nimik.As putea sa o bag intr-un calc ca sa vad detalii despre, dar eu am laptop.

 

Vreau sa fac in felul urmator: Voi folosi Pinul 7 din PORTB (RB7) ca si alimentare pentru tastatura, pinul 5 si 6 pt clock si data(RB5 si RB6)....astea se vor conecta la mufa PS2 .Folosesc un oscilator de 10 MHz.

 

Intrebarea mea este care este algoritmul de receptie a datelor?

 

void main() {     TRISB7 = 0; ///setat ca si iesire     PORTB7= 1; ///setam ca sa avem iesire pt alimentare (are ceva ca folosesc un pin din poarta pt alimentare?)     TRISB6 = ? PORTB6=? //cum setez acest pin ca sa imi dea clock-ul?     TRISB5 = 1; ///setat pentru intrare de la tastatura (data)    while(1)     {       //gandirea ar fi: --daca am tensiune pe PORTB5 ..inseamna ca primesc date, deci undeva sa fie memorati bitii.       //apoi apelez o functie care imi scoate pe o alta poarta in paralel PORTA = 0X1C ;     }}

Am gasit ceva aici http://tams-www.informatik.uni-hamburg.de/applets/hades/webdemos/95-dpi/pic16f628-rxtx/echo.html dar nu stiu daca merge si nici nu prea inteleg codul.

 

Astept niste pareri si ajutor.Va multumesc.

Link spre comentariu

Aaaa, ai o tastatură normală de PC? Aşa spune. Am crezut că e una miniatură. Păi atunci nu-ţi rămîne decît să cauţi descrierea protocolului de comunicare şi să-l implementezi în PIC.Nu folosi portul PIC-ului pentru alimentare, rişti să-l arzi.

Link spre comentariu

ok...nu inteleg cum sa implementez protocolul acela in PIC, tastatura va trimite date la apasarea unei taste...dar cum fac progarmul care sa imi puna intr-o variabila codul binar specific tastei apasate?....cer prea mult?

Link spre comentariu

Inainte de toate citeste cu atentie cum functioneaza USART-ul pic-ului si apoi revino cu intrebari.In principiu, ca sa ai o idee, dupa ce USART-ul receptioneaza 1 byte apare o intrerupere. trebuie monitorizata acea intrerupere, dupa care pur si simplu copiezi datele din registrul TXREG unde vrei tu si faci ce vrei cu ele.Mult spor la citit

Link spre comentariu
  • 4 săptămâni mai târziu...

Am reusit sa fac acea aplicatie cu tastatura. Am folosit acest cod pe care l-am gasit in help-ul de la mikroC . Se pare ca pic16f877a nu are registrii ANSEL si ANSELH .In acea schema http://www.mikroe.com/esupport/index.php?_m=knowledgebase&_a=viewarticle&kbarticleid=143 la pinii de clock si data apar tensiuni.Eu nu am folosit asa ceva.Cred ca mi-ar fi tinut semnalul de clock sau data tot pe 1 .

Sper sa ajute si pe altii ceea ce am facut aici..

 

unsigned short keydata = 0, special = 0, down = 0;sbit PS2_Data            at RC0_bit;sbit PS2_Clock           at RC1_bit;sbit PS2_Data_Direction  at TRISC0_bit;sbit PS2_Clock_Direction at TRISC1_bit;void main() {  ADCON1 = 0;  ADCON1 = 0;  TRISB = 0;  TRISD = 0;  PORTB = 255;  PORTD = 255;    UART1_Init(19200);                                  // Initialize UART module at 19200 bps  Ps2_Config();                                       // Init PS/2 Keyboard  Delay_ms(100);                                      // Wait for keyboard to finish  UART1_Write_Text("Ready");  UART1_Write(10);                                    // Line Feed  UART1_Write(13);                                    // Carriage return  do {    if (Ps2_Key_Read(&keydata, &special, &down)) {      if (down && (keydata == 16)) {                  // Backspace         UART1_Write(0x08);         PORTB = keydata;      }      else if (down && (keydata == 13)) {             // Enter        UART1_Write('r');                            // send carriage return to usart terminal        //Usart_Write('n');                          // uncomment this line if usart terminal also expects line feed         PORTB = keydata;                                             // for new line transition      }      else if (down && !special && keydata) {        UART1_Write(keydata);        PORTB = keydata;    ///keydata este sirul de biti receptionat de la tastatura. (ex: '01101100')      }    }    Delay_ms(1);                                      // debounce  } while (1);}
Link spre comentariu

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări