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

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

Desconectado camhost1

  • PIC12
  • **
  • Mensajes: 51
Re: Ejemplitos en C para 16F648A
« Respuesta #480 en: 18 de Noviembre de 2013, 19:25:37 »
Hola amig@s. Aprovechando esta serie de ejemplos que han posteado y muy buenos, quisiera generar una duda respecto a hacer que un led parpadee, les comento la siguiente cuestión: he hecho varios ejemplos sobre esto, pero todos han sido de la misma forma, es decir, cuento por ejemplo con un pulsador conectado en RA0 y cuando lo presiono me genera una salida o serie de salidas en el puerto B para hacer que varios leds parpadeen durante cierto tiempo, pero esto es por cada pulso que le doy al botón. Ahora tengo la siguiente duda: ¿Cómo puedo hacer que un led o varios leds parpadeen cada vez que mantenga presionado un botón? es decir, que una vez que suelte el pulsador el led o los leds dejen de parpadear, quisera saber cómo puedo hacer esto. Gracias y sigan compartiendo tan buenos ejemplos.
con instrucciones de control, mientras que el pin x esta en alto, prenda leds, si no apague.

Desconectado samayala2011

  • PIC10
  • *
  • Mensajes: 1
Re: Ejemplitos en C para 16F648A
« Respuesta #481 en: 12 de Diciembre de 2013, 19:10:38 »
amigos por favor necesito de su ayuda, necesito un contador con dos display usando 2 pulsadores uno para que ascienda y el otro para que descienda. inicialmente debe comenzar en el numero 30 y si se presiona un botom debe bajar 1 digito y si se presiona otro botom debe subir un dijito. por favor ayudenme es para un  proyecto en automatizacion industrial. con lcd ya lo hice pero el profesor me lo esta pidiendo con 2 display y un pic 16f84a. les agradezco de antemano su ayuda. mi correo ayala-samuel@hotmail.com

Desconectado barincho

  • PIC10
  • *
  • Mensajes: 5
Re: Ejemplitos en C para 16F648A
« Respuesta #482 en: 30 de Julio de 2014, 18:47:34 »
buenas tardes, hace tiempo que estoy probando con lenguaje c, siempre saltan dudas o preguntas.
si me permiten les hago una consulta; yo diseñe un pcb en donde la RA4 (pic 16F84A) esta a "1" mediante una resistencia y la envio a cero atravez de un pulsador NA.
hasta ahi todo bien la placa con todos los componentes quedo perfecta. el problema se me genera en el programa, ya que el ccs, me tira errores. me explico en una parte del programa pregunto (if) si A4 es igual a 0, si uso = me tira error, si uso == lo acepta pero al correr el programa aplicando los estimulos (mplab) directamente lo pasa como si nada; quisiera saber como realizar dicha pregunta. que el programa espera hasta que yo pulse el NA para que el pin A4 de 5V pase a 0V, una vez leido el puerto siga con la ejecucion que yo desee
desde ya muchas gracias

Desconectado barincho

  • PIC10
  • *
  • Mensajes: 5
Re: Ejemplitos en C para 16F648A
« Respuesta #483 en: 30 de Julio de 2014, 18:58:09 »
buenas tardes, hace tiempo que estoy probando con lenguaje c, siempre saltan dudas o preguntas.
si me permiten les hago una consulta; yo diseñe un pcb en donde la RA4 (pic 16F84A) esta a "1" mediante una resistencia y la envio a cero atravez de un pulsador NA.
hasta ahi todo bien la placa con todos los componentes quedo perfecta. el problema se me genera en el programa, ya que el ccs, me tira errores. me explico en una parte del programa pregunto (if) si A4 es igual a 0, si uso = me tira error, si uso == lo acepta pero al correr el programa aplicando los estimulos (mplab) directamente lo pasa como si nada; quisiera saber como realizar dicha pregunta. que el programa espera hasta que yo pulse el NA para que el pin A4 de 5V pase a 0V, una vez leido el puerto siga con la ejecucion que yo desee
desde ya muchas gracias

Desconectado juanfro

  • PIC10
  • *
  • Mensajes: 1
problemas con 16f877a
« Respuesta #484 en: 15 de Septiembre de 2014, 19:32:08 »
tengo un problema con el16f877a, creo que es mi prorama, sucede que cuando lo simulo en proteus me ejecuta todo el programa normal, pero cuando grabo el programa en el pic y lo ejecuto en mi protoboard no sucede nada, ya comprobe el pic y el grabador haciendo otro programita simple y me ejecuta normal en mi protoboard.Les dejo mi programita haber si alguien me ayuda.
*************
el programa consiste en un teclado 3X4, un LCD 2x16, una memoria eeprom y el PIC16F877a
al ingresar una clave de 4 digitos, si es correcta, graba una serie de datos en la eeprom, al ingreso de cada digito te muestra en el display.utilizo la interrupcion de timer para originar un calendario , esto me sirve para que cada vez que ingrese(acceda la clave) se guarde la fecha y hora en la eeprom.


*****************
#include <16F877a.H>
#fuses XT, NOWDT, NOPROTECT, NOLVP
#use delay(clock = 4000000)
#use i2c(master,sda=PIN_C4,scl=PIN_C3)
#define use_portb_kbd TRUE
#define use_portd_lcd true
#include <lcd.c>
#include <kbd.c>
#include <stdlib.h>
#use RS232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7, BITS=8)
#rom 0x2100={'0','2','1','8','9','0','0','1','2','0','2','4','1','9','5','0','2','8','4','0','3','7','3','0','4','6','2','0','5','5','1','0'}
int Segundos=0;
int Year=14,Mes=9,Dia=04,Hora=18,Minuto=55;
int yeari,mesi,diai,horai,minutoi,c=0,d=0;
INT8 dato;
#define BISIESTO(year)(year%4 == 0)
#define EEPROM_ADDRESS long int
//timer///
#int_TIMER1
void  TIMER1_isr(void)//Función de interrupción por desbordamiento TMR1 
{
output_toggle(PIN_A3);
segundos++;
if(Segundos == 60) {Minuto++; Segundos=0;
    if(Minuto == 60) {Hora++; Minuto=0;
      if(Hora == 24) {Dia++; Hora=0;
        if (  (Dia == 29 && Mes==2 && !BISIESTO(Year))
           || (Dia == 30 && Mes==2)
           || (Dia == 31 && (Mes==4 || Mes==6 || Mes==9 || Mes==11 ))
           || (Dia == 32)
           ) {Mes++;Dia=0;}
           if(Mes == 13) {Year++; Mes=0;}
             }}}
             
set_timer1(0x0BDC);//carga del TMR1
}
 
 void write_ext_eeprom(long int address,BYTE data) //Escribir en la eeprom
 {
   short int status;
   i2c_start();
   i2c_write(0xA0);
   i2c_write(address>>8);
   i2c_write(address);
   i2c_write(data);
   i2c_stop();
   i2c_start();
   status=i2c_write(0xa0);
   while(status==1)
   {
   i2c_start();
   status=i2c_write(0xa0);
   }
 }
 BYTE read_ext_eeprom(long int address)
 {
 BYTE data;
 i2c_start();
 i2c_write(0xA);
 i2c_write(address>>11);
 i2c_write(address);
 i2c_start();
 i2c_write(0xa1);
 data=i2c_read(0);
 i2c_stop();
 return(data);
 }

#int_RDA
 void RDA_isr(){
EEPROM_ADDRESS  address=0;;
char keypress=' ';
      keypress=' ';
 if(kbhit()){                       
      Keypress=getc();
      switch (keypress){
      case 'I':                       
         WRITE_EXT_EEPROM(0,0);
        address=0;
         DATO=0;
         while(DATO<=254){
              address++;
            DATO=READ_EXT_EEPROM(address);
            printf("%u",dato);
             }
                     break;
         
        case 'O': 
        WRITE_EXT_EEPROM(0,0);
        address=0;
        lcd_gotoxy(1,1);
        printf(lcd_putc,"BORRANDO EEPROM");
        lcd_gotoxy(1,2);
          printf(lcd_putc,"PLEASE WAIT...     ");
       puts("BORRANDO EEPROM");
       while (d<=128){
       d++;
        while(c<=254){
              WRITE_EXT_EEPROM(address,255);
            address++;
           c++;
            }
            c=0;
          }       
          hora = hora+1;
            lcd_gotoxy(1,1);
            Printf(lcd_putc,"                 ");
            lcd_gotoxy(1,2);
            Printf(lcd_putc,"INGRESE PASSWORD");
             puts("EEPROM BORRADA");
           break;
         }
      }
}
//***** Programa Principal *****//
    void main()
{
 char k;
 int i,a=3;
char data[4],clave[31]; //matrices para guardar clave y datos
lcd_init();
kbd_init();
port_b_pullups(TRUE);
output_low(PIN_A0);
output_low(PIN_A2);//led Verde =off
output_low(PIN_A1);//led rojo=on

inicio: setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);//Setup timer: Reloj interno, preescaler= 8
enable_interrupts(INT_TIMER1);//Habilito interrupción particular del TIMER1
enable_interrupts(GLOBAL);//Habilito interrupciones globales
 enable_interrupts(INT_RDA);
set_timer1(0x0BDC);//Carga del TMR1
  while(TRUE){
 
   i=0;//posicion de la matriz
   lcd_gotoxy(1,2);
   Printf(lcd_putc,"INGRESE PASSWORD");//primer dato
        while(i<=3)
              {  //para cuatro datos
      k=kbd_getc();//lee el teclado
      if(k!=0)//si se ha pulsado alguna tecla
         {
          data=k;//se guarda en la posicion correspondiente
         i++;
         
         lcd_gotoxy(i+1,1);
         printf(lcd_putc,"*");//siguiente dato
          output_high(PIN_A0);
        delay_ms(50);
        Output_low(PIN_A0);
        delay_ms(300);
         }
      }
       for(i=0;i<=31;i++)
      {
      //pasa datos de eeprom a la matriz clave
      clave=read_eeprom(i);
      }
     if((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2])&&(data[3]==clave[3]))//clave 1
      {
      lcd_gotoxy(1,1);
      printf(lcd_putc,"\fBIENVENIDO");//compara los datos con la clave
      lcd_gotoxy(1,2);
      printf(lcd_putc,"J. PRUDENCIO");
     
       WRITE_EXT_EEPROM(a,101);
       a++;
      goto activa;
      }
     if((data[0]==clave[4])&&(data[1]==clave[5])&&(data[2]==clave[6])&&(data[3]==clave[7]))//Clave 2
      //compara digito a digito los valores almacenados en la eeprom y la clave introducida
      {
      lcd_gotoxy(1,1);
      printf(lcd_putc,"\fBIENVENIDO");
      lcd_gotoxy(1,2);
      printf(lcd_putc,"J. FIGUEROA");
       WRITE_EXT_EEPROM(a,102);
       a++;
      goto activa;
      }
     if((data[0]==clave[8])&&(data[1]==clave[9])&&(data[2]==clave[10])&&(data[3]==clave[11])) // clave 3
      {
      lcd_gotoxy(1,1);
      printf(lcd_putc,"\fBIENVENIDO");//compara los datos con la clave
      lcd_gotoxy(1,2);
      printf(lcd_putc,"J. TUESTA");
      WRITE_EXT_EEPROM(a,103);
       a++;
        goto activa;
      }
      if((data[0]==clave[12])&&(data[1]==clave[13])&&(data[2]==clave[14])&&(data[3]==clave[15])) // clave 4
      {
      lcd_gotoxy(1,1);
      printf(lcd_putc,"\fBIENVENIDO");//compara los datos con la clave
      lcd_gotoxy(1,2);
      printf(lcd_putc,"P. VENTURA");
      WRITE_EXT_EEPROM(a,104);
       a++;
      goto activa;
      }
      if((data[0]==clave[16])&&(data[1]==clave[17])&&(data[2]==clave[18])&&(data[3]==clave[19])) // clave 5
      {
      lcd_gotoxy(1,1);
      printf(lcd_putc,"\fBIENVENIDO");//compara los datos con la clave
      lcd_gotoxy(1,2);
      printf(lcd_putc,"R. AYALA");
      WRITE_EXT_EEPROM(a,105);
       a++;
       WRITE_EXT_EEPROM(a,dia);
       goto activa;
      }
      if((data[0]==clave[20])&&(data[1]==clave[21])&&(data[2]==clave[22])&&(data[3]==clave[23])) // clave 6
      {
      lcd_gotoxy(1,1);
      printf(lcd_putc,"\fBIENVENIDO");//compara los datos con la clave
      lcd_gotoxy(1,2);
      printf(lcd_putc,"R. MOYA");
      WRITE_EXT_EEPROM(a,106);
       a++;
      goto activa;
      }
      if((data[0]==clave[24])&&(data[1]==clave[25])&&(data[2]==clave[26])&&(data[3]==clave[27])) // clave 7
      {
      lcd_gotoxy(1,1);
      printf(lcd_putc,"\fBIENVENIDO");//compara los datos con la clave
      lcd_gotoxy(1,2);
      printf(lcd_putc,"H. LEON");
      WRITE_EXT_EEPROM(a,107);
       a++;
      goto activa;
      }
      if((data[0]==clave[28])&&(data[1]==clave[29])&&(data[2]==clave[30])&&(data[3]==clave[31])) // clave 8
      {
      lcd_gotoxy(1,1);
      printf(lcd_putc,"\fBIENVENIDO");//compara los datos con la clave
      lcd_gotoxy(1,2);
      printf(lcd_putc,"W. GARCIA");
      WRITE_EXT_EEPROM(a,108);
       a++;
      goto activa;
      }
    else{
     lcd_gotoxy(1,1);
     printf(lcd_putc,"\PASSWORD ERROR");//clave erronea
     delay_ms(400);
     output_low(PIN_A0);
     delay_ms(100);
     output_high(PIN_A0);
     delay_ms(100);
      output_low(PIN_A0);
     delay_ms(100);
      output_high(PIN_A0);
       delay_ms(100);
      output_low(PIN_A0);
      }
      lcd_gotoxy(1,1);
      delay_ms(100);
      printf(lcd_putc,"                 ");
    lcd_gotoxy(1,2);
   printf(lcd_putc,"                 ");
   
   }
