Autor Tema: Comienzo en C  (Leído 17345 veces)

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

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #75 en: 25 de Junio de 2012, 12:24:23 »
Gracias jukin, era eso, gracias, te paso como quedaron las llamadas de distintas formas, me verificas que las dos ultimas no me funcionan y no se por que:
Código: C
  1. myptr = &My_Msnj[0][0];
  2.  
  3.            LCDMsnj (0, 0, (unsigned char*)myptr);                //primera linea funciona , este solo funcioma con la primer linea
  4.            LCDMsnj (0, 1, (unsigned char*)(My_Msnj+1));          //segunda linea funciona
  5.            LCDMsnj (0, 2,  My_Msnj[2]);                          //tercera linea funciona
  6.            LCDMsnj (0, 3, (unsigned char*) (*(My_Msnj+3)+0));    //cuartalinea funciona
  7.            LCDMsnj (0, 4, (unsigned char*) (*(myptr+4)+0));      //quinta linea no funciona
  8. //         LCDMsnj (0, 5, (unsigned char*)*(*(myptr+5)+0));      //sexta linea no funciona    133:Error [1130] pointer operand required for '*'

El apuntador myptr no me funciona para seleccionar las diferentes filas por que?
Saludos


Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Comienzo en C
« Respuesta #76 en: 25 de Junio de 2012, 12:40:33 »
Macedo:
          la función espera un puntero. Y no el contenido a donde apunta el puntero myptr. (al contenido se accede desreferenciando el puntero con el operador *
La función es la que se encarga de procesar el contenido a donde apunta el puntero myptr. Vos sólo le debés pasar el puntero. (para llegar a la línea que querés mostrar  deberás incrementar a  myptr mediante aritmética de punteros)
Es medio traba lengua. Pero es así.
Y si le pasás así el parámetro también debería funcionar.

&My_Msnj[4][0]

fijate el ejemplo que te pasé en c18 que ahí lo uso así.
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Comienzo en C
« Respuesta #77 en: 25 de Junio de 2012, 13:22:45 »
Estas comenzando con C y ya te estas metiendo con punteros?  :shock:
No contesto mensajes privados, las consultas en el foro

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #78 en: 25 de Junio de 2012, 14:42:33 »
Hola, tienen razón demasiado pronto para romperme la cabeza, es que cuando tengo una duda en algo hasta que no me sale no me gusta dejarla pero gracias por el aporte y la paciencia, entendí lo del puntero que no funciona y es, si no me equivoco, este debería estar dentro del la función principal y dentro de otra ya que como dijo jukinch la función principal espera un puntero y no su dirección.
Ahora todas estas funcionan:
Código: C
  1. LCDMsnj (0, 0, (myptr+0));                        //primera linea funciona con aritmetica de punteros, sumar de a 20 segun array
  2.            LCDMsnj (0, 1, (unsigned char*)(My_Msnj+1));      //segunda linea funciona
  3.            LCDMsnj (0, 2,  My_Msnj[2]);                      //tercera linea funciona
  4.            LCDMsnj (0, 3, (*(My_Msnj+3)+0));                 //cuarta linea funciona
  5.            LCDMsnj (0, 4,  &My_Msnj[4][0]);                  //quinta linea funciona

Diferentes formas de llamar al array.
Funciona. :-/
Lo que ne me funciona es *(*(My_Msnj+5)+0)); como el de tu ejemplo me da este error: 133:Error [1130] pointer operand required for '*'

Voy a continuar con el proyecto ahora viene la parte de la USART y debo comparar datos en cadena. Voy a tratar de hacerlo solo ;-)
Saludos :lol:


Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #79 en: 30 de Junio de 2012, 12:18:20 »
Hola me pueden ayudar con esto, estoy probando la insercion de delays en ASM y tengo algunos problemas, mi cod:
Código: C
  1. unsigned char CounterA=0, CounterB=0, CounterC=0;
  2.  
  3. /******* PIC Time Delay = 5,00000000 s with Osc = 18432000 Hz *****/
  4. void MY_Delay_5s(void) {
  5.  
  6.         _asm
  7.                 movlw   117
  8.                 movwf   CounterC,0          //0=Access RAM
  9.                 movlw   226
  10.                 movwf   CounterB,0          //0=Access RAM
  11.                 movlw   195
  12.                 movwf   CounterA,0          //0=Access RAM
  13.    loop:
  14.                 decfsz  CounterA,1,0        //0=Access RAM
  15.                 goto    loop
  16.                 decfsz  CounterB,1,0        //0=Access RAM
  17.                 goto    loop
  18.                 decfsz  CounterC,1,0        //0=Access RAM
  19.                 goto    loop
  20.                 retlw   0
  21.         _endasm
  22. }

