Advertisement
Eddie_1337

CSC lab2

Feb 28th, 2022
715
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.08 KB | None | 0 0
  1. #include <reg515c.h>        // include fisierul reg515c.h, cu definitiile SFR
  2. #define TRUE 1
  3.  
  4. #define EIGHT_BIT 1         // mod 1 - 10 biti (8 biti de date)
  5. #define NINE_BIT 3          // mod 3 - 11 biti (9 biti de date)
  6.  
  7. void StartDelay(int ms);
  8. unsigned char UsartInit(unsigned int baudrate, unsigned char mode);     // initializare USART
  9. void UsartSendChar(unsigned char ch);               // transmisie caracter
  10. void UsartSendMessage(unsigned char *mesaj);
  11. int UsartReceiveChar(unsigned int timeout);
  12. void Timer0Init(void);
  13.  
  14. unsigned int timeval;
  15. unsigned char timeout;
  16. unsigned char* ptr;
  17. unsigned int flag_R = 0;
  18. void main(void){    // programul principal
  19.  
  20.     SWDT=1;         // pornire ceas de garda - WDT prin program.
  21.                     // WDT porneste automat la lansarea simulatorului,
  22.                     //  deoarece pinul simulat PE_SWD=1 la pornirea simulatorului.
  23.                     // Odata pornit, WDT nu mai poate fi dezactivat prin program.
  24.                     // Dacã nu vrem sa folosim WDT în programul simulat, atunci se forteaza
  25.                     //  din simulator PE_SWD=0 si se reseteaza CPU.
  26.                     // Cele doua comenzi se pun intr-un fisier de comenzi pe care simulatorul este instruit
  27.                     //  sa-l incarce la pornire.
  28.  
  29.     Timer0Init();
  30.    
  31.     UsartInit(9600, EIGHT_BIT);     // 9600 baud, 8 biti de date
  32.     EAL=1;              // validare globala intreruperi
  33.  
  34.     StartDelay(2000);                   // asteapta 1 secunda
  35.  
  36.     while(TRUE){
  37.  
  38.         if(timeout){
  39.             UsartSendMessage(UsartReceiveChar(1000));           // transmite caracter
  40.             UsartSendMessage("abc\n\r");            // transmite caracter
  41.             StartDelay(2000);                   // asteapta 1 secunda
  42.         }
  43.  
  44.         WDT=1;          // restart WDT - daca nu se utilizeaza aceasta secventa WDT reseteaza microcontrolerul
  45.         SWDT=1;         // sunt necesare ambele comenzi pentru rearmarea WDT
  46.     }
  47. }
  48.  
  49.  
  50. void Timer0Init(void){  // Initializare Timer 0
  51.     TMOD=0x01;          // Timer 0 modul 1, pe 16 biti
  52.     TL0=0x7E;
  53.     TH0=0xF9;           // Temporizare 1 ms (TH0:TL0=65536-1666 =0xF97E la 10 MHz, cu factor de divizare 6)
  54.     ET0=1;              // Validare intreruperi Timer 0
  55.     timeout=1;
  56. }
  57.  
  58. void Timer0Handler (void) interrupt 1{      // functia de intrerupere la depasire Timer 0
  59.     TL0=0x7E;
  60.     TH0=0xF9;                               // reincarca numaratorul pentru 1 ms
  61.     if(timeval) timeval--;                  // decrementeaza timeval daca este diferit de 0
  62.     else{
  63.         TR0=0;
  64.         timeout=1;
  65.     }                               // daca timeval=0, opreste timerul 0
  66. }
  67.  
  68. void UsartHandler (void) interrupt 4 {      // functia de intrerupere la depasire Timer 0
  69.     if(TI) {
  70.         TI=0;
  71.         if (*ptr) UsartSendChar(*ptr++);
  72.     }
  73.     if(RI) {
  74.         RI=0;
  75.         flag_R = 1;
  76.     }
  77. }
  78.  
  79. void StartDelay(int ms){                   // intarziere programabila
  80.     timeout=0;
  81.     timeval=ms;                    // initializeaza timeval
  82.     TR0=1;                         // porneste timerul 0
  83. }
  84.  
  85.  
  86. unsigned char UsartInit(unsigned int baudrate, unsigned char mode){         // initializare USART
  87.     switch(mode){
  88.         case EIGHT_BIT:  SCON = 0x52; break;     // mod 1, REN=1, TI=1, RI=0
  89.         case NINE_BIT:   SCON = 0xD2; break;     // mod 3, REN=1, TI=1, RI=0
  90.         default:    return 1;
  91.     }
  92.     switch(baudrate){
  93.         case 4800:  SRELH = 0x03;      // factorul de divizare = 0x03BF
  94.                     SRELL = 0xBF;
  95.                     PCON &= 0x00;      // SMOD = 0
  96.                     break;
  97.         case 9600:  SRELH = 0x03;      // factorul de divizare = 0x03DF
  98.                     SRELL = 0xDF;
  99.                     PCON &= 0x00;      // SMOD = 0
  100.                     break;
  101.         case 19200: SRELH = 0x03;      // factorul de divizare = 0x03DF
  102.                     SRELL = 0xDF;
  103.                     PCON |= 0x80;      // SMOD = 1
  104.                     break;
  105.         case 57600: SRELH = 0x03;      // factorul de divizare = 0x03F5
  106.                     SRELL = 0xF5;
  107.                     PCON |= 0x80;      // SMOD = 1
  108.                     break;
  109.         default: return 2;             // eroare - baudrate necunoscut
  110.     }
  111.     ADCON0 |= 0x80;                     // Valideaza generatorul intern de tact pentru seriala BD=1
  112.     TI=0;
  113.     ES=1;                               // Validare intreruperi USART
  114.     return 0;                           // succes
  115. }
  116.  
  117. void UsartSendChar(unsigned char ch){ // transmisie character
  118.     SBUF = ch;          // scrie caracterul de transmis in buffer
  119. }
  120.  
  121. void UsartSendMessage(unsigned char *mesaj) {
  122.     ptr = mesaj;
  123.     UsartSendChar(*ptr++);
  124. }
  125.  
  126. int UsartReceiveChar(unsigned int timeout) {
  127.     char m = '0';
  128.     flag_R = 0;  
  129.     StartDelay(timeout);
  130.     while (timeout == 0 && flag_R == 0) {
  131.         WDT = 1;
  132.         SWDT = 1;
  133.     }
  134.     if (flag_R) {
  135.         m = SBUF;
  136.         return m;
  137.     }
  138.     else return 0;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement