Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

12/08/2014 #41


necesito tu ayuda D@rkbytes
D@rkbytes dijo: Ver Mensaje
Nop, la verdad nunca he armado ese proyecto, pero viendo el esquema, no se ve complicado.
Móntalo sobre un protoboard para que hagas pruebas de su funcionamiento.
Hola D@rkbytes estuve simulando el código de la insoladora, cuando le doy el boton star me sale el mensaje pause, es como que hubiera presionado el boton pause, yo quiero que corra como debe ser cuando se presiona star decrementar el tiempo y no pasar por pause para que recien corra el temporizado, a ver si me das una mano de ante mano gracias por la ayuda que me puedas brindar.
12/08/2014 #42
Moderador

Avatar de D@rkbytes

alex26 dijo: Ver Mensaje
Hola D@rkbytes estuve simulando el código de la insoladora, cuando le doy el botón start me sale el mensaje pause, es como que hubiera presionado el botón pause, yo quiero que corra como debe ser cuando se presiona start decrementar el tiempo y no pasar por pause para que recién corra el temporizado.
A ver si me das una mano.
De ante mano gracias por la ayuda que me puedas brindar.
Como te había mencionado anteriormente, no he probado ese circuito pero vi que tiene algunos problemas.
Faltan colocar resistencias pull-down en los pines de los pulsadores del puerto A.
El código tiene muchas redundancias y le falta mejorar bastante.

Pero mira, le hice algunos cambios al esquema y también al código.
Espero que con los cambios realizados ya te funcione.

Suerte.
14/08/2014 #43


D@rkbytes dijo: Ver Mensaje
Como te había mencionado anteriormente, no he probado ese circuito pero vi que tiene algunos problemas.
Faltan colocar resistencias pull-down en los pines de los pulsadores del puerto A.
El código tiene muchas redundancias y le falta mejorar bastante.

Pero mira, le hice algunos cambios al esquema y también al código.
Espero que con los cambios realizados ya te funcione.

Suerte.
Gracias D@rkbytes, te agradezco solucionaste mi problema...
27/08/2014 #44


alex26 dijo: Ver Mensaje
Gracias D@rkbytes, te agradezco solucionaste mi problema...
Hola estimado amigo aquí de nuevo incomodando un poco, migre todo el codigo a un pic mas grande como es el pic 16f876a, necesitaba mas puertos para activar otras cosas mas... al compilarlo todo normal carga el el hex generado sale el mensaje, pero cuando presiono el boton para desplazar de digito se queda ahi estático y solo el botón que suma el digito funciona, aqui te dejo adjunto la simulacion, te dejo un link de como ahorrar pines en un pic 16f628a el problemas es que no logre compilarlo, espero me ayudes...
Archivos Adjuntos
Tipo de Archivo: rar insoladora.rar (66,7 KB (Kilobytes), 82 visitas)
27/08/2014 #45
Moderador

Avatar de D@rkbytes

alex26 dijo: Ver Mensaje
Hola estimado amigo, aquí de nuevo incomodando un poco.
Migré todo el código a un pic mas grande como es el pic16f876a.
Necesitaba mas puertos para activar otras cosas más.
Al compilarlo todo normal, carga el el hex generado, sale el mensaje, pero cuando presiono el botón para desplazar de dígito se queda ahí estático y sólo el botón que suma el dígito funciona.
Para usar ese PIC, ahora tienes que reemplazar el registro CMCON por el registro ADCON1.
Deja el mismo valor (7), eso hará funcionar los puertos con ADC como entradas digitales.

También debes fijarte el lugar en dónde van los pulsadores.
El pulsador para cambiar de dígito va en el pin RA3 y tú lo pusiste en RA5
alex26 dijo: Ver Mensaje
te dejo un link de como ahorrar pines en un pic16f628a.
El problemas es que no logré compilarlo, espero me ayudes.
Olvidaste poner el link.

Suerte.
28/08/2014 #46


