Generar una onda de 400 kHz

#1
Hola, me gustaria saber lo primero si me es posible generar una onda (cuadrada) de unos 400 kHz con un arduino UNO, estoy haciendo muchas pruebas con los timers y AVR, pero solo consigo ondas de 90 kHz, tengo bastante claro que hacer, pero no me funciona, y no entiendo por que.

Si alguien me pudiera echar una mano, se lo agradeceria muchisimo.
 
#3
Muchas gracias por tu ayuda, pero no tengo ni idea de ensamblador, intentare buscar alguna solucion, y si no, tendre que ponerme a aprender, jaja.

Muchas gracias por tu ayuda y rapidez
 
#9
uffffff, en principio, la quiero para emitir por una antena y recibirla, pero tb me gustaria hacer una modulacion en frecuencia de la onda para transmitir informacion
 
#10
Acá te subo el proyecto reducido solo para hacer esa señal cuadrada en 400kHz (dá justo si no me equivoqué).

El código en C es este:

Código:
#include <avr/io.h>
#include <avr/interrupt.h>
 
//-------------- Definiciones de tipos de variables
typedef unsigned char			u8;
typedef unsigned int			u16;
typedef unsigned long int		u32;
typedef unsigned long long int	u64;
//-------------- Definiciones de tipos de variables

//-------------- Variables globales de interrupciones
volatile u8 flag_externa0=0;
//-------------- Variables globales de interrupciones

/*	PUERTO SALIDA TTL		*/

#define PORT_SALIDA_TTL		PORTA
#define DDR_PORT_SALIDA_TTL	DDRA
#define PIN_PORT_SALIDA_TTL	PINA
#define BIT_SALIDA_TTL		PA4

/*----------------------------*/

extern void ttl_frec_var_alta(u8,u8);

#define DISPARO_EXT_NIVEL_BAJO		0
#define DISPARO_EXT_CAMBIO_LOGICO	1
#define DISPARO_EXT_FLANCO_DESC		2
#define DISPARO_EXT_FLANCO_ASC		3


void set_bits (volatile u8 *port, u8 mask)
{
	*port |= mask;
}

void configura_int_externa_0(u8 tipo_de_disparo)
{
	DDRD &= ~(1 << PD2);     // PD2 como entrada
	set_bits(&PORTD,(1<<PD2));
	
	
	MCUCR&=0xfC;
	MCUCR|=(0x03&tipo_de_disparo); // Defino el tipo de disparo
	
	GIFR&=~(1<<INTF0);	//limpio el flag de la interrupción externa
}

int main(void)
{   			
	DDRA=(1<<BIT_SALIDA_TTL);
	
	GICR&=0x3f;			//Deshabilito las interrupciones externas
	GICR|=(1<<INT0);	//Habilito la interrupcion externa 0
	SREG |=0x80;		// Habilito las interrupciones
    
	u8 t_on=5,t_off=5; // 400kHz
	
	while(1)
    {        
		
		//Fvariable=16MHz/{2*[8Clk + 3*(N-1)]}	N esta compuesto por 2 bytes (alto y bajo)
		ttl_frec_var_alta(t_on,t_off);	// Solo sale cuando hay una interrupción externa 0!
		
    }
La función "ttl_frec_var_alta" está hecha en assembler, tiene dos bytes de argumento, que definirán el Ton y el Toff, la frecuencia quedará definida por:

Fvariable=16MHz/{2*[8Clk + 3*(N-1)]}

Me olvidé como funcionaba, pero creo que fijando en 5 Ton y Toff, obtenés 400kHz.

De esa función en assembler, la única forma de salir es usando la interrupción externa 0, de lo contrario se la pasa generando la señal.

El puerto que usé como salida es el PA4, de un atmega 16, se puede modificar fácilmente.

El resto de las funciones sos bastante básicas, configurar los puertos como salida, la externa 0, etc.
 

Adjuntos

Arriba