Autor Tema: Aprendamos a usar e Cpik (mejor el SDCC)  (Leído 16184 veces)

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

Desconectado SimonMG

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 172
Re: Aprendamos a usar e Cpik (mejor el SDCC)
« Respuesta #15 en: 21 de Noviembre de 2006, 22:11:54 »
otra cosa muy importante la verdad que nunca entendi la libreria del PIC18F452  :? :? :? 
la mayoria de las librerias de los PIC son asi, si se logra desifrarlas podemos darle play al ADC y el RS232 con el 18F, de todas maneras dejen que me desaoge un poco con las clases y les explico la cocunicasión con rs232 con el 16F877 = 16F876 (!!!!PUBLICIDAD:compatible con la Sboard Publicada en el foro de proyectos!!!!)
"La politica es para ahora, una ecuacion es para siempre"
Albert Einstein

Desconectado SimonMG

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 172
Re: Aprendamos a usar e Cpik (mejor el SDCC)
« Respuesta #16 en: 22 de Noviembre de 2006, 23:17:56 »
les presento una nueva libreria para las cominicasiones rs232 con el SDCC sci.h en el estan todas las configurasiones para la comunicasión

/*************************************************************************** */
/* sci.h                                                                     */
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/* Rutinas para manejo del puerto serie del PIC                              */
/* Comunicaciones a 9600 baudios (Configuracion 8N1)                         */
/*---------------------------------------------------------------------------*/
/*  Simón Malavé   SEMG_7000@hotmail.com                                     */
/*---------------------------------------------------------------------------*/
/*  LICENCIA GPL                                                             */
/*****************************************************************************/

/****************************************************/
/* Configurar el puerto serie a N81 y 9600 Baudios  */
/****************************************************/
void sci_conf(void)
{
  SPBRG = 0x19;  //-- 9600 baudios (con cristal de 4MHz) ó ----> 0x81 9600 baudios a 20Mhz
  TXSTA = 0x24;  //-- Configurar transmisor
  RCSTA = 0x90;  //-- Configurar receptor
 
}

/******************************************/
/* Recibir un caracter por el SCI         */
/*----------------------------------------*/
/* DEVUELVE:                              */
/*   -Caracter recibido                   */
/******************************************/
unsigned char sci_read(void)
{
  //-- Eserar hasta que llegue el dato
  while (!RCIF);
   
  return RCREG;
}

/*****************************************/
/* Transmitir un caracter por el SCI     */
/*---------------------------------------*/
/* ENTRADAS:                             */
/*   -car: Caracter a enviar             */
/*****************************************/
void sci_write(unsigned char car)
{
  //-- Esperar a que Flag de lista para transmitir se active
  while (!TXIF);
   
  //-- Hacer la transmision
  TXREG=car;
}

/*--------------------------------------------------*/
/* Enviar una cadena por el puerto serie            */
/* NOTA: con esta funcion solo se pueden enviar     */
/* cadenas constantes y NO un puntero a una cadena  */
/* Observar que se usa el atributo __code           */
/* No esta soluconado todavia en el SDCC 2.5.1      */
/* Ejemplo de uso:                                  */
/*    sci_cad("Hola");                              */
/*--------------------------------------------------*/
void sci_cad(__code unsigned char *cad)
{
  unsigned char i=0;
 
  while (cad!=0) {
    sci_write(cad);
    i++;
  } 
}

/*---------------------------------------------------------*/
/* Envio de una cadena por el puerto serie                 */
/* Con esta funcion si podemos enviar punteros a cadenas,  */
/* pero no cadenas constantes                              */
/* Ejemplo de uso:                                         */
/*     sci_cad2(mi_cadena);                                */
/*---------------------------------------------------------*/
void sci_cad2(unsigned char *cad)
{
  unsigned char i=0;
 
  while (cad!=0) {
    sci_write(cad);
    i++;
  } 
}


creo que esta muy claro de todas maneras les dejo un ejemplo de como enviar una cadena 
« Última modificación: 22 de Noviembre de 2006, 23:29:44 por SimonMG »
"La politica es para ahora, una ecuacion es para siempre"
Albert Einstein