D@rkbytes dijo: Ver Mensaje
Para usar ese PIC, ahora tienes que reemplazar el registro CMCON por el registro ADCON1.
Deja el mismo valor (7), eso hará funcionar los puertos con ADC como entradas digitales.

También debes fijarte el lugar en dónde van los pulsadores.
El pulsador para cambiar de dígito va en el pin RA3 y tú lo pusiste en RA5

Olvidaste poner el link.

Suerte.
Una vez mas... gracias D@rkbytes, este es el
link http://www.picbasic.co.uk/forum/showthread.php?t=18972
esto es basado en la idea de myke predko y consta en hacer un interface con shift register para el display lcd y ahorrar pines en el pic, a ver si logras compilarlo y hacerlo correr, te adjunto imagen del Ckto mas simulación con los archivos pbp.

Logre generar el archivo hex para hacerlo correr a 8mhz, pero en el display lcd no sale nada.

espero alguna respuesta...
Archivos Adjuntos
Tipo de Archivo: rar Interfaz_pic_lcd.rar (245,3 KB (Kilobytes), 37 visitas)
28/08/2014 #47
Moderador

Avatar de D@rkbytes

alex26 dijo: Ver Mensaje
Una vez más... Gracias D@rkbytes.
Este es el link.
http://www.picbasic.co.uk/forum/showthread.php?t=18972
Esto es basado en la idea de myke predko y consta en hacer un interface con shift register para el display lcd y ahorrar pines en el pic.
A ver si logras compilarlo y hacerlo correr, te adjunto imagen del circuito más simulación con los archivos pbp.

Logré generar el archivo hex para hacerlo correr a 8mhz, pero en el display lcd no sale nada.

Espero alguna respuesta.
Para que ese programa funcione se necesita modificar la librería pbppic14.lib
Esta librería se encuentra en la carpeta de instalación de PICBasic Pro.

Dentro del archivo que adjunto viene la librería modificada para que funcione el "HighJack" que se requiere.

Ahora lo que tienes que hacer es lo siguiente:
Reemplaza la librería original pbppic14.lib por la librería adjunta que modifiqué.
Este reemplazo y modificación no afecta a los programas que usen la instrucción LCDOUT
Tan sólo será usado el HighJack de la librería con los programas que usen el archivo One_Wire_74HC595.bas o LCD_AnyPin.pbp que es el archivo original de donde parte este proyecto de Darrel Taylor.
Éste archivo hace un redireccionamiento de la instrucción LCDOUT hacia LCDsend.

Recuerda que el PIC16F628A no puede trabajar a 8MHz con el oscilador interno, tan sólo a 4MHz máximo.

Bien, adjunto el proyecto funcionando con la librería modificada y la simulación para hacer funcionar una pantalla LCD 16x2 con un solo cable. (One-Wire) y un 74HC595.

Suerte.
Imágenes Adjuntas
Tipo de Archivo: jpg 1_Wire_74HC595.jpg (107,3 KB (Kilobytes), 52 visitas)
Archivos Adjuntos
Tipo de Archivo: rar 16F628A LCD One Wire 74HC595.rar (142,3 KB (Kilobytes), 54 visitas)
Tipo de Archivo: zip LCD_AnyPin.zip (4,0 KB (Kilobytes), 35 visitas)
30/08/2014 #48


D@rkbytes dijo: Ver Mensaje
Para que ese programa funcione se necesita modificar la librería pbppic14.lib
Esta librería se encuentra en la carpeta de instalación de PICBasic Pro.

Dentro del archivo que adjunto viene la librería modificada para que funcione el "HighJack" que se requiere.

Ahora lo que tienes que hacer es lo siguiente:
Reemplaza la librería original pbppic14.lib por la librería adjunta que modifiqué.
Este reemplazo y modificación no afecta a los programas que usen la instrucción LCDOUT
Tan sólo será usado el HighJack de la librería con los programas que usen el archivo One_Wire_74HC595.bas o LCD_AnyPin.pbp que es el archivo original de donde parte este proyecto de Darrel Taylor.
Éste archivo hace un redireccionamiento de la instrucción LCDOUT hacia LCDsend.

