TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: TAZcustom en 19 de Junio de 2012, 14:56:16
-
E comenzado este proyecto e logrado iniciar el sensor correctamente pero ahora no se como leer los datos para mostrarlos en un LCD 16x2 con un PIC16f877A aqui dejo el programa de lo que llevo por si alguien me puede ayudar con el tema, solo kiero obtener los datos de la temperatura y la humedad.
Define CONF_WORD = 0x3f72
Define CLOCK_FREQUENCY = 12
AllDigital
Define LCD_BITS = 4
Define LCD_DREG = PORTB
Define LCD_DBIT = 4
Define LCD_RSREG = PORTD
Define LCD_RSBIT = 1
Define LCD_RWREG = PORTD
Define LCD_RWBIT = 2
Define LCD_EREG = PORTD
Define LCD_EBIT = 3
Lcdinit
Define 1WIRE_REG = PORTB
Define 1WIRE_BIT = 0
Dim v As Byte
Dim t_byte1 As Byte
Dim t_byte2 As Byte
Dim rh_byte1 As Byte
Dim rh_byte2 As Byte
Symbol data = PORTB.0
loop:
TRISB.0 = 0
1wireInit
High data
1wireSendByte 1
Low data
WaitUs 18
High data
WaitUs 30
TRISB.0 = 1
1wireGetByte v
If PORTB.0 = 0 Then
WaitUs 80
If PORTB.0 = 1 Then
WaitUs 80
Goto inicio
Endif
Endif
Goto loop
inicio:
WaitMs 50
Lcdout #t_byte1, "temp"
WaitMs 1000
Lcdcmdout LcdClear
Goto inicio
al final donde me muestra lcdout #t_byte, "temp" kiero mostrar la temperatura pero en el LCD me aparece " 0 temp"
Saludos!!!
-
Me proporcionaron este programa pero hay lineas que no las comprendo ya que es muy diferente al Pic Simulator IDE
// LCD module connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
sbit Data at RA0_bit;
sbit DataDir at TRISA0_bit;
char message1[] = "Temp = 00.0 C";
char message2[] = "RH = 00.0 %";
unsigned short TOUT = 0, CheckSum, i;
unsigned short T_Byte1, T_Byte2, RH_Byte1, RH_Byte2;
void StartSignal(){
DataDir = 0; // Data port is output
Data = 0;
Delay_ms(25); // Low for at least 18us
Data = 1;
Delay_us(30); // High for 20-40 us
DataDir = 1; // Data port is input
}
unsigned short CheckResponse(){
TOUT = 0;
TMR2 = 0;
T2CON.TMR2ON = 1; // Start TMR2 while waiting for sensor response
while(!Data && !TOUT); // If there's no response within 256us, the Timer2 overflows
if (TOUT) return 0; // and exit
else {
TMR2 = 0;
while(Data && !TOUT);
if (TOUT) return 0;
else {
T2CON.TMR2ON = 0;
return 1;
}
}
}
unsigned short ReadByte(){
unsigned short num = 0, t;
DataDir = 1;
for (i=0; i<8; i++){
while(!Data);
TMR2 = 0;
T2CON.TMR2ON = 1; // Start TMR2 from 0 when a low to high data pulse
while(Data); // is detected, and wait until it falls low again.
T2CON.TMR2ON = 0; // Stop the TMR2 when the data pulse falls low.
if(TMR2 > 40) num |= 1<<(7-i); // If time > 40us, Data is 1
}
return num;
}
void interrupt(){
if(PIR1.TMR2IF){
TOUT = 1;
T2CON.TMR2ON = 0; // stop timer
PIR1.TMR2IF = 0; // Clear TMR0 interrupt flag
}
}
void main() {
unsigned short check;
TRISB = 0b00000000;
PORTB = 0;
TRISA = 0b00100001;
CMCON = 7;
INTCON.GIE = 1; //Enable global interrupt
INTCON.PEIE = 1; //Enable peripheral interrupt
// Configure Timer2 module
PIE1.TMR2IE = 1; // Enable Timer2 interrupt
T2CON = 0; // Prescaler 1:1, and Timer2 is off initially
PIR1.TMR2IF =0; // Clear TMR INT Flag bit
TMR2 = 0;
Lcd_Init();
Lcd_Cmd(_Lcd_Clear);
Lcd_Cmd(_LCD_CURSOR_OFF);
do {
Delay_ms(1000);
StartSignal();
check = CheckResponse();
if (!check) {
Lcd_Cmd(_Lcd_Clear);
Lcd_Out(1, 1, "No response");
Lcd_Out(2, 1, "from the sensor");
}
else{
RH_Byte1 = ReadByte();
RH_Byte2 = ReadByte();
T_Byte1 = ReadByte();
T_Byte2 = ReadByte();
CheckSum = ReadByte();
// Check for error in Data reception
if (CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF))
{
message1[7] = T_Byte1/10 + 48;
message1[8] = T_Byte1%10 + 48;
message1[10] = T_Byte2/10 + 48;
message2[7] = RH_Byte1/10 + 48;
message2[8] = RH_Byte1%10 + 48;
message2[10] = RH_Byte2/10 + 48;
message1[11] = 223; // Degree symbol
Lcd_Cmd(_Lcd_Clear);
Lcd_Out(1, 1, message1);
Lcd_Out(2, 1, message2);
}
else{
Lcd_Cmd(_Lcd_Clear);
Lcd_Out(1, 1, "Checksum Error!");
Lcd_Out(2, 1, "Trying Again ...");
}
}
}while(1);
}
-
Por lo que veo a t_byte1 no le asignas ningun valor antes de enviarla al display, imagino que antes tendras que hacer t_byte1 = v para de esta forma asignarle un valor.
Otro tema; indicas que los puertos trabajaran como digitales pero no especificas que el portb.0 lo vas a utilizar como entrada ya que lo estás leyendo, esto seria trisb.0 =1 como entrada. Todo esto implica que dejas a la elección del compilador su estado por lo que no sé que puede pasar.
Nota: Utilizar K en vez de Q queda bonito, pero el buscador del foro no lo entiende, por lo que en todos los foros, por lo menos los técnicos, se recomienda encarecidamente escribir lo mejor posible.
-
Por lo que veo a t_byte1 no le asignas ningun valor antes de enviarla al display, imagino que antes tendras que hacer t_byte1 = v para de esta forma asignarle un valor.
Otro tema; indicas que los puertos trabajaran como digitales pero no especificas que el portb.0 lo vas a utilizar como entrada ya que lo estás leyendo, esto seria trisb.0 =1 como entrada. Todo esto implica que dejas a la elección del compilador su estado por lo que no sé que puede pasar.
Nota: Utilizar K en vez de Q queda bonito, pero el buscador del foro no lo entiende, por lo que en todos los foros, por lo menos los técnicos, se recomienda encarecidamente escribir lo mejor posible.
GRACIAS AMIGO LO TOMARE EN CUENTA Y SI FIJATE QUE NO LE ASIGNE NINGUN VALOR YA QUE AUN NO SE COMO LEER LOS DATOS NO SE SI EL PIC LOS DETECTE AUTOMATICAMENTE O QUE ONDA.
otra duda puedo usar el puerto como entrada y salida al mismo tiempo?? si te fijas puse trisb.0 = 1 y trisb.0 = 0
saludos!!
-
Si se puede utilizar, no me di cuenta que usas "TRIS" en el cuerpo del programa, no es normal pero si la aplicación lo requiere es totalmente valido.
Si no recuerdo mal, todas o casi todas las funciones del PSI ya reconfiguran de forma automática los puertos como entrada o como salida según la necesidad. De todas formas es conveniente leer el manual que indica como trabaja la función, por si antes de llamarla hay que configurar el puerto o pin del puerto de una forma determinada.