Se considera o structura hardware constind din doua sisteme de dezvoltare echipate cu microcontrolere de tip 80C552. Acest tip de microcontroler integreaza in cip facilitatile hardware necesare pentru a comunica pe o magistrala seriala in standard I2C. Acest hardware are structura unui automat cu stari finite, exploatabil prin intermediul unor registre ale microcontrolerului. Modul de exploatare este descris pe larg in paragraful 2. Se cere sa se lege intre ele doua sisteme, unul care functioneaza ca master si unul care functioneaza ca sclav. Pentru fiecare dintre sisteme se va scrie un program, in limbaj C, care sa permita comunicatia intre cele doua sisteme astfel: 1. La inceputul rularii aplicatiei (dupa reset), fiecare modul initializeaza interfata I2C. 2. Dupa initializare, sistemul master intra in modul transmitator si transmite catre sclav doua siruri de octeti. Aceste siruri sint preluate din memorie, unde se presupune ca au fost declarate prin program, ca constante. Sistemul sclav va receptiona aceste siruri de octeti si le va memora intr-un buffer. Transmisia celor doua siruri se va face ca o operatie indivizibila, prin generarea unui start repetat dupa transmiterea primului sir. 3. Dupa terminarea transmisiei de catre master, acesta va trece in mod receptor, iar sclavul va trece in mod transmitator. Acum sistemul sclav va transmite doua siruri de octeti, iar sistemul master le va receptiona, deasemenea cu start repetat. Aparitia unei erori de magistrala va avea ca efect abandonarea operatiei curente (de transmitere, respectiv de receptie) si incercarea de reluare a ei. Deoarece in sistem exista un singur master, aparitia unei stari de pierdere a arbitrarii va fi tratata la fel ca o eroare. Deasemenea, absenta semnalului de acknoledge de la sclav va fi tratata ca eroare. Incercarea de repetare a transferului se va face de trei ori, dupa care se va aborta intreaga sesiune de comunicatie. Sistemele pe care se va implementa aceasta aplicatie sint concepute in principal ca platformre de dezvoltare si testare a aplicatiilor. Aceasta inseamna ca dispun de resurse mai mari decit ale unui sistem dedicat (embedded) dar mai mici decit ale unui calculator PC. De regula, astfel de aplicatii de dezvolta, la nivel software, pe un calculator PC pe care ruleaza un crosscompilator. Acesta genereaza cod obiect care va fi transportat, de obicei printr-o cale de comunicatie seriala (RS232), pe sistemul tinta. Compilatorul C pentru microcontrolerul 80552 recunoaste numele registrelor SFR si ale bitilor din aceste registre. Ele sint asimilate unor variabile predefinite si pot aparea in expresii si in instructii de atribuire sint instructii valide. Pentru interfata cu dispozitivele de intrare-iesire presupunem ca sint disponibile doua functii de biblioteca care au urmatoarele prototipuri: unsigned char citeste(void); void scrie(unsigned char); Prima functie citeste starea tastaturii si returneaza un cod ASCII, daca este apasata o tasta, respectiv valoarea 0, daca nu este apasata nici o tasta. Exista 12 taste care au insemnele 0,1,2,3,4,5,6,7,8,9,*,#, respectiv codurile ASCII 0x30, 0x31, 0x32 etc. A doua functie afiseaza un caracter pe un dispozitiv de afisare 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.
După plată vei primi prin email un cod de download pentru a descărca gratis oricare alt referat de pe site.Vezi detalii.