Forum: Mikrocontroller und Digitale Elektronik ADC free running mode aktivieren Atmega 16?


von Matthias H. (maethes26)


Lesenswert?

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;
}

von Regler (Gast)


Lesenswert?

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.

von Norbert (Gast)


Lesenswert?

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!

von Regler (Gast)


Lesenswert?

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. ;)

von Norbert (Gast)


Lesenswert?

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...

von Regler (Gast)


Lesenswert?

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?

von Matthias H. (maethes26)


Lesenswert?

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?

von Regler (Gast)


Lesenswert?

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.

von Matthias H. (maethes26)


Lesenswert?

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
Noch kein Account? Hier anmelden.