Autor Tema: Flasher con 12F629  (Leído 3084 veces)

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

Desconectado stecklerdav

  • PIC10
  • *
  • Mensajes: 9
    • Software para simular sistemas opticos
Flasher con 12F629
« en: 12 de Febrero de 2016, 10:31:09 »
Buen dia tengan todos, estoy tratasndo de hacer un juego con luces LEDs todo me funciona como quiero en el codigo, solo hay un detalle y no he podido resolverlo. la EEPROM interna del PIC solo puedo leer 0 y 1 como variables gurdadas. no he podido leer valores 2,3,4,5,6,7 no entiendo porque.

VERIFIQUE QUE ESTUVIERA GUARDANDO EL VALOR 2,3 LEEYENDO LA EEPROM DESPUES DE ACTIVARLO UNA VEZ.

lo codifique en mikroC y tambien en XC8 con el mismo resultado.

aca le coloco el codigo, gracias de antemano.

#include <built_in.h>
unsigned short n,Nciclo,r;
unsigned short address;


void interrupt()
 { 
    delay_ms(100);

       switch (n)
        {
          case 0:n=1; Nciclo=1;break;
          case 1:n=2; Nciclo=2;break;
          case 2:n=3; Nciclo=3;break;
          case 3:n=0; Nciclo=0;break;
         }
    r=n;
     INTF_bit=0;

 }
 void Inicializar()
 {
    OSCCAL = 0b100000;
    TRISIO = 0b000100;
    CMCON  = 0b00000111;
    INTCON=  0b11010000;
 }
 
void main() {
     //EEPROM_write(0x25,0x02);

     Inicializar();
       delay_ms(10000);
     (n)=(EEPROM_Read(0x25))&&0x0F;            //// ACA TENGO EL PROBLEMA ////
     delay_ms(500);
     while(1)
          {
          switch (Nciclo){
                 case 1:eeprom_write(0x25,1);delay_ms(100);Nciclo=4;break;
                 case 2:eeprom_write(0x25,2);delay_ms(150);Nciclo=4;break;
                 case 3:eeprom_write(0x25,3);delay_ms(150);Nciclo=4;break;
                 case 0:eeprom_write(0x25,0);delay_ms(150);Nciclo=4;break;
           }
           r=n;
         
           switch (n){
            case 0:
             GP4_bit=0;
             delay_ms(75);
             GP4_bit=1;
             delay_ms(100);
             GP4_bit=0;
             delay_ms(75);
             GP4_bit=1;
             delay_ms(100);
             GP4_bit=0;
             delay_ms(75);
             GP4_bit=1;
             delay_ms(100);
             GP4_bit=0;
             delay_ms(75);
             GP5_bit=0;
             delay_ms(75);
             GP5_bit=1;
             delay_ms(100);
             GP5_bit=0;
             delay_ms(75);
             GP5_bit=1;
             delay_ms(100);
             GP5_bit=0;
             delay_ms(75);
             GP5_bit=1;
             delay_ms(100);
             GP5_bit=0;
             delay_ms(75);

             break;


            case 1:

           
             GP4_bit=0;
             delay_ms(5);
             GP5_bit=0;
             delay_ms(75);

             GP4_bit=1;
             delay_ms(5);
             GP5_bit=1;
             delay_ms(100);

             GP4_bit=0;
             delay_ms(5);
             GP5_bit=0;
             delay_ms(75);

             GP4_bit=1;
             delay_ms(5);
             GP5_bit=1;
             delay_ms(100);

             GP4_bit=0;
             delay_ms(5);
             GP5_bit=0;
             delay_ms(75);

             GP4_bit=1;
             delay_ms(5);
             GP5_bit=1;
             delay_ms(100);

             GP4_bit=0;
             delay_ms(5);
             GP5_bit=0;
             delay_ms(75);

             GP4_bit=1;
             delay_ms(5);
             GP5_bit=1;
             delay_ms(100);

             GP4_bit=0;
             delay_ms(5);
             GP5_bit=0;
             delay_ms(75);

             GP4_bit=1;
             delay_ms(5);
             GP5_bit=1;
             delay_ms(100);
             
             GP4_bit=0;
             delay_ms(5);
             GP5_bit=0;
             delay_ms(100);

             break;


             case 2:
             GP4_bit=0;
             delay_ms(75);
             GP4_bit=1;
             delay_ms(100);
             GP4_bit=0;
             delay_ms(75);
             GP4_bit=1;
             delay_ms(100);
             GP4_bit=0;
             delay_ms(75);
             GP4_bit=1;
             delay_ms(100);
             GP4_bit=0;
             delay_ms(75);

             break;

             case 3:

             GP5_bit=0;
             delay_ms(75);
             GP5_bit=1;
             delay_ms(100);
             GP5_bit=0;
             delay_ms(75);
             GP5_bit=1;
             delay_ms(100);
             GP5_bit=0;
             delay_ms(75);
             GP5_bit=1;
             delay_ms(100);
             GP5_bit=0;
             delay_ms(75);

             break;

         }


       }
  }




Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Flasher con 12F629
« Respuesta #1 en: 12 de Febrero de 2016, 11:44:30 »
Tenes 2 problemas:

1ero estas grabando continuamente la EEPROM. La EEPROM tiene numero de escrituras limitados, asi que estarias "quemando" la posicion de la memoria EEPROM. Es decir despues de 1 millon de escrituras se vuelve inservible. Asi que cambia tu programa para que solo y unicamente grabe cuando es necesario.

2do problema:

Código: C
  1. n=(EEPROM_Read(0x25)) [b]&&[/b] 0x0F;

&& es un comparador logico, lo cual va a evaluar lo devuelto por la eeprom, que si es disitntos de 0 es un TRUE y si es 0 es FALSE, 0x0F siemrpe da TRUE, por lo tanto es por eso que tenes 0 o 1.
Lo que tenes que usar es una AND bit a bit &. Y para la proxima && en comparaciones de if,for,while, una AND es &, lo mismo aplica para la OR | y la OR logica ||. Asi se resuelve:

Código: C
  1. n= EEPROM_Read(0x25) & 0x0F;

Desconectado stecklerdav

  • PIC10
  • *
  • Mensajes: 9
    • Software para simular sistemas opticos
Re:Flasher con 12F629
« Respuesta #2 en: 12 de Febrero de 2016, 12:12:54 »
Muchas gracias KILLERJC solucionado el problema, ya tenia dos dias en eso. el problema fue que debi utilizar el & simple. por otro lado solo grabo en la EEPROM cuando apriento el pulsador solamente. lo que si hago es leer cada vez que enciendo el micro.

Muchas gracias killerJC. Saludos.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Flasher con 12F629
« Respuesta #3 en: 12 de Febrero de 2016, 12:41:23 »
Muchas gracias KILLERJC solucionado el problema, ya tenia dos dias en eso. el problema fue que debi utilizar el & simple. por otro lado solo grabo en la EEPROM cuando apriento el pulsador solamente. lo que si hago es leer cada vez que enciendo el micro.

Muchas gracias killerJC. Saludos.
Tenes razon, pero estas intentando acceder al switch con el numero 4... agregale al switch un default, asi cuando no esta dentro de los valores 0 a 3 va al default


Código: C
  1. switch (Nciclo){
  2.                  case 1:eeprom_write(0x25,1);delay_ms(100);Nciclo=4;break;
  3.                  case 2:eeprom_write(0x25,2);delay_ms(150);Nciclo=4;break;
  4.                  case 3:eeprom_write(0x25,3);delay_ms(150);Nciclo=4;break;
  5.                  case 0:eeprom_write(0x25,0);delay_ms(150);Nciclo=4;break;
  6.                  default: break;
  7.            }


 

anything