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.