#include <16F1936.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#fuses noDEBUG // debug - in circuit debugger enabled on RB6 and RB7 - DISABLED
#fuses noLVP // LVP - low voltage enable - DISABLED
#fuses noFCMEN // Fail safe clock monitor - DISABLED
#fuses noIESO // IESO - internal / external switch over DISABLED
#fuses noBROWNOUT // Brown out reset selection bits - 11 BOR DISABLED
#fuses CPD // CPD - date code protect DISABLED
#fuses PROTECT // CP - code protect DISABLED
#fuses noMCLR // MCLRE - RE3 is MCLR
#fuses noPUT // PWRTE - power up timer enable bit DISABLED
#fuses noWDT // WDTE - watch dog enable bit - not enabled here, in code below
#fuses INTRC_IO // FOSC - oscillator - set to INTRC_IO-- defaults the clock to 4Mhz
#use delay(internal=8000000)
#use rs232(baud=9600,parity=N,xmit=pin_c6,rcv=pin_c7,bits=8,errors)
#byte portA= 0x0C
#byte portB= 0x0D
#byte portC= 0x0E
#byte portE= 0x10
# use fast_io(a)
# use fast_io(b)
#define izq pin_c0
#define medias pin_c1 //
#define acc pin_c2
#define der pin_c3
#define stop pin_c4
// #define speed50 delay_ms(50)
//#define speed100 delay_ms(100)
// #define speed200 delay_ms(200)
// #define speed300 delay_ms(300)
// #define speed400 delay_ms(400)
// #byte valor=0
// typedef volatile char valor;
//secuencia 9
byte const s1d7[]={0b00000001,0b00000010,0b00000100,0b00001001,0b00010010,0b00100100,0b01001001,0b10010010
0b00100100,0b01001000,0b10010000,0b00100000,0b01000000,0b10000000,0b00000000};//0-14
// byte const s2d7[]={0,50,100,150,200,255};//0-14
// byte const s3d7[]={255,200,150,100,50,0};//0-14
// secuencia10
byte const s2d7[]={0,127,255};//0-14
byte const s3d7[]={255,127,0};//0-14
// byte const valor;
// *******************************************************************
// variables para pwm
signed int16 pwmh =0;
signed int16 pwml =0;
//*********************
int1 doble=0x01; // en 0 solo ascendente en 1 asciende y regresa
signed int8 i=0; // variable para las secuencias
signed int8 j=0; // variable para las secuencias
signed int8 k=0; // variable para las secuencias
signed int8 m=0; // variable para numero de salidas // para secuencia 9
signed int8 n=7; // numero de salidas
// int n=num; // numero de salidas que se van a utilizar
int8 mezcla =0; // alberga la info del puerto para luego pasarla a los puertos a y b
signed int16 s; // tiempo de retardo
int puerto =1; // 0 a y b / 1 a / 2 el b elige el puerto
//int puerto1 =1; // 0 a y b / 1 a / 2 el b elige el puerto
signed int16 f=0; // para secuencia10 pwm
int g=0; // para secuencia10 pwm
signed int intensidad=0;
int8 valor=0;
int flag=0;
int1 flag2=0;
int guardar;
// char rol=0;
// static int valor;
// declaracion funciones
void ret1 (); // retardo general secuencias
void secuencia1 ();
void secuencia2 ();
void secuencia3 ();
void secuencia4 ();
void secuencia5 ();
void secuencia6 ();
void secuencia7 ();
void secuencia8 ();
void secuencia9 ();
void secuencia10 ();
void secuencia11 ();
void salida (); // funcion para mostrar los efectos
void dimmer ();
void suiche();
//*******************
void freno();
void frenoflash();
#int_RDA
void RDA_isr(void)
{
//valor=0;
if(kbhit())//verifico si el dato ya esta disponible
{
valor=0;
valor=getc();//adquiero el dato
//guardar =valor;
flag=1;
}
/*
switch(valor)// aqui se piede el contenido sde valor
{
case 'a':
//putc('m');
// guardar=valor;
puerto=0;
secuencia1();
break;
case 'b':
guardar=valor;
secuencia2();
break;
}
guardar =valor;
*/
// valor=getc(); //Captura el dato recibido del PIC 1
// guardar=getc();
// flag=1;
//guardar =valor;
//putc(valor);
}
/*
bit_set(porta,4) ;
//write_eeprom(0x01,valor);
delay_ms(100);
//valor=read_eeprom(0);
bit_clear(porta,4) ;
delay_ms(100);
*/
// EEPROM DISTRIBUCION //
/*
0 u pwmh
1 t pwml
2 v SECUENCIA DIRECCIONALES
3 w SECUENCIA ESTACIONARIAS
4 x SECUENCIA FRENO
5 y SECUENCIA MEDIAS
6 z SECUENCIA SALUDO
*/
// VOID MAIN //
void main()
{
SET_TRIS_a(0B00000000);
SET_TRIS_b(0B00000000);
SET_TRIS_c(0B10011111);
SET_TRIS_e(0B1);
setup_adc_ports(NO_ANALOGS);
setup_comparator(NC_NC_NC_NC);
portA=0x00;
portB=0x00;
enable_interrupts(INT_RDA); //HAbilita interrupcion por puerto serial
enable_interrupts(GLOBAL); // Habilita las interrupcciones globales
s=80;
while(TRUE)
{
// configura # de salidas
//***********************
//num = sizeof(s4d7);
// porta=tama;
// num=num -1;
// num=8;
//****************************
// Reset_cpu();
// SALIDAS TRIS //
if (n>=7) // selecciono las salidas que necesito para que por error no se prendan los que no necesito
SET_TRIS_a(0B00000000);
if (n==6)
SET_TRIS_a(0B10000000);
if (n==5)
SET_TRIS_a(0B11000000);
if (n==4)
SET_TRIS_a(0B11100000);
if (n==3)
SET_TRIS_a(0B11110000);
if (n<=2)
SET_TRIS_a(0B11111000);
//*********************************
if (!input_state(acc))
{
ret1();
flag2=0;
}
if ((input_state(acc))&&(flag2==0))
{
flag2=1;
puerto=0;
secuencia3();
secuencia3();
}
// VALOR INTERUPCION /
if (flag==1)
{
putc(guardar);
switch(valor)// aqui se piede el contenido sde valor
{
case 'a':
// putc('m');
// guardar=valor;
puerto=0;
secuencia1();
break;
case 'b':
guardar=valor;
secuencia2();
break;
case 'c':
guardar=valor;
secuencia3();
break;
case 'd':
guardar=valor;
secuencia4();
break;
case 'e':
guardar=valor;
secuencia5();
break;
case 'f':
guardar=valor;
secuencia6();
break;
case 'g':
guardar=valor;
secuencia7();
break;
case 'h':
guardar=valor;
secuencia8();
break;
case 'i':
guardar=valor;
secuencia9();
break;
case 'j':
guardar=valor;
secuencia10();
break;
case 'k':
guardar=valor;
secuencia11();
break;
// EEPROM //
case 't': // DIRECCIONALES
write_eeprom(0,guardar);
case 'u': // pwmh
write_eeprom(0,guardar);
case 'v': // pwml
write_eeprom(0,guardar);
break;
case 'w': // ESTACIONARIAS
write_eeprom(1,guardar);
break;
case 'x': // FRENO
write_eeprom(2,guardar);
break;
case 'y': // MEDIAS
write_eeprom(3,guardar);
break;
case 'z': // SALUDO
write_eeprom(4,guardar);
break;
// default:
}
mezcla=0x00;// LIMPIO EL PUERTO LUEGO DE VISUALIZAR LA FUNCION QUE QUIERO
salida();
flag=0;
valor=0;
// guardar =valor;
}
/* if (input_state(der))
{
putc(guardar);
valor=read_eeprom(0);
flag=1;
}
*/
// DISRIMINA EL ESTADO STOP DIRECIONALES O MEDIAS //
//************************************************//
// puerto==0 solo las 2 direccionales1
// puerto==1 stop izquierodo y direccional derecha
// puerto==2 stop derecho y direccional izquierda
// puerto==3 solo direccional derecha
// puerto==4 solo direccional izquierda
if ((!input_state(stop))&&(!input_state(izq))&&(!input_state(der))&&(!input_state(medias)))// todo apagado
{
porta=0x00;
portb=0x00;
}
if ((input_state(stop))&&(!input_state(izq))&&(!input_state(der))&&(!input_state(medias)))// solo freno
{
//puerto=0;
frenoflash();
}
if ((input_state(stop))&&(input_state(izq))&&(input_state(der))&&(!input_state(medias)))// ambas direccionales activas
{
puerto=0;
secuencia1();
}
if ((input_state(stop))&&(!input_state(izq))&&(input_state(der))&&(!input_state(medias)))//freno izquierdo activo - direccional derecha activa
{
puerto=1;
secuencia1();
}
if ((input_state(stop))&&(input_state(izq))&&(!input_state(der))&&(!input_state(medias))) // freno derecho activo - direccional izquierda activa
{
puerto =2;
secuencia1();
}
if ((!input_state(stop))&&(input_state(izq))&&(input_state(der))&&(!input_state(medias))) //ambas direccionales estacionarias
{
puerto=0;
secuencia1();
}
if ((!input_state(stop))&&(!input_state(izq))&&(input_state(der))&&(!input_state(medias)))//solo direccional derecha activa
{
puerto=3;
secuencia1();
}
if ((!input_state(stop))&&(input_state(izq))&&(!input_state(der))&&(!input_state(medias)))//solo direccional izquierda activa
{
puerto=4;
secuencia1();
}
if ((!input_state(stop))&&(!input_state(izq))&&(!input_state(der))&&(input_state(medias)))//solo medias
{
puerto=0;
secuencia10();// medias solo
}
if ((!input_state(stop))&&(input_state(izq))&&(input_state(der))&&(input_state(medias)))//solo direccionales estacionarias
{
puerto =0;
secuencia1();
}
if ((!input_state(stop))&&(!input_state(izq))&&(input_state(der))&&(input_state(medias))) //media izquierda activa dirrecional derecha activa
{
puerto=1;
secuencia1();
}
if ((!input_state(stop))&&(input_state(izq))&&(!input_state(der))&&(input_state(medias)))// media derecha activa direccional izquierda aciva
{
puerto=2;
secuencia1();
}
if ((input_state(stop))&&(input_state(izq))&&(input_state(der))&&(input_state(medias)))// todo activado da solo direccionals
{
puerto =0;
secuencia1();
}
if ((input_state(stop))&&(!input_state(izq))&&(!input_state(der))&&(input_state(medias)))// todo activado da solo direccionals
{
frenoflash();
}
}
}
void dimmer()
{
// reinicio temporizador al hacer un cambio
if (intensidad==0) // si variable en 1 prendo primer segmento
{
//intensidad=-1;
porta=0;
delay_ms(300);
// tenue();
}
intensidad++; // le sumo 1 a k
if (intensidad>5) // si pasa de 7 vuevo a 0
{
intensidad=0; // reinicio a 1
}
if (intensidad==1) // si variable en 1 prendo primer segmento
{
//intensidad=-1;
// pwmh=0; //
//pwml=255;
pwmh=0; //
pwml=1000;
// tenue();
}
if (intensidad==2) //
{
//pwmh=50; //
// pwml=200;
pwmh=250; //
pwml=750;
// tenue();
}
if (intensidad==3) //
{
// pwmh=70; //
// pwml=180;
pwmh=500; //
pwml=500;
// tenue();
}
if (intensidad==4) //
{
// pwmh=100; //
// pwml=150;
pwmh=750; //
pwml=250;
// tenue();
}
if (intensidad==5) //
{
// pwmh=150; //
// pwml=100;
pwmh=1000; //
pwml=0;
intensidad=0;
// tenue();
}
if (intensidad==6) //
{
// pwmh=200; //
// pwml=50;
pwmh=800; //
pwml=200;
// tenue();
}
if (intensidad==7) //
{
// pwmh=255; //
// pwml=0;
pwmh=1000; //
pwml=0;
intensidad=0;
// tenue();
}
//delay_ms(20);
// WRITE_EEPROM(1,pwmh); // grabo en eeprom
// WRITE_EEPROM(2,pwmb); // grabo en eeprom
}
// ****** fin del for del dimmer
// FUNCIONES ***
//********************************************
// "FUNCION SALIDA" define que puertos usare
void salida()
{
if (puerto==0)// puertos A y B
{
porta=mezcla;
portb=mezcla;
}
if (puerto==1) // puerto A derecho
{
portb=0xff;;
porta=mezcla;
}
if (puerto==2) // puerto B izquierdo
{
porta=0xff;
portb=mezcla;
}
if (puerto==3) // puerto B izquierdo
{
portb=0x00;
porta=mezcla;
}
if (puerto==4) // puerto B izquierdo
{
porta=0x00;
portb=mezcla;
}
}
// *****************************
// RETARDO ***
void ret1()
{
delay_ms(s);
}
// SEC1 *** uno a uno se desplaza y apaga el anterior auto fantastico (uno solo se ve encendido)
void secuencia1()
{
for(j=0;j<=n;j++)
{
bit_set(mezcla,j);
//bit_set(porta,j) ;
//bit_set(portb,j) ;
salida();
ret1() ;
bit_clear(mezcla,j) ;
salida();
//bit_clear(porta,j) ;
//bit_clear(portb,j) ;
}
if (doble==1)
{
for (j=n;j>=0;j--)
{
bit_set(mezcla,j);
// bit_set(porta,j) ;
// bit_set(portb,j) ;
salida();
ret1() ;
bit_clear(mezcla,j) ;
salida();
//bit_clear(porta,j) ;
// bit_clear(portb,j) ;
}
}
}
//************************************
//******** sec2 ********************* uno a uno se desplaza titilando y apaga el anterior (uno solo se ve encendido)
void secuencia2()
{
for(j=0;j<=n;j++)
{
for (k=0; k<=1 ; k++)
{
bit_set(mezcla,j) ;
// bit_set(porta,j) ;
// bit_set(portb,j) ;
salida();
ret1() ;
//bit_clear(porta,j) ;
// bit_clear(portb,j) ;
bit_clear(mezcla,j) ;
salida();
ret1() ;
}
}
if (doble==1)
{
for (j=n;j>=0;j--)
{
for(k=0; k<=1 ; k++)
{
bit_set(mezcla,j) ;
//bit_set(porta,j) ;
//bit_set(portb,j) ;
salida();
ret1() ;
//bit_clear(porta,j) ;
// bit_clear(portb,j) ;
bit_clear(mezcla,j) ;
salida();
ret1() ;
}
}
}
}
//************************************
//******** sec3 ********************* uno a uno va prendiendo y va llenando
void secuencia3()
{
for(j=0;j<=n;j++)
{
bit_set(mezcla,j) ;
//bit_set(porta,j) ;
// bit_set(portb,j) ;
salida();
ret1() ;
}
mezcla=0x00;
//porta=0x00;
//portb=0x00;
salida();
ret1() ;
if (doble==1)
{
for (j=n;j>=0;j--)
{
//for(int8 k=0 ; k<1 ; k++)
//{
bit_set(mezcla,j) ;
// bit_set(porta,j) ;
// bit_set(portb,j) ;
salida();
ret1() ;
// bit_clear(porta,j) ;
//ret1() ;
// }
// porta=0x00;
}
mezcla=0x00;
//porta=0x00;
//portb=0x00;
salida();
ret1() ;
}
}
//************************************
//******** sec4 ********************* prende todos y los apaga todos uno a uno
void secuencia4()
{
mezcla=0xff;
salida();
//porta=0xff;
//portb=0xff;
ret1() ;
for(j=0;j<=n;j++)
{
bit_clear(mezcla,j) ;
// bit_clear(porta,j) ;
// bit_clear(portb,j) ;
salida();
ret1() ;
}
if (doble==1)
{
// porta=0xff;
// portb=0xff;
mezcla=0xff;
salida();
ret1() ;
for (j=n;j>=0;j--)
{
bit_clear(mezcla,j) ;
// bit_clear(porta,j) ;
// bit_clear(portb,j) ;
salida();
ret1() ;
}
}
}
//************************************
//******** sec5 ******prende todos apaga uno a uno dejando el anterior encendido, solo uno se ve apagado
void secuencia5()
{
mezcla=0xff;
//porta=0xff;
//portb=0xff;
salida();
ret1() ;
for(j=0;j<=n;j++)
{
bit_clear(mezcla,j) ;
// bit_clear(porta,j) ;
// bit_clear(portb,j) ;
salida();
ret1() ;
bit_set(mezcla,j) ;
//bit_set(porta,j) ;
// bit_set(portb,j) ;
salida();
ret1() ;
}
if (doble==1)
{
mezcla=0x00;
// porta=0x00;
//portb=0x00;
salida();
ret1() ;
mezcla=0xff;
//porta=0xff;
//portb=0xff;
salida();
ret1() ;
for (j=n;j>=0;j--)
{
bit_clear(mezcla,j) ;
//bit_clear(porta,j) ;
//bit_clear(portb,j) ;
salida();
ret1() ;
bit_set(mezcla,j) ;
//bit_set(porta,j) ;
//bit_set(portb,j) ;
salida();
ret1() ;
}
}
mezcla=0x00;
//porta=0x00;
//portb=0x00;
salida();
ret1() ;
}
//************************************
//******** sec6 *****//prende uno apaga,prende uno y 2 apaga, prende 1,2 y 3 apaga, va prendiendo de a uno luego prende el siguiente y estirandose
void secuencia6()
{
for(i=0;i<=n;i++)
{
for (j=0;j<=i;j++)
{
bit_set(mezcla,j) ;
//bit_set(porta,j) ;
//bit_set(portb,j) ;
salida();
ret1() ;
}
mezcla=0x00;
//porta=0x00;
//portb=0x00;
salida();
ret1() ;
}
if (doble==1)
{
for(i=n;i>=0;i--)
{
for (j=n;j>=i;j--)
{
bit_set(mezcla,j) ;
// bit_set(porta,j) ;
//bit_set(portb,j) ;
salida();
ret1() ;
}
mezcla=0x00;
//porta=0x00;
//portb=0x00;
salida();
ret1() ;
}
}
}
//************************************
//******** sec7 prende todos luego prende todos y apaga el primero, se va encogiendo hasta apagarlos todos
void secuencia7()
{
for(i=0;i<=n;i++)
{
for (j=i;j<=n;j++)
{
bit_set(mezcla,j) ;
//bit_set(porta,j) ;
//bit_set(portb,j) ;
salida();
ret1() ;
}
mezcla=0x00;
//porta=0x00;
// portb=0x00;
salida();
ret1() ;
}
if (doble==1)
{
for(i=n;i>=0;i--)
{
for (j=i;j>=0;j--)
{
bit_set(mezcla,j) ;
//bit_set(porta,j) ;
//bit_set(portb,j) ;
salida();
ret1() ;
}
mezcla=0x00;
//porta=0x00;
//portb=0x00;
salida();
ret1() ;
}
}
}
//************************************
//sec8 va prendiendo hasta llegar al ultimo, este lo deja encendido y arranca de nuevo hasta el penultimo (va llenando)
void secuencia8()
{
for(i=n;i>=0;i--)
{
for(j=0;j<=i;j++)
{
for(int8 k=0;k<=0;k++)
{
bit_set(mezcla,j) ;
//bit_set(porta,j) ;
//bit_set(portb,j) ;
salida();
ret1() ;
bit_clear(mezcla,j) ;
//bit_clear(porta,j) ;
// bit_clear(portb,j) ;
salida();
ret1() ;
}
}
bit_set(mezcla,i) ;
//bit_set(porta,i) ;
//bit_set(portb,i) ;
salida();
ret1() ;
}
//porta=0x00;
if (doble==1)
{
for(i=0;i<=n;i++)
{
for(j=n;j>=i;j--)
{
for(int8 k=0 ; k<=0 ; k++)
{
bit_set(mezcla,j) ;
// bit_set(porta,j) ;
// bit_set(portb,j) ;
salida();
ret1() ;
bit_clear(mezcla,j) ;
// bit_clear(porta,j) ;
//bit_clear(portb,j) ;
salida();
ret1() ;
}
}
bit_set(mezcla,i) ;
//bit_set(porta,i) ;
//bit_set(portb,i) ;
salida();
ret1() ;
}
//porta=0x00;
}
}
//************************************
//sec9 // empieza prendiendo 1 a la vez llega al tercero y prende tambien el 1 cuando este llega tambien a 3 prende de nuevo el 1( acumula 3 encendidos) y se va hasta el ultimo 1
void secuencia9()
{
/*
si n7 14
si n=6 12
si n=5 11
si n=4 10
si n3 9
*/
if (n==7)//
m=13;
if (n==6)
m=12;
if (n==5)
m=11;
if (n==4)
m=10;
if (n==3)
m=9;
if (n==2)
m=8;
for (i=0;i<=m;i++)
{
mezcla=s1d7[i];
//porta=s1d7[i];
// portb=s1d7[i];
// s=porta;
salida();
ret1();
// PORTa=(PORTa)^=s14d7[i];
}
if (doble==1)
{
for (i=m;i>=0;i--)
{
mezcla=s1d7[i];
//porta=s1d7[i];
//portb=s1d7[i];
// s=porta;
salida();
ret1();
// PORTa=(PORTa)^=s14d7[i];
}
}
}
//************************************
//sec 10 va aumentando el brillo
void secuencia10()
{
for (g=0;g<=2;g++)
{
pwmh=s2d7[g];
pwml=s3d7[g];
for (f=0;f<=1000;f++)
{
mezcla=0x00;
// porta =0x00;
// portb =0x00;
salida();
delay_us(pwml);
mezcla=0xff;
// porta =0xff;
// portb =0xff;
salida();
delay_us(pwmh);
}
}
if (doble==1) // REGRESO
{
for (g=0;g<=2;g++)
{
pwml=s2d7[g];
pwmh=s3d7[g];
for (f=0;f<=1000;f++)
{
mezcla=0x00;
//porta =0x00;
//portb =0x00;
salida();
delay_us(pwml);
mezcla=0xff;
//porta =0xff;
//porta =0xff;
salida();
delay_us(pwmh);
}
}
}
if (g>2)
{
mezcla=0x00;
//porta=0;
//portb=0;
salida();//lo muestro en los puertos
delay_ms(400);
}
}
//*****************************
//sec10 // ramdom secuencias
void secuencia11()
{
secuencia1 ();
secuencia2 ();
secuencia3 ();
secuencia4 ();
secuencia5 ();
secuencia6 ();
secuencia7 ();
secuencia8 ();
secuencia9 ();
secuencia10();
}
//**** fin funciones ****
//****************************
void freno()
{
porta=0xff;
portb=0xff;
ret1();
porta=0x00;
portb=0x00;
ret1();
}
void frenoflash()
{
for (i=0;i<=5;i++)
{
porta=0xff;
portb=0xff;
delay_ms(50);
porta=0x00;
portb=0x00;
delay_ms(50);
}
delay_ms(400);
}
void suiche()
{
}