gracias por responderme,
estoy usando lenguaje c, con el codevisionAVR; ya habiendo configurado el ADC, quisiera poder tomar estas 20 muestras, guardarlas en un buffer que podria ser (unsigned char sen[20] ) y luego de haber tomado las 20 muestras enviarlas por el puerto serie para que otro programa en el pc me las procese, estas 20 muestras se deben tomar cada 850 microsegundos, en donde todas las 20 muestras equivalen a la frecuencia o mas bien ell periodo de la onda seno de entrada que tiene un a frecuencia de 60 Hz. OK. espero con esta informacion me puedan ayudar. he aqui un pequeño codigo en donde hago supuestamente este proceso pero simulandolo no me captura las 20 muestras.
#include <mega32.h>
#include <delay.h>
#include <ctype.h>
unsigned char se2[20];
char rect;
int adc_data1,i=0; //declaracion de variables
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
unsigned char rx_wr_index,rx_rd_index,rx_counter;
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
#pragma savereg-
interrupt [USART_RXC] void uart_rx_isr(void)
{
char status,data;
#asm
push r26
push r27
push r30
push r31
in r26,sreg
push r26
#endasm
status=UCSRA;
data=UDR;
//rect=data; //se lo agregue
//PORTB=rect; //se lo aagregue
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
#asm
pop r26
out sreg,r26
pop r31
pop r30
pop r27
pop r26
#endasm
}
#pragma savereg+
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
// USART Transmitter buffer
#define TX_BUFFER_SIZE 8
char tx_buffer[TX_BUFFER_SIZE];
unsigned char tx_wr_index,tx_rd_index,tx_counter;
// USART Transmitter interrupt service routine
#pragma savereg-
interrupt [USART_TXC] void uart_tx_isr(void)
{
#asm
push r26
push r27
push r30
push r31
in r26,sreg
push r26
#endasm
if (tx_counter)
{
--tx_counter;
UDR=tx_buffer[tx_rd_index];
UDR=se2; //esto lo agregue
//PORTB=UDR; //se lo agregue
if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
};
#asm
pop r26
out sreg,r26
pop r31
pop r30
pop r27
pop r26
#endasm
}
#pragma savereg+
#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
{
tx_buffer[tx_wr_index]=c;
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
++tx_counter;
}
else
UDR=c;
// PORTB=UDR; //se lo agregue
#asm("sei")
}
#pragma used-
#endif
#define ADC_VREF_TYPE 0x20
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void) // interrupcion del ADC
{
unsigned char adc_data;
// Read the 8 most significant bits
// of the AD conversion result
adc_data=ADCH;
// Place your code here
adc_data1=adc_data;
}
while (1) he aqui el programa con el cual supuestamente me debe capturar las 20 muestras
{
// Place your code here
for (i=0;i<20;i++){
ADCSRA|=0x40; // llama al conversor
se2=adc_data1;
delay_us(850);
}
if (i==20){
puts(se2);
}
};