Vous êtes sur la page 1sur 7

Pedal experimental y de bajo costo. freeze sound retainer.

Se requiere un PIC12F1822 y una memoria ram 23LC1024


Un operacional 4558.
No hay diseño de plaqueta por que solo es una prueba y esta version se queda aqui.
Viene en camino otro mucho mejor.

Si tenes consultas buscame en el grupo de pedales DIY de facebook.


Soy Daniel Weselka. Enero 2021.

-------------------------------------------------------------

Para grabar el pic crear un archivo de texto limpio con el block de notas.
Copiar y pegar el siguiente código.
Y renombrar el archivo de texto a main.hex Para que lo tome el grabador de pic que vayas a usar.
:060000008031B22900006E
:08000800830180312000200873
:10001000A4002108A5002208A6002308A7008B1E23
:1000200013280B192328850191308400801C1A287D
:10003000911826282408A0002508A1002608A2005F
:100040002708A30009000B1180311A2830149110E1
:1000500080311A28BA1B302822000C1232282000C6
:1000600022000C1621000C128C1022008C1421008E
:100070008C1022008C1020003A1B422822000C1207
:100080004428200022000C1621000C128C102200A3
:100090008C1421008C1022008C102000BA1A5428D5
:1000A00022000C125628200022000C1621000C12EF
:1000B0008C1022008C1421008C1022008C10200047
:1000C0003A1A662822000C126828200022000C161A
:1000D00021000C128C1022008C1421008C102200A4
:1000E0008C102000BA19782822000C127A282000DF
:1000F00022000C1621000C128C1022008C142100FE
:100100008C1022008C1020003A198A2822000C1230
:100110008C28200022000C1621000C128C102200CA
:100120008C1421008C1022008C102000BA189C28FE
:1001300022000C129E28200022000C1621000C1216
:100140008C1022008C1421008C1022008C102000B6
:100150003A18AE2822000C12B028200022000C16FB
:1001600021000C128C1022008C1421008C10220013
:100170008C102000080021008C1222008C1202300A
:100180002000BA002A20BA012A203808B900BA0093
:100190002A203708B900BA002A2008003808A10030
:1001A0003708A000A10CA00CA10CA00C2008250071
:1001B00091002000B70DB70DB70DB70DCF3025005A
:1001C00093053030200037052500930420000800F7
:1001D00021008C1222008C1203302000BA002A2049
:1001E000BA012A203808B900BA002A203708B90015
:1001F000BA002A200800B70121008C1022008C14BC
:1002000021000C16003020000C1A0130B707210025
:100210008C1022008C1003102000B70D21008C10D0
:1002200022008C1421000C16003020000C1A013022
:10023000B70721008C1022008C1003102000B70D8E
:1002400021008C1022008C1421000C16003020009C
:100250000C1A0130B70721008C1022008C100310FB
:100260002000B70D21008C1022008C1421000C16E8
:10027000003020000C1A0130B70721008C1022003A
:100280008C1003102000B70D21008C1022008C145C
:1002900021000C16003020000C1A0130B707210095
:1002A0008C1022008C1003102000B70D21008C1040
:1002B00022008C1421000C16003020000C1A013092
:1002C000B70721008C1022008C1003102000B70DFE
:1002D00021008C1022008C1421000C16003020000C
:1002E0000C1A0130B70721008C1022008C1003106B
:1002F0002000B70D21008C1022008C1421000C1658
:10030000003020000C1A0130B70721008C102200A9
:100310008C1020003708A100080037083806803903
:10032000BA00B71F9529B709B70AB81F9929B809A4
:10033000B80A3808A10137020318A1293708A0001C
:10034000AD29A0010830B900B70DA00D3808200272
:100350000318A000A10DB90BA429BA1FB129A10946
:10036000A10A0800F030210099005A3020009B00BB
:1003700005309C0021000C112500940195010130ED
:1003800096002D3091001C3093002000B014230003
:100390008C0122009201910121001E109E1001305B
:1003A00023008C0021001E169E161E139E131D1482
:1003B000D9306500323024008C00210095138C1553
:1003C00020008C1DB01021009114C0308B040C3023
:1003D0002500930021009D148C1222008C16200011
:1003E000B801B701BB20B601B5018030BA002A20A0
:1003F0003608A3003508B50A0319B60AB700230862
:10040000B800370FF529380FF529B801B701BB201F
:10041000B601B5013010301C0B2A21009D180E2AA0
:100420001C082000AA0021009D1420002A08BA0000
:100430002A20B50A0319B60AB01C272AAC012A08DB
:10044000AB002C08B8002B08B700CE202F2AAC0137
:100450008030AB002C08B8002B08B700CE2021005C
:100460008C1520008C190A2A36081F3C031C3B2AD5
:10047000FF30B600B5003608B4003508B300FF30D1
:100480003502B1001F30363BB2003208B6003108E9
:10049000B50021008C1222008C1620003208B80012
:1004A0003108B700E8203108A80004303207A9005D
:1004B000FB202108803C031D622A3208A900310874
:1004C000A800652AB10A0319B20A28083102031DDF
:1004D000582A29083202031D582A21008C122200B2
:1004E0008C1620003208B8003108B700E820301020
:1004F000301C782A33083502031D902A340836024E
:10050000031D902A21008C1222008C162000320834
:10051000B8003108B700E8203208B6003108B5004D
:10052000FB202108AD00B50A0319B60AB01CC22A87
:1005300021009D18992A1C082000AA0021009D1462
:100540007F3020002A02AE007F302D02AF002E083F
:10055000B7000230B8008D212108AE002F08B70087
:100560000230B8008D212108AF002F082E077F3EF2
:10057000A301AB002308AC002C08B8002B08B7007F
:10058000CE20C62AB8012D08B700CE2021008C1538
:1005900020008C1D772A21008C1222008C1620004E
:0E05A000B801B701BB20B601B5010A2A6300FD
:020000040001F9
:04000E008439FC1E17
:00000001FF
;PIC12F1822
;CRC=26AD CREATED="06-feb-21 22:02"

