Hallo Leute,
wie setze ich ganz allgemein normalerweise die Abtastrate in einem C
Programm um, welches einen Atmega8 steueren soll?
Ich stele mir das so vor, dass ich im eine Schleife programmiere. Die
Anzahl der Durchlaeufe lege ich fest. Im Ende der Schleife baue ich
enfach noch ein Verzoegerung ein. Diese Verzoergerung selber bestimmt
somit die Abtastrate.
Macht man das so ?
Spielt der ueber den Vorteiler eingestellte Prozessortakt eine Rolle
oder ist der nur wichtig, wenn ich mit Interrupts arbeiten moechte?
Besten Dank im Vorraus
Berus
Hallo,
Mit delay in einer Schleife würde ich das nicht tun. Blockiert dir den
Rest deines Programms.
Ideal wäre denke ich den ADC mittels Prescaler auf eine bestimmte
Frequenz zu setzten und dann im Freerunning Modus laufen zu lassen.
Es lässt sich jedes mal wenn eine Wandlung fertig ist ein Interrupt
erzeugen. Diesen kannst du dann nutzen.
@ Berus (Gast)
>wie setze ich ganz allgemein normalerweise die Abtastrate in einem C>Programm um, welches einen Atmega8 steueren soll?
Welche Abtastrate? VOn einem AD-Wandler? Oder eher einer zyklischen
Berechnung?
>Ich stele mir das so vor, dass ich im eine Schleife programmiere. Die>Anzahl der Durchlaeufe lege ich fest. Im Ende der Schleife baue ich>enfach noch ein Verzoegerung ein. Diese Verzoergerung selber bestimmt>somit die Abtastrate.>Macht man das so ?
Nein. Man nutzt einen Timer.
http://www.mikrocontroller.net/articles/Multitasking#Verbesserter_Ansatz_mit_Timer>Spielt der ueber den Vorteiler eingestellte Prozessortakt eine Rolle
Ja.
@ Falk Brunner:
Ich meine die Abtastrate eines AD-Wandlers. Ich werde mir den von dir
hochgeladenen Link sicherlich noch durchlesen. Trotzdem frage ich auch,
dich verwendet man die Zeit zwischen zwei Overflows als Abtastrate?
Danke
Berus
Um was für eine Abtastrate handelt es sich?
Schleife mit Verzögerung ist aber schonmal der falsche Weg.
Lies Dich doch mal in die Themen "Timer" und "Interrupts" ein.
@Claude Juncker (berus)
>Ich meine die Abtastrate eines AD-Wandlers.
Dazu gibt es den free running mode beim AVR. Andere Mikrocontroller
haben ähnliches.
>hochgeladenen Link sicherlich noch durchlesen. Trotzdem frage ich auch,>dich verwendet man die Zeit zwischen zwei Overflows als Abtastrate?
Beim AD-Wandler gibt es keinen Overflow, zumindest nicht zeitlich.
Overflow tritt beim Timer auf.
Aber ja, die Interruptfrequnz (eagl ob Timer oder ADC im free running
Modus) ist dann gleich der Abtastrate.
Das wäre die allereinfachste Variante, die aber nur richtig
funktioniert, wenn der Controller nichts anderes mehr machen soll, außer
dieser Abtastung.
Normalerweise werden Timings komplexerer Programme mit einem Timer
realisiert, welcher auf eine sinnvolle Zeitbasis eingestellt wird, mit
der alle Komponenten des Programmes auskommen können.
Hierzu gibt es schon einen guten Artikel hier auf der Seite. Such mal
nach Multitasking...
Claude Juncker schrieb:> @tm0991: Meinst du also, dass ich die Zeit bis zum naechsten Overfloaw> als Abtastrate verwenden soll?
Im Free Running Mode läuft der ADC mit der vorher eingestellten Frequenz
das ist dann deine Abtastrate.
Berus schrieb:> Hallo Leute,>> wie setze ich ganz allgemein normalerweise die Abtastrate in einem C> Programm um, welches einen Atmega8 steueren soll?
Du bist doch der mit den UV-Strahlen oder?
´
Warum stürzt du dich denn jetzt auf den ollen Atmeg8. Der pinkompatible
Atmega88 und seine Brüder bieten die Möglichkeit den ADC mit 2 Timern
mit insgesamt 5 verschiedenen Triggerquellen zu verbinden.
Ein Register konfigurieren und alles passiert rein in Hardware.
mfg.
@ thomase: ja, ich bin derjenige, der UV-Strahlen moechte. Ich moechte
ausserdem einen Atmega8 auf einem Mini-Board programmieren. Es ist also
etwas mehr als ein einfacher ATmega8.
@ Alle:
Ich habe mir den Link ueber Multitasking durchgelesen. Ausserdem habe
ich auch in das Datenblatt des Atmega8 einen Blick geworfen. Allerdings
bin ich jetzt verwirrt, weil ich einen Widerspruch entdeckt habe, das
glaube ich zumindestens. Es waere mir aber lieber, wenn dem nicht so
waere.
Der Atmega hat doch standardmaessig einen Takt von 1 Mhz. Ausserdem
weist der Timer 8 Bit auf. Das heisst, dass der Timer bis 256 zaehlt bis
er wieder auf 0 springt. Wenn wir jetzt einen Vorteiler von 2
einstellen, dann erhalte ich doch fuer den Prozessortakt des IC 0,5 MHz.
Das bedeute auch, dass er 500000/256= 1953,125 Prozesse in einer Sekunde
durchfueht. Wenn ich das also richtig verstanden habe, dann wuerde das
Hauptprogramm des C-Quellcodes 1953,125 mal durchlaufen werden. Setze
ich also ADCSRA =(1<<ADFR), dann geschehen 1953 ADC-Umwandlungen je
Sekunde und somit habe ich eine Abtastrate von ebenfalls 1953 Samples.
Koennte das bitte jmd. von euch bestaetigen?
Ausserdem steht im Datenblatt des Atmega 8 ausserdem:
<<By default, the successive approximation circuitry requires an input
clock frequency
between 50 kHz and 200 kHz to get maximum resolution.>>
Wenn ich dann mal meine Moeglichkeiten durchrechne, die die obige
Bedingung erfuellen, dann komme ich auf entweder auf 62500 Hz
(Vorteiler 16) bzw 125000 Hz (Vorteiler 8). Das ist dann eine Abtastrate
von rund 244 Hz bzw. 488 Hz.
Im Datenblatt steht ausserdem, dass ich sogar max. auf 15kSPS kommen
kann? Wie soll das denn bitte gehen, ohne die obige Bedinung zu
verletzten?
Beste Gruesse
Berus
Claude Juncker schrieb:> Im Datenblatt steht ausserdem, dass ich sogar max. auf 15kSPS kommen> kann? Wie soll das denn bitte gehen, ohne die obige Bedinung zu> verletzten?
Wenn du das Datenblatt richtig studiert hättest, dann wäre dir auch
aufgefallen dass man die Sample-Rate deutlich erhöhen kann, wenn man im
Gegenzug Einbußen bei der Genauigkeit akzeptiert.
> Der Atmega hat doch standardmaessig einen Takt von 1 Mhz.
Je nachdem, was du als Takt bezeichnest: Der interne RC-Oszillator läuft
(temperaturabhängig) mit ungefähr 8 MHz, aber im Auslieferungszustand
ist der 1:8-Vorteiler eingeschaltet.
> Ausserdem> weist der Timer 8 Bit auf. Das heisst, dass der Timer bis 256 zaehlt bis> er wieder auf 0 springt.
Nein! Der Timer springt von 255 auf 0. Es lassen sich nur 2^8 = 256
Zustände mit 8 bit darstellen, inklusive der 0.
> durchfueht. Wenn ich das also richtig verstanden habe, dann wuerde das> Hauptprogramm des C-Quellcodes 1953,125 mal durchlaufen werden. Setze> ich also ADCSRA =(1<<ADFR), dann geschehen 1953 ADC-Umwandlungen je> Sekunde und somit habe ich eine Abtastrate von ebenfalls 1953 Samples.
Nein! Jeder einzelne "Maschinensprachebefehl" benötigt eine bestimmte
Anzahl an Taktzyklen. Beim AVR als RISC-Design kommen zwar viele Befehle
mit einem Taktzyklus aus, aber es gibt auch jede Menge Befehle, die zwei
oder drei Taktzyklen benötigen. Mit deinem C-Hauptprogramm hat das
ziemlich wenig zu tun. Dein Hauptprogramm wird vom Compiler in einzelne
Maschinenbefehle übersetzt, die du durchzählen könntest. Aber wenn da
zum Beispiel Schleifen drin sind, deren Abbruch von einem Zähler oder
anderen Bedingungen abhängt, kannst du nicht von vornherein sagen, wie
lange die Abarbeitung deines Hauptprogramms dauern wird. Das gleiche
gilt für Bedingungen, die unterschiedliche Codepfade aufrufen.
Dir fehlt es noch an Grundlagenwissen - schmöker noch ein bisschen im
Tutorial!
Hallo zusammen,
ich danke euch für eure letzten Beiträge. Ich habe jetzt mal ein kleines
C-Programm geschrieben.
Es soll einfach einen ADC eines Atmega8 dazu bringen, dass er jede
Sekunde das analoge Signal abtastet und konvertiert. Der ADC soll in
etwa 30 Sekunden 30 Werte digitalisieren.
Ihr habt mir geraten, dass ich es über den Timer machen sollte. Das wäre
sicherlich der elegantere Weg. Dennoch habe ich mich für ein Programm
mit einer Schleife entschieden, weil der Atmega8 nur als ADC dienen
soll. Er soll also keine zweite Aufgabe erledigen
Schafft es das? Ich bin für jeden Verbesserungsvorschlag dankbar.
Im Anhang schicke ich euch den Code.
Berus
Claude Juncker schrieb:> Ihr habt mir geraten, dass ich es über den Timer machen sollte. Das wäre> sicherlich der elegantere Weg. Dennoch habe ich mich für ein Programm> mit einer Schleife entschieden, weil der Atmega8 nur als ADC dienen> soll.
Du bist der Experte! Ich verstehe jetzt nicht, warum du jetzt noch Hilfe
brauchst? Ist doch alles klar, oder nicht?
Claude Juncker schrieb:> Er soll also keine zweite Aufgabe erledigen
Ich habe mal vor meine Taschenlampe schwarzes Gaffaband geklebt, die
soll einfach nur leuchten und keine zweite Aufgabe erfüllen.
@maart:
Wenn ich jetzt aus deiner Geschichte mit dem Gaffaband eine Schluss für
meine Frage ziehen müsste, dann würde ich sagen, dass das C-Programm
nicht funktioniert.
Wenn du damit allerdings nur sagen möchtest, dass ich das Potential des
Atmega8 nicht ganz ausschöpfe, dann gebe ich dir Recht.
Ein Atmega8 kostet aber weniger als ein ADC als solcher. Deshalb will
ich lieber einen Atmega8.
Wenn ich ein Experte wäre, dann würde ich euch ja nicht um Rat bitten.
Naja, was solls.
Berus
Claude Juncker schrieb:> Wenn ich jetzt aus deiner Geschichte mit dem Gaffaband eine Schluss für> meine Frage ziehen müsste, dann würde ich sagen, dass das C-Programm> nicht funktioniert.
Haaaalt! Falscher Schluss! Meine Taschenlampe funktioniert sehr gut, es
kommt nur leider kein Licht raus. (das ist die zweite Aufgabe der Lampe)
Deine Aussage hier hat mich aber verwundert:
Claude Juncker schrieb:> Er soll also keine zweite Aufgabe erledigen
Wie wo watt? Der arme ADC wandelt und wandelt, aber wofür? Was soll den
mit den Werten geschehen? Wie weiterverarbeitet werden?
Naja...Ich dachte, dass die Wandlungsergebnisse über den Port B über
einen USB und (virtuelle) COM-Verbindung an das Terminalprogramm
geschickt werden. Das schließlich die Wandlungen im Terminalprogramm
angezeigt werden. Das hätte ich vlt. dazu sagen sollen.
Bis jetzt habe ich mit all dem nicht gearbeitet. Ich hatte nur vermutet,
dass es so funktioniert.
Danke
Berus
Ich antworte eigentlich nur, weil mir gerade wirklich langweilig ist und
ich nicht einschlafen kann.
Claude Juncker schrieb:> Ihr habt mir geraten, dass ich es über den Timer machen sollte. Das wäre> sicherlich der elegantere Weg. Dennoch habe ich mich für ein Programm.....Claude Juncker schrieb:> Ich bin für jeden Verbesserungsvorschlag dankbar.
Das ist doch glatt gelogen! Dir ist es doch egal, was hier vorgeschlagen
wird, du machst eh dein Ding. Ich sag's ja: DU bist der Experte! Also
sie zu, wie du klar kommst.
Claude Juncker schrieb:> @maart:>> Wenn ich jetzt aus deiner Geschichte mit dem Gaffaband eine Schluss für> meine Frage ziehen müsste, dann würde ich sagen, dass das C-Programm> nicht funktioniert.>> Wenn du damit allerdings nur sagen möchtest, dass ich das Potential des> Atmega8 nicht ganz ausschöpfe, dann gebe ich dir Recht.>> Ein Atmega8 kostet aber weniger als ein ADC als solcher. Deshalb will> ich lieber einen Atmega8.>> Wenn ich ein Experte wäre, dann würde ich euch ja nicht um Rat bitten.>> Naja, was solls.> Berus
Naja, was solls.
Eigentlich ist es hier jedem scheissegal, ob dein Programm läuft oder
nicht. Aber es ist auch jedem klar, dass es das nie tun wird. Dass du in
der Lage bist, ein formal ordentliches C-Programm zu schreiben, sieht
man. Man sieht aber auch, dass du von Mikrocontrollerprogrammierung
keine Ahnung hast. Gar keine.
Auch du wirst den Weg mit der blinkenden LED gehen. Wie jeder andere vor
dir auch. Und wenn du hundertmal nur den ADC benutzen willst. Und auch
du wirst einen Timer benutzen.
> Wenn ich ein Experte wäre, dann würde ich euch ja nicht um Rat bitten.
Dann nimm den Rat auch an. Du zeigst dich einfach nur arrogant und
absolut beratungsresistent.
So ein Porgramm schreib ich dir in weniger als einer Stunde. Wie manch
anderer hier auch. Das kommt aber nicht daher, dass das so einfach ist,
sondern weil wir jede Menge Erfahrung mitbringen. Und die hat keiner mit
der Muttermilch aufgesaugt. Und wenn diese Leute dir etwas von der
Erfahrung abgeben, dann nimmst du das an und benimmst dich nicht wie ein
Kleinkind: "Ich will das aber nicht".
Ansonsten kannst du mit deinem Programm bleiben, wo der Pfeffer wächst.
mfg.
@ maart:
wirst du es glauben, wenn ich behaupte, dass ich nicht alle
Verbesserungsvorschläge in mein Projekt einbauen kann?
Naja... Ich dachte eigentlich nur, dass man hier auf dem Forum nach
Hilfe fragen kann. Das klappt ja eigentlich auch sehr gut normalerweise.
Ich hätte nicht gedacht, dass es mir hier jmd. persönlich nimmt, wenn
ich mich aus praktischen Gründen für das Unterlassen seiner Idee
entscheiden würde.
Warum sollte ich mich für einen Timer entscheiden, wenn es auch ohne
genau oder wenigsten ungefähr genau so gut geht? Das behaupte ich auch
nur, weil EGS_TI das bestätigt hat.
Berus
Wenn du Recht hast und das Verwenden eines Timers unumgänglich ist, dann
werde ich früher oder später sowieso darauf stoßen und mich damit
tiefgründiger auseinandersetzen müssen. Noch sehe ich darin aber keine
Notwendigkeit.
Ich nehme dir jedoch deinen Unmut nicht übel. Ich glaube, dass du
denkst, dass ich euch die ganze Arbeit machen lasse ohne selber zu
arbeiten. Das ist aber nicht wahr. Ich brauche einfach nur von euch
Bestätigung, weil mir sonst keiner sagen kann, ob das, was ich mache,
auch sinnvoll und richtig ist. Hier gibt es aber viele Männer vom Fach,
die reichlich Erfahrung habe. Deshalb frage ich hier gerne nach. Ich
weiß, dass ich hier eine qualifizierte Antworten kriegen kann.
Nichts für Ungut
Berus
Claude Juncker schrieb:> Ich hätte nicht gedacht, dass es mir hier jmd. persönlich nimmt, wenn> ich mich aus praktischen Gründen für das Unterlassen seiner Idee> entscheiden würde.
Persönlich nehmen? Um Gottes Willen, nein! Über soetwas schmunzel ich
nur.
Mein Gaffaband vor der Taschenlampe ist auch sehr praktisch: Das Glas
wird nicht schmutzig.
Thomas Eckmann hat es aber schon sehr schön beschrieben und praktisch
wollte ich ja auch schon schlafen.
Und wieder so ein Ding:
Claude Juncker schrieb:> Wenn ich ein Experte wäre, dann würde ich euch ja nicht um Rat bitten.
Wie oft wurde dir jetzt der Rat nahe gelegt, einen Timer zu benutzen?
Claude Juncker schrieb:> Noch sehe ich darin aber keine> Notwendigkeit.
Alles klar.
Und ab geht die Lutzi
Immer grade aus
Das Leben ist kein Schlafabteil
Jetzt stehn alle auf
Und ab geht die Lutzi
Händchen in die höh
Wer lang feiert lebt noch lang
Und wir feiern viel
Wer lang feiert lebt noch lang
Drum feiern alle mit
Du bist sehr hinterlistig. Du zitierst nur solche Auszüge aus meinen
Beiträgen, die deinen Vorwürfe rechtfertigen. Ich weiß ehrlich gesagt
nicht, wozu du das machst. Aber wenn du alle Beiträge dieses Threads
gelesen hättest, dann wäre dir aufgefallen, das es hier auch min. einen
außer mir gibt, der auch meint, dass es ohne Timer geht.
Du solltest jetzt besser schlafen gehen, denn etwas. sinnvolles hast du
in der letzten Stunde zu diesem Thread nicht beigetragen.
Berus
Ich kann aber noch nicht einschlafen (das Gewitter ist zu laut)
Vielleicht hilft dir das hier:
Tue dir wirklich den Gefallen und fange wirklich mal mit einer
blinkenden LED an. Das mag sich viellecht nach Kinderkram anhören,
ermöglicht dir aber einen grundlegenden Einstieg in die Sache.
Dann kannst du lauter lustige LEDs an den PortB anschließen und dann
auch vielleicht erkennen, dass das hier
1
uint16_tADCResultTotal=(ADCH<<8)|(ADCLow);
2
3
PORTB=ADCResultTotal;
nicht funktionieren kann.
Wenn du den Code nicht einfach nur zusammen kopiert hast, ist dir
uint16_t ja nicht unbekannt. Die Ports haben aber nur maximal 8bit.
Vermutlich schwebst du aber auch nur in einer ganz anderen Ebene als ich
und du empfindest meine Äußerungen als persönlichen Angriff. Ich will
hier keinen persönlich angreifen (zumindest jetzt noch nicht, ich lasse
es dich dann aber wissen.)
ok, das leuchtet ein. Also brauche ich zwei Ports, um das 10-Bitwort zu
übertragen.
Mal sehen- Vlt. nehme ich doch noch LEDs in die Bestellliste auf.
Hab Dank und gute Nacht.
Berus
Claude Juncker schrieb:> ok, das leuchtet ein. Also brauche ich zwei Ports, um das 10-Bitwort zu> übertragen.>> Mal sehen- Vlt. nehme ich doch noch LEDs in die Bestellliste auf.>> Hab Dank und gute Nacht.> Berus
Du brauchst überhaupt keinen Port, um die Daten zu übertragen, sondern
den UART.
mfg.
Aha...Das bringt mich doch gleich einen großen Schritt nach vorne. Ohne
jetzt genaue Kenntnisse darüber zu besitzen, heißt das doch jetzt, dass
ich mich mit dem UART Regsiter des IC beschäftigen muss, damit die
Übertragung über UART funktionieren kann.
Stimmt das?
Ich hätte nicht gedacht, dass du mir nach allem noch den richtigen Weg
weist.
Jetzt weiß ich, womit ich beschäftigen werde.
Aufrichtigen Dank
Berus
P.S.: die LEDs sind jetzt auch auf der Bestellliste drauf, aber nur weil
sie kaum was kosten.
> über den Port B über einen USB und (virtuelle) COM-Verbindung an das> Terminalprogramm geschickt werden.
Ich denke der soll nichts anderes machen ! Jetzt soll er auf einmal noch
Kommunizieren und ein Protookll beherschen.
Uwe schrieb:> Ich denke der soll nichts anderes machen ! Jetzt soll er auf einmal noch> Kommunizieren und ein Protookll beherschen.
Das hatten wir schon geklärt, nachtreten braucht man jetzt nicht.
Claude Juncker schrieb:> P.S.: die LEDs sind jetzt auch auf der Bestellliste drauf, aber nur weil> sie kaum was kosten.
Aber auch die Vorwiderstaende nicht vergessen!
>> über den Port B über einen USB und (virtuelle) COM-Verbindung an das>> Terminalprogramm geschickt werden.> Ich denke der soll nichts anderes machen ! Jetzt soll er auf einmal noch> Kommunizieren und ein Protookll beherschen.
Und schwupp geht das ganze Timing durch Warteschleifen den Bach runter.
Claude Juncker schrieb:> Ich hätte nicht gedacht, dass es mir hier jmd. persönlich nimmt, wenn> ich mich aus praktischen Gründen für das Unterlassen seiner Idee> entscheiden würde.>> Warum sollte ich mich für einen Timer entscheiden, wenn es auch ohne> genau oder wenigsten ungefähr genau so gut geht? Das behaupte ich auch> nur, weil EGS_TI das bestätigt hat.
So hat er das nicht bestaetigt. Er sagte kann man machen ist aber nicht
zu empfehlen.
Das Standardverfahren ist das mit den Timern. Genau aus diesen Grund
kann man ja den ADC bei vielen uC von einen Timer per Hardware starten
lassen.
Warum du dich da gegen jetzt straeubst das weist nur du.
Hallo Leute,
ich habe mir aus dem Datenblatt nicht nur die Kapitel über den USART
sondern auch über die Timer ausgedruckt.
Wenn die meisten hier nachdrücklich auf die Notwendigkeit des Timers
hinweisen, dann sehe ich wohl ein, dass er auch einen Platz in meinem
Programm finden wird. Ihr habt mich überzeugt.
Jetzt sehe ich mir mal weiter die Datenblätter und die Tutorials hier
an.
Seid gewiss, ich melde mich bei Gelegenheit bei euch.
Danke und bis die Tage!
Berus