??
Einfach prüfen, ob der zuvor gemessene Wert größer, bzw kleiner ist.
if(wert[i] < wert[i-1]) //Fallende Flanke (1->0)
if(wert[i] > wert[i-1]) //Steigende Flanke (0->1)
hallo ich hab folgendes Problem:
Ich will einen Frequenzzähler in AVR Studio 4 für den ATmega88 programmieren.
Frequenzbereich 80-400Hz. Sinus-Spannung über Oszi an Pin.
Ich hab mich die letzten 4 stunden durch sämtliche foren und
bauanleitungen gegoogelt und hab ein grundlegendes Problem:
Wie erkenn ich eine high-low Flanke des Signals?
Der ADC ist programmiert und sollte einen 10bit Wert in die Register
schreiben (ADH, ADL) wie errechne ich daraus eine Flanke? In allen
Anleitungen wurde einfach abgefragt, ob am Port X eine 1 anliegt
(Flanke ??).
Kann der Contr. hardwareseitig eine Flanke erkennen ?
Danke für die schnellen und zahlreichen Antworten.
??
Einfach prüfen, ob der zuvor gemessene Wert größer, bzw kleiner ist.
if(wert[i] < wert[i-1]) //Fallende Flanke (1->0)
if(wert[i] > wert[i-1]) //Steigende Flanke (0->1)
Naja, da hast du dann aber auch leicht sofort eine Flanke wenn der Wert nur leicht im high oder low bereich flakert. Du müsstest die aufschreiben wie die Werte in den letzten paar Millisekunden waren und dann vergleichen, damit dass ganze aussagekräftig ist, aber da ist die Frage nach ner internen Möglichkeit sehr gut
Ich hätte auch gerne ne Antwort auf deine Frage . . .
www.subms.de
Aktuell: Flaschcraft Funkboard - Informationssammlung
Warum verwendet ihr nicht den Analog-Comparator, der kann auch gleich einen Interrupt auslösen bei entsprechender Flanke.
Hubert
oder nen OP-Verstärker davor, der dann das kleine Signal auf annähernd
Rechteck verstärkt
Vor den Erfolg haben die Götter den Schweiß gesetzt
Über RC Netzwerk an INT0 oder INT1 Pin und auf Flanke triggern lassen. Steht im Datenblatt des Mega88 beschrieben.
danke erstmal für eure ideen,
hab mich jetzt mal an das prog. gemacht. warscheinlich ist es etwas primitv oder umständlich....ist ja auch mein erstes \/
die berechnung hab ich simuliert und die funtzt auch, aber der ADC konvertiert nicht. hab schon alles mögliche bei der initalisierung
ausprobiert: Single Conversion, Free Running...
es wird einfach kein Wert in die ADCL und ADCH register geschrieben,
Das Signal kommt wie gesagt aus nem generator und liegt definitv am Port an.
hier die Initialisierung des ADCs:
und hier der Start der Konvertierung im Single Conversion Mode:Code:void initadc (void) { //Powersave Disable PRR |= (0<<PRADC); // ADC aktivieren ADCSRA |= (1<<ADEN); // Prescaler auf /128 ADCSRA |= (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // Referenzspannung auf interne 1,1V ADMUX |= (1<<REFS1) | (1<<REFS0); // Input auf PC4 / ADC4 ADMUX |= (0<<MUX3) | (1<<MUX2) | (0<<MUX1) | (0<<MUX0); // Ergebnis rechtsverschoben ADMUX |=(0<<ADLAR); // B-Register initialisieren ADCSRB = 0x00;
Code:ADCSRA |= (1<<ADSC); // Umwandlung starten //while (ADCSRA & (1<<ADSC)); // warten bis umwandlung fertig
Lesezeichen