Guten Abend zusammen liebe Experten und Kollegen. ich verzweifle leider immer noch an dem free running mode. Ich weiß leider nicht wie ich den aktivieren soll. Ich versteh die Literatur leider noch nciht so ganz, dabei ist das ein doch sehr einfachen und überschaubares Thema, die paar Befehle. Ich möchte, dass der Kontroller einen vorgewählten Kanal kontinuierlich mißt. Keine Literatur konnte mich aufschlauen. (hier das Tutorial, 2 Fachbücher und Doku des Atmega 16) Hier ist mein Code wie ich es mir vorstelle, aber es läuft trotz einen Tipps eines Forenmitglieds immer noch nicht. ich benutze AVR Studio 5 Bitte seid so nett und zeigt mir den richtigen Code. Ich bedanke mich dafür schon mal recht herzlich im Vorraus. Viele Grüße, MAtthias. #include <avr/io.h> #include <util/delay.h> #include <stdlib.h> #include "lcd_tools.c" #ifndef F_CPU #warning "F_CPU war noch nicht definiert, wird nun nachgeholt" #define F_CPU 8000000UL // Systemtakt in Hz - Definition als unsigned long beachten // Ohne ergeben sich unten Fehler in der Berechnung #endif uint16_t result = 0; uint16_t result2 = 0; uint8_t i; char texte[10]; int main(void) { lcd_ini(); ADMUX = (1<<MUX2)|(1<<MUX1); //0x06; //channel selection // ADMUX &= ~((1<<REFS0)|(1<<REFS1)) ; // interne Referenzspannung aus , da eh schon null ADCSRA =(1<<ADPS2) | (1<<ADPS1); // Frequenzvorteiler: setzen auf 64 (8 MHz / 64 = 125 kHz) und ADC aktivieren // ADCSRA = (1<<ADEN); // aktivieren // ein Mitlglied meinte oben genannte Zeile so ändern, geht aber immer noch nicht ADCSRA |= (1<<ADEN); // aktivieren ADCSRA= (1<<ADSC); // start conversion (single?) bit stay high as long as the vonversion is in progress ADCSRA = (1<<ADATE); // free running mode while(1) { result=0; for(i=0; i<20;i++) { while ( ADCSRA & (1<<ADIF) ); // auf Abschluss der Konvertierung warten , warten bis die Wandlung durchgeführt iwst und bit wieder auf Null result += ADCW; // Wert abholen } result /=20; dtostrf((double)result, 4,0, texte); lcd_gotopos(2,16); lcd_writetext (texte); } return 0; }
Matthias H. schrieb: > // ein Mitlglied meinte oben genannte Zeile so ändern, geht aber immer > noch nicht > > ADCSRA |= (1<<ADEN); // aktivieren > > > > ADCSRA= (1<<ADSC); // start conversion (single?) bit stay Denk nochmal SCHARF nach..... Hast Du diese Befehle WIRKLICH verstanden? Wenn Du = benutzt wird das Register UNABHÄNGIG von seinen vorherigen Werten gesetzt. Schau mal im Tutorial den Abschnitt Bitmanipulation an... Außerdem muss doch noch ein ADFR bit gesetzt werden, wenn man den Free-Running-Modus verwendet. Beides sind Anzeichen, dass Du dich noch nicht wirklich mit dem Thema beschäftigt hast, oder die die Theorie fehlt. Im 2. Fall empfehle ich Dir ein C-Tutorial. Nur mal so als Warnung: Kann hier daneben gehen.
Regler schrieb: > Außerdem muss doch noch ein ADFR bit gesetzt werden, wenn man den > Free-Running-Modus verwendet. ADFR? Beim Mega16? Das wäre ja ein toller Trick!
Norbert schrieb: > Regler schrieb: >> Außerdem muss doch noch ein ADFR bit gesetzt werden, wenn man den >> Free-Running-Modus verwendet. > > ADFR? Beim Mega16? Das wäre ja ein toller Trick! OK, ok.... Asche auf mein Haupt: Hab nicht im Datenblatt des Atmega16 nachgeschaut und vom Attiny26 extrapoliert. Aber das Nachschlagen kann/soll er ruhig selbst tun. Der 1. Grund reicht ja bereits, dass es nicht funktionieren kann. Und der reicht, um die Laune zu helfen, in Grenzen zu halten. ;)
1 | ADMUX = (1<<MUX2) | (1<<MUX1); //channel selection |
2 | |
3 | ADCSRA = (1<<ADPS2) | (1<<ADPS1) // Frequenzvorteiler: 64 |
4 | // (8 MHz / 64 = 125 kHz)
|
5 | // und ADC aktivieren
|
6 | | (1<<ADSC) // start conversion |
7 | | (1<<ADEN) // aktivieren |
8 | | (1<<ADATE); // free running mode |
Probier' den hier mal...
Norbert schrieb: > Probier' den hier mal... Echt schön, dass du bereit bist ihm zu helfen. Aber wie soll er so aus seinen Fehlern lernen? @TO: |= ist nicht gleich =. a |= b; ist die Kurzform von a = a | b; genau wie +=, -=, .... Kannst Du den Fehler jetzt erkennen?
Hallo Regler, ich habe ebend einen neuen Thread aufgemacht und Euch geantwortet. :-) Ich dachte, dann bekommen allen Antwortenden eher mit, dass ich Ihnen geantwortet habe. Danke, dass Du mir gezeigt hast, das dies die Kurzform von ist. a |= b; > > ist die Kurzform von > > a = a | b; Das wußte ich jetzt so nicht! a oder b bedeutet dann, dass wenn ich ein Bit mit 1 setze, die null dort überschrieben wird, weil 1 eine 0 überschreibt. Beispiel: UCSRB |= (1<<RXEN) | (1<<TXEN); nur an den beiden Bit Stellen (RXEN und TXEN) wird eine Oder Verknüpfung mit UCSRB durchgeführt. und folglich die beiden nullen mit einer 1 überschrieben. :-) Habe ich das so weit richtig verstanden? was bedeutet dann folgende Zeile bitte? UCSRB = (1<<RXEN) | (1<<TXEN); damit wird gesagt, dann nur die beiden Stellen auf 1 gesetzt werden und sonst nichts, oder? Vielen Dank für Deine Hilfe. Ich freue mich sehr darüber. Einen schönen Abend noch wünscht Matthias. Regler schrieb: > Norbert schrieb: >> Probier' den hier mal... > > Echt schön, dass du bereit bist ihm zu helfen. Aber wie soll er so aus > seinen Fehlern lernen? > > @TO: |= ist nicht gleich =. > > a |= b; > > ist die Kurzform von > > a = a | b; > > genau wie +=, -=, .... Kannst Du den Fehler jetzt erkennen?
Hier wird alles geklärt, was du brauchst und noch mehr: http://www.mikrocontroller.net/articles/Bitmanipulation Noch ein Tip: Ein C-Tutorial durcharbeiten. Das sind echt(!) Grundlagen. Wenn Du das nicht verstehst, wirst Du noch oft auf die Schnautze fallen. Da gibt es noch einige Fallstricke in C (z.B.:Pointer, Arrayzugriffe, Überläufe,...), die wesentlich schwerer zu durchschauen sind.
Regler schrieb: > Hier wird alles geklärt, was du brauchst und noch mehr: > http://www.mikrocontroller.net/articles/Bitmanipulation > > Noch ein Tip: Ein C-Tutorial durcharbeiten. Das sind echt(!) > Grundlagen. Wenn Du das nicht verstehst, wirst Du noch oft auf die > Schnautze fallen. Da gibt es noch einige Fallstricke in C (z.B.:Pointer, > Arrayzugriffe, Überläufe,...), die wesentlich schwerer zu durchschauen > sind. Danke für die Warnung. ich werde es im Hinterkopf behalten. Jetzt gerade versuche ich mich in das Thema Timer einzuarbeiten. Dazu habe ich zwei fAchbücher, das Tutorial und das Atmega 16 Datenblatt und zur Not noch das Forum hier. Wenn all die Grundlagen erstmal sitzen, dann ist alles andere halb so schwierig und man kämpft nicht mehr an so vielen Fronten gleichzeitig. Bis dahin ist es ein harter Weg. :-) Ich bin begeistert von den uC, was die alles können und wie flexibel und leistungsfähig die sind. Ich habe das Gefühl die SPS Steuerung erschließt sich für viele Benutzer schneller, da die Programmierung auf eine einfache grafische Klicksteuerung aufbaut. Das habe ich auch gerade in der Technikerschule mit Step7 von Siemens. Schöne Grüße.
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.