Sari la conținut
ELFORUM - Forumul electronistilor

modificare registrii pic16f877 din mikroC


Vizitator Ionescurazvan

Postări Recomandate

Vizitator Ionescurazvan

Buna, vreau sa fac o comunicare intre pic16f877 si un modul bluetooth hc-06. Modulul poate comunica doar uart-asincron.

   Problema e ca in urma codului ce l-am facut , registrul TXSTA se incarca cu valoarea 36h= 0011 0110 , din care rezulta ca bitul 4 sync este 1 ( 1=sincron, 0= asincron). Pe mine ma intereseaza sa comunice asincron . Nu sunt familiarizat atata cu programul mikroC, ma intereseaza daca se pot modifca valorile unui registru.

 

   Mentionez ca am folosit niste functii din libraria uart pentru a realiza comunicarea.

 

poza cu structura registrului txsta: http://postimg.org/image/86ek1iv7v/

 

 

poza cu continutul registrilor in mikroC:  http://postimg.org/image/7s937k2ob/

 

codul:

// LCD module connections
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
// End LCD module connections
 
char rd_txt[20];    //variable to memorize input from serial
int a0, a1, a2;     //variable to keep evidence if a RLY is on or off
char state[16];
 
void main()
{
  TRISC.F0 = 0; //Makes PORTC0 or RC0 Output Pin
  TRISC.F1 = 0; //Makes PORTC1 or RC1 Output Pin
  TRISC.F2 = 0; //Makes PORTC2 or RC2 Output Pin
  PORTC = 0x00;
  a0 = a1 = a2 = 0;    //set RLY state as OFF
  state[0] = 0;        //set var that shows state of RLYs on 2nd row to 0
 
  UART1_Init(9600);            // initialize UART1 module
  Delay_ms(100);
  Lcd_Init();                  // Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);         // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);    // Cursor off
  Delay_ms(100);
  Lcd_Out(1,1,"RLY1  RLY2  RLY3");   //display on LCD
  Lcd_Out(2,1,"OFF   OFF   OFF");   //display on LCD
 
  while (1) {
    if (UART1_Data_Ready() == 1) {            // if data is received
      UART1_Read_Text(rd_txt, "e", 16);       // reads text until 'OK' is found
      UART1_Write_Text(rd_txt);          // sends back text
 
      if (strstr(rd_txt, "p") != 0){
        if (strstr(rd_txt, "1") != 0){
          PORTC.F0 = 1; //RLY1 ON
          a0 = 1;
        }
        if (strstr(rd_txt, "2") != 0){
          PORTC.F1 = 1; //RLY2 ON
          a1 = 1;
        }
        if (strstr(rd_txt, "3") != 0){
          PORTC.F2 = 1; //RLY3 ON
          a2 = 1;
        }
      }
      if (strstr(rd_txt, "o") != 0){
        if (strstr(rd_txt, "1") != 0){
          PORTC.F0 = 0; //RLY1 OFF
          a0 = 0;
        }
        if (strstr(rd_txt, "2") != 0){
          PORTC.F1 = 0; //RLY2 OFF
          a1 = 0;
        }
        if (strstr(rd_txt, "3") != 0){
          PORTC.F2 = 0; //RLY3 OFF
          a2 = 0;
        }
      }
    }
 
    state[0] = 0;
    if (a0 == 1){
      strcat(state, "ON ");
    //  UART1_Write_Text("RLY1 ON ");
    }
    else{
      strcat(state, "OFF");
    //  UART1_Write_Text("RLY1 OFF ");
    }
    if (a1 == 1){
      strcat(state,"   ON ");
     // UART1_Write_Text("nRLY2 ON");
    }
    else{
      strcat(state,"   OFF");
      //UART1_Write_Text("nRLY2 OFF");
    }
    if (a2 == 1){
      strcat(state,"   ON");
      //UART1_Write_Text("nRLY3 ON");
    }
    else{
      strcat(state,"   OFF");
      //UART1_Write_Text("nRLY3 OFF");
    }
    Lcd_Cmd(_LCD_CLEAR);               // Clear display
    Lcd_Out(1,1,"RLY1  RLY2  RLY3");   //display on LCD
    Lcd_Out(2,1,state);
 
    Delay_ms(100);
 
  }
}
Editat de Ionescurazvan
Link spre comentariu
  • Răspunsuri 2
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Mircea

    1

Zile populare

Top autori în acest subiect

Pai aici ai modificat un bit intr-un registru: TRISC.F0 = 0.La fel poti face cu orice registru, unde bit-ul poate fii scris.Din pacate, tu nu ai configurat decat port-urile in programelul tau. Mai ai de lucru, caci valorile standard (de reset) ale unui controller nu-s suficiente pentru orice program.Fa-ti un obicei din a te familiariza cu orice Registru si seta toti bitii necesari. Help-ul Mikroe lasa impresia ca functiile fac totul, ceea ce nu e 100% adevarat decat in programe foarte simple.

Link spre comentariu
Vizitator Ionescurazvan

My bad , dupa o analiza mai detaliata , mi-am dat seama ca vaorile din fereastra debuggerului erau in binar , nu in hexa. Dupa ce le-am trecut pe hexa totul e bine :)

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări