Eis aqui mais um achado na Internet.
Um projecto interessante, simples e muito aplicado por hobbistas agora com a chegada no Natal.
Trata-se de um LED que tenta simular uma vela, recorrendo a um pequeno MCU (neste caso um 12F675) para gerar o PWM aleatório com uma duração igualmente aleatória.
O efeito é bastante semelhante ao de uma vela. O código teve de sofrer algumas alterações, em relação ao original, mas funcionou bastante bem quando o testei. Digo isto porque não estando no meu super-mega laboratório caseiro, apenas consegui um LED branco de HB para testar e fiquei muito satisfeito.

Para mais Info e ver o código original com os comentários, este é o LINK.

#include <htc.h>

__CONFIG (FOSC_INTRCIO & WDTE_OFF & PWRTE_ON & MCLRE_OFF & BOREN_OFF & CP_OFF & CPD_OFF);

unsigned int t1value=65535-(100+99*1)+1; //inicial 1%

void interrupt isr(void)
{
if(T0IF)
{
TMR0=217;
TMR1H=(t1value>>8)&0xFF;
TMR1L=(t1value&0xFF);
GPIO2=1;
TMR1ON=1;
T0IF=0;
}
if(TMR1IF)
{
TMR1ON=0;
GPIO2=0;
TMR1IF=0;
}
}

char getrandombit(void)
{
static unsigned short shiftregister=0x9500;
unsigned short value;
char output;

value=(shiftregister&0x0200)>>9 ^ (shiftregister&0x0400)>>10;
shiftregister <<= 1;
shiftregister |= value;
output=(value ^ 1) & 0x01;
return output;
}

void main(void)
{
char i=30;
int pause;
GIE=0;
PEIE=0;

TRISIO=0x3B;

ANSEL=0;

OPTION_REG=0xD7;

TMR0=217;
T0IF=0;
T0IE=1;

T1CON=0x00;
TMR1H=(t1value>>8) & 0xFF;
TMR1L=(t1value&0xFF);
TMR1IF=0;
TMR1IE=1;

PEIE=1;
GIE=1;

while(1)
{
if(getrandombit())
i+=10;
else
i-=10;

if(i<0)  i=0;
if(i>60) i=60;

t1value=65535-(100+99*i)+1;

for(pause=0;pause<1000;pause++);
}
}


0 Responses so far.

Enviar um comentário