Autor Tema: como capturar 20 muestras de una señal seno con el ADC de un ATMEGA32  (Leído 4568 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado resistencia

  • PIC10
  • *
  • Mensajes: 7
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.

Desconectado stk500

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 4919
Re: como capturar 20 muestras de una señal seno con el ADC de un ATMEGA32
« Respuesta #1 en: 06 de Julio de 2008, 02:56:21 »
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


Desconectado resistencia

  • PIC10
  • *
  • Mensajes: 7
Re: como capturar 20 muestras de una señal seno con el ADC de un ATMEGA32
« Respuesta #2 en: 07 de Julio de 2008, 13:38:19 »
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);
         }
     
       };

Desconectado stk500

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 4919
Re: como capturar 20 muestras de una señal seno con el ADC de un ATMEGA32
« Respuesta #3 en: 07 de Julio de 2008, 14:30:07 »
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

Desconectado resistencia

  • PIC10
  • *
  • Mensajes: 7
Re: como capturar 20 muestras de una señal seno con el ADC de un ATMEGA32
« Respuesta #4 en: 07 de Julio de 2008, 16:54:16 »
no importa  me serviria de todas maneras como lo puedo hacer, con tal de que este en lenguje c, yo haria la adecuacion correspondiente