Recuerda que el PIC16F628A no puede trabajar a 8MHz con el oscilador interno, tan sólo a 4MHz máximo.

Bien, adjunto el proyecto funcionando con la librería modificada y la simulación para hacer funcionar una pantalla LCD 16x2 con un solo cable. (One-Wire) y un 74HC595.

Suerte.



muchas gracias D@rkbytes, cualquier inquietud volveré a consultarte
24/04/2015 #49


Hola, no sé si siguen interesados en esto, pero estoy trabajando en una y necesito ayuda. Estaba haciendo una pero el código en C me tira un error en el compilador CSS: "Error 71 Out of ROM. A segment of the program is too large."

El código es el siguiente:

Código:
#include <16F628A.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT                 //Reset when brownout detected
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection

#use delay(clock=4000000,RESTART_WDT)
#use I2C(master, sda=PIN_B3, scl=PIN_A4)

#rom 0x2100={0,185,1}

#include <LCD.C>

// Pinout
#byte PORTA=5
#bit CARA_SUPERIOR=PORTA.0
#bit CARA_INFERIOR=PORTA.1
#bit BUZZER=PORTA.2
#bit SW_ARRIBA=PORTA.7
#bit SW_ABAJO=PORTA.6
#bit SW_INTRO=PORTA.3

// Mensajes
#define STOP 0
#define PAUSA 1
#define MUESTRACARAS 2
#define MSG_MINUTOS 3
#define MSG_SEGUNDOS 4

// Control estado entrada datos
#define ENTRADAMINUTOS 1
#define ENTRADASEGUNDOS 2

// Control tecla pulsada
#define ARRIBA 1
#define ABAJO 2
#define INTRO 3

const char car[32] =   {17,17,0,0,0,0,17,17,31,31,0,0,0,0,31,31,31,31,0,0,0,0,17,17,17,17,0,0,0,0,31,31};

int8 OpcionMenu=1, ConfCaras, HayMensaje;
int1 Estado=0, EnPausa=0;
int16 Tiempo, Ticks, TiempoPredefinido;
int8 MinutosPre, SegundosPre,TicksMensaje, EstadoEntradaTiempo;



void CargaConfiguracion() {
   TiempoPredefinido = ((int16)read_eeprom(0) * (int16)256) + (int16)read_eeprom(1);
   MinutosPre=TiempoPredefinido/60;
   SegundosPre=TiempoPredefinido - MinutosPre*60;
   ConfCaras=read_eeprom(2);
   TicksMensaje=0;
   Tiempo=TiempoPredefinido;
   EstadoEntradaTiempo=0;
   CARA_INFERIOR=0;
   CARA_SUPERIOR=0;
   HayMensaje=0;
}

void GrabaConfigEeprom() {
   Write_Eeprom (0,TiempoPredefinido >> 8); // graba el byte alto
   Write_eeprom (1,TiempoPredefinido & 0xFF); // graba el byte bajo
   Write_Eeprom (2,ConfCaras);
}

void LCD_DefineCaracter () {
   char i;
   lcd_send_byte (0,0x40);
     for (i=0;i<32;i++) {
      lcd_send_byte (1,car[i]);
   }
}


void menu() {
   lcd_gotoxy(1,2);
   switch (OpcionMenu) {
      case 1:
         if (Estado || EnPausa)
            lcd_putc ("     Parar      ");
          else
            lcd_putc ("    Arrancar    ");
         break;
      case 2:
         lcd_putc ("Cfg tiempo      ");
         break;
      case 3:
         lcd_putc ("Cfg caras       ");
         break;
      case 4:
         if (EnPausa)
            lcd_putc ("   Continuar    ");
          else
            lcd_putc ("     Pausar     ");
         break;
   }
}

void Pitido (int16 Duracion) {
   Duracion*=3;
   while (Duracion>0) {
      BUZZER=1;
      delay_us(162);
      Duracion--;
      BUZZER=0;
      delay_us(162);
   }
}

