[ MOD] Para publicar codigo se debe usar las etiquetas GeShi.
Código
#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; }