activa:
  output_high(PIN_A0);
   delay_ms(300);
   output_low(PIN_A0);
   delay_ms(50);
    output_high(PIN_A0);
   delay_ms(30);
    output_low(PIN_A0);
     delay_ms(200);
  output_high(PIN_A1);//led rojo Off
   output_high(PIN_A2); // led verde =on
    delay_ms(2000);
   output_low(PIN_A1);//cierra la cerradura con pulso al relé
   output_low(PIN_A2);//led verde =off
   diai=100 + dia;
         WRITE_EXT_EEPROM(a,diai);
         mesi = 100 + mes;
       a++;
       WRITE_EXT_EEPROM(a,mesi);
       yeari = 100+year;
       a++;
       WRITE_EXT_EEPROM(a,yeari);
       a++;
       horai = 100+hora;
       WRITE_EXT_EEPROM(a,horai);
       a++;
       minutoi=minuto + 100;
       WRITE_EXT_EEPROM(a,Minutoi);
       a++;
              lcd_gotoxy(1,1);
   printf(lcd_putc,"               ");
    lcd_gotoxy(1,2);
   printf(lcd_putc,"               ");
    goto inicio;
     }
*************************************

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
sobre: el programita de hoy consiste en sacar por pantalla(lcd)
« Respuesta #485 en: 14 de Junio de 2015, 12:56:50 »
Holas. Acabo de empezar a tratar con micros, por aora no e hecho ningun programa propio, me dedico a moldear el codigo ya escrito para ver los efectos y famicializarme con el, me ocurre lo mismo con proteus. No conocco las patillas tanto del 16f648a ni del LCD de buestro ejercicio.
Os agradeceria a cualquiera q me embieis el proyecto que contiene el circuito ya hecho en proteus de este ejercicio.
   No se como va esto es el primer mensaje que meto, perdonarme y avisarme si no es necesario dar mi email, este es berto3soydd@hotmail.com.

¿Que significa: No usar smileys?.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ejemplitos en C para 16F648A
« Respuesta #486 en: 14 de Junio de 2015, 16:18:57 »
Berto, la conexion va a depender exclusivamente del programa. Por que a los LCD 2x16  ( creo que tambien los de 4 lineas, los de 1 lineas seguro ) se pueden conectar con 4 u 8 pines de datos

http://img.webme.com/pic/p/picmind/pic_lcd.jpg
http://www.x-robotics.com/images/lcd4bits.gif

Donde conectas cada pin depende de tu programa. Si usas 8 bits de dato por ahi conviene usar un puerto completo, y si usas 4, medio puerto o el siperior o inferior, por que es mas facil de trabajar asi

Citar
No conocco las patillas tanto del 16f648a ni del LCD de buestro ejercicio.

Para justamente eso estan los datasheet de cada integrado, en google pones "PIC16F684A datasheet" y vas a encontrar un PDF con todo lo que interesa, modulos, pines, configuracion, caracteristicas electricas (maximo y minimos)
http://ww1.microchip.com/downloads/en/DeviceDoc/41202C.pdf

Por su parte.. si queres saber como funciona el LCD y sus pin, tenes que buscar su controladorm de los cuales el mas comun es el hd44780 (solo puse "LCD driver" en google )
Buscando "hd44780 datasheet" encontramos su datasheet. Aqui tenes los pines, tiempos a respetar, y lo que te interesa es la parte de la memorua y conecxionado con el integrado en la pag 32/33 tenes ambos conexionados de 4 y 8 bits
https://www.sparkfun.com/datasheets/LCD/HD44780.pdf

