quinta-feira, 25 de março de 2010

LED Scope com R8C/1A


Bem meus caros visitantes, eu estava precisando de um scope light para medir algumas coisas em campo e tive a idéia de montar um protótipo simplificado ... ou um Draft de um Scope usando uma matriz de leds e um R8C/1A ... deu certo... apesar de ter ainda que fazer um monte de ajustes ...
Bom aí vai um passo-a-passo do brinquedo:

Primeiro selecionamos os LEDs de 3mm, como eu não tinha 100 leds de uma cor só eu misturei verdes e vermelhos....


Começando a soldagem dos componentes...



Notem a forma de amarração da matriz de leds pelo lado de traz ...


Aqui a matriz já quase completa...


A matriz completa ...


Soldando um soquete e um 4017 para chavear as colunas....


Conferindo as pontes e as ligações em busca de imperfeições ...



Fixando a placa do R8C/1A na placa da matriz de leds...



Fazendo as primeiras ligações para os Positivos dos Leds, ligando do 4017 para os transistores, que estão ligados a 5V...


Uma Visão dos transistores... Usei o já famoso BC548B ... tem de penca na gaveta! ;-)


Feitas todas as ligações dos pinos do 4017 para os transistores, ligamos também as linhas do 5V e do GND...


E finalmente a ligação das linhas negativas da Matriz para os pinos correspondentes do R8C/1A ...
Com esta configuração, nível lógico 0 acende o led e nível lógico 1 apaga o mesmo...


Ligando agora o fio amarelo que faz o clock do R8C para o 4017...




Tudo ligado ... pronto ... conectando o E8 para fazermos o programa ...



Primeiro ligando todos os leds... tiveram 2 que falharam e foram substituidos ...


E agora o programa rodando com um audio na entrada AD do R8C ...


Vejam também o vídeo ...


E por fim... segue o código fonte:

==========================
#include "sfr_r81b.h"

void main(void);

char sample[10];

void initializeCPU(void) {
int t;
asm("FCLR I");                           //Interrupt disable
prc0=1;                                  //Protect off
//**************************************
// CPU Clock Setting
//**************************************
//Note: Include asm("nop")for oscillator's stabilization period after clock setting is done.
//User may set on-chip oscillator to off when Main Clock is selected.(cm14=1)
cm05=0;cm13=1;cm14=0;                    //Main Clock selected(cm0 bit 5, cm1 bit 3 and 4, ocd bit 2)
for(t=0; t<10; t++);
cm15=1;                                  //High Drive Capacity selected(CM1 bit 5)
ocd2=0;                                  //Main Clock selected(ocd bit 2)
cm16=0;cm17=0;cm06=0;                    //No division selected(cm0 bit 6,cm1 bit 6 and 7)
prc0=0;                                  //Protect on
asm("FSET I");           //Interrupt enabled
}

void initializeIO(void) {
// Column OUT LEDs
pd3_4 = 1;
pd3_3 = 1;
pd1_0 = 1;
pd1_1 = 1;
pd1_2 = 1;
pd1_4 = 1;
pd1_5 = 1;
pd1_6 = 1;
pd1_7 = 1;
pd4_5 = 1;
// Setting Initial Logic levels
p3_4 = 0;
p3_3 = 0;
p1_0 = 0;
p1_1 = 0;
p1_2 = 0;
p1_4 = 0;
p1_5 = 0;
p1_6 = 0;
p1_7 = 0;
p4_5 = 0;
// Clock for 4017
pd3_5 = 1;
}

void initializeAD(void) {
//**************************************
// ADC Setting
//**************************************
//When using the repeat mode, use the undivided XIN clock as the CPU clock
//Note:For 8-bit resolution, when conversion finished, read AD result at AD register(00C0H).
//Note:For 10-bit resolution, when conversion finished, read AD result at AD register(00C0H,00C1H).
//Set AN11 pin to input port direction
vcut=1;adgsel0=1;ch0=1;ch1=1;ch2=1;      //Port P1 group: AN11 is selected(adcon0 bit 0-3)
md=0;                                    //One-shot mode selected(adcon0 bit 3)
cks1=0; cks0=0;                          //f4 selected(adcon1 bit 4 and adcon0 bit 7)
bits=1;                                  //10-bit mode selected(adcon1 bit 3)
smp=1;                                   //With sample and hold selected(adcon2 bit 0)
adst=1;                                  //A/D conversion starts(adcon0 bit 6)
adic=0x00;                               //Set interrupt piority level 0(adic)
}

void SetAmplitude(char amplitude) {
p3_4 = 1;
p3_3 = 1;
p1_0 = 1;
p1_1 = 1;
p1_2 = 1;
p1_4 = 1;
p1_5 = 1;
p1_6 = 1;
p1_7 = 1;
p4_5 = 1;
switch (amplitude) {
case 0: p3_4 = 0; break;
case 1: p3_3 = 0; break;
case 2: p1_0 = 0; break;
case 3: p1_1 = 0; break;
case 4: p1_2 = 0; break;
case 5: p1_4 = 0; break;
case 6: p1_5 = 0; break;
case 7: p1_6 = 0; break;
case 8: p1_7 = 0; break;
case 9: p4_5 = 0; break;
}
}

void Wait(void) {
int t;
int t2;
for(t2=0; t2<1; t2++) {
for(t=0; t<1; t++) {
asm("nop");
}
}
}

void ClockPulse(void) {
p3_5 = 0;
Wait();
p3_5 = 1;
Wait();
p3_5 = 0;
}

void AddSample(char samp) {
int t;
for(t=1;t<=9;t++) {
sample[t-1]=sample[t];
}
sample[9]=samp;
}

void RenderScreen(void) {
int t;
for(t=0;t<=9;t++) {
SetAmplitude(sample[t]);
ClockPulse();
}
}

void main(void) {
int t=0;
int pulseWidth=80;
int pulseCount=0;
initializeCPU();
initializeIO();
initializeAD();
adst=1;
for(;;) {
adst=1;
while(adst==1);
t=(9*ad)/128;
if(pulseCount==pulseWidth) {
AddSample(t);
pulseCount=0;
}
pulseCount++;
RenderScreen();
}
}

==========================

Nenhum comentário:

Postar um comentário