void PitidoGrave (int16 Duracion) {
Duracion/=2;
   while (Duracion>0) {
      BUZZER=1;
      delay_us(1000);
      Duracion--;
      BUZZER=0;
      delay_us(1000);
   }
}

void ArrancaInsolado() {
   Estado=1; // la encendemos
   EnPausa=0;
   CARA_SUPERIOR=(ConfCaras<3);
   CARA_INFERIOR=(ConfCaras!=2);
   Ticks = Tiempo * 2;
   set_timer1(3036);  // hasta 65536 son 62500 ciclos
   // 62500 con prescaler de 8 y a 1MHz es medio segundo
   // 62500*8/1000000=0,5s.
   enable_interrupts(GLOBAL);
   OpcionMenu=4;
}

void FinalizaInsolado(int Modo) {
char i;
   Estado=0; // la paramos
   CARA_SUPERIOR=0;
   CARA_INFERIOR=0;
   disable_interrupts(GLOBAL);
   if (Modo==STOP){
      Tiempo=TiempoPredefinido;
      EnPausa=0;
      if (OpcionMenu==4) // si está parado no puede entrar en la opción 4
         OpcionMenu=1;
   }
    else {
      EnPausa=1;
      HayMensaje=PAUSA;
    }
   for (i=0;i<3;i++) {
      Pitido (100);
      PitidoGrave (200);
   }
}

void MuestraTiempo() {
   int Minutos, Segundos;


   if (EstadoEntradaTiempo) {
      lcd_gotoxy(12,2);
      Minutos=MinutosPre;
      Segundos=SegundosPre;
   } else {
      lcd_gotoxy(12,1);
      Minutos = Tiempo / 60;
      Segundos = Tiempo - Minutos*60;
   }

   printf (lcd_putc,"%2u:%02u",Minutos,Segundos);
}

void MuestraEstado() {
char i;
   lcd_gotoxy(1,1);
   switch (HayMensaje) {
      case 0: // no hay mensaje
         for (i=0;i<11;i++)
            printf (lcd_putc,"%c",ConfCaras*Estado);
         break;
      case MUESTRACARAS:
         lcd_gotoxy(12,2);
         for (i=6;i<11;i++)
            printf (lcd_putc,"%c",ConfCaras);
         break;
      case PAUSA:
         printf(lcd_putc,"  Pausado   ");
         break;
      case MSG_MINUTOS:
         printf(lcd_putc,"Minutos....");
            lcd_send_byte (0,0x0F);
         break;
      case MSG_SEGUNDOS:
         printf(lcd_putc,"Segundos...");
         //lcd_gotoxy(15,1);
         break;

   }
   if (HayMensaje)
      TicksMensaje++;
      if (TicksMensaje==4) {
         HayMensaje=0;
         TicksMensaje=0;
      }
   MuestraTiempo ();
}


void EjecutaOpcion() {
   switch (OpcionMenu) {
      case 1:
         if (Estado || EnPausa)  // estaba encendida
               FinalizaInsolado(STOP);
          else  // estaba apagada
               ArrancaInsolado();
         break;
      case 2:
         EstadoEntradaTiempo++;
         HayMensaje=MSG_MINUTOS;
//         lcd_send_byte(0,0xC); // parpadeo
//         lcd_gotoxy(1,12);
         break;
      case 3:
         ConfCaras++;
         if (ConfCaras==4)
            ConfCaras=1;
         if (Estado) {
            CARA_SUPERIOR=(ConfCaras<3);
            CARA_INFERIOR=(ConfCaras!=2);
         }
         lcd_gotoxy(1,1);
         HayMensaje=MUESTRACARAS;
         break;
      case 4:
         if (EnPausa)
            ArrancaInsolado();
          else
            FinalizaInsolado  (PAUSA);
         break;
   }
}



#int_TIMER1
TIMER1_isr()
{
   set_timer1(3036);  // hasta 65536 son 62500 ciclos
   // 62500 con prescaler de 8 y a 1MHz es medio segundo
   // 62500*8/1000000=0,5s.
   Ticks--;
   if (!Ticks) // se acabó
      FinalizaInsolado(STOP);
   else {
      Tiempo=Ticks/2;
   }
   menu();
   MuestraEstado();
}

