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.
@tm0991: Meinst du also, dass ich die Zeit bis zum naechsten Overfloaw als Abtastrate verwenden soll?
@ 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_t ADCResultTotal = (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?
Claude Juncker schrieb: > Mal sehen- Vlt. nehme ich doch noch LEDs in die Bestellliste auf. Kann nicht schaden und sind auch nicht teuer. Das hier: http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART wirst du dann später für die Übertragung zum PC brauchen.
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.