TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Miquel_S en 14 de Mayo de 2016, 03:34:51

Título: Uso de punteros
Publicado por: Miquel_S en 14 de Mayo de 2016, 03:34:51
Hola, mirando códigos para el Pic18 me he encontrado con el hola mundo de toda la vida pero usando punteros, y tengo una duda que me gustaría me respondierais. ¿Es mejor acostumbrarse al uso de los punteros o por el contrario en ejemplos sencillos como este es complicarse la vida?
Código: C
  1. /*
  2. Programa1  : El Hola Mundo de los micros
  3. Descripción: Ejemplo de programa que enciende el LED RB0
  4. Empresa    : Ifara Tecnologías S.L.
  5. Autor      : Andrés Prieto-Moreno
  6. */
  7.  
  8. void main(void) {
  9.         // definimos dos punteros para acceder a los registros
  10.         unsigned char *puerto_b;
  11.         unsigned char *dir_puerto_b;
  12.  
  13.         // asignamos las direcciones correctas a los punteros
  14.         puerto_b = (unsigned char *) 0xF81;
  15.         dir_puerto_b = (unsigned char *) 0xF93;
  16.  
  17.         // ponemos el valor adecuado en el contenido apuntado
  18.         *dir_puerto_b = 0;  // puerto B configurado de salida
  19.         *puerto_b =  1;     // enciende el bit cero del puerto B
  20. }


Gracias.
Título: Re:Uso de punteros
Publicado por: MerLiNz en 14 de Mayo de 2016, 06:51:05
"PORTB" tambien es un puntero y ya tiene designado su direccion, yo no los usaria por eso yaa que tendras que buscar todas las direcciones de variables que ya estan definidas en la libreria del pic.
Título: Re:Uso de punteros
Publicado por: PalitroqueZ en 14 de Mayo de 2016, 07:02:37
Miquel_S

utiliza los punteros cuando creas conveniente usarlos
Título: Re:Uso de punteros
Publicado por: KILLERJC en 14 de Mayo de 2016, 08:17:59
Como dijo Merlinz PORTB es un puntero, y esta mejor declarado que eso xD, al menos en el .h del micro esta declarado como volatile.

Y como dice PalitroqueZ:
utiliza los punteros cuando creas conveniente usarlos


En fin.
Realmente para ese ejemplo es realmente complicarse la vida, para mi que quiso "demostrar" todo lo que sabe. Si ese codigo esta "completo" le faltan muchas cosas.
Título: Re:Uso de punteros
Publicado por: Miquel_S en 14 de Mayo de 2016, 18:47:25
Gracias a los tres por vuestras opiniones.

Miquel_S
Título: Re:Uso de punteros
Publicado por: PalitroqueZ en 14 de Mayo de 2016, 19:55:11
es posible que mi última respuesta no haya aportado algo significativo, pero es que no se me ocurrió otra conclusión   :D

Miquel_S si debes utilizar punteros en cualquier caso que se te presente, para que te des cuenta donde es que en realidad es necesario utilizarlo.

 :mrgreen:
Título: Re:Uso de punteros
Publicado por: RALF2 en 14 de Mayo de 2016, 23:32:24
Citar
// asignamos las direcciones correctas a los punteros
        puerto_b = (unsigned char *) 0xF81;
        dir_puerto_b = (unsigned char *) 0xF93;

Yo veo un detallito en ese codigo, alli estan haciendo un casting a una direccion de 8 bits, me parece; por lo que puerto_b apunta a 0x81h y dir_puerto_b a 0x93.   :shock:

De ser asi, entonces, podria haber problemas, ya que, no se esta especificando bien la direccion del banco 15h que es al que se desea apuntar.   :mrgreen:

Saludos
Título: Re:Uso de punteros
Publicado por: KILLERJC en 15 de Mayo de 2016, 00:13:52
No, el casting imagino que lo hace para que no le de el warning ( ya que 0xF81 es un numero y no un puntero). No es que el numero lo castea a uno de 8 bits. Sino que le dice que ese numero apunta a un numero de 8bits (que es el contenido del registro)

Hay 3 cosas que veo en el codigo.

La primera es no ponerlo como volatile, que ante una compilacion con optimizacion se iria.
La segunda es que no hay un loop infinito. ( a no ser que este incompleto )
Y finalmente el tema era ... por que crear un puntero ( el cual ocupa espacio en memoria ) para guardar la direccion, cuando podrias usar el archivo .h que provee Microchip y que declara a los punteros de una forma "especial" y que no ocupan espacio. Creo que estaban definidos asi en los .h:

extern volatile unsigned char * PORTB  @ 0xF81;

O algo por el estilo.. Si observas extern significa que esta definido en otro lado. Pero es un artilugio del compilador al igual que el @ a no ser que me este perdiendo algo mas.
Título: Re:Uso de punteros
Publicado por: Miquel_S en 15 de Mayo de 2016, 07:12:11
Gracias de nuevo por sus respuestas, KILLERJC no hay mas código que el que puse y como bien dices esta incompleto, pero creo que solo lo hizo a modo de ejemplo y da por sentado que el que lo lea sabrá que falta el bucle, configuración de los puertos, los includes pertinentes etc etc.
Perdón ¿Que es esto del casting, aquí me he perdido?

Saludos!
Título: Re:Uso de punteros
Publicado por: KILLERJC en 15 de Mayo de 2016, 14:22:35
El casting o "type casting" es cuando convertis una variable de un tipo en otro.

Lo habras visto cuando calculan la tension para el ADC

Citar
resultado = ((uint16_t)variable * 5)/1024

Lo que esta en negrita es el cast , casting, igual que aca:

Citar
        puerto_b = (unsigned char *) 0xF81;
Título: Re:Uso de punteros
Publicado por: Miquel_S en 16 de Mayo de 2016, 02:47:39
Entiendo gracias.