Autor Tema: Ejemplitos en C para 16F648A  (Leído 736289 veces)

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

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Ejemplitos en C para 16F648A
« Respuesta #435 en: 17 de Octubre de 2009, 22:48:21 »
Código: [Seleccionar]
value=getchar();

printf("%C",value);


Eso de atrás, toma un dato por RS232, luego lo envía.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ejemplitos en C para 16F648A
« Respuesta #436 en: 17 de Octubre de 2009, 23:23:06 »
Por aquí hay ejemplos de uso de 2 comunicaciones seriales en un PIC, como recibir/enviar con cada bus.-


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado bakhosm

  • PIC10
  • *
  • Mensajes: 5
Re: Ejemplitos en C para 16F648A
« Respuesta #437 en: 17 de Octubre de 2009, 23:55:02 »
gracias suky y PICmouse, estare probando...

Desconectado bakhosm

  • PIC10
  • *
  • Mensajes: 5
Re: Ejemplitos en C para 16F648A
« Respuesta #438 en: 18 de Octubre de 2009, 01:23:15 »
sigo con el mismo problema pero ahora el PIC2 transmite nada, tome el ejemplo de Suky y lo adapte a lo que necesitaba (y creo que le falta mas al codigo), llevo dias con esto, y se que estoy cerca pero no hallo la solucion  :? :(


les adjuntaré el esquematico y los codigos a ver si me pueden ayudar

el del PIC1 no es nada complicado, solo un envio de mensaje para poder hacer la comunicacion

Código: [Seleccionar]
#include <16F877A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#use delay (clock=4000000)
#use RS232 (baud=9600,parity=N,xmiT=PIN_C6,rcv=PIN_C7,bits=8)

void main(void)
{
printf("  Bienvenidos...   \rSistema Encendido\r");
}


cuando coloco el codigo de la pagina que dijo suky en el PIC2 el terminal de proteus no se ve nada, aqui se los dejo

Código: [Seleccionar]
#include <16F877A.h>
#include <string.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#use delay (clock=4000000)
#use RS232 (STREAM= ROBOT, baud=9600,parity=N,xmiT=PIN_C4,rcv=PIN_C5,bits=8)
#use RS232 (STREAM= PC,baud=9600,parity=N,xmiT=PIN_C6,rcv=PIN_C7,bits=8)   

char string_robot[16];
char string_pc[16];
int1 kbhit_robot=0; // Para saber si llego dato desde la alarma.
int1 kbhit_pc=0; // Para saber si llego dato desde el modem.

#int_EXT
void ext_isr()
{
 gets(string_pc,PC);
 kbhit_pc=1;
}

#int_RDA
void rda_isr()
{
 gets(string_robot,robot);
 kbhit_robot=1;
}

void main(void)
{
printf("esperando dato");

SET_TRIS_C(0b10100000);
 ext_int_edge(H_TO_L);
 enable_interrupts(int_RDA);
 enable_interrupts(int_EXT);
 enable_interrupts(GLOBAL);
while(1)
 {
  while(kbhit_robot==0&&kbhit_pc==0){} //Espero a que llegue dato desde algun dispositivo.
       if(kbhit_robot)
       {
        fprintf(ROBOT,"\n\rEl dato de la alarma fue: %s",string_robot);
       }
       if(kbhit_pc)
       {
        fprintf(PC,"\n\rEl dato del modem fue: %s",string_robot);
       }
  kbhit_robot=0;
  kbhit_pc=0; // Reinicio bandera para proxima espera.
 }
}

Tengo proteus 7.6 SP0 y el compilador de C es CCS COMPILER 4.023  (IDE / PCB / PCM / PCH)

a ver si ustedes lo ven desde otra perspectiva, xq de verdad no doy con la falla.

de antemano muchas gracias

Desconectado bakhosm

  • PIC10
  • *
  • Mensajes: 5
Re: Ejemplitos en C para 16F648A
« Respuesta #439 en: 18 de Octubre de 2009, 21:22:12 »
 :-/ :-/ :-/ :-/ :-/ :-/ :-/ :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:


LISTOOOOOOOOOOO LO LOGREEEE  :mrgreen: :mrgreen: :-/ :-/ :-/

logre la comunicacion entre los dos pics y la pc el problema era el proteus que no funcionaba el CPP y no funcionaba la simulacion del hiperterminal, no funciono ni el 7.6 SP0 mni el 7.5 SP3

alguna sugerencia???

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Ejemplitos en C para 16F648A
« Respuesta #440 en: 18 de Octubre de 2009, 21:50:28 »
no confíes mucho en el proteus, si ayuda bastante, pero a veces trae más de un dolor en la panza

que bien que ya te haya funcionado
.

Desconectado bakhosm

  • PIC10
  • *
  • Mensajes: 5
Re: Ejemplitos en C para 16F648A
« Respuesta #441 en: 18 de Octubre de 2009, 23:06:57 »
si eso aprendi de esta experiencia, perdi toda la noche de ayer solo y media mañana con un amigo probando gracias a el logre hacer un protocolo y detectar la falla jeje...

en un rato quemo los pics cuando termine mi proyecto publico el protocolo que usé para que funcionará.


mi proyecto lleva sensor de ultrasonido PING )) de paralax, seguire con el programa, tengo un codigo en ASM, a ver como lo adapto sin usar #ASM y #ENDASM


Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re: Ejemplitos en C para 16F648A
« Respuesta #442 en: 25 de Octubre de 2009, 20:03:45 »
Que tal amigos!
Aqui les coloco un nuevo ejemplito  :mrgreen:
Esta vez se trata del juego de luces del auto fantastico;-)

