Autor Tema: MALA COMPILACION EN PIC  (Leído 2787 veces)

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

Desconectado Strongpic

  • PIC10
  • *
  • Mensajes: 16
MALA COMPILACION EN PIC
« en: 04 de Julio de 2016, 18:13:46 »
Hola estoy trabajando con el pic 16f84a en lenguaje c y ensamblador, tengo problema a la hora de pasar mis progrmas a C, al compilar me surge dos errores de registro INDF en la direccion 0x00, supongo que tiene que ver con el vector de resest que en asembler, se lo envia con un org 00 y goto inicio, en C estoy perdido. Tambien me surge un problema con delay que no comprendo
---------------------------------------------------------------------
"un sencillo programa de encendido y apagado de un led"

/*  * File:   led.c
 * Author: Damian Rodriguez.
 * * Created on 4 de julio de 2016, 14:43
 */
#include <stdio.h>
#include <stdlib.h>
#include <xc.h> //;libreria de compilador en c
#include <as16f84a.h>

#define _XTAL_FREQ 4000000         //Fosc=4Mhz
   ///PROGRAMA
void main(void)
  {
   TRISB = 0x00;   //portb como salida(RB0,las demas desactivadas)
   PORTB = 0X00;   //SALIDAS EN CERO
   while(1); {
   PORTBbits.RB0 = 1;          //led on
     __delay__ms(500);
   PORTBbits.RB0 = 0;        //led off
     __ delay_ms(500);
             }
   return (EXIT_SUCCESS);
}
--------------------------------------------------
Errores que surgen
 Files (x86)\Microchip\xc8\v1.37\include\pic16f84a.inc:46: warning: (374) missing basic type; int assumed
C:\Program Files (x86)\Microchip\xc8\v1.37\include\pic16f84a.inc:46: error: (984) type redeclared
C:\Program Files (x86)\Microchip\xc8\v1.37\include\pic16f84a.inc:46: error: (1098) conflicting declarations for variable "INDF" (C:\Program Files (x86)\Microchip\xc8\v1.37\include\pic16f84a.inc:46)

gracias seguire trabajando en esto

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:MALA COMPILACION EN PIC
« Respuesta #1 en: 04 de Julio de 2016, 18:21:05 »
quita #include <as16f84a.h>

xc.h ya tiene todo lo que necesitas

Desconectado Strongpic

  • PIC10
  • *
  • Mensajes: 16
Re:MALA COMPILACION EN PIC
« Respuesta #2 en: 04 de Julio de 2016, 19:55:13 »
gracias killer, logre generar el CODIGO MAQUINA,. HEX :-/,
Ahora se puede trabajar con el proteus para simularlo?

/*  * File:   led.c
 * Author: Damian Rodriguez.
 * * Created on 4 de julio de 2016, 14:43
 */
#include <stdio.h>
#include <stdlib.h>
#include <xc.h> //;libreria de compilador en c
#define _XTAL_FREQ 4000000         //Fosc=4Mhz
   ///PROGRAMA
void main()
  {
   TRISB = 0x00;   //portb como salida(RB0,las demas desactivadas)
   PORTB = 0X00;   //SALIDAS EN CERO
   while(1); {
   PORTBbits.RB0 = 1;          //led on
     __delay_ms(500);
   PORTBbits.RB0 = 0;        //led off
     __delay_ms(500);
             }
   }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:MALA COMPILACION EN PIC
« Respuesta #3 en: 04 de Julio de 2016, 21:46:33 »
Deberias poder hacerlo. Tambien con el MPLAB podes simularlo paso a paso, lo que si no vas a ver encenderse un led, sino ponerse un bit a 1 o a 0.

Desconectado Strongpic

  • PIC10
  • *
  • Mensajes: 16
Re:MALA COMPILACION EN PIC
« Respuesta #4 en: 05 de Julio de 2016, 20:25:28 »
Totalmente corregido, cometi unos errores, que se los ve si se los compara con el codigo de ayer.
 
Pude simularlo por software, viendo como cambiaba el registro del puerto de salida, jugue con delay que era algo nuevo y desconcertante para mi que vengo de asm, donde hago bucles anidados, me queda ir a proteus, pero llegue a mi objetivo con introducirme en C con el compilador xc8. :-/

