mikrocontroller.net

Forum: Compiler & IDEs Analogwert vergleichen


Autor: Oliver W. (soliver)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey,
ich habe da ein problem.
Ich versuche mit meinem ATmega88, eine analoge spannung einzulesen und 
zu vergleichen.

Die Spannung liefert eine kleine Solarzelle, (etwa 1V-2V ).
Die aufgabe des Micocontrollers soll es dabei sein die ausgegebene 
Spannung ständig zu kontrollieren und wenn ein gewisser spannungswert 
z.b.: 1,5V überschritten wird ein signal auszugeben.

Jetzt kommen meine fragen dazu:
Welche Refferenzspannung muss ich nehmen?
Funktioniert das ACO bit im ACSR register überhaupt?( es sind 
wiedersprüchliche angaben über dessen funktionsweise im Umlauf)

Ich versuche das Programm in C zu schreiben womit ich erst kürzlich 
angefangen habe.

Ich hoffe auf eure hilfe!
MFG Oliver
#include <avr\io.h>
#include <delay.h>
#include <stdint.h>


void port_init(void)
{
  DDRB = 0xff;
  DDRC = 0x00;
  DDRD= 0x00;
  ACSR = 0b00000000;
  ADCSRA = 0b11100111;
  DIDR1= 0xff ;
  ADMUX = (1<<REFS1) | (1<<REFS0);      // interne Referenzspannung nutzen

}

void AN(void) // signal geben
{
PORTB = 0x01;

}

void AUS(void) // signal stoppen
{
PORTB = 0x00;

}