Citar
// Luces del auto fantastico por Ralf2, Foro todopic!
#include <16F876a.h>
#device adc = 10
#use delay (CLOCK = 4000000)
#fuses XT,NOWDT,NOLVP
#byte port_b=6
#byte port_c=7
#use fast_io(all)

void main()
{
   int x;
   port_b=0;
   port_c=0;
   set_tris_b(0);
   set_tris_c(0);
   port_b=1;
   while(1)
   {
     for (x=0;x<=14;x++)
      {
        shift_left(&port_b,2,0);
        delay_ms(100);
      }
     
        for (x=0; x<=14;x++)
         {
           shift_right(&port_b,2,0);
           delay_ms(100);
         }
   }
   
}

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Ejemplitos en C para 16F648A
« Respuesta #443 en: 18 de Noviembre de 2009, 19:59:29 »
Hola, alguien puede decirme porque en este codigo de VsZeNer puedo cambiar los mensajes excepto el primero.

Código: CSS
  1. ////////////////////////////////////////////////////////////////////////////////////
  2. //                     VsZeNeR"05      
  3. //                     30/Agosto/05
  4. //
  5. //   Programa:   Escribir & leer eeprom interna del PIC y mostrarla por lcd
  6. //   Version:   0.0
  7. //
  8. //   Dispositivo: PIC 16F648A         Compilador:    CCS vs3.227
  9. //   Entorno IDE: MPLAB IDE v7.21      Simulador:    Proteus 6.7sp3
  10. //
  11. //   Notas: Se muestra por pantalla de lcd(LM016L) la informacion grabada en la memoria
  12. //         interna del PIC(eeprom) y luego se muestra por la lcd
  13. //         Se utiliza variables locales:
  14. //            ·LAST_VOLUME -> posicion a grabar en la eeprom del pic
  15. //            ·mensaje1[] -> contiene 1º mensaje a escribir en eeprom y mostrar en lcd
  16. //            ·mensaje2[] -> contiene 2º mensaje a escribir en eeprom y mostrar en lcd
  17. //            ·mensaje3[] -> contiene 3º mensaje a escribir en eeprom y mostrar en lcd
  18. //            ·mensaje4[] -> contiene 4º mensaje a escribir en eeprom y mostrar en lcd
  19. //            ·volume -> contiene mensaje leido por la eeprom interna del pic
  20. //         Tener en cuenta que hay que poner la directiva NOLVP para que el pin B4 sea de
  21. //         salida.
  22. //   Conexiones:      B0 -> E            
  23. //               B1 -> RS        
  24. //               B2 -> RW      
  25. //               B4 -> D4        
  26. //               B5 -> D5            
  27. //               B6 -> D6  
  28. //               B7 -> D7                  
  29. //////////////////////////////////////////////////////////////////////////////////
  30.  
  31. #include <16f648a.h>            //pic a utilizar          
  32. #fuses XT,NOWDT,NOPROTECT,PUT,NOLVP      //ordenes para el programador
  33. #use delay (clock=4000000)         //Fosc=4Mhz
  34. #define use_portb_lcd TRUE         //definir portb lcd
  35. #include<lcd.c>                  //libreria manejo lcd
  36.  
  37.      
  38. ///PROGRAMA
  39. void main(void)
  40. {
  41.   char LAST_VOLUME=0,volume;      //variables de direccion escritura eeprom y mensaje
  42.   char mensaje1[]="VsZeNeR"05";   //mensajes...
  43.    char mensaje2[]="HOLA";
  44.    char mensaje3[]="FORO";
  45.    char mensaje4[]="TODOPIC!";      //a escribir en eeprom interna y mostrar en lcd  
  46.      
  47.    lcd_init();                  //inicializa lcd
  48.    
  49.    write_eeprom(LAST_VOLUME,mensaje1);   //escritura de los mensajes...
  50.    LAST_VOLUME++;
  51.    write_eeprom(LAST_VOLUME,mensaje2);
  52.    LAST_VOLUME++;
  53.    write_eeprom(LAST_VOLUME,mensaje3);
  54.    LAST_VOLUME++;
  55.    write_eeprom(LAST_VOLUME,mensaje4);   //...en la eeprom interna(0 hasta la 3)
  56.    
  57.    for( ; ; ){   //bucle...
  58.       for(LAST_VOLUME=0;LAST_VOLUME<4;LAST_VOLUME++){   //bucle que recorre las posiciones de eeprom
  59.       volume = read_EEPROM (LAST_VOLUME);            //almacena mensaje de la direccion eeprom
  60.       printf(lcd_putc,"%s",volume) ;               //muestra mensaje por pantalla lcd
  61.       delay_ms(500);
  62.       lcd_putc("f" );                           //borra pantalla lcd
  63.       }      //...infinito
  64.    }
  65. }
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ejemplitos en C para 16F648A
« Respuesta #444 en: 18 de Noviembre de 2009, 21:37:13 »
Revisa por aquí, se comenta el mismo problema y Mig explica como se debe hacer correctamente.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado delth

  • PIC10
  • *
  • Mensajes: 4