Desconectado SimonMG

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 172
Re: Aprendamos a usar e Cpik (mejor el SDCC)
« Respuesta #17 en: 22 de Noviembre de 2006, 23:23:57 »
ahora si!! un pequeño ejemplo de como enviar una cadena por el puerto serial

/*************************************************************************** */
/* rs232_c.c                                                       */
/*---------------------------------------------------------------------------*/
/* Enviar una cadena por el puerto serie cada vez que se recibe un caracter  */
/*---------------------------------------------------------------------------*/
/*  Simón Malavé SEMG_7000@hotmail.com                                     */
/*---------------------------------------------------------------------------*/
/*  LICENCIA GPL                                                             */
/*****************************************************************************/

//-- Especificar el pic a emplear
#define __16f877
#include "pic16f877.h"

//-- Se usa la libreria de comunicaciones serie
#include "sci.h"


/*********************************/
/* Programa principal            */
/*********************************/
void main(void)
{
 
  //-- Configurar el puerto B
  //-- Todos los pines de entrada, salvo RB1 de salida, que es
  //-- donde esta el led
  TRISB=0xFD;
 
  //-- Configurar las comunicaciones serie
  sci_conf();
 
  //-- Bucle infinito
  for (;;) {
    //-- Esperar a que llegue dato
    sci_read();
   
    //-- Cambiar el led de estado
    PORTB^=0x02;
   
    //-- Enviar la cadena por el puerto serie
    sci_cad("Hola como estas...");
   
   
  }

}

el programa esta claro esto nos servira para desarrollar proyectos mas completos como un pequeño servidor para encender y apagar leds :D
todas las librerias deben estar dentro de la carpeta!!!!!!
se me olvidava les dejo un .zip con todo incluido
"La politica es para ahora, una ecuacion es para siempre"
Albert Einstein

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Aprendamos a usar e Cpik (mejor el SDCC)
« Respuesta #18 en: 23 de Noviembre de 2006, 04:15:32 »
Hola gracias lo voy a probar y te cuento
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado SimonMG

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 172
Re: Aprendamos a usar e Cpik (mejor el SDCC)
« Respuesta #19 en: 03 de Diciembre de 2006, 12:33:34 »
Buscando por la red (DIOS MIO SI QUE ES GRANDE) encontre un ejemplo de lectura y escritura de la eprom interna del PIC con un 18F :-/ :-/ :-/ :-/

aqui va:

// read and write eeprom of PIC18F2550 (and 18F2455, 18F4455, 18F4550)
// EEPROM size is 256 bytes
// (c) Raphael Wimmer. Licensed under GNU GPL v2 or higher

#include <pic18fregs.h>
#include <stdio.h>
#include <usart.h>

#pragma stack 0x300 0xff // set 64 byte stack at 0x300, needed by sdcc


void ee_write_byte(unsigned char address, unsigned char *_data){

    EEDATA = *_data;
    EEADR = address;
    // start write sequence as described in datasheet, page 91
    EECON1bits.EEPGD = 0;
    EECON1bits.CFGS = 0;
    EECON1bits.WREN = 1; // enable writes to data EEPROM
    INTCONbits.GIE = 0;  // disable interrupts
    EECON2 = 0x55;
    EECON2 = 0x0AA;
    EECON1bits.WR = 1;   // start writing
    while(EECON1bits.WR){
        _asm nop _endasm;}
    if(EECON1bits.WRERR){
        printf("ERROR: writing to EEPROM failed!\n");
    }
    EECON1bits.WREN = 0;
    INTCONbits.GIE = 1;  // enable interrupts
}

void ee_read_byte(unsigned char address, unsigned char *_data){
    EEADR = address;
    EECON1bits.CFGS = 0;
    EECON1bits.EEPGD = 0;
    EECON1bits.RD = 1;
    *_data = EEDATA;
}

void initUsart()
{
    usart_open(    // Use USART library to initialise the hardware
            USART_TX_INT_OFF
            & USART_RX_INT_OFF
            & USART_BRGH_HIGH
            & USART_ASYNCH_MODE
            & USART_EIGHT_BIT,
            10                      // '10' = 115200 Baud with 20 MHz oscillator and BRGH=1
            );
    stdout = STREAM_USART;
}



// very simple example. use on an erased eeprom

