Advertisement
Eddie_1337

Main_CSC

May 16th, 2022
804
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.44 KB | None | 0 0
  1. #include <c8051F040.h>  // declaratii SFR
  2. #include <wdt.h>
  3. #include <osc.h>
  4. #include <port.h>
  5. #include <uart1.h>
  6. #include <Protocol.h>
  7. #include <UserIO.h>
  8.  
  9. nod retea[NR_NODURI];                   // reteaua Master-Slave, cu 5 noduri
  10.  
  11. unsigned char STARE_NOD = 0;        // starea initiala a nodului curent
  12. unsigned char TIP_NOD       =   0;      // tip nod initial: Slave sau No JET
  13. unsigned char STARE_IO  = 0;        // stare interfata IO - asteptare comenzi
  14. unsigned char ADR_MASTER;               // adresa nod master - numai MS
  15.  
  16. //***********************************************************************************************************
  17. void TxMesaj(unsigned char i);  // transmisie mesaj destinat nodului i
  18. unsigned char RxMesaj(unsigned char i);     // primire mesaj de la nodul i
  19.  
  20. //***********************************************************************************************************
  21. void main (void) {
  22.     unsigned char i, found; // variabile locale
  23.    
  24.     WDT_Disable();                                              // dezactiveaza WDT
  25.     SYSCLK_Init(OSC);                                           // initializeaza si selecteaza oscilatorul ales in osc.h
  26.     UART1_Init(NINE_BIT, BAUDRATE_COM);     // initilizare UART1  - conectata la RS232-B (P1.0 si P1.1)
  27.  
  28.     PORT_Init ();                                                   // conecteaza perifericele la pini (UART0, UART1) si stabileste tipul pinilor
  29.  
  30. #if(USERIO == KEYBLCD)
  31.     LCD_Init();                                                 // 2 linii, display ON, cursor OFF, pozitia initiala (0,0)
  32.     KEYB_Init();
  33. #elif(USERIO == TERMINAL)
  34.     UART0_Init(EIGHT_BIT, BAUDRATE_IO);     // initializare UART0  - conectata la USB-UART (P0.0 si P0.1)
  35. #endif
  36.  
  37.     Timer0_Init();                                  // initializare Timer 0
  38.  
  39.     EA = 1;                         // valideaza intreruperile
  40.     SFRPAGE = LEGACY_PAGE;          // selecteaza pagina 0 SFR
  41.    
  42.     for(i = 0; i < NR_NODURI; i++){ // initializare structuri de date
  43.         retea[i].full = 0;                      // initializeaza buffer gol pentru toate nodurile
  44.         retea[i].bufasc[0] = ':';           // pune primul caracter in buffer-ele ASCII ":"
  45.     }
  46.  
  47.     Afisare_meniu();                            // Afiseaza meniul de comenzi
  48.    
  49.     while(1){                                               // bucla infinita
  50.        
  51.         switch(STARE_NOD){
  52.             case 0:                                         // nodul este slave, asteapta mesaj de la master   
  53.                 switch(RxMesaj(ADR_NOD)){
  54.                     case TMO:   Error("\n\rNod SLAVE -> MASTER!");
  55.                                     TIP_NOD = 1;
  56.                                     STARE_NOD = 2;      // master cazut, nodul curent devine master
  57.                                     i = ADR_NOD;        // primul slave va fi cel care urmeaza dupa noul master
  58.                                     break;
  59.  
  60.                     case ROK:   STARE_NOD = 1; break;   // a primit un mesaj de la master, trebuie sa raspunda
  61.                     case CAN:   Error("\n\rMesaj incomplet!"); break;
  62.                     case TIP:   Error("\n\rTip mesaj necunoscut!"); break;
  63.                     case ESC:   Error("\n\rEroare SC!"); break;
  64.                     default:        Error("\n\rEroare necunoscuta!"); break;
  65.                 }
  66.                 break;
  67.  
  68.             case 1:                                         // nodul este slave, transmite mesaj catre master
  69.                 found = 0;
  70.                 for(i = 0; i < NR_NODURI; i++){
  71.                     if(retea[i].full == 1){
  72.                             found = 1;
  73.                             break;
  74.                     }
  75.                 }
  76.                 if(found){
  77.                     retea[i].bufbin.adresa_hw_dest = ADR_MASTER;
  78.                     TxMesaj(i);
  79.                 }
  80.                 else{
  81.                     retea[ADR_MASTER].bufbin.adresa_hw_dest = ADR_MASTER;
  82.                     retea[ADR_MASTER].bufbin.adresa_hw_src = ADR_NOD;
  83.                     retea[ADR_MASTER].bufbin.tipmes = POLL_MES;
  84.                     TxMesaj(ADR_MASTER);
  85.                 }
  86.                 STARE_NOD = 0;              // revine sa astepte un mesaj de la master
  87.                 break;
  88.    
  89.             case 2:                                         // tratare stare 2 si eventual comutare stare
  90.                 do{
  91.                     i++;                                                // selecteaza urmatorul slave
  92.                     if(i == NR_NODURI) i = 0;
  93.                 }
  94.                 while(i == ADR_NOD);
  95.    
  96.                 retea[i].bufbin.adresa_hw_dest = i;
  97.                 if(retea[i].full == 1) TxMesaj(i);
  98.                 else{
  99.                     retea[i].bufbin.adresa_hw_src = ADR_NOD;
  100.                     retea[i].bufbin.tipmes = POLL_MES;
  101.                     TxMesaj(i);
  102.                 }
  103.                 STARE_NOD = 3;              // trece sa astepte raspunsul de la slave-ul i
  104.                 break;
  105.  
  106.             case 3:                                         // nodul este slave, asteapta mesaj de la master   
  107.                 switch(RxMesaj(i)){
  108.                     case TMO:   Error("\n\rTimeout nod ");
  109.                                     UART0_Putch(i+'0');
  110.                     case ROK:   break;  // a primit un mesaj de la master, trebuie sa raspunda
  111.                     case ERI:   Error("\n\rEroare incadrare!"); break;
  112.                     case ERA:   Error("\n\rEroare adresa!"); break;
  113.                     case TIP:   Error("\n\rTip mesaj necunoscut!"); break;
  114.                     case OVR:   Error("\n\rEroare suprapunere!"); break;
  115.                     case ESC:   Error("\n\rEroare SC!"); break;
  116.                     default:        Error("\n\rEroare necunoscuta!"); break;
  117.                 }
  118.                 STARE_NOD = 2;              // a primit sau nu un raspuns de la slave, trece la urmatorul slave
  119.                 break;
  120.         }
  121.         Terminal();
  122.     }
  123. }
  124.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement