Vizitator Ionescurazvan Postat Iunie 9, 2016 Partajează Postat Iunie 9, 2016 (editat) 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 0110b , 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 Iunie 9, 2016 de Ionescurazvan Link spre comentariu
Mircea Postat Iunie 9, 2016 Partajează Postat Iunie 9, 2016 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 Postat Iunie 9, 2016 Partajează Postat Iunie 9, 2016 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
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum