Extras din referat
Se consideră o structură hardware constînd din două sisteme de dezvoltare echipate cu
microcontrolere de tip 80C552. Acest tip de microcontroler integrează în cip facilităţile
hardware necesare pentru a comunica pe o magistrală serială în standard I2C. Acest hardware
are structura unui automat cu stări finite, exploatabil prin intermediul unor registre ale
microcontrolerului. Modul de exploatare este descris pe larg în paragraful 2.
Se cere să se lege între ele două sisteme, unul care funcţionează ca master şi unul care
funcţionează ca sclav. Pentru fiecare dintre sisteme se va scrie un program, în limbaj C, care
să permită comunicaţia între cele două sisteme astfel:
1. La începutul rulării aplicaţiei (după reset), fiecare modul iniţializează interfaţa
I2C.
2. După iniţializare, sistemul master intră în modul transmiţător şi transmite către
sclav două şiruri de octeţi. Aceste şiruri sînt preluate din memorie, unde se
presupune că au fost declarate prin program, ca constante. Sistemul sclav va
recepţiona aceste şiruri de octeţi şi le va memora într-un buffer. Transmisia celor
două şiruri se va face ca o operaţie indivizibilă, prin generarea unui start repetat
după transmiterea primului şir.
3. După terminarea transmisiei de către master, acesta va trece în mod receptor, iar
sclavul va trece în mod transmiţător. Acum sistemul sclav va transmite două şiruri
de octeţi, iar sistemul master le va recepţiona, deasemenea cu start repetat.
Apariţia unei erori de magistrală va avea ca efect abandonarea operaţiei curente (de
transmitere, respectiv de recepţie) şi încercarea de reluare a ei. Deoarece în sistem există un
singur master, apariţia unei stări de pierdere a arbitrării va fi tratată la fel ca o eroare.
Deasemenea, absenţa semnalului de acknoledge de la sclav va fi tratată ca eroare. Încercarea
de repetare a transferului se va face de trei ori, după care se va aborta întreaga sesiune de
comunicaţie.
Sistemele pe care se va implementa această aplicaţie sînt concepute în principal ca platformre de dezvoltare şi testare a aplicaţiilor. Aceasta înseamnă că dispun de resurse mai mari decît ale unui sistem dedicat (embedded) dar mai mici decît ale unui calculator PC.
De regulă, astfel de aplicaţii de dezvoltă, la nivel software, pe un calculator PC pe care rulează un crosscompilator. Acesta generează cod obiect care va fi transportat, de obicei printr-o cale de comunicaţie serială (RS232), pe sistemul ţintă.
Compilatorul C pentru microcontrolerul 80552 recunoaşte numele registrelor SFR şi ale biţilor din aceste registre. Ele sînt asimilate unor variabile predefinite şi pot apărea în expresii şi în instrucţii de atribuire
sînt instrucţii valide.
Pentru interfaţa cu dispozitivele de intrare-ieşire presupunem că sînt disponibile două funcţii de bibliotecă care au următoarele prototipuri:
unsigned char citeste(void);
void scrie(unsigned char);
Prima funcţie citeşte starea tastaturii şi returnează un cod ASCII, dacă este apăsată o tastă, respectiv valoarea 0, dacă nu este apăsată nici o tastă. Există 12 taste care au însemnele 0,1,2,3,4,5,6,7,8,9,*,#, respectiv codurile ASCII 0x30, 0x31, 0x32 etc.
A doua funcţie afişează un caracter pe un dispozitiv de afişare cu cristale lichide.
#include <reg552.h>
#include <ap_lib.h>
char slv=0xA;
char key;
void initializare()
{
//initializez S1CON
//setare rata de transfer 16 MHz
ENS=1; //pentru validarea SIO1
STA=0;//se reseteaza
STO=0;//se reseteaza
SI=0;//se reseteaza
AA=1;//se seteaza
CR0=0;//cei trei biti
CR1=0;//sunt pozitionati pentru
CR2=0;//rata de transfer dorita
}
//trimitere tasta incrementata
void slave_send()
{
S1ADR=slv<<1;//adresa slave
while (1)
{
if (SI)//testare SI
{
switch(S1STA)//se analizeaza starea curenta
{
case 0x0://eroare de comunicatie pe bus
lcd_Write(1, "*");//se afiseaza caracterul asterisc
break;
case 0xA8://SLA+R receptionat;ACK receptionat
S1DAT=key;//data transmisa
STO=0;
AA=1;
break;
case 0xB0://arbitrare pierduta
break;
case 0xB8://data transmisa;ACK receptionat de la master
S1DAT=key;
STO=0;
AA=1;
break;
case 0xC0://data transmisa;NOT_ACK receptionat
STA=0;
STO=0;
AA=1;
break;
case 0xC8://identic cu starea C0H
STA=0;
STO=0;
AA=1;
break;
}
SI=0;//resetare SI
}
}
}
// citeste data transmisa de master
void slave_receive()
{
S1ADR=slv<<1;//adresa slave
AA=1;//modul slave receptor.
Preview document
Conținut arhivă zip
- Comunicatii de Date.docx