Re: Ejemplitos en C para 16F648A
« Respuesta #445 en: 13 de Diciembre de 2009, 23:58:29 »
Hola Vszener,

 Primero que nada muchas gracias por tus valiosas contribuciones en este foro...

Estoy tratando de probar los ejemplos pero me marca el siguiente error al compilar el ejemplo del "Parpadeo de un led cada 0.5s":

*** Error 24 "C:\Program Files\PICC\devices\18f452.h" Line 2(9,18): Unknown device type
      1 Errors,  0 Warnings.

Este es mi escenario (integrando el compilador CCS en Mplab y modificando el codigo para usar el Pic18F452 en lugar del Pic16F648A):
MPLAB  8.40
CCS 4.13 (Demo Version)
ICD2 Debugger
PIC18F452 (Device)
PICDEM 2 PLUS (Target)

De antemano muchas gracias.


Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Ejemplitos en C para 16F648A
« Respuesta #446 en: 16 de Diciembre de 2009, 05:23:55 »
Buenas delth:

Asegurate que la librería de tu dispositivo se encuentra en la siguiente dirección: C:\Program Files\PICC\devices\


Un saludi. ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Cortijero

  • PIC12
  • **
  • Mensajes: 57
Re: Ejemplitos en C para 16F648A
« Respuesta #447 en: 07 de Abril de 2010, 07:20:26 »
Hola! estoy siguiendo este tutorial, pero me he atascado  :(
Estoy intentando hacer el programita de la lcd y el teclado matricial, pero no soy capaz. A ver si alguien por aqui me puede ayudar (he creado un tema con esta duda, pero creo que antes deberia haber preguntado aqui )
La cuestion es que lo hago todo tal cual esta aqui, a excepcio del pic, que uso un 18f4550. Baje las bibliotecas, las puse en su lugar.... y nada de nada... Este es el codigo, a ver si veis algun error, que yo ya me he cegado y no veo nada :oops:

Código: [Seleccionar]
#include <18F4550.h>           //Libreria del PIC
#fuses XT,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN,NOPBADEN //Configuracion de los fuses:
#use delay (clock=4000000)    //Configuramos oscilador a 4Mhz
#include <lcd2.c>   //Libreria para la lcd
#include <kbd3x4.c>   //Libreria para teclado matricial
#use fast_io(A)
#use fast_io(B)


//---------- PROGRAMA PRINCIPAL ----------------
void main ()
{
   char tecla;   //almacena tecla pulsada
   lcd_init();      //inicializa lcd
   lcd_putc("Tecla pulsada:\n");   
   for(;;){
      do{               //espera hasta que se pulse una tecla
         tecla=kbd_getc();   
         }while(tecla==0);
         
      printf(lcd_putc,"%c",tecla);      //muestra tecla
      lcd_putc("\b");            //retrocede una posicion
      }      //...infinito
     
}

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: Ejemplitos en C para 16F648A
« Respuesta #448 en: 07 de Abril de 2010, 19:07:37 »
creo que el problema esta en la forma que configuras el oscilador fijate en la pagina 24 del datasheet. Si utilizas un cristal XT no es necesario activar el PLL ni el USBDIV.
Código: [Seleccionar]
#fuses XT,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,CPUDIV1,NOVREGEN,NOPBADEN a ver si resuelve tu problema.

Saludos!

PD: Si vas a utilizar el USB el fuse correcto para llegar a los 48 MHz  sería XTPLL pero ya es otro tema.
LAS MALVINAS SON ARGENTINAS!

Desconectado RAMON292

  • PIC10
  • *
  • Mensajes: 1
como hacemos para incrementar 2 numeros.
« Respuesta #449 en: 25 de Abril de 2010, 22:07:21 »
Hola a todo .- Aprovecho para felicitarlo a todo por este mundo en la electronica.- ya que para mi "PIC" es palabra mayor .--

Mi problema estoy haciendo un contador 0000 a 9999 .-  lo tengo funcionando pero no estoy entendiendo como hacer ya que quiero que me sume Ej: 12 + 12 + 12 + ...  y visualizar en resultado en dysplay.- 7 seg.-

le paso el codigo para que me lo analicen .- ya que no se como encarar la suma   el incremento lo hace trave de un pulsador por interupcion de cambio de estado.-

#include "16F628A.h"            //Incluye el fichero de símbolos y etiquetas.
#use delay (clock=4000000)      //Define la frecuencia del oscilador.
#fuses HS,NOWDT,NOPUT,NOBROWNOUT,NOLVP,NOPROTECT,NOCPD//Define palabra de conf. para la grabación del micro.
#use fixed_io(a_outputs=PIN_A0,PIN_A1,PIN_A2,PIN_A3)
#use fixed_io(b_outputs=PIN_B0,PIN_B1,PIN_B2,PIN_B3)
///VARIABLES GLOBALES
int   di2=0,di1=0,di0=0,di3=0;
int16 var=0;
//LLAMADA FUNCION INTERRUPCION

#INT_RB

void cualquiercosa()

{

if(input(PIN_B4))                //se ingreso dato?

{
var++;                        //var aumenta 1.
if(var>=1) var=0,di3++;           //var es mayor o igual a 1? si=>var=0 y di2 aumenta 1.
if(di3==10) di3=0,di2++;
if(di2==10) di2=0,di1++;          //di2 es igual a 10? si=>di2=0 y di1 aumenta 1.
if(di1==10) di1=0,di0++;          //di1 es igual a 10? si=>di1=0 y di0 aumenta 1.
if(di0==10) di0=0;                //di0 es igual a 10? si=>di0=0.

}
}


///PROGRAMA
void main(void)
{
 
   enable_interrupts(INT_RB);  //Activa Interrupcion por Cambio de Estado de PIN
   enable_interrupts(GLOBAL);      //Habilita Interrupciones globales
   

   
     
   while (true)
     
   {  output_a(0);                //Saca por el Puerto A el valor 0 (todos en low)
      output_high(PIN_A3);        //Habilita di2
      output_b(di3);              //Saca por el Puerto B el valor de di2
      delay_ms(10);               //retardo
      output_a(0);                //Saca por el Puerto A el valor 0 (todos en low)
      output_high(PIN_A2);        //Habilita di2
      output_b(di2);              //Saca por el Puerto B el valor de di2
      delay_ms(10);               //retardo
      output_a(0);
      output_high(PIN_A1);           //Saca por el Puerto A el valor 0 (todos en low)
      output_b(di1);              //Saca por el Puerto B el valor de di1
      delay_ms(10);               //retardo
      output_a(0);
      output_high(PIN_A0);        //Habilita di0
      output_b(di0);              //Saca por el Puerto B el valor de di0
      delay_ms(10);
       }
}

desde ya muchas gracias.-