El header:
Código: C
  1. /****************************************************************************/
  2. /*  Delay ASM                                                               */
  3. /*  Function : MY_Delay_5s                                                  */
  4. /*      Parameters                                                          */
  5. /*          Input   :  Nothing                                              */
  6. /*          Output  :  Nothing                                              */
  7. /****************************************************************************/
  8. void MY_Delay_5s(void);

Así lo llamo en main.c
Código: C
  1. #include        "My_Delays.h"
  2.  
  3. void main(void) {
  4. ...
  5. ...
  6.             My_Delay_5s();    //
  7. ...

Pero me dice estos errores:
120:Warning [2058] call of function without prototype
Error - could not find definition of symbol 'My_Delay_5s' in file './Main.o'.

La verdad es que no se que pueda ser, el prototipo esta declarado, la función también, no se por donde buscar ya revise muchos ejemplos y me parece que esta todo bien.
Me dan una mano
Saludos

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Comienzo en C
« Respuesta #80 en: 30 de Junio de 2012, 13:51:07 »
Macedo subí el proyecto completo o aunque sea el main.
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #81 en: 30 de Junio de 2012, 14:25:23 »
Hola jukinch, ya esta creo que se colgo el MPLab, tenia otros abierto tambien, y funciona todo lo que quiero preguntarte es sobre esta funcion:
Código: C
  1. #include        "My_Delays.h"
  2.  
  3. /******* PIC Time Delay = 5,00000000 s with Osc = 18432000 Hz *****/
  4. void MY_Delay_5s(void) {
  5.  
  6. unsigned char CounterA=0, CounterB=0, CounterC=0;
  7.  
  8.          _asm
  9.                 movlw   117
  10.                 movwf   CounterC,0          //0=Access RAM
  11.                 movlw   226
  12.                 movwf   CounterB,0          //0=Access RAM
  13.                 movlw   195
  14.                 movwf   CounterA,0          //0=Access RAM
  15.    loop:
  16.                 decfsz  CounterA,1,0        //0=Access RAM
  17.                 goto    loop
  18.                 decfsz  CounterB,1,0        //0=Access RAM
  19.                 goto    loop
  20.                 decfsz  CounterC,1,0        //0=Access RAM
  21.                 goto    loop
  22.                 retlw   0
  23.          _endasm
  24. }

El "unsigned char CounterA=0, CounterB=0, CounterC=0;" se puede declarar global ya que pretendo hacer varias así, con ASM, y todas tienen estas variables, es un cod. generado por PicLoops v2.2, las puse fuera de "void MY_Delay_5s(void)" pero dejo de funcionar la función, la puse en main.c y la función deja de funcionar, si la saco de la función esta no funciona mas.
Orientame por favor s i es que se puede o vale la pena hacerlo.
Saludos

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Comienzo en C
« Respuesta #82 en: 30 de Junio de 2012, 15:53:15 »
Macedo:
Debes declarar CounterA B y C como globales.
unsigned char CounterA=0, CounterB=0, CounterC=0;// debes ponerlo en el archivo main.c al principio luego de los includes y antes de:
void main(void)
{
}
No dentro de main. Si lo ponés dentro de la funcion main serán declaradas como locales dentro de main.
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #83 en: 13 de Julio de 2012, 13:16:45 »
Hola perdón la tardanza, lo declare en el main pero el compilador no me deja hacerlo, creo que no se puede muestra esto:

Error [1510] CounterA cannot have 'extern' storage class, block scope, and an initializer
Error [1510] CounterB cannot have 'extern' storage class, block scope, and an initializer
Error [1510] CounterC cannot have 'extern' storage class, block scope, and an initializer
Halting build on first failure as requested.

o esto:

This feature is not implemented in compiler. There may be a definition of external symbol 'CounterC' found instead of its declaration

Al parecer no quiere que loa llame como extern en la función, ya que si no lo pongo así dice que no existe.
La única forma de que funcione es así:
Código: C
  1. void Delay_5s(void) {
  2. unsigned char CounterA=0, CounterB=0, CounterC=0;
  3.  _asm
  4.                 movlw   117
  5.                 movwf   CounterC,0          //0=Access RAM
  6.                 movlw   226
  7.                 movwf   CounterB,0          //0=Access RAM
  8.                 movlw   195
  9.                 movwf   CounterA,0          //0=Access RAM
  10.    loop:
  11.                 decfsz  CounterA,1,0        //0=Access RAM
  12.                 goto    loop
  13.                 decfsz  CounterB,1,0        //0=Access RAM
  14.                 goto    loop
  15.                 decfsz  CounterC,1,0        //0=Access RAM
  16.                 goto    loop
  17. //              retlw   0x00
  18. _endasm
  19. }

Otra pregunta, no se si notaron el "retlw 0x00" al final, debe ir? ya que si lo coloco parte del programa se pone "loco" pero si no andanda todo bien!.
Saludos



Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Comienzo en C
« Respuesta #84 en: 13 de Julio de 2012, 18:48:43 »
Macedo:
declaraste CounterA B y C como globales (fuera de main) ?.
           Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #85 en: 14 de Julio de 2012, 10:44:45 »
Hola asi las declare como me dijiste:
Código: C
  1. int i,j;                                 // Global, usado por LCD configuration
  2.  
  3. unsigned char vcc_state;          // usado en TEST Extesion Port
  4. unsigned char gnd_state;          // usado en TEST Extesion Port
  5. unsigned char test_state=0;                     // usado en UpdateMenu
  6. unsigned char BusChar[15];
  7. unsigned char pos;
  8. unsigned char CounterA=0, CounterB=0, CounterC=0;

Y en el archivo delay.c asi:
Código: C
  1. #include        "My_Delays.h"
  2.  
  3. extern unsigned char CounterA=0, CounterB=0, CounterC=0;
  4. /******* PIC Time Delay = 5,00000000 s with Osc = 18432000 Hz *****/
  5. void Delay_5s(void) {
  6.  
  7.  _asm
  8.                 movlw   117
  9.                 movwf   CounterC,0          //0=Access RAM
  10.                 movlw   226
  11.                 movwf   CounterB,0          //0=Access RAM
  12.                 movlw   195
  13.                 movwf   CounterA,0          //0=Access RAM
  14.    loop:
  15.                 decfsz  CounterA,1,0        //0=Access RAM
  16.                 goto    loop
  17.                 decfsz  CounterB,1,0        //0=Access RAM
  18.                 goto    loop
  19.                 decfsz  CounterC,1,0        //0=Access RAM
  20.                 goto    loop
  21. //        retlw   0x00
  22.  //       return 0x00
  23. _endasm
  24. }

Saludos

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Comienzo en C
« Respuesta #86 en: 14 de Julio de 2012, 15:01:01 »
Subí el proyecto completo así lo vemos.
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Comienzo en C
« Respuesta #87 en: 14 de Julio de 2012, 16:39:20 »
Macedo:
        No podés declarar una variable global con un valor definido y luego declararla como extern asignándole un nuevo valor.

         Vos en el archivo principal.c les asignás el valor cero a CounterA B y C, es decir, las declarás y las definís dándole el valor 0.
         Luego en el archivo delays.c las declarás como extern y le volvés a asignar el valor cero.
         Para solucionar tu problema tenés que declararlas y definirlas globalmente en el archivo principal y luego en tu otro archivo.h las declarás como extern y nada más. Es decir, sin volver a asignarle el cero.
          Luego, dentro de la función del archivo externo, si vas a poder cambiar el valor a las variables.
              
A continuación acompaño dos archivos para compilarlos con devc++ a modo de ejemplo.

Código: C
  1. // ARCHIVO MAIN.C
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include "source2.h"
  5.  
  6. unsigned char CounterA=0, CounterB=0, CounterC=0;
  7. extern     void mifuncion(void);    
  8. int main(int argc, char *argv[])
  9. {
  10.    
  11.  
  12.    printf("hola desde main\n");
  13.    printf("counterA= %d\n", CounterA);
  14.    printf("counterB= %d\n", CounterB);
  15.    printf("counterC= %d\n", CounterC);
  16.  
  17.     mifuncion();
  18.  
  19.  
  20.   system("PAUSE");     
  21.   return 0;
  22. }

Código: C
  1. // ARCHIVO source2.h
  2. extern unsigned char CounterA, CounterB, CounterC;
  3.  
  4. void mifuncion(void)
  5.      {
  6. CounterA=10;
  7. CounterB=10;
  8. CounterC=10;
  9.      printf ("hola desde source2.h\n");
  10.      printf("counterA= %d\n", CounterA);
  11.      printf("counterB= %d\n", CounterB);
  12.      printf("counterC= %d\n", CounterC);
  13.      }

y la salida:
Código: C
  1. hola desde main
  2. counterA= 0
  3. counterB= 0
  4. counterC= 0
  5. hola desde source2.h
  6. counterA= 10
  7. counterB= 10
  8. counterC= 10
  9. Presione una tecla para continuar . . .

dale una lectura a estos links:
http://stackoverflow.com/questions/1433204/what-are-extern-variables-in-c/1433387#1433387
http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/CONCEPT/storage_class.html
« Última modificación: 14 de Julio de 2012, 19:40:50 por jukinch »
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #88 en: 17 de Julio de 2012, 13:41:08 »
Hola jukinch, gracias por los link, nunca esta demás el conocimiento, te comento lo que hice:
Declare en main.c como dijiste:
Código: C
  1. unsigned char CounterA=0, CounterB=0, CounterC=0;
y en delay.h como extern:
Código: C
  1. extern unsigned char CounterA, CounterB, CounterC;
y delay.h lo inclui en delay.c donde esta mi funcion:
Código: C
  1. #include        "My_Delays.h"
  2.  
  3. /******* PIC Time Delay = 5,00000000 s with Osc = 18432000 Hz *****/
  4. void Delay_5s(void) {
  5.  
  6.  _asm
  7.                 movlw   117
  8.                 movwf   CounterC,0          //0=Access RAM
  9.                 movlw   226
  10.                 movwf   CounterB,0          //0=Access RAM
  11.                 movlw   195
  12.                 movwf   CounterA,0          //0=Access RAM
  13.    loop:
  14.                 decfsz  CounterA,1,0        //0=Access RAM
  15.                 goto    loop
  16.                 decfsz  CounterB,1,0        //0=Access RAM
  17.                 goto    loop
  18.                 decfsz  CounterC,1,0        //0=Access RAM
  19.                 goto    loop
  20. //      retlw   0x00
  21.         return 0x00
  22. _endasm
  23. }
Pero con esta configuración la función se cuelga y el pic queda ahí sin hacer nada.
Otra:
Defini en main.c como extern:
Código: C
  1. extern unsigned char CounterA, CounterB, CounterC;
En delay.c:
Código: C
  1. unsigned char CounterA=0, CounterB=0, CounterC=0;

Pero la funcion no funciona, se saltea esta parte y continua con el programa! :shock:

Te pregunto sera que funciona asi por ser una función con assembler?
De esta manera funciona:
Código: C
  1. /******* PIC Time Delay = 5,00000000 s with Osc = 18432000 Hz *****/
  2. void Delay_5s(void) {
  3. unsigned char CounterA=0, CounterB=0, CounterC=0;
  4.  
  5.  _asm
  6.                 movlw   117
  7.                 movwf   CounterC,0          //0=Access RAM
  8.                 movlw   226
  9.                 movwf   CounterB,0          //0=Access RAM
  10.                 movlw   195
  11.                 movwf   CounterA,0          //0=Access RAM
  12.    loop:
  13.                 decfsz  CounterA,1,0        //0=Access RAM
  14.                 goto    loop
  15.                 decfsz  CounterB,1,0        //0=Access RAM
  16.                 goto    loop
  17.                 decfsz  CounterC,1,0        //0=Access RAM
  18.                 goto    loop
  19. //      retlw   0x00
  20. //      return 0x00
  21. _endasm
  22. }

Saludos


Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Comienzo en C
« Respuesta #89 en: 17 de Julio de 2012, 16:39:35 »
Macedo: en ASM no tengo idea  :?. Probá simular o debuggear el código para ver que pasa.
        Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes


 

anything