void main(){
    char save_me = 'x';
    char from_eeprom;

    initUsart();
   
    printf("EEPROM-Demo\n");
    ee_read_byte(0x00, &from_eeprom);
    printf("Char read from 0x00: %c\n", from_eeprom);
   
    ee_write_byte(0x00, &save_me);
    printf("Char written to 0x00: %c\n", save_me);
   
    ee_read_byte(0x00, &from_eeprom);
    printf("Char read from 0x00: %c\n\n", from_eeprom);
}

Es facil de entender se puede dividir el programa para generar una libreria de lectura y escritura de eprom otra cosa que me parecio extrana es que el autor señala que este comando debe ir por defecto: #pragma stack 0x300 0xff // set 64 byte stack at 0x300, needed by sdcc aqui termina, el programa utiliza otra libreria de comunicasión serial que se encuentra en la carpeta de sdcc

saludos y suerte  :mrgreen: :mrgreen: :mrgreen:




"La politica es para ahora, una ecuacion es para siempre"
Albert Einstein

Desconectado SimonMG

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 172
Re: Aprendamos a usar e Cpik (mejor el SDCC)
« Respuesta #20 en: 03 de Diciembre de 2006, 12:45:17 »
El programa que e publicado enteriormente aparte de su utilidad da luz de como se puede utilizar las librerias de los 18F que tan complicadas son, !se estan aclarando!!
"La politica es para ahora, una ecuacion es para siempre"
Albert Einstein

Desconectado SimonMG

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 172
Re: Aprendamos a usar e Cpik (mejor el SDCC)
« Respuesta #21 en: 03 de Diciembre de 2006, 19:18:35 »
Una lamentable noticia, revisando por el foro de sdcc parece ser que los 18F solo funcionan con la versión 2.6 una mala noticia para los que utilizamos distribuciones de linux basadas en debian ya que los repositorios todavia no ponen la v2.5 como estable, quienes puedan instalar el sdcc v2.6 pueden utilizar los pic 18f, otra cosa me gustaria que si se puede me muestren un ejemplo sencillo en C18 de MPlab para el pic 18F452 por ejemplo la comuncación rs232 o encender unos led, les agradeceria mucho es solo para comparar.

gracias y saludos
"La politica es para ahora, una ecuacion es para siempre"
Albert Einstein

Desconectado SimonMG

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 172
Re: Aprendamos a usar e Cpik (mejor el SDCC)
« Respuesta #22 en: 07 de Diciembre de 2006, 19:08:38 »
PORFINNNNNNNNN :-/ :-/ :-/ :-/ :-/ :-/ :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:

Pude hacer un programa en Cpik, tenia problemas con las configurasiones rs232 pero ya las resolvi

 :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ aqui va....

#include <macro.h>
#include <rs232.h>
#include <p18f452.h>

void rs232_init()
{
   TRISC |= 0b10000000 ; // set bit 7 (input)
   // setbit(TRISC,7) ;
   TRISC &= 0b10111111 ;  // clear bit 6 (output)
   // clrbit(TRISC,6) ;
   
   //  0b00100100 ; // tx enabled, hi speed
   TXSTA =  bit(TXEN) | bit(BRGH) ;
   
   // 0b10010000 ; // serial port enabled, 8 bits,
   // continuous rx enabled, no it
   RCSTA =  bit(SPEN) | bit(CREN) ; 
   
   //  creo que 0x86 es 9600b a 20Mhz
   SPBRG =  103 ; // este es a 9600 @ 16Mhz
   // clear PIE1<4> = disable transmit it   
   // clear PIE1<5> = disable receive it
   PIE1 &=  0b11001111 ;
}

void rs232_putchar(char c)
{
   if( c == '\n' ) // LF -> CR-LF
   {
      while( !(PIR1 & 0b00010000) ) ; // wait for TXREG empty
      TXREG = '\r'  ;
      nop() ; nop() ; // because TXREG needs 2 instr to be valid   
   }
   while( !(PIR1 & 0b00010000) ) ; // wait for TXREG empty
   TXREG = c ;   
}
// blocking rs232 read
char rs232_getchar()
{
   if( RCSTA & 4) // framing error ?
      PRODH = RCREG ; // clear it by reading RCREG
   if( RCSTA & 2) // overrun error ?
      RCSTA &= ~0b00010000 ;   // clear bit CREN
      
   RCSTA |= 0b00010000 ;
   while( !( PIR1 & 0b00100000) ) ; // wait for RCREG full
   return RCREG ;
}


