TODOPIC
Otros Microcontroladores / Dispositivos programables => Microcontroladores 8 bits => Mensaje iniciado por: resistencia en 05 de Julio de 2008, 20:00:15
-
buendia tenga todos
si alguien puede ayudarme; como puedo capturar 20 muestras de una señal seno con frecuancia de 60Hz, guardarlas en un buffer y enviarlas por el puerto serie.
-
Hola Resistencia!
no soy un experto para darte los pasos, pero usando el adc del atmega en modo multiplexer es posible, siendo asi es muy complejo lo que quiere hacer, ¿Que lenguaje usa para los Atmel? ¿ y Cual programdor? y ¿para que va usar 20 captura de señales Seno?, danos mas informacion.
Saludo
-
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);
}
};
-
Lo siento mucho resistencia, yo no uso Codevision, sino Bascom, ha probado mirar aqui http://www.avrfreaks.net/ te aconsejo de darte una mirada alli que lo mas seguro encuentra algunas soluciones.
Saludo
-
no importa me serviria de todas maneras como lo puedo hacer, con tal de que este en lenguje c, yo haria la adecuacion correspondiente