El pin R/W algunos lo usan otros no, eso depende del programa.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re: Ejemplitos en C para 16F648A
« Respuesta #487 en: 15 de Junio de 2015, 17:43:31 »
Gracias por tu rapida atencion KILLERJC. Le e echado un vistazo a las paginas y busquedas que me as dado. Tu informacion es mui concreta a lo que buscaba. Aunque mui engorrosa devido a que esta en ingles. Malo para mi. El traductor que utilizo comete el (error) de traducirme los pines y no respeta los saltos de linea, pero muchas gracias.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ejemplitos en C para 16F648A
« Respuesta #488 en: 15 de Junio de 2015, 17:58:18 »
Gracias por tu rapida atencion KILLERJC. Le e echado un vistazo a las paginas y busquedas que me as dado. Tu informacion es mui concreta a lo que buscaba. Aunque mui engorrosa devido a que esta en ingles. Malo para mi. El traductor que utilizo comete el (error) de traducirme los pines y no respeta los saltos de linea, pero muchas gracias.

El mundo de la electronica esta en ingles (algunos aleman y chino :P, pero mayormente ingles)... Te vas a tener que acostumbrar, ya que como ves traductores suelen cometer errores, aunque vi algunos datasheets en español, especialmente el del PIC16F84A (no tengo links)... Pero aun asi, no podes saber si realmente es lo que decia o no el documento original. Y tomarse el trabajo de traducir 400 hojas es de locos.

Sino podes buscar tutoriales por internet, el tema esta que no hay mejor informacion que la que proveen los fabricantes del IC.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re: Ejemplitos en C para 16F648A
« Respuesta #489 en: 16 de Junio de 2015, 12:18:31 »
No te creas. En mi caso el problema no va ser demasiado el ingles, mi problema es que hace mucho que no escribo codigo, solo trabaje con un 8085 y ya tengo 40 años. El topico de que para programar hace falta saber ingles y matematicas es una ventaja pero no completamente cierto. Hice programas muy buenos para mi gusto entre 23 y 28 años, lo unico que me hacia falta saber en ingles es el significado de las sentencias y respecto a los calculos un ordenador siempre lo hace mejor que una persona. Lo que tienes que hacer es deducir idear, esto es lo que no sabe hacer el ordenador. A mi edad mi capacidad de idear no va a ser tan agil como cuando era mas joven. Lo cierto es que emvejecer le sienta mal a todo el mundo, incluso a mis actrices favoritas.

Saludos.

Desconectado Josh01

  • PIC10
  • *
  • Mensajes: 1
Re: Ejemplitos en C para 16F648A
« Respuesta #490 en: 01 de Julio de 2015, 15:07:20 »
Buenas Tardes, tengo la duda de si estos programas funcionan para el PIC 18F4550.

Saludos!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ejemplitos en C para 16F648A
« Respuesta #491 en: 01 de Julio de 2015, 17:08:34 »
Buenas Tardes, tengo la duda de si estos programas funcionan para el PIC 18F4550.
Saludos!

Si va a funcionar con algunos cambios, por ejemplo la parte de la configuracion de los modulos es distinto, y tambien son los fuses.
A no ser que se modifique algun registro en particular y se usen solo las funciones del compilador no deberias tener problemas. Si ya usan algunos registros entonces vas a tener que buscar su "equivalente"

Tenes que recordar ademas que el PIC16F84 es un uC muy basico, no tiene casi nada, y por eso es ideal para aprender sobre los PICs, Los PIC18 ya cambia mucho en como se maneja, como esta distribuida la memoria asi que puede que te encuentres con algunos obstaculos.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re: Sobre supercontador 0a9999
« Respuesta #492 en: 24 de Julio de 2015, 17:42:39 »
Hola vszener dime ¿que codificador deveria utilizar para un programa como este?

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re: Sobre proyecto mensaje BETI
« Respuesta #493 en: 24 de Julio de 2015, 18:05:38 »
Hola vszener.
No puedo utilizar siempre display de 7 segmentos B podria ser 8 pero nada sustituye a T. Yo probe con un con uno de 14seg para T pero no consegui nada. E vuelto a buscar el dataset pero no consigo una imagen concreta que indique el encendido de sus segmentos desde su pin. ¿Como lo hiciste tu?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Sobre supercontador 0a9999
« Respuesta #494 en: 24 de Julio de 2015, 20:45:59 »
Hola vszener dime ¿que codificador deveria utilizar para un programa como este?

Hola vszener.
No puedo utilizar siempre display de 7 segmentos B podria ser 8 pero nada sustituye a T. Yo probe con un con uno de 14seg para T pero no consegui nada. E vuelto a buscar el dataset pero no consigo una imagen concreta que indique el encendido de sus segmentos desde su pin. ¿Como lo hiciste tu?

No soy vzener pero podria responderte, el principal problema es que no se que es B, T ni nada por el estilo. Si puedieras dar una explicacion mejor seria posible ayudarte.


 

anything