Sari la conținut
ELFORUM - Forumul electronistilor

Comunicare PC-PIC


caddyct

Postări Recomandate

As dori sa realizez un program pentru un PIC18F4520 in Microchip C18 sau in ASM (oricare) prin care sa trimit de pe PC mesaje sau caractere (nu conteaza) apoi ulterior poate comenzi catre PIC care are si un LCD.Iar acel mesaj sa apara pe LCD-ul respectiv.Comunicarea as vrea sa fie de tip seriala, RS232.Folosesc placuta PICDEM2 PLUS versiunea RoHS (cea verde).LCD-ul e un 2x16 Hitachi HD44780.

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

Top autori în acest subiect

  • caddyct

    5

  • ratza

    4

  • Liviu M

    1

  • kit

    1

Top autori în acest subiect

Ai nevoie de Hyperterminal ca s? trimi?i caracterele. Pentru PIC e bine s?-?i structurezi mesajul dup? un anumit ?ablon. Presupunînd c? vrei s? trimi?i mai multe caractere într-un mesaj de lungime variabil?, po?i avea a?a:

START LEN MSG CHK STOP

 

S? le lu?m acum pe rînd.

START e caracterul de început al mesajului care indic? faptul c? se transmite un nou mesaj. Trebuie e s? fie un caracter care s? nu poat? fi con?inut în mesajul de comand?. De exemplu po?i s? pui "$" pentru start ?i "." pentru stop, iar în mesaj s? ai doar caractere alfanumerice.

LEN e lungimea mesajului, adic? num?rul de caractere pe care vrei s?-l trimi?i.

MSG e seria de caractere trimise. Preferabil ar fi s? ai doar cifre ?i litere, f?r? caractere speciale. Se poate ?i cu ele, dar e mai elegant f?r?.

CHK e checksum-ul, dar cum tu trimi?i mesaje manual, e cam nasol de calculat. Po?i renun?a la el, dac? e?ti sigur c? ai transmisii f?r? erori. Practic e bine s?-l faci.

STOP e caracterul care indic? faptul c? transmisia s-a încheiat.

 

Nu ?tiu dac? PIC-ul t?u are întrerupere pe USART RX, mi-e lene s? m? uit, dar dac? are e bine s-o folose?ti, programul va merge mult mai repede.

 

Ca variabile ai nevoie (minim) de un buffer pentru caracterul primit, un index pentru pozi?ia în mesaj, un string pentru mesajul propriu zis ?i dou? variabile pentru suma de control primit? ?i recalculat?.

 

Algoritmul ar fi urm?torul, pentru varianta cu întrerupere:

- ini?ializezi indexul pentru pozi?ia în mesaj cu 0;

- recep?ionezi un caracter ?i îl copiezi local în buffer;

- verifici dac? ai primit caracterul de start ?i dac? da, incrementezi indexul ?i copiezi în string urm?torul caracter care va veni. Dac? nu, a?tep?i pîn? prime?ti caracterul de start;

- recep?ionezi ?i testezi fiecare caracter ca s? vezi dac? e caracterul de stop. Dac? nu e stop copiezi în string.

Dac? e, resetezi indexul ?i descompui mesajul din string. Ca s? faci asta, ?tii c? în string ai num?rul de caractere recep?ionate chiar pe prima pozi?ie ?i c? la pozi?ia LEN+2 ai un checksum. Îl recalculezi ?i îl verifici cu cel primit, trebuie s? fie identice. Dac? nu sînt, înseamn? c? s-a întîmplat ceva na?pa la recep?ie ?i tre' s? trimi?i din nou mesajul.

 

Ca s? nu te complici inutil, po?i structura codul în felul urm?tor (îmi iau libertatea de a boteza func?iile, tu le po?i numi cum te taie capul):

- init_hw() în care ini?ializei to?i regi?trii de care ai nevoie;

- rx_message() pentru compus mesajul;

- check_message(checksum_rx, checksum_calculated) pentru calculat ?i verificat checksum-ul;

- decode_message(message_received, "COMMAND") pentru verificat ?i execu?ia comenzii;

- print_message(message received) pentru a afi?a pe ecran;

- main() în care bagi un frumos while(1) ?i la?i întreruperea s? fac? teburile ai departe.

Link spre comentariu

In datasheet-ul lui zice la EUSART asa:The pins of the Enhanced USART are multiplexedwith PORTC. In order to configure RC6/TX/CK andRC7/RX/DT as an EUSART:? bit SPEN (RCSTA<7>) must be set (= 1)? bit TRISC<7> must be set (= 1)? bit TRISC<6> must be set (= 1)The operation of the Enhanced USART module iscontrolled through three registers:? Transmit Status and Control (TXSTA)? Receive Status and Control (RCSTA)? Baud Rate Control (BAUDCON)?R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R-0 R-0 R-x SPEN RX9 SREN CREN ADDEN FERR OERR RX9D bit 7 bit 0PS: Ce program de Hyperterminal sa folosesc? eu am avut un Hyperterminal Private Edition da mi-a expirat.Vista nu are HyperTerminal din pacate :sparge:

Link spre comentariu

Dac? nu are întrerupere, va trebui s? faci poll la port tot timpul ?i se complic? treaba. O s? arunc o privire peste datasheet ?i o s?-?i zic dac? merge sau nu.

Pentru terminal exist? o variant? mai nesim?it?, ?i anume s? iei versiunea freeware de CodeVision. De?i e pentru Atmel, terminalul din el e excelent, po?i trimite inclusiv fi?iere.

http://www.hpinfotech.ro/html/download.htm

 

EDIT: Merge ?i cu întrerupere, vezi c? mai ai vreo dou? baxuri de regi?tri de configurat :crazy:

Link spre comentariu

Aplicatia de mai sus e pentru 16f84, care n-are port serial hardware (sau are, ca nu-mi dau seama din poza?), totul se face in cod. 18f45x0, pe de alta parte, are tot ce-i trebuie implementat in hard, trebuie numai activat (configurat picul corespunzator).

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