Autor Tema: Mis dudas aprendiendo C  (Leído 864 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Mis dudas aprendiendo C
« 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
« Última modificación: 22 de Julio de 2022, 15:35:14 por Fer_TACA, Razón: Cambiar título o del post »
Todos los días se aprende algo nuevo.

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:No funciona interrupción con entradas analógicas
« Respuesta #1 en: 10 de Julio de 2022, 17:47:46 »
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

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re:No funciona interrupción con entradas analógicas
« Respuesta #2 en: 10 de Julio de 2022, 17:56:52 »
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.
Todos los días se aprende algo nuevo.

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:No funciona interrupción con entradas analógicas
« Respuesta #3 en: 10 de Julio de 2022, 20:29:13 »
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.

 

* pwiz1.jpg
(27.22 kB, 746x508 - visto 265 veces)
   

* pwiz2.jpg
(23.88 kB, 744x511 - visto 181 veces)



Saludos.
« Última modificación: 10 de Julio de 2022, 20:32:00 por Eduardo2 »

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re:No funciona interrupción con entradas analógicas
« Respuesta #4 en: 11 de Julio de 2022, 04:06:19 »
Gracias de nuevo por la información.

Lo tendré muy en cuenta para el futuro.

F.
Todos los días se aprende algo nuevo.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re:Mis dudas aprendiendo C
« Respuesta #5 en: 22 de Julio de 2022, 15:46:06 »
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.
Todos los días se aprende algo nuevo.

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Mis dudas aprendiendo C
« Respuesta #6 en: 22 de Julio de 2022, 18:01:31 »
...
¿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.



Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re:Mis dudas aprendiendo C
« Respuesta #7 en: 22 de Julio de 2022, 18:33:37 »
Gracias por la respuesta.
Lo probaré, pero creo que de momento es un poco elevado ese nivel para mí.

F.
Todos los días se aprende algo nuevo.

Desconectado uZYNQ

  • PIC16
  • ***
  • Mensajes: 123
Re:Mis dudas aprendiendo C
« Respuesta #8 en: 22 de Julio de 2022, 19:29:31 »
Citar
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.


 

anything