*******************************************************************
#include <stdio.h>
#include <stdlib.h>
#include <xc.h> //;libreria de compilador en c
#define _XTAL_FREQ 4000000         //Fosc=4Mhz
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
   ///PROGRAMA
     
int main()
  {
    TRISB = 0x00;   //portb como salida(RB0,las demas desactivadas)
   PORTB = 0X00;   //SALIDAS EN CERO
   while(1){
   PORTBbits.RB0 = 1;          //led on
     __delay_ms(5);
   PORTBbits.RB0 = 0;        //led off
     __delay_ms(5);
             }
   return(EXIT_SUCCESS);
   
   }
==================================
BUILD SUCCESSFUL (total time: 4s)
Loading code from C:/Users/Damian/MPLABXProjects/Led1encendido.X/dist/default/production/Led1encendido.X.production.hex...
Loading completed

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:MALA COMPILACION EN PIC
« Respuesta #5 en: 05 de Julio de 2016, 22:17:12 »
Citar
jugue con delay que era algo nuevo y desconcertante para mi que vengo de asm, donde hago bucles anidados

El dealy es simplemente eso.. bucles anidados :P, nomas que esa funcion la genera internamente el MPLAB, vos solo pones la cantidad de tiempo y el MPLAB intenta crear esa rutina, a veces por ejemplo el de 500ms te puede llegar a dar error, entonces se suele hacer algo como esto:

Código: C
  1. for( i=0 ; i< 100; i++)
  2. {
  3.      __delay_ms(5);
  4. }

Eso no va a dar 500ms EXACTOS pero... ¿ quien usa delays para dar un valor exacto de tiempo?, para eso estan los timers.

Notaras que en C es muy parecido a ASM en el sentido de tener que trabajar con los registros.

Cualquier pregunta, podes realizarla aca o crear una nuevo post. Buena suerte!

Desconectado Strongpic

  • PIC10
  • *
  • Mensajes: 16
Re:MALA COMPILACION EN PIC
« Respuesta #6 en: 06 de Julio de 2016, 09:37:42 »
Claro comprendo que es un delay igual a los retardo(bucles anidados), pero tengo que declararlos como define a eso me refiero como desconcertante,como un requisito previo,gracias por responder,.Ahora estoy trabajando con interrupciones tanto en asm y C estare subiendo cuando salgan dudas
saludos!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:MALA COMPILACION EN PIC
« Respuesta #7 en: 06 de Julio de 2016, 14:27:02 »
Ese define es una macro. En realidad ya esta definido no recuerdo si es _delay_ms(). (Definido gracias a xc.h)

Lo que vos estas haciendo con el define es una "sustitucion"

Código: C
  1. #define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))

es decir si vos pones:

Código: C
  1. __delay_ms(5)

es lo mismo que hubieras puesto:

Código: C
  1. _delay((unsigned long)((5)*(_XTAL_FREQ/4000.0)))

_delay es una funcion que provee el compilador y que genera el delay de la cantidad de ciclos que le pidas, obviamente tiene un limite.
Como la cantidad de ciclos en un tiempo determinado va a variar segundo la frecuencia del oscilador, tambien te pide que definas _XTAL_FREQ, en si tu programa lo MINIMO que necesitas es:


Código: C
  1. #include <xc.h>
  2. #define _XTAL_FREQ 4000000
  3.  
  4. void main(void) {
  5.    
  6.     TRISB = 0x00;   //portb como salida(RB0,las demas desactivadas)
  7.     PORTB = 0X00;   //SALIDAS EN CERO
  8.    
  9.     while(1)
  10.     {
  11.         PORTBbits.RB0 ^= 1;          //led on
  12.         __delay_ms(5);
  13.     }
  14. }

Citar
BUILD SUCCESSFUL (total time: 471ms)
Loading code from /home/xxxxx/workspace/MPLAB/PIC16XC.X/dist/default/production/PIC16XC.X.production.hex...
Loading completed

Para que funcione ademas en fisico, necesitas agregarle los FUSES o bits de condifguracion. Que eso lo haces muy facil en MPLAB.
Y podes observar que no necesite del define, por que ya dentro del xc.h (y rodo lo que incorpora) esta esa funcion.


 

anything