Autor Tema: Uso de punteros  (Leído 1598 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Uso de punteros
« 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.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re:Uso de punteros
« Respuesta #1 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.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re:Uso de punteros
« Respuesta #2 en: 14 de Mayo de 2016, 07:02:37 »
Miquel_S

utiliza los punteros cuando creas conveniente usarlos
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Uso de punteros
« Respuesta #3 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.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Uso de punteros
« Respuesta #4 en: 14 de Mayo de 2016, 18:47:25 »
Gracias a los tres por vuestras opiniones.

Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re:Uso de punteros
« Respuesta #5 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:
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re:Uso de punteros
« Respuesta #6 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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Uso de punteros
« Respuesta #7 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.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Uso de punteros
« Respuesta #8 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!
« Última modificación: 15 de Mayo de 2016, 07:19:08 por Miquel_S »
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Uso de punteros
« Respuesta #9 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;

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Uso de punteros
« Respuesta #10 en: 16 de Mayo de 2016, 02:47:39 »
Entiendo gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.


 

anything