TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Fer_TACA en 10 de Julio de 2022, 14:44:33
-
Hola de nuevo a todos.
Bueno aprovechando el fin de semana, me estoy dedicando a fondo a aprender C. Estoy usando CCs
ya he leido entradas, digitales, probado interrupciones, escribir en el LCD, leer valores analógicos, etc. vamos lo mas básico.
Ahora me encuentro con un problema:
Quiero hacer una especie de menú, seleccionando hasta 5 posibles entradas. Cada entrada se selecciona por una interrupción con flanco de bajada en RB0.
En una de las posiciones del menú trato de leer el valor analógico de unas entradas analógicas. Bien si configuro el programa para leer 1 o 2 entradas analógicas, el programa funciona bien. Pero si quiero utilizar más entradas analógicas, hasta 4, entonces la interrupción ya no me funciona y por tanto no puedo seleccionar la parte del menú que visualizaría dichas entradas analógicas.
Si utilizo:
setup_adc_ports(sAN0); --> OK
setup_adc_ports(sAN0,sAN1); --> OK
setup_adc_ports(sAN0,sAN1,sAN2,sAN3); --> MAL
setup_adc_ports(all_analog); --> MAL
Seguro que hay algo que estoy haciendo mal.
¿Alguna ayuda para este principiante?
Adjunto el código.
F
-
Está mal la sintaxis. Debe ser: setup_adc_ports(sAN0|sAN1|sAN2|sAN3) o sea, una OR en lugar de coma.
setup_adc_ports(sAN0,sAN1) funcionaba porque con dos argumentos el CCS te hace una OR
setup_adc_ports(all_analog) no funcionaba porque se declara PIN_B0 == AN12 como entrada analógica --> te deja de funcionar la INT_EXT
-
Muchas gracias Eduardo.
No sabia ese tipo de sintaxis para configurar los canales analógicos.
Llevo solo ayer y hoy empezando con C y creo que, a pesar de este error y algunos otros que me da vergüenza indicar, PROGRESO ADECUSADAMENTE. :mrgreen: :mrgreen: :mrgreen:
Y lo de:
setup_adc_ports(all_analog) no funcionaba porque se declara PIN_B0 == AN12 como entrada analógica --> te deja de funcionar la INT_EXT
No me fije en el datasheet
Mañana ya pruebo todo y seguiré peleándome con ello.
Repito muchas gracias.
F.
-
No sabia ese tipo de sintaxis para configurar los canales analógicos.
Lo que le ingresás a setup_adc_ports es una máscara, no una lista de los pines analógicos.
setup_adc_ports(sAN0|sAN1|sAN2|sAN3) es lo mismo que setup_adc_ports(0x0F)
Una gran ayuda es el Project Wizard de CCS, en cada pestaña tenés mostradas las posibilidades del hardware y la sintaxis.
Yo lo uso para configuraciones individuales (sobre todo timers) aunque está pensado para generar una plantilla del proyecto completo.
- Tienes que ingresar para ver archivos adjuntos - - Tienes que ingresar para ver archivos adjuntos -
Saludos.
-
Gracias de nuevo por la información.
Lo tendré muy en cuenta para el futuro.
F.
-
Hola de nuevo.
En primer lugar y para no crear más post, ya seguro que me saldrán más preguntas, he cambiado el título del post.
Ahora de nuevo tengo otra duda o pregunta:
¿Se puede borrar una sola fila de un display LCD?
Se que existe un comando para borrar el LCD de forma completa si se quiere mostrar mensajes nuevos.
¿Pero que pasa si por ejemplo en la fila 1 se quiere mantener un mensaje fijo y en la fila 2 un mensaje variable?
Supongamos que en la fila 2 tengo un mensaje que ocupa los 16 caracteres y después de un tiempo mostrar un mensaje más corto (10 caracteres). En este caso se quedarían mostrando los caracteres anteriores. Se que a la hora de escribir el nuevo mensaje se pueden enviar caracteres vacíos dentro de la cadena del mensaje a mostrar, pero me queda la duda si se puede borrar un fila entera con algún comando directo en vez de: print" "
F.
-
...
¿Se puede borrar una sola fila de un display LCD?
Se que existe un comando para borrar el LCD de forma completa si se quiere mostrar mensajes nuevos.
¿Pero que pasa si por ejemplo en la fila 1 se quiere mantener un mensaje fijo y en la fila 2 un mensaje variable?
...
Si el controlador no tiene esa instrucción... si o si deberá ser por software. Al menos el controlador mas común , el HD44780, no la tiene.
En CCS se podría hacer printf(padding,"texto %u %u\n", var1,var2)
Donde padding(char x) es una rutina que recibe uno a uno los caracteres formateados por printf y cuando llega un \n ,o definimos otro, inserta espacios hasta el fin de línea.
-
Gracias por la respuesta.
Lo probaré, pero creo que de momento es un poco elevado ese nivel para mí.
F.
-
Se que existe un comando para borrar el LCD de forma completa si se quiere mostrar mensajes nuevos.
¿Pero que pasa si por ejemplo en la fila 1 se quiere mantener un mensaje fijo y en la fila 2 un mensaje variable?
Utilizando la función de posición del cursor. Imprimes el mensaje en la fila 1 una sola vez y luego pones el cursor en la fila 2 en la columna que quieras e imprimes. después solo repites colocando el cursor en la fila 2 e imprimiendo. ( creo que en CCS en gotoXY o algo parecido)
Saludos.