Aqui abajo de todo dejo el código fuente (no es necesario, por si


alguien quiere investigar)

un detalle, si el pedal se enciende (al momento de darle corriente)


esta el pulsador apretado, se pasa a un modo sin bypass de audio (sin
retorno). O sea solo el efecto. Esto es si alguien quiere modificar el
circuito y hacer que el sonido en vivo pase de largo. Y asi mejorar la
calidad del audio.
// pedal experimental freeze sound retainer
// Daniel Weselka Danywes @ gmail . com
// enero 2021
// compilado con PIC C CCS
///////////////// main.c desde aqui /////////////////////////////////////////
#include <12F1822.h>
#device ADC=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES WRT //Program Memory Write Protected
#use delay(internal=32MHz)
#use pwm(CCP1,TIMER=2,FREQUENCY=22050,DUTY=50)
int16 finxx;
int adc;
int16 pwm;
int ram;
signed int c;
signed int d;
short sincro;
short bypass=true; // cero sin bypass 1 con bypass
int16 primer_sample;
int16 ultimo_sample;
int16 puntero;
#define pulsador PIN_A3
#include <ram_23LC1024_64kb.c>
#INT_TIMER0
void TIMER0_isr(void)
{}
#INT_TIMER2
void TIMER2_isr() { // periodo PWM 90us en 11025 / 45us en 22050
sincro= true;
}
void main()
{
setup_adc_ports(sAN0);
setup_adc(ADC_CLOCK_INTERNAL);
// setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1|RTCC_8_bit); //32,0 us overflow
set_tris_a(0b11011001);
PORT_A_PULLUPS(0b00110010);
if (!input(pulsador)) bypass = false; // pulsador apretado al
// encender audio con bypass
// enable_interrupts(INT_TIMER0);
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
pwm_on();
read_adc(ADC_START_ONLY);
output_high (ram_cs);
ram_start_out (0); // 2 para escritura - dir 0
puntero=0;
do{
spi_output(0x80); // borra memoria RAM
}while (puntero++ < 0xffff);

ram_start_out (0); // 2 para escritura - dir 0


puntero=0;
while (true) {
do{
sincro=false; // sincronismo al comienzo de
while (!sincro); // cada pulso de PWM
adc=read_adc(ADC_READ_ONLY);
read_adc(ADC_START_ONLY);
spi_output(adc); // graba sample en memoria RAM
puntero++;
if (bypass) {
pwm = adc;
pwm_set_duty(pwm);
}else{
pwm = 128;
pwm_set_duty(pwm);
}
} while (input(pulsador)); // pulsador suelto, sigue grabando
//! } while (input(pulsador)||(adc>144)||adc<112);
//! // pulsador suelto, sigue grabando
//! // solo sale del bucle en un cruce
//! // por cero.
//!
if (puntero < 8192)puntero = 0xFFFF; // evita el corte por fin de memoria.
ultimo_sample = puntero;
primer_sample = puntero - 8191;
puntero = primer_sample;
output_high (ram_cs);
ram_start_in (primer_sample); // 3 para lectura
////////// busca el primer cruce por cero para evitar clicks ////
finxx = primer_sample + 1024;
do {
if ( spi_input() == 128) finxx=primer_sample;
else primer_sample++;
} while (primer_sample != finxx);
/////////////////////////////////////////////////////////////////
output_high (ram_cs);
ram_start_in (primer_sample); // 3 para lectura
do{
sincro=false; // sincronismo al comienzo de
while (!sincro); // cada pulso de PWM
if (puntero == ultimo_sample){ // termina el loop de audio
output_high (ram_cs); // comienzo de un nuevo loop
ram_start_in (primer_sample); // 3 para lectura de RAM
puntero = primer_sample;
}
ram = spi_input ();
puntero++;
if (bypass) {
adc = read_adc(ADC_READ_ONLY);
read_adc(ADC_START_ONLY);
c = adc - 127;
d = ram - 127;
c = c/2; // prueba menos volumen
d = d/2; // prueba menos volumen
pwm = c + d + 127; // suma onda de la memoria y la de entrada
pwm_set_duty(pwm);
}else{
pwm_set_duty(ram);
}
}while (!input(pulsador)); //mantiene el buble con el pulsador presionado
output_high (ram_cs); // prepara para grabar el nuevo bucle.
ram_start_out (0); // 2 para escritura - dir 0
puntero=0;
}
}
///////////////// fin main.c /////////////////////////////////////////
//////// Comienzo archivo ram_23LC1024_64kb.c desde aqui ///////////////////
////////////////////////////////////////////////////////////////////////////
//////////////// nuevas rutinas mas rapidas Daniel Jun 2019 /////////////
//
// llamar primero a ram_start con la direccion de
// comienzo a escribir o leer. y el comando 2 para escritura 3 para lectura
// luego enviar los bytes de a uno llamando a spi_output(). el dato
// o ir leyendo los bytes de a uno con spi_input ()
// finalizar con output_high (ram_cs) antes de cambiar de
// modo lectura o escritura
////////////////////////////////
//#byte TRISC = 0xF94 // tris puerto C //valido para PIC18F2550 y PIC18F4550
//#bit TRISio1 = TRISC.1 // bit 1 ent/sal memoria
//#byte TRISE = 0xF96 // tris puerto C //valido para PIC18F2550 y PIC18F4550
//#bit TRISio1 = TRISE.1 // bit 1 ent/sal memoria
///////////////////////////////
//#USE FAST_IO (A)
#define ram_cs PIN_A5 // pin 2 - picpin
#define ram_so PIN_A4 // pin 3 - picpin con resistencia para
// unir ram_so y ram_si
// memoria pin 3 wp VCC
// memoria pin 4 GND
#define ram_si PIN_A4 // pin 3 - picpin
#define ram_sck PIN_A1 // pin 6 - pinpic
// memoria pin 7 HOLD VCC
// memoria pin 8 VCC
//#define fin_ram 0x0001ffff //#131071 bytes
#define fin_ram 5500 // 1/4 segundo 11000 // 1/2 segundo
void ram_init (void)
{
output_high (ram_cs);
output_low (ram_sck);
}
int spi_input (void)
{
int b;
//!// 18us 26 words Codigo mas lento pero ocupa menos memoria
//! int x;
//! for (x=0;x<8;x++){
//! b = b<<1;
//! output_high (ram_sck);
//! if (input(ram_so)) bit_set(b,0);else bit_clear (b,0);
//! output_low (ram_sck);
//! }
//!/// 14 us 143 words Código mas rápido.
b = 0;
output_high (ram_sck);
b += input(ram_so);
output_low (ram_sck);
b = b<<1;
output_high (ram_sck);
b += input(ram_so);
output_low (ram_sck);
b = b<<1; output_high (ram_sck);
b += input(ram_so);
output_low (ram_sck);
b = b<<1; output_high (ram_sck);
b += input(ram_so);
output_low (ram_sck);
b = b<<1; output_high (ram_sck);
b += input(ram_so);
output_low (ram_sck);
b = b<<1; output_high (ram_sck);
b += input(ram_so);
output_low (ram_sck);
b = b<<1; output_high (ram_sck);
b += input(ram_so);
output_low (ram_sck);
b = b<<1; output_high (ram_sck);
b += input(ram_so);
output_low (ram_sck);
return (b);
}
void spi_output (int oo)
{
///////// 130us código mas lento pero ocupamenos memoria.
// int x;
// for (x=0;x<8;x++){
// output_bit (ram_si,bit_test(rw,x));
// output_high (ram_sck);
// output_low (ram_sck);
// rw = rw<<1;
// }
////////// 14 us código mas rápido.
output_bit (ram_si,bit_test(oo,7));
output_high (ram_sck);
output_low (ram_sck);
output_bit (ram_si,bit_test(oo,6));
output_high (ram_sck);
output_low (ram_sck);
output_bit (ram_si,bit_test(oo,5));
output_high (ram_sck);
output_low (ram_sck);
output_bit (ram_si,bit_test(oo,4));
output_high (ram_sck);
output_low (ram_sck);
output_bit (ram_si,bit_test(oo,3));
output_high (ram_sck);
output_low (ram_sck);
output_bit (ram_si,bit_test(oo,2));
output_high (ram_sck);
output_low (ram_sck);
output_bit (ram_si,bit_test(oo,1));
output_high (ram_sck);
output_low (ram_sck);
output_bit (ram_si,bit_test(oo,0));
output_high (ram_sck);
output_low (ram_sck);
}
void ram_start_out (int16 dd)
{
// TRISio1 = 0;
output_low (ram_cs);
spi_output (2);
spi_output(0);
spi_output(make8(dd,1));
spi_output(make8(dd,0));
}
void ram_start_in (int16 dd)
{
// TRISio1 = 0;
output_low (ram_cs);
spi_output (3);
spi_output(0);
spi_output(make8(dd,1));
spi_output(make8(dd,0));
// TRISio1 = 1;
}
//////// fin archivo ram_23LC1024_64kb.c hasta aqui ///////////////////

Vous aimerez peut-être aussi