Moin.
Hab vor einiger Zeit hier schon mal gefragt, wie man ein Audiosignal am besten für nen AVR in ein Rechtecksignal umwandelt.
Damals wurde mir der Tip mit dem LM339 gegeben. Ich habs zu der Zeit auch hinbekommen.
Jetzt - über 1 Jahr später - wollt ich die Schaltung nocheinmal aufbauen, aber es klappt nicht so wirklich.
Ziel ist es einfach, ein Audiosignal aus einer Soundkarte o.ä. so aufzubereiten, dass ich ein Rechtecksignal gleicher Frequenz hab, die dann an nem INT-Pin eines AVR bestimmt werden kann.
µC ist ein ATMega8, 8MHz intern (ausreichend für diese Zwecke).
Das Testprogramm soll, abhänging von der Frequenz einfach mal eine LED blinken lassen. Ein Software-Frequenzteiler teilt durch 5000, so dass z.B. 5 kHz die LED im Sekundentakt blinken lassen müsste.
Die LED blinkt jedoch - unabhängig von der angelegten Frequenz - immer relativ gleich. Als Testsignal wird ein Sweep von 500 - 5000 Hz durchlaufen.
Für das spätere Projekt sollen dann nur Frequenzen von 800 - 3000 Hz erkannt werden.
Hier mal das Testprogramm:
Code:
#include "main.h" // Funktionsprototypen
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "glob_defs.h" // Definitionen wie ENABLE = 1, DISABLE = 0, etc
#include "glob_type.h" // Typen, ui8_t, ui16_t etc...
volatile ui16_t tmpcnt = 0;
void Sys_Init(void)
{
DDRC |= (1 << PC2) | (1 << PC3) | (1 << PC4) | (1 << PC5);
}
void INT0_Init(void)
{
// INT0, Steigende Flanke
GICR |= (1 << INT0);
MCUCR |= (1 << ISC01) | (1 << ISC00);
}
void Timer1_Init(void)
{
// Timer einfach zählen lassen, Prescaler 1
TCCR1A = 0;
TCCR1B = (1 << CS10);
TCNT1 = 0;
}
int main(void)
{
Sys_Init();
Timer1_Init();
INT0_Init();
sei();
while(1)
{
if (tmpcnt >= 5000)
{
PORTC ^= (1 << PD5);
tmpcnt = 0;
}
}
return(0);
}
ISR (SIG_INTERRUPT0)
{
tmpcnt++;
}
Hat hier jemand nen Verbesserungsvorschlag, Primär mal für die Hardware, um dort ein sauberes Signal zu bekommen?
Lesezeichen