void ConfiguraTiempo(int Modo) {
   switch (EstadoEntradaTiempo) {
      case ENTRADAMINUTOS:
         switch (Modo) {
            case ARRIBA:
               MinutosPre++;
               if (MinutosPre>99)
                  MinutosPre=0;
               break;
            case ABAJO:
               if (MinutosPre==0)
                  MinutosPre=100;
               MinutosPre--;
               break;
            case INTRO:
               EstadoEntradaTiempo++;
               HayMensaje=MSG_SEGUNDOS;
               TicksMensaje=0;
         };
         break;
     case ENTRADASEGUNDOS:
         switch (Modo) {
            case ARRIBA:
               SegundosPre++;
               if (SegundosPre>59)
                  SegundosPre=0;
               break;
            case ABAJO:
               if (SegundosPre==0)
                  SegundosPre=60;
               SegundosPre--;
               break;
            case INTRO:
               EstadoEntradaTiempo=0;
               TiempoPredefinido = (int16)MinutosPre*(int16)60+(int16)SegundosPre;
               HayMensaje=0;
               if (!Estado && !EnPausa)
                  Tiempo=TiempoPredefinido;
               GrabaConfigEeprom();
         }
   }
//MuestraEstado();
MuestraTiempo();
}

void main()
{
   set_tris_a(0b11001000);
   setup_timer_0(RTCC_INTERNAL);setup_wdt(WDT_2304MS);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   lcd_init();
   enable_interrupts(INT_TIMER1);
   disable_interrupts (GLOBAL);
   setup_oscillator(OSC_4MHZ);

   printf(lcd_putc,"Temporizador v.1\n");
   lcd_putc("Nocturno -- 2007");
   LCD_DefineCaracter ();
   CargaConfiguracion();
   delay_ms(500);
   pitido(50);
   CARA_INFERIOR=0;
   CARA_SUPERIOR=0;
   menu();
   MuestraEstado();

   while(1){

//   pitido(50);
      restart_wdt();
      if (!SW_ARRIBA) {// sube en el menú
         pitido(20); // antirrebotes
         while (!SW_ARRIBA); // esperamos que suelte tecla
         if (EstadoEntradaTiempo)
            ConfiguraTiempo(ARRIBA);
          else {
            OpcionMenu--;
            if (!OpcionMenu)
               OpcionMenu=(3+Estado+EnPausa);
            if (OpcionMenu==3)
               HayMensaje=MUESTRACARAS;
              else
               HayMensaje=0;
            TicksMensaje=0;
            menu();
            MuestraEstado();
          }
      }

      if (!SW_ABAJO) {// baja en el menú
         pitido(20); // antirrebotes
         while (!SW_ABAJO); // esperamos que suelte tecla
         if (EstadoEntradaTiempo)
            ConfiguraTiempo(ABAJO);
          else {
            OpcionMenu++;
            if (OpcionMenu==(4+Estado+EnPausa))
               OpcionMenu=1;
            if (OpcionMenu==3)
               HayMensaje=MUESTRACARAS;
              else
               HayMensaje=0;
            TicksMensaje=0;
            menu();
            MuestraEstado();
          }
      }
      if (!SW_INTRO) {// acepta opción
         pitido(20); // antirrebotes
         while (!SW_INTRO); // esperamos que suelte tecla
         if (EstadoEntradaTiempo) {
            ConfiguraTiempo(INTRO);
           } else {
            HayMensaje=0;
            TicksMensaje=0;
            EjecutaOpcion();
           }
         menu();
         MuestraEstado();
      }

   }
}
24/04/2015 #50
Moderador

Avatar de D@rkbytes

Eso quiere decir que ya no hay espacio para el programa en la ROM.
Trata de optimizar el código o cambia de PIC, por ejemplo, al PIC16F648A que tiene el doble de ROM.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.