#include <16F877a.h>
#device ADC=8
#fuses NOWDT,HS,NOPROTECT,NOBROWNOUT
#use delay(clock=20000000)
#include "spi_hardware1.h"
unsigned int8 valor = 0; unsigned int8 i;
unsigned int8 variable1, variable2;
int8 cambio_pulso;
int8 movimiento1,movimiento2,movimiento3;
short estado_de_pulso;
signed int8 cambio_1 = 0;
int8 registro_1 = 0;
void DACout(int8 valores_bytes) {
output_b(valores_bytes);
}
#INT_RTCC //se utiliza interrupcion con el timer 0
void playback() {
delay_us(42);
set_rtcc(128+cambio_1);
if(movimiento3) movimiento3--;
else output_low(PIN_E2);
variable2++;
if(variable2==255) {
variable1++;
movimiento1++;
}
if(variable1==registro_1) variable1=0;
if(movimiento1 == movimiento2) {
movimiento1 = 0;
output_high(PIN_E2);
movimiento3 = 5;
}
if(input_state(PIN_D0) != estado_de_pulso) i++; // Boton presionado
else i=(i==0)?i-1:0;
valor = readByte(variable1,variable2);
output_b(valor);
cambio_1 = read_adc()/2 - cambio_pulso;
}
void main() {
short dir=0;
set_tris_b(0x00);
output_low(PIN_E1); // initially set relay to full bypass
for(i=0;i<6;i++) {
output_toggle(PIN_E0);
delay_ms(50);
}
setup_adc(ADC_CLOCK_DIV_2);
setup_adc_ports(AN0_AN1_AN2_AN3_AN4);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(GLOBAL);
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_XMIT_L_TO_H|SPI_CLK_DIV_4);
valor = 0;
while(1) {
set_adc_channel(0);
variable1=0;
variable2=0;
estado_de_pulso = input_state(PIN_D0);
// "Wait" phase
while(1) {
if(input_state(PIN_D0) != estado_de_pulso) i++;
else i=(i==0)?i-1:0;
if(i==100) break;
valor = read_adc();
output_b(valor);
delay_us(20);
}
estado_de_pulso = !estado_de_pulso;
delay_ms(50);
set_adc_channel(2);
registro_1 = read_adc()/2 + 1;
set_adc_channel(0);
// Recording phase
if(input_state(PIN_D7)) while(1) { // if(input_state(PIN_D7)) to read from LOOP/BURST switch
variable2++;
if(variable2==255) variable1++;
if(variable2==registro_1) break;
valor = read_adc();
output_b(valor);
delay_us(50);
delay_us(30);
writeByte(variable1,variable2,valor);
}
else while(1) {
variable2++;
if(variable2==255) variable1++;
if(variable1==128) break;
if(input_state(PIN_D0) != estado_de_pulso) i++;
else i=(i==0)?i-1:0;
if(i==100) {
estado_de_pulso = !estado_de_pulso;
break;
}
valor = read_adc();
output_b(valor);
delay_us(50);
delay_us(25);
writeByte(variable1,variable2,valor);
}
registro_1 = variable1;
play:
set_adc_channel(1);
output_high(PIN_E1); // engage relay, switch to playback mode
delay_us(50);
cambio_pulso = read_adc()/2;
variable1=variable2=dir=0;
output_high(PIN_E2);
enable_interrupts(INT_TIMER0);
movimiento1=0;movimiento2=registro_1/4;
movimiento3 = 5;
set_rtcc(0);
while(1) {
if(i==100) break;
delay_us(200);
}
estado_de_pulso = !estado_de_pulso;
disable_interrupts(INT_TIMER0);
output_low(PIN_E1); // disengage relay, return to full bypass
}
return;
}