int main(void)
{
  unsigned int x;

  AUS();
  port_init();
  
  while (1)
  {

  _delay_ms(1);
  ADCSRA |= (1<<ADSC);    //start_convertion();


  while (ADCSRA& (1<<ADSC));

  x= ADCL;          // wert auslesen
  x+= (ADCH<<8); 

        if(ACSR &(1<< 5))    // messpannung größer als refferenz /ACO bit gesetzt?
          {
            AN();      //sprung zur ausgabe  
          }
        else        // ACO nicht gesetzt
          {
            AUS();       //spannung ausstellen
          }
  _delay_ms(100);    

  }
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver Warneke schrieb:

> Welche Refferenzspannung muss ich nehmen?

Eine die größer als deine zu messende Spannung ist und kleiner gleich 
deiner Versorgungsspannung

> Funktioniert das ACO bit im ACSR register überhaupt?( es sind
> wiedersprüchliche angaben über dessen funktionsweise im Umlauf)

Ich seh jetzt nicht ganz den Zusammenhang zwischen dem Analog Comperator 
und dem Analog/Digital Converter

> Ich versuche das Programm in C zu schreiben womit ich erst kürzlich
> angefangen habe.

Dann solltest du zuerst auf bewährte Funktionen zurückgreifen. Im 
AVR-GCC-Tutorial findet sich zb eine allgemeine ADC Routine, die auch 
funktioniert.

>   ACSR = 0b00000000;
>   ADCSRA = 0b11100111;
>   DIDR1= 0xff ;
>   ADMUX = (1<<REFS1) | (1<<REFS0);      // interne Referenzspannung


>
>   _delay_ms(1);
>   ADCSRA |= (1<<ADSC);    //start_convertion();
>
>
>   while (ADCSRA& (1<<ADSC));
>
>   x= ADCL;          // wert auslesen
>   x+= (ADCH<<8);
>
>         if(ACSR &(1<< 5))    // messpannung größer als refferenz /ACO
> bit gesetzt?


Für mich ist da der Gedankengang nicht wirklich nachvollziehbar, wie du 
aus einem ADC Wert plötzlich auf den Komperator kommst.

Du kennst deine Referenzspannung, nehmen wir an 5V (AVcc)
D.h. bei 1.5V würde der ADC einen Wert von ...

     5    .....  1023
     1.5  .....    x
   --------------------
           1.5 * 1023
     x = -------------  = 306
               5

... liefern. Daraus ergibt sich dann der Code:
    if( x > 306 )
      AN();
    else
      AUS();

Zu simpel? Oder warum meinst du, du musst da mit dem Comperator 
rummachen?



Lass den Free Running Mode Free Running Mode sein. Nimm die ADC Funktion 
aus dem Tutorial. Die macht 1 Messung bei jedem Funktionsaufruf. Dessen 
Ergebnis vergleichst du mit 306 (oder dem entsprechenden Wert für die 
dich interessierende Voltzahl) und gut ists.

Autor: Mike (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Karl heinz

Karl heinz Buchegger schrieb:
> ... liefern. Daraus ergibt sich dann der Code:
>
>     if( x > 306 )
>
>       AN();
>
>     else
>
>       AUS();

Ich bin leider noch totaler Anfänger.
Und auf der suche nach einer ähnlichen Sache, nur ich möchte einen Text 
in der Webpage anzeigen lassen.

Diesen teil habe ich nun hin bekommen aber es wird kein Text ausgegeben.

[c]
      unsigned char Stufe
      #if USE_ADC
      //Visualisierung ADC3
      if(var_array[6] == 0)
      Stufe=("Anlage aus");
      if((var_array[6] >= 375) && (var_array[6] <= 385))
      Stufe="Stufe 1 =  44 % ~ 132 m³/h";
      if((var_array[6] >= 590) && (var_array[6] <= 610))
      Stufe="Stufe 2 =  76 % ~ 228 m³/h";
      if((var_array[6] >= 676) && (var_array[6] <= 686))
         Stufe="Stufe 3 =  100 % ~ 300 m³/h";
      #endif
[/c}

Was mache ich da Falsch und was muß ich ändern?
Ich habe die C Datei mit Angehangen und dieser Code steht ab Zeile 844.

Bitte helft mir damit ich das Projekt Fertig stellen kann.

Gruß Mike

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mike schrieb:
> unsigned char Stufe
; Strichpunkt, und warum eigentlich unsigned?
>       #if USE_ADC
>       //Visualisierung ADC3
>       if(var_array[6] == 0)
>       Stufe=("Anlage aus");

das geht so nicht! Stufe ist char, nimmt also genau ein (1) Zeichen auf.
-> C-Buch

>       if((var_array[6] >= 375) && (var_array[6] <= 385))
>       Stufe="Stufe 1 =  44 % ~ 132 m³/h";
s.o.
>       if((var_array[6] >= 590) && (var_array[6] <= 610))
>       Stufe="Stufe 2 =  76 % ~ 228 m³/h";
s.o.
>       if((var_array[6] >= 676) && (var_array[6] <= 686))
>          Stufe="Stufe 3 =  100 % ~ 300 m³/h";
s.o.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mike schrieb:

> Was mache ich da Falsch und was muß ich ändern?

So ziemlich alles.
Selbst dann, wenn man das von Floh gesagte berücksichtigt ... ist das 
immer noch Unsinn.

> aber es wird kein Text ausgegeben.

Logo.
Nur weil du eine Variable definierst, heißt das noch lange nicht, dass 
der Text dann irgendwie magisch auf der Web-Seite landet.

> Bitte helft mir damit ich das Projekt Fertig stellen kann.

Du musst erst mal C lernen, ehe du dich an so etwas wie einen 
vorhandenen Web-Server zu modifizieren wagst.

Autor: Oliver W. (soliver)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Antwort!
Durch den beitrag hab ich nun endgültig den unterscheid zwischen dem 
Comperator und dem ADC verstanden.

Es gibt allerdings noch einen Fehler in dem Programm.
Der Simulator kehrt nach der initialisierung des ADC´s nicht in die Main 
schleife zurück. Ich bin wie gesagt erst kürzlich mit der C 
Programierung angefangen und kann den Fehler nicht entdecken.

Die Funktion des Microcontrollers soll sein, einen Analog wert zu 
vergleichen und sobald dieser 1V überschritten hat ein Signal 
auszugeben.

Mein Programm sieht nun wie folgt aus.

#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>

/* Ports initialisieren */
void port_init(void)
  {
    DDRB = 0xff;
    DDRC = 0x00;
    DDRD = 0x00;
  }

/* ADC initialisieren */
void ADC_Init(void)
  {

    uint16_t result;

    ADMUX = (1<<REFS1) | (1<<REFS0);      // interne Referenzspannung 
nutzen
    ADCSRA = (1<<ADPS1) | (1<<ADPS0);     // Frequenzvorteiler
    ADCSRA |= (1<<ADEN);

    ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung
    while (ADCSRA & (1<<ADSC) );          // auf Abschluss der 
Konvertierung warten

    result = ADCW;
  }

    /* ADC Einzelmessung */
    uint16_t ADC_Read(uint8_t channel)
  {
      ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
      ADCSRA |= (1<<ADSC);
      while (ADCSRA & (1<<ADSC) )
        ;
      return ADCW  ;
  }

void AN(void) // signal geben
  {
    PORTB = 0x00;
  }

void AUS(void) // signal stoppen
  {
    PORTB = 0xFF;
  }

int main(void)
  {
    uint16_t x;

    port_init();         //Ports initialisieren
    ADC_Init();          //ADC  initialisieren

      while(1);        //Messschleife
    {
      _delay_ms(1000);    //Jede Sekunde Aktualisieren
      x = ADC_Read(1);     //Einzelmessung
        if( x > 306 )
            AN();
            else
            AUS();
    }
  }



Vielen Dank für die Hilfe!
MFG Oliver

Autor: Semikolon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver W. schrieb:
> while(1);        //Messschleife
          |
          DA ist der Wurm!

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Autor: Karl heinz Buchegger (kbuchegg) (Moderator)
>
> Datum: 19.08.2010 19:46
>
> Mike schrieb:
>
>
>> Was mache ich da Falsch und was muß ich ändern?
>
> So ziemlich alles.
>
> Selbst dann, wenn man das von Floh gesagte berücksichtigt ... ist das
>
> immer noch Unsinn.
>
>> aber es wird kein Text ausgegeben.
>
> Logo.
>
> Nur weil du eine Variable definierst, heißt das noch lange nicht, dass
>
> der Text dann irgendwie magisch auf der Web-Seite landet.
>
>> Bitte helft mir damit ich das Projekt Fertig stellen kann.
>
> Du musst erst mal C lernen, ehe du dich an so etwas wie einen
>
> vorhandenen Web-Server zu modifizieren wagst.

Danke erstmal für den guten Tip ;-)

Habe auch ein Buch (ISBN 978-3-7723-7350-3)vor mir, nur Hilft es mir 
nicht viel.

Bitte entschuldigt das ich mit so "einfachen" Fragen das Forum 
belästige.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mike schrieb:

> Bitte entschuldigt das ich mit so "einfachen" Fragen das Forum
> belästige.

Das hat mit einfach nichts zu tun.
In der Tat ist Strinverarbeitung in C gar nicht mal eine besonders 
einfache Sache, sondern eine der ersten größeren Hürden, mit der sich 
ein Einsteiger konfrontiert sieht.

Dein Problem: Du übernimmst dich mit deiner Aufgabenstellung als 
Anfänger.
Wenn ich in meinem ganzen Leben noch nie auf einen Berg gestiegen bin, 
dann nehm ich als ersten Berg nicht den Mont Blanc, sondern einen 
kleinen Hügel im Voralpenland.

Genauso bei dir: Du versuchst mindestens 2 bis 3 Monate Programmierung 
(auf einem PC wegen der besseren Entwicklungsumgebung) zu überspringen. 
Und daher kommst du nicht weiter. Ein Buch hilft dir nur dann, wenn du 
es von vorne beginnend durcharbeitest und auch die im Buch angegebenen 
Übungen machst, bzw. dir selber Übungen ausdenkst. Nach 2 oder 3 Wochen 
bist du dann im Buch bei Stringverarbeitung angelangt (moderate 
Lernzeiten eingeräumt). Nach ein paar weiteren Stunden hast du dann die 
Stringverarbeitung soweit verinnerlicht, dass dir die simpelsten 
Basis-Fehler in der Stringverarbeitung nicht mehr passieren.
Dann könnte man sich diesen Code weiter vornehmen.
Das Problem dabei: Du versuchst ein nicht gerade triviales Programm zu 
modifizieren. D.h. du musst vorher Programmanalyse betreiben um zu 
verstehen, wie und wo du eingreifen musst. Aber auch da fehlt dir die 
Erfahrung, die sich erst im Laufe der Zeit und mit fleissigem Üben 
einstellt. Unter anderem bekommst du sie, indem du bei deinen Übungen 
Fehler machst, deren Suchen und Beseitigen dir eine Menge Erfahrung 
vermittelt.

Und bei der Art und Weise, wie du die Modifikation versuchst, ist dieses 
Defizit ziemlich klar zu sehen. In ähnlicher Weise wie auch die 
Bergwacht auf der Zugspitze den Flachlandtiroler untrüglich an seinen 
Sandalen und nicht bergtauglicher Kleidung erkennt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.