Documente Academic
Documente Profesional
Documente Cultură
Proiect
-Tema 1-
Student: Grupa:
Formatul mesajelor:
Obs.:
Câmpul adresă destinaţie va conţine adresa nodului care va recepţiona mesajul.
Câmpul cod funcţie poate fi, după caz:
• 0 – mesaj de interogare (lungime date = 0) – transmis de master către un
nod slave sau de slave către master, în lipsa altui mesaj util
• 1 – mesaj de date – mesaj care conţine un text ASCII
I/E digitale
Intrări A/D
Ieşiri D/A
• 4 canale de ieşire D/A implementate cu un convertor extern AD7226 cu 4 canale;
• rezoluţia ieşirilor D/A este de 8 biţi.
• Interfaţă LCD - permite controlul oricărui afişaj cu cristale lichide bazat pe controlerele
HD44780, HD61830 şi compatibile.
• Conector extensie - magistralele de adrese şi date, liniile de reset şi de întrerupere sunt
disponibile la un conector cu 50 de pini pentru conectarea unor periferice externe.
3. Protocolul Master-Slave
Pentru a forma o rețea de comunicație, este nevoie de o placă (nod) care să gestioneze
fluxul de mesaje dintre restul plăcilor conectate. Astfel, nodul master deţine controlul reţelei şi
acordă nodurilor slave, pe rând, permisiunea de a transmite date de-a lungul retealei. Nodurile
slave au ca responsabilitate să citească mesajele de la master pentru a afla când au dreptul de a
transmite date. Avantajul acestei organizări este acela că nodurile slave pot primi mesaje numai
de la master şi nu vor trebui să citească răspunsurile celorlalte noduri slave.
Tehnica master / slave este o tehnică de acces la mediu cu control centralizat. Dreptul de
acces este acordat de către master pe rând, în mod ciclic, fiecărui nod slave, printr-un mesaj
adresat acestuia. La primirea unui mesaj, un nod slave ştie că poate transmite la rândul lui un
mesaj, dar numai către nodul master. Astfel, dreptul de acces revine sistematic la nodul master,
care trece la următorul nod slave din lista circulară.
În tabelul de mai jos s-au indicat numele și semnificația celor mai importante semnale
definite de standardul RS232. De asemenea s-a indicat poziția acestor semnale pe un conector
de 25 pini și pe unul de 9 pini. Direcția este indicată între calculator (DTE) sș modem (DCE).
Dacă în schimb, nodul pe care ruleaza programul este slave, atunci se va duce pe ramura “else”
in care se vor parcurge urmatoarele etape:
Se asteapta un raspuns de la master (RxMesaj()) unde se va realiza si conversia ascii-
binar.,
Se cauta un mesaj de transmis in bufferele de transmisie, sare peste propriul buffer (de
receptie), iar dacă nu a fost gasit niciun mesaj de transmis va iesi din bucla “for”.
Dacă este gasit un mesaj ASCII de transmis, se va apela ca si functie Pregatire_mesaj(),
unde se va calcula suma de control si conversia binar-ascii.
Transmite mesajul cu destinatia nodul i (prin intermediul masterului)
Dacă nu s-a transmis niciun mesaj de date, atunci se va transmite un mesaj de interogare, după
care se vor apela funcțiile de Pregătire_mesaj() -> în care se calculează suma de control și
conversia binar- ascii, TxMesaj() – transmite mesajul de interogare către master.
în cazul in care primim un mesaj, se va afișa folosind functia Afisare_mesaj();
Periodic vom verifica dacă s-a apasat o tasta, iar dacă s-a efectuat, atunci vom trata comanda
transmisie mesaj. După câteva adaptări, vor interveni câteva verificări privind buffer-ul. Mai
precis ne vom întreba dacă buffer-ul este plin sau nu. În caz afirmativ, se va afișa un mesaj
“Buffer Plin” și totul va continua cu refacerea meniului comenzi.
5. Pregătirea mesajelor pentru transmisie
Funcția de pregătire a mesajului de transmis are scopul de a forma mesajul ce se va
transmite în rețea între noduri și respectă cerințele de format impuse în proiect. Astfel, un mesaj
va putea fi interpretat corect la recepție. La orice transmisie, mesajul va fi fie de tip interogare
sau de tip date. Diferențierea se realizează prin codul funcției care va fi “0” pentru interogare și
“1” pentru date.
După ce au fost încărcate în bufferul binar, are loc conversia datelor ce compun
mesajul în cod ASCII, încărcarea acestora în bufferul ASCII împreună cu delimitatorii de mesaj
convertiți și ei la rândul lor în cod ASCII.
Implementare:
Funcția de transmisie a mesajelor, fie ele de interogare sau de date, calulează mai întâi
bitul de paritate, apoi transmite caracterul de început de mesaj „:‟. După acest caracter se trimit
pe rând toate datele păstrate în bufferul ASCII. Dacă nodul este slave, după ce transmite, golește
bufferul. Ieșirea din funcție are loc după ce se transmit toate caracterele din buffer.
do
{
ACC=*ptr;
TB8=P;
Ser_Send_Byte(COM0,*ptr,1);
}
while(*ptr++!=0x0a);
if (ADR_NOD!=MASTER)
{
retea[i].full=0;
}
while(Ser_SND_Done(COM0)==0);
}
7. Recepţia mesajelor
Funcția de recepție este cea mai complexă funcție din cele 3, ea având ca responsabilități:
decodificarea mesajului din ASCII în binar, identificarea nodului destinație – dacă este nod
master sau nod slave și avertizarea operatorului cu privire la posibile erori ce pot apărea la
recepție(erori legate de suma de control, erori de suprapunere, depășirea timeout-ului, eroare
determinată de codul funcției).
Dacă este nodul master cel care recepționează, el așteaptă cu timeout sosirea caracterului
„:‟, iar dacă nodul este slave așteaptă fără timeout recepția caracterului de început de mesaj de la
master. Datele recepționate sunt decodificate și pe baza a ceea ce s-a recepționat, se recalculează
suma de control ce va fi comparată cu suma ce a fost trasmisă. Dacă cele două nu coincid, este
afișată o eroare pe LCD.
MASTER-ul asteaptă (reprezentat prin timeout cu delay 1000) recepția primului caracter
al răspunsului de la SLAVE. Dacă timeout = 1 (se termină perioada de ațteptare), se termină
recepția. Dacă primul caracter primit de la slave este diferit de „:‟ (repezintă primul character al
unui mesaj), se ignoră restul mesajului și se iese din funcție. Dacă primul caracter este „:‟ se sare
peste prima poziție și asteaptă primirea primului și celui de-al doilea caracter al adresei
hardware, atâta timp cât perioada de delay este diferită de 1. Dacă adresa celui de-al doilea
caracter este diferită de adresa nodului, se afișază un mesaj de eroare și se ignoră restul
mesajului
SLAVE-ul asteaptă, atât timp cât timeout este diferit de 1, primirea primului caracter al
răspunsului de la MASTER. Așteaptă primirea primului caracter al mesajului transmis de către
MASTER până când acel caracter este „:‟. Atunci când s-a găsit caracterul de început de mesaj,
se sare peste prima poziție și așteaptă primirea primului și celui de-al doilea caracter al adresei
hardware, atât timp cât perioada de delay este diferită de 1. Toți acești pași de repeat până când
mesajul este adresat acestui SLAVE.
Se pune în buffer restul mesajului atât timp cât timeout-ul nu este depășit și cât ultimul
caracter este diferit de 0x0A. Se sare peste primele 3 poziții ale mesajului, care reprezintă
caracterul „:‟ și adresa ASCII-HEX. Dacă mesajul este de date, se determină dacă este destinație
(M) sau sursa (S) iar adresei hardware, pe lângă codul funcției i se mai adaugă și adresa
(destinație sau sursă). Dacă nodul este MASTER si dacă bufferul destinație este deja plin, se
termină recepția și se iese din funcție. Adresei hardware i se mai adaugă și lungimea datelor.
Dacă nodul este MASTER, se stochează în bufferul destinație codul funcției, codul
nodului sursă al mesajului și lungimea datelor.
Dacă nodul este SLAVE, se stochează în bufferul destinație codul funcției, codul
nodului sursă al mesajului și lungimea datelor.
Dacă mesajul nu este de date, se iese din funcție. De asemenea tot în acest timp se
calculează şi suma de control, care este verificată la sfârsit cu suma de control primită în mesaj.
Implementare:
unsigned char j, ch, sc, adresa, screc, destsrc, lng, functie, *ptr, *ptrbin;
if(ADR_NOD==MASTER)
{
ch=Ser_Receive_TMO(COM0, 1000);
if(timeout)
{
timeout=0;
error("Timeout nod");
LCD_Putchar(i+'0');
return;
}
retea[i].full=0;
if(ch!=':')
{
error("Eroare incadrare");
do
{
ch=Ser_Receive_TMO(COM0,5);
} while(timeout==0);
return;
}
ptr=retea[i].bufasc+1;
*ptr++=Ser_Receive_TMO(COM0,5);
if(timeout)
{
timeout=0;
error("Timeout nod");
LCD_Putchar(i+'0');
return;
}
*ptr--=Ser_Receive_TMO(COM0,5);
if(timeout)
{
timeout=0;
error("Timeout nod");
LCD_Putchar(i+'0');
return;
}
adresa=ascii2bin(ptr);
if(adresa!=ADR_NOD)
{
error("Eroare adresa!");
do
{
ch=Ser_Receive_TMO(COM0,5);
}while(timeout==0);
return;
}
}
else{
do{
do
{
ch=Ser_Receive_TMO(COM0,5);
} while(timeout==0);
do{
ch=Ser_Receive_Byte(COM0,1);
}while(ch!=':');
ptr=retea[i].bufasc + 1;
*ptr++=Ser_Receive_TMO(COM0,5);
if(timeout)
{
timeout=0;
error("Timeout nod");
LCD_Putchar(i+'0');
return;
}
*ptr--=Ser_Receive_TMO(COM0,5);
if(timeout)
{
timeout=0;
error("Timeout nod");
LCD_Putchar(i+'0');
return;
}
adresa=ascii2bin(ptr);
}while(adresa!=ADR_NOD);
}
ptr++;
do
{
*(++ptr) = Ser_Receive_TMO(COM0,5);
if(timeout)
{
timeout=0;
error("Timeout nod");
LCD_Putchar(i+'0');
return;
}
} while(*ptr!=0x0A);
ptr=retea[i].bufasc + 3;
screc=adresa;
functie=ascii2bin(ptr);
ptr+=2;
if(functie>=2)
{
error("Eroare cod functie!");
return;
}
screc += functie;
if (functie==MES)
{
destsrc = ascii2bin(ptr);
ptr += 2;
screc += destsrc;
if(ADR_NOD==MASTER)
{
if (retea[destsrc].full == 1)
{
error("Eroare de suprapunere");
return;
}
}
lng = ascii2bin(ptr);
ptr += 2;
screc += lng;
if(ADR_NOD==MASTER)
{
retea[destsrc].bufbin.functie = functie ;
retea[destsrc].bufbin.destsrc = i ;
retea[destsrc].bufbin.lng = lng ;
for(j = 0,ptrbin = retea[destsrc].bufbin.date;j<lng;j++)
{
ch = ascii2bin(ptr);
ptr+=2;
*ptrbin = ch;
screc+=ch;
ptrbin++;
}
sc = ascii2bin(ptr);
if (sc==screc)
{
retea[destsrc].full = 1 ;
return;
}
error("Eroare SC!");
return;
retea[ADR_NOD].bufbin.functie = functie ;
retea[ADR_NOD].bufbin.destsrc = destsrc ;
retea[ADR_NOD].bufbin.lng = lng ;
for(j = 0,ptrbin = retea[ADR_NOD].bufbin.date;j<lng;j++)
{
ch = ascii2bin(ptr);
ptr+=2;
*ptrbin = ch;
screc+=ch;
ptrbin++;
}
sc = ascii2bin(ptr);
if(sc==screc)
{
retea[ADR_NOD].full = 1 ;
return;
}
error("Eroare SC!");
return;
}
}
8. Concluzii
Aplicatia dispune de o interfață cu operatorul local constând într-un meniu afișat pe
LCD-ul fiecărui nod din rețeaua de comunicație:
Pe prima linie sunt afișate: master/slave, adresă nod, COM0/COM2, ASCII/binar.
Pe a doua linie: RxM – adresă nod sursă - ultimul mesaj de date recepţionat cu succes
Pe a treia linie: 1 – TxM 2 – Stare
Pe a patra linie: afișarea mesajului ce se dorește a fi transmis (comanda TxM)/ conținutul
bufferului de transmisie (comanda Stare).
Dacă nodul este master și operatorul dorește execuția comenzii TxM trebuie să se
introducă adresa nodului destinație și apoi mesajul de transmis. Dacă dorește execuția comenzii
Stare, trebuie să introducă adresa nodului solicitat, pentru ca apoi să se afișeze pe LCD starea
bufferului de transmisie a respectivului nod.
Dacă nodul este slave se așteaptă mesaj de la master sau apăsarea unei taste de către
operator. Sosirea de la master a unui mesaj de date este confirmată prin afișarea acestuia pe linia
a doua a LCD-ului. Dacă nodul slave vrea să transmită un mesaj de date, operatorul trebuie să
introducă adresa nodului destinație apoi mesajul