-
8Mhz geteilt durch 100, er zählt von 0 bis 99 löst dann zeitgleich mit 99 den interrupt aus und erst im nächsten timerschritt setzt er wieder auf 0, hab mich auch erst vom echten oszilloskop überzeugen lassen ... im moment zu mindest habe ich ja ADC prescaler 8 * 13 ADC clock rechentakte zeit zum dividieren, ein prescaler unter 8 gibt keine berechenbaren ffrequenzen mehr, deine idee mit (ADC>>4) ist genial ... warum ist mr das nciht eingefallen XD ... es könnt wirklich sein dass bei PS 4 oder gar PS 2 die 26 bzw, 52 rechenzyklen nicht ganz ausreichen, ich redduzier mal die ISR und verfrachte das senden in die uart ISR
achhhhssoooooooooooo jetzt hab ich das mit dem adlar erst richtig gefressen, stimmt so spar ich mir die division!!! danke besserwessi ^^
-
Ok, und ich habe deine rumrechnerei verstanden. Du machst es aber auch umständlich ;)
Es würde mich schwer wundern wenn GCC diese Optimierung nicht von alleine hinbekommt, immerhin hat er es ja nur mit unsinged Werten zu tun, denen man beim Shiften ja nicht weht tut.
mfG
Markus
-
ja mei hüpertärminel und excel zwingen mich zu optimierungen
Code:
ISR(SIG_ADC)
{
*pos = ADCH;
if (++pos > end) {
ADCSRA &= ~((1<<ADEN) | (1<<ADIE));
pos = adcval;
UCSRB |= (1<<UDRIE);
}
}
ISR(SIG_UART_RECV)
{
}
ISR(SIG_UART_TRANS)
{
}
ISR(SIG_UART_DATA)
{
UDR = (*pos)/4+'!';
while (!(UCSRA & (1<<UDRE)));
UDR = '\r';
pos++;
if (pos > end) UCSRB &= ~(1<<UDRIE);
}
messreihen haben ergeben dass ich DENNOCH nicht unter ADC prescaler 8 gehen kann, da kommt nur schrott raus .... die schwebung hängt wirklich nur mit der frequenz zusammen, wenn ich die impulsfrequenz nur ein wenig verschiebe, klärt sich die schwebung zu einer gleichmäßigen schwingung, die um +/- 2 vom zielwert herumschwingt
da es im moent nur provisorisch ist und die zeit unkritisch habe ich die ascii anpassung in die UART ISR verlegt
also wie ich mit dem prescaler noch vernünftig auf 2 runterkommen soll ist mir absolut unklar, liegt vermutlich an den 16Mhz dass ich nicht tiefer als 8 komme, bei 4 komme ich auf umgerechnet eine frequenz von 1,8kHz also 0.8kHz zu viel die abtastung wird also nur um etwa 10% schneller statt sich zu verdoppeln
-
Das Verhältnis zwischen Rechenzeit und Wandlungszeit bleibt bei unterschiedlichen Taktfrequenzen immer gleich!
Das was du beschreibst deutet darauf hin, dass die Eingangsimpedanz zu hoch ist.
Der ADC ist laut Datenblatt darauf ausgelegt, bei Normfrequenz mit einer Eingangsimpedanz von maximal 10kOhm (Datasheet, Abschnitt ADC: "Analog Input Circuitry")
Wenn du den ADC mit einer höheren Frequenz betreibst, muss der interne Kondesator schneller aufgeladen werden => deine Stromquelle darf keinen so hohen Widerstand bieten.
Wenn sie das dennoch tut, kann es sein, dass du Schrott misst.
mfG
Markus
PS: Hoffentlich habe ich dich richtig verstanden ;)
-
Wenn es schneller sein soll könnte man auf den Interrupt verzichten und die Daten im Hauptprogram in den Speicher kopieren. Viel Zeit wird schon für Anfang und Ende der ISR zum Retten der Register verbraucht.
Man hat aber immer noch sie Probleme mit dem AD-wandler, der nicht für so hohen Takt ausgelegt ist. Auch eine Niederohmige Qualle hilft da nicht unbedingt viel.
-
Klar wird der ADC ungenauer bei steigender Frequenz. Aber nachdem was ich bisher so zwischen den Zeilen im Forum und im Datenblatt gelesen habe, ist die Impedanz der "Qualle" eben bei steigender Frequenz durchaus von Bedeutung.
mfG
Markus
-
naja ich sage es mal so, wenn ich mti prescaler 8 messe, bekomme ich in 1mS ~153 werte, wenn ich mit ps 4 ODER 2 rechne werden es nicht wie zu erwarten wäre ~306 sondern nur rund 185 werte, der wandler ist schlicht zu langsam bei 16Mhz takt ... die daten für meinen tiefpass haste ja, rechne doch mal die Eingangsimpedanz aus, 100Ohm 330nF und 3,6kOhm und 10nF, die ergebnisse sind immer gleich, bei ps2 und 4 rund 185 werte pro impulse == 1mS ... das würde aber schon fast an die im datenblatt genannten 200kHz rankommen obwohl ich aus dem datenblatt nicht wirklich entnehmen kann worauf diese 200kHz sich beziehen .... die schwebung zu eliminieren wird wohl fast unmöglich sein, es sei denn ich schaffe eine passene kombination aus auflösung und samplezahl um mein signal zu erzeugen wo die, naja ich nenns mal "oberschwingung" gleichmäßig ist ... mhhh ndas hab ich ja noch garnicht probiert ^^
-
Die 200 kHz im Datenblatt beziehen sich auf den AD Takt. Also Quarztakt / Prescaler. Das gibt dann eine maximale Samplingrate von 200 kHz / 13 = 15,4 Khz. Diese einschränkung ist aber nur für die volle 10 Bit Genauigkeit. Sonst sind bis 1 MHz AD takt vorgesehen, also Prescaler 16 bei 16 Mhz Takt.
Mit dem Interrrupt geht das einfach nicht schnell genug die daten auszulesen, der AD wandler würde noch schneller Daten liefern, allerdings ist nicht sicher das die gut sind. Geht dann aber nicht mehr mit ISR in C, sondern nur noch in ASM oder per polling.
-
*grusel* ASM
das polling bleibt wohl die letzte variante die ich probieren kann, ich schrebis mal um ... hätt mir nie träumen lasen dass interrupts so stark bremsen ... ich dachte immer dass das registersichern in max 4 rechenzyklen erledigt ist, dann noch die kopieraktion aus register in speicheradresse, dann inkrement und vergleichen
-
Das Problem ist, dass AVR-GCC wohl immer alle Register sichert, auch wenn die ISR nur eine Hand voll braucht. Das macht >50 Operationen nur für die Katz.
mfG
Markus