void main(void)
{

   TRISB |= 0b00000000 ;

   rs232_init();

for (;;) {


            }
 
}               

el progrmama configura el rs232, luedo les ponfo las configurasiones como una libreria adicional para que no se compliquen


« Última modificación: 07 de Diciembre de 2006, 19:15:11 por SimonMG »
"La politica es para ahora, una ecuacion es para siempre"
Albert Einstein

Desconectado MicroExpert

  • PIC10
  • *
  • Mensajes: 19
    • JDM
Re: Aprendamos a usar e Cpik (mejor el SDCC)
« Respuesta #23 en: 28 de Marzo de 2007, 12:07:49 »
Hola..
Me pueden ayudar con este problema….
Resulta que estoy utilizando el SDCC, para compilar programas escritos en C, utilizando los PIC, específicamente el 16F877A.

Utilizando la linea de comandos.

Al ejecutar:
SDCC.exe  -mpic14 -p16f877a  test.c
Todo funciona bien y obtengo el test.asm
Ahora al ejecutar:
Mpasmwin.exe  /q /o test.asm
Todo bien y obtengo el test.o
Finalmente para obtener el test.hex ejecuto:
mplink.exe 16f877a.lkr test.o libsdcc.lib /m test.map /o test.out
y obtengo el siguiente mensaje:

MPLINK 4.06, Linker Copyright (c) 2006 Microchip Technology Inc. Error - Coff file '' does not appear to be a valid COFF file. Error - Could not build member ''in library file 'D:\Archivos de programa\Microchip\Project\Test2\pic16f877a.lib'.
 Errors    : 2  BUILD FAILED: Tue Mar 27 18:49:33 2007.


Siguiendo otra forma, ahora utilizando el entorno de desarrollo de MPLAB
Utilizo el test.asm y procedo a ensamblar como se muestra en la figura adicionando el 16f877a.lkr y libsdcc.libY obtengo el mismo error…


 

Alguien sabe como obtener el Hex, utilizando las herramientas del MPLAB

Archivos utilizados:
Archivos

 
« Última modificación: 05 de Junio de 2007, 13:28:38 por MicroExpert »
Aprender es facil, intentalo.
Mi Pagina

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Aprendamos a usar e Cpik (mejor el SDCC)
« Respuesta #24 en: 28 de Marzo de 2007, 15:06:35 »
A pero este es bajo windows y el que estaba mostrandonos el uso SIMONMG es bajo linux
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado MicroExpert

  • PIC10
  • *
  • Mensajes: 19
    • JDM
Re: Aprendamos a usar e Cpik (mejor el SDCC)
« Respuesta #25 en: 29 de Marzo de 2007, 11:32:47 »
Es verdad...
Pero estoy siguiendo los mismos pasos que indica la ayuda del SDCC para emsambrar con el  MPLAB..
Y al parecer solo falla en la obtencion del .hex..Ya llevo 5 dias tratando de solucionar esto y nada que ver...
Si alguien sabe por que no se obtiene el .hex.   escriban

Gracias
Aprender es facil, intentalo.
Mi Pagina

Desconectado SimonMG

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 172
Re: Aprendamos a usar e Cpik (mejor el SDCC)
« Respuesta #26 en: 29 de Marzo de 2007, 12:50:20 »
porq trabajas en Windows con sdcc, es preferible trabajar con MPLAP, el problema con sdcc es el manejo de librerias coloca la libreria del 16F877 en la misma carpeta en donde esta el programa, animo es dificil, pero no imposible, además el mensaje de error menciona probleamas con las librerias... pero creo que no hay razon para complicarse en windows, hay muchos compiladores en C para windows en cambio en linux solo hay dos Cpik (ya ta frito :?) y el sdcc

saludos y suerte  :-/
"La politica es para ahora, una ecuacion es para siempre"
Albert Einstein

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Aprendamos a usar e Cpik (mejor el SDCC)
« Respuesta #27 en: 29 de Marzo de 2007, 17:46:19 »
Estoy siguiendo los pasos de este link, aprendiendo a usar el SDCC bajo win (aún no dispongo del linux :?) y al parecer este compilador lleva el .c a .asm pero con otra nomenclatura, y quiero saber si el que sirve es el gpasm ¿es así?
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado SimonMG

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 172
Re: Aprendamos a usar e Cpik (mejor el SDCC)
« Respuesta #28 en: 30 de Marzo de 2007, 00:57:01 »
no se en detalles la diferencia de gpasm y el asm del MPALB se que las hay pero no se donde, igual que el sdcc y C18, el cpik y el sdcc, etc... yo personal mente recomiendo que si an a trabajar en linux utilicen las erramientas de linux, en cambio si trabajan con windows utilicen las erramientas de windows, en resumen se le hará mas facil de cualquiera de las dos maneras. Por mi parte reinstale Windows en mi computadora, "Pro ahora" debo agragar ya que viene una nueva por hai... http://www.vit.com.ve/ o una Siragon todavia no me decido...

Saludos
"La politica es para ahora, una ecuacion es para siempre"
Albert Einstein

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Aprendamos a usar e Cpik (mejor el SDCC)
« Respuesta #29 en: 30 de Marzo de 2007, 11:20:03 »
Hola Simon. esas compu que salen en la página lucen muy bien.

yo quisiera meterle mano a linux, hay que tener conocimientos de éste por lo del cambio de plataforma que impulsa el gobierno, y mientras estoy en esa , le estoy dando mano al SDCC por el win, y he hecho unos avances:

pude hacer la primera compilación, el ejemplo lo tomé de este link
se llama test.c

Código: C
  1. #define __16f84
  2. #include"pic16f84.h"
  3.  
  4. // Set the __CONFIG word:
  5. typedef unsigned int word;
  6. word at 0x2007  __CONFIG = 0x3ff1;
  7.  
  8. unsigned char count;
  9.  
  10. void main(void) {
  11.  
  12.         TRISA = 0;
  13.         count = 0;
  14.         while(1) {
  15.                 PORTA = count;
  16.                 count ++;
  17.         }
  18.  
  19. }

el makefile según la fuente consultada deber ser así:

sdcc -mpic14 -p16f84 test.c

si todo va bien te apareceran 5 archivos:

test.asm
test.cod
test.hex
test.lst
test.o

quiere decir que crea el .hex de una vez

como yo no conozco el ANSI C, y corrijanme por favor: de allí vienen ese .o y unas librerias que existen dentro del directorio SDCC .lib que según leí por ahí son codigos ya compilados.

estoy probando con la versión 2.6.5 #4 719 28-mar-2007

cuando se termina de instalar el compilador, pregunta si desea que la ruta del SDCC sea declarada como variable de entorno, es decir, como path

esto es útil porque puedo crear los fuentes desde cualquier carpeta en mi disco duro,

para ir mas allá me fui al proteus y coloqué las lineas del makefile en el Define Code Generation tools




aquí estoy generalizando con el 16f84 y luego le doy build desde el proteus y ¡perfecto!

me hace la simulación:




hasta aquí todo bien, ahora quiero meterle un retardo de 1 Mega ciclos con el archivo de cabecera delay.h pero ya me tranqué... no se como se hace.. la función es:

void delay1mtcy(unsigned char) __wparam;

y al compilar me genera errores en todas las lineas :(

este es el nuevo código:

Código: C
  1. #define __16f84
  2. #include"pic16f84.h"
  3. #include"pic16/delay.h"
  4.  
  5. // Set the __CONFIG word:
  6. typedef unsigned int word;
  7. word at 0x2007  __CONFIG = 0x3ff1;
  8.  
  9. unsigned char count;
  10.  
  11. void main(void) {
  12.  
  13.         TRISA = 0;
  14.         count = 0;
  15.         while(1) {
  16.                 PORTA = count;
  17.                 count ++;
  18.                                 delay1mtcy("1");
  19.         }
  20.  
  21. }

y los horrores... perdón los errores:




fuente consultada:

Installing and using SDCC on Linux

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek