Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <c8051F040.h> // declaratii SFR
- #include <wdt.h>
- #include <osc.h>
- #include <port.h>
- #include <uart1.h>
- #include <Protocol.h>
- #include <UserIO.h>
- nod retea[NR_NODURI]; // reteaua Master-Slave, cu 5 noduri
- unsigned char STARE_NOD = 0; // starea initiala a nodului curent
- unsigned char TIP_NOD = 0; // tip nod initial: Slave sau No JET
- unsigned char STARE_IO = 0; // stare interfata IO - asteptare comenzi
- unsigned char ADR_MASTER; // adresa nod master - numai MS
- //***********************************************************************************************************
- void TxMesaj(unsigned char i); // transmisie mesaj destinat nodului i
- unsigned char RxMesaj(unsigned char i); // primire mesaj de la nodul i
- //***********************************************************************************************************
- void main (void) {
- unsigned char i, found; // variabile locale
- WDT_Disable(); // dezactiveaza WDT
- SYSCLK_Init(OSC); // initializeaza si selecteaza oscilatorul ales in osc.h
- UART1_Init(NINE_BIT, BAUDRATE_COM); // initilizare UART1 - conectata la RS232-B (P1.0 si P1.1)
- PORT_Init (); // conecteaza perifericele la pini (UART0, UART1) si stabileste tipul pinilor
- #if(USERIO == KEYBLCD)
- LCD_Init(); // 2 linii, display ON, cursor OFF, pozitia initiala (0,0)
- KEYB_Init();
- #elif(USERIO == TERMINAL)
- UART0_Init(EIGHT_BIT, BAUDRATE_IO); // initializare UART0 - conectata la USB-UART (P0.0 si P0.1)
- #endif
- Timer0_Init(); // initializare Timer 0
- EA = 1; // valideaza intreruperile
- SFRPAGE = LEGACY_PAGE; // selecteaza pagina 0 SFR
- for(i = 0; i < NR_NODURI; i++){ // initializare structuri de date
- retea[i].full = 0; // initializeaza buffer gol pentru toate nodurile
- retea[i].bufasc[0] = ':'; // pune primul caracter in buffer-ele ASCII ":"
- }
- Afisare_meniu(); // Afiseaza meniul de comenzi
- while(1){ // bucla infinita
- switch(STARE_NOD){
- case 0: // nodul este slave, asteapta mesaj de la master
- switch(RxMesaj(ADR_NOD)){
- case TMO: Error("\n\rNod SLAVE -> MASTER!");
- TIP_NOD = 1;
- STARE_NOD = 2; // master cazut, nodul curent devine master
- i = ADR_NOD; // primul slave va fi cel care urmeaza dupa noul master
- break;
- case ROK: STARE_NOD = 1; break; // a primit un mesaj de la master, trebuie sa raspunda
- case CAN: Error("\n\rMesaj incomplet!"); break;
- case TIP: Error("\n\rTip mesaj necunoscut!"); break;
- case ESC: Error("\n\rEroare SC!"); break;
- default: Error("\n\rEroare necunoscuta!"); break;
- }
- break;
- case 1: // nodul este slave, transmite mesaj catre master
- found = 0;
- for(i = 0; i < NR_NODURI; i++){
- if(retea[i].full == 1){
- found = 1;
- break;
- }
- }
- if(found){
- retea[i].bufbin.adresa_hw_dest = ADR_MASTER;
- TxMesaj(i);
- }
- else{
- retea[ADR_MASTER].bufbin.adresa_hw_dest = ADR_MASTER;
- retea[ADR_MASTER].bufbin.adresa_hw_src = ADR_NOD;
- retea[ADR_MASTER].bufbin.tipmes = POLL_MES;
- TxMesaj(ADR_MASTER);
- }
- STARE_NOD = 0; // revine sa astepte un mesaj de la master
- break;
- case 2: // tratare stare 2 si eventual comutare stare
- do{
- i++; // selecteaza urmatorul slave
- if(i == NR_NODURI) i = 0;
- }
- while(i == ADR_NOD);
- retea[i].bufbin.adresa_hw_dest = i;
- if(retea[i].full == 1) TxMesaj(i);
- else{
- retea[i].bufbin.adresa_hw_src = ADR_NOD;
- retea[i].bufbin.tipmes = POLL_MES;
- TxMesaj(i);
- }
- STARE_NOD = 3; // trece sa astepte raspunsul de la slave-ul i
- break;
- case 3: // nodul este slave, asteapta mesaj de la master
- switch(RxMesaj(i)){
- case TMO: Error("\n\rTimeout nod ");
- UART0_Putch(i+'0');
- case ROK: break; // a primit un mesaj de la master, trebuie sa raspunda
- case ERI: Error("\n\rEroare incadrare!"); break;
- case ERA: Error("\n\rEroare adresa!"); break;
- case TIP: Error("\n\rTip mesaj necunoscut!"); break;
- case OVR: Error("\n\rEroare suprapunere!"); break;
- case ESC: Error("\n\rEroare SC!"); break;
- default: Error("\n\rEroare necunoscuta!"); break;
- }
- STARE_NOD = 2; // a primit sau nu un raspuns de la slave, trece la urmatorul slave
- break;
- }
- Terminal();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement