TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: darck_khronos en 17 de Mayo de 2009, 23:36:57
-
Tengo un problema, intento enviar datos por el puerto rs232 pero como podria hacer las comparaciones de los puertos y que estos mandaran datos al pic que tiene la lcd
este es mi diagrama
(http://img200.imageshack.us/img200/1314/proyecto2.png)
no doy como podria hacer la siguiente comparacion
Rb0 = 1 Envia Esta en 0 %
Rb0 = Rb1 = 1 Envia Esta en 10%
Rb0 = Rb1 = Rb2 = 1 Envia Esta en 20%
Rb0 = Rb1 = Rb2 = Rb3 = 1 Envia Esta en 30%
Asi hasta llegar a
rb0=rb1=rb2=rb3=rb4=rb5=rb6=rb7=ra0=ra1=ra2= Esta en 100%
Como podria generar ese codigo
-
Pues es un selector de casos lo que necesitas:
switch(input_b())
{
case 0b00000001:
printf(); //llénalo con lo que necesitas
break;
case 0b00000011:
printf
break;
...
case 0b11111111:
printf()
break;
}
-
aun aplicando el caso de arriba no comprendo por que me sale solo esto en la pantalla
cual puede ser el error
(http://img196.imageshack.us/img196/7885/sshot7.png)
este es el codigo de mi pic de envio
#include <18f2550.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use fast_io(b)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
void main(){
do {
switch(input_b())
{
case 0b00000001:
printf("\r\n\10 lleno\r\n");
break;
case 0b00000011:
printf("\r\n\20 lleno\r\n");
break;
case 0b00000111:
printf("\r\n\30 lleno\r\n");
break;
case 0b00001111:
printf("\r\n\40 lleno\r\n");
break;
case 0b00011111:
printf("\r\n\50 lleno\r\n");
break;
case 0b00111111:
printf("\r\n\60 lleno\r\n");;
break;
}
} while (TRUE);
}
-
Al usar #fast_io es tu responsabilidad configurar el tris del puerto b.
Al hacer input_b() puede que esté sacando datos de forma errónea y la lcd los malinterprete. Además, ni siquiera incluyes lcd.c en tu programa, de ahí que se complica más la cosa.
-
Hola.
Porque no posteas el codigo del micro que presenta el problema???? El programa del micro emisor no te va a afectar la LCD :D
-
Sí es cierto no me fijé en que el programa no era el de la lcd :D
Khronos, publica bien tus programas :D
-
Ok ya tengo un avanze xD ya cambie el codigo aqui los pongo
Programa Para Leer Datos y Visualizar en la LCD
#include <18f2550.h>
#FUSES XT,NOWDT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)
#include <LCD.C>
#BYTE TRISA=0X85
#BYTE PORTA=0X05
int valor;
#int_RDA
RDA_isr()
{
valor=GETC();
}
void main() {
bit_clear(TRISA,0);
lcd_init();
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
for (;;) {
lcd_gotoxy(1,1);
printf(lcd_putc,"Lenado De Tanque");
lcd_gotoxy(1,2);
printf(lcd_putc," %D Porciento",valor);
}
}
Aqui esta el que me manda la informacion
#include <16f88.h>
#FUSES NOWDT
#fuses NOMCLR,INTRC_IO
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_b5, rcv=pin_b2)
void main() {
int valor;
while(true){
for (valor=10;valor<=100;) {
PUTC(valor);
valor=valor+10;
delay_ms(500);
}
}
}
(http://img35.imageshack.us/img35/6619/sshot8.png)
mi pregunta es la siguiente:
Como podria evitar que al terminar el conteo de 100 me agrege una o de mas como se ve en la figura
y en la parte donde esta el pic 16f88 como podria mandar una lectura por el ADC para que me mandara la lectura de 0 a 100 con un potenciometro de 100k
-
Hola.
La primera pregunta no te la entendi :-)
La segunda: debes conectar el potenciometro a uno de los pines del ADC del 16f88 y configurar el ADC con la funcion setup_adc();, luego para obtener el valor de conversion usas read_adc(); y ese valor lo envias por el serial.
Saludos
-
Hola.
La primera pregunta no te la entendi :-)
La segunda: debes conectar el potenciometro a uno de los pines del ADC del 16f88 y configurar el ADC con la funcion setup_adc();, luego para obtener el valor de conversion usas read_adc(); y ese valor lo envias por el serial.
Saludos
es que en la imagen me imprime
(http://img268.imageshack.us/img268/1674/sshot9.png)
Llenado de tanque
100 porciento
y despues del 100 me dice
Llenado de tanque
10 porcientoo
y ok estare hacien pruebas por que es la pimera vez que usare el Adc
-
Limpiar LCD con \f ... :mrgreen:
printf(lcd_putc, "\fLlenado de tanque\n%u \%",valor);
-
Es que debes borrar el display, sino esta sobre escribiendo lo anterior.
Uyy! Me gano migsantiago :mrgreen:
-
Ah!!!! en la segunda imagen si se ve la 'o' de mas ..... limpia la lcd como dice mig o puedes colocar espacios despues asi:
printf(lcd_putc, "\fLlenado de tanque\n%u porciento ",valor);
De esta manera te evitas el parpadeo del limpiado del LCD
-
Ya me encuentro en la parte del ADC mas que al compilar el siguiente codigo me marca este error
#include <16f88.h>
#device adc=10
#FUSES NOWDT
#fuses NOMCLR,INTRC_IO
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_b5, rcv=pin_b2)
void main() {
int16 q;
float p;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
for (;;) {
set_adc_channel(0);
delay_us(20);
q = read_adc();
p = 5.0 * q / 1024.0;
PUTC( "\fADC = %4ld", q);
delay_ms(100);
}
}
(http://img194.imageshack.us/img194/5356/sshot10.png)
-
hola.
Debes usar el printf para sacar las variables .... y debes tener en cuenta el formato, q es %lu
-
hola.
Debes usar el printf para sacar las variables .... y debes tener en cuenta el formato, q es %lu
Por la parte de la inprecion no hay problema pero por que no me detecta el pin ra0 como Adc por que me muestra que es indefinido
?
-
Ok.
La impresion ok.
Con respecto a lo de la entrada analogica, es por que no es asi la configuracion, segun el archivo 16F88.h, se debe colocar:
setup_adc_ports(sAN0);
Siempre es bueno revisar el .h del micro correspondiente.
-
Me ganaste MLO__
ya tengo el codigo del Adc ya funciona ahora el detalle es el mas fundamental como puedo hacer que me de una escala de 0 a 100
aqui dejo el codigo de los dos pics ya que esta modificado en algunas lineas
Pic LCD
#include <18f2550.h>
#FUSES XT,NOWDT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)
#include <LCD.C>
#BYTE TRISA=0X85
#BYTE PORTA=0X05
float p;
#int_RDA
RDA_isr()
{
p=GETC();
}
void main() {
bit_clear(TRISA,0);
lcd_init();
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
for (;;) {
lcd_gotoxy(1,1);
printf(lcd_putc,"Lenado De Tanque");
lcd_gotoxy(1,2);
printf(lcd_putc," adc=%1.2f",p);
}
}
Codigo de envio
#include <16f88.h>
#device adc=10
#FUSES NOWDT
#fuses NOMCLR,INTRC_IO
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_b5, rcv=pin_b2)
/*void main() {
int valor;
while(true){
for (valor=10;valor<=100;) {
PUTC(valor);
valor=valor+10;
delay_ms(500);
}
}
}*/
void main() {
int16 q;
float p;
setup_port_a( ALL_ANALOG ); //Canal 0 analógico
setup_adc(ADC_CLOCK_INTERNAL); //Fuente de reloj RC
for (;;) {
set_adc_channel(0); //Habilitación canal0
delay_us(20);
q = read_adc(); //Lectura canal0
p = 5.0 * q / 1024.0; //Conversión a tensión
PUTC(q);
delay_ms(100);
}
}y aqui otra imagen de la simulacion
(http://img41.imageshack.us/img41/3162/sshot11.png)
-
Para la escala de 0 a 100% deberás usar una regla de 3.
5V -> 255 binario
0V -> 0 binario
Relaciona el 255 con el 100% y el 0 con el 0%. Implementa una variable flotante para lograrlo.
Edito: Veo que usas 10bits de ADC, solo cambia el 255 por 1023.
-
ya realice la convercion pero en la terminal virtual solo me imprime a lo maximo solamente 5 datos diferente
#include <16f88.h>
#device adc=10
#include <math.h> //Necesaria para los cálculos matemáticos
#FUSES NOWDT
#fuses NOMCLR,INTRC_IO
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_b5, rcv=pin_b2)
void main() {
float medicion; //Variables de ecuación
int16 valor;
setup_port_a( ALL_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
delay_us(10);
do {
valor = Read_ADC();
medicion = valor * 1024.0 / 100 ;
putc(medicion);
} while (TRUE);
}
puse un potenciometro de 1M aqui dejo adjunta la simulacion
-
La conversión la haces mal. Debes hacer casting de float o expresar el 100 como flotante en esta línea, si no, el resultado se calcula como int16.
medicion = valor * 1024.0 / 100.0 ;
-
La conversión la haces mal. Debes hacer casting de float o expresar el 100 como flotante en esta línea, si no, el resultado se calcula como int16.
medicion = valor * 1024.0 / 100.0 ;
no se si soy yo el pic o la programacion ya intente eso y mas cosas con mas operaciones y me sigue dando solo 6 resultados nadamas no hace mas variaciones
-
En el link lo hago con ADC a 8 bits .... y no da problema ...
7 Segmentos con Timer0 (http://www.todopic.com.ar/foros/index.php?topic=21738.0)
-
no se si soy yo el pic o la programacion ya intente eso y mas cosas con mas operaciones y me sigue dando solo 6 resultados nadamas no hace mas variaciones
¿Cuáles son los 6 resultados que te da?
Es que nos diste mal el cálculo de la regla de 3. Ponlo así:
medicion = valor * 100.0 / 1024.0 ;