Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - yersonugarte

#1
Programación C/C++ / ayuda con programa
21 Agosto 2015, 05:07 AM
hola gente del foro, resulta que mi nivel de c no es de lo mas avanzado y me dieron un programa que tengo que ver como trabaja, lo que hace es: se tiene el pic que recibe una señal proveniente de un microfono y usa un conversor analogo-digital y la señal la almacena en una memoria externa y hace que se repita infinitas veces y se puede controlar la velocidad de las repeticiones todo esto presionando un boton pero hay varios codigos que no entiendo bien seria genial si me podrian echar una manito. aqui va el programa, de antemano muchas gracias....  :laugh:

[ MOD] Para publicar codigo se debe usar las etiquetas GeShi.



#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;
}