mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Temperaturmessung über UART ATMEGA16


Autor: N. M. (mani)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein HALLO in die Runde,

ich habe ein Problem mit der Übertragung von float über den UART.
Am Anfang habe ich ein kleines Programm geschrieben das mir auf 
Tastendruck die ASCII-Tabelle anzeigt (um mal zu testen ob es überhaupt 
mal funktioniert).
Das ging auch wunderbar...also kann es mal nicht an der Übertragung 
liegen.

Anschliesend wollte ich etwas "größeres" machen:
Durch einen PT-100 fließt ein Konstantstrom von 10mA und erzeugt über 
diesem einen Spannungsabfall, den ich an ADC0 einlese.
Nach der Umrechnung in eine Temperatur soll diese in ASCII Zeichen 
konvertiert werden (dtostrf) und über den UART durch ein 
Konsolenprogramm(Hyperterminal) sichtbar gemacht werden.
Doch irgenwie kommt nur Müll raus! Ich habe schon ettliche Sachen 
versucht, aber ohne Erfolg...ist bestimmt irgendeine 
Kleinigkeit,trotzdem sehe ich es nicht.Ich hoffe mal einer von euch weis 
Rat?
Hardware: ATMEGA16L    Software: AVR-Studio v.4.13 / WinAVR-20071221
Die Libary libm.a für die Funktion dtostrf habe ich drin.

Hier mal der Code:
#include <avr/io.h>
#include <stdlib.h>

void adc_init (void)
{
  
    ADCSRA   |= (1<<ADEN)|(1<<ADPS2)
             |(1<<ADPS1)|(1<<ADPS0);  // Aktivierung ADC mit Prescaler 128 --> 8Mhz/128 = 62.5kHz
                  //Der Prescaler sollte zwischen 50-200kHz ergeben
  ADMUX = 0;            // Auswahl von ADC0 durch MUX
}

void ser_init (void)
{
  UCSRC|=(1<<URSEL)|(3<<UCSZ0);   //Asynchron 8N1
  UBRRH= UBRR_VAL>>8;        
  UBRRL= UBRR_VAL & 0xFF;      //Baudrate auf 9600 Bits/sek

}


int uart_putc(unsigned char c)
{
  while(!(UCSRA & (1<<UDRE))){;}; //Warten bis senden möglich
  UDR=c;
  return 0;
}


void uart_puts(char *temp_string)
{
  while (*temp_string!='\n')
  {
  uart_putc(*temp_string);
  temp_string++;
  }
}


int main(void)
{
  unsigned int i=0;
  char temp_string[10]={0,0,0,0,0,0,0,0,0,0};
  float spannung=0,temp=0,temp_insg=0;

  adc_init();
  ser_init();
  

  for(;;)

  {
    for(i=0;i<10;i++)
      {
      ADCSRA |= (1<<ADSC);      //Start conversion
      while (ADCSRA & (1<<ADSC) ) {;}  // wait until converstion completed
      
      spannung=(float)((5* ADCW)/1024);    //Umrechnen von Binär
      temp=(float)(((spannung-1))/0.00391); //Errechnen der Temperatur
      temp_insg=(float)temp_insg+temp;
      }

    temp_insg=(float)(temp_insg/10);        //Mittelwert errechnen
    dtostrf(temp_insg, 7, 3, temp_string);  //Zerlegung von temp_insg in String
    
    
    uart_puts(temp_string);          //senden des Strings
    uart_putc('\n');

    

  }
return 0;
}


Gruß Mani

Autor: fusebit (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Am Rande: 10 mA sind zu viel für ein Pt100. Da wird der schon merklich 
warm...

Autor: mani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du meinst von wegen eigenerwärmung durch den Strom ?

Ok, gutes Argument...was wäre da so normal ? 1mA?

Gruß

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Mani,

falls Du diesen Thread noch nicht kennst solltest Du dies hier
auf jeden Fall lesen:

Beitrag "Temperaturmessschaltung möglichst genau?"

Wenn Du den PT100 auf jeden Fall verwenden willst, solltest Du auch
die Schaltung nachbauen.

Sonst wirst Du mit Deinen Ergebnissen nicht so glücklich werden.

Die Software habe ich mir jetzt nicht genauer angeguckt, da
Du aus meiner Sicht schon ein Problem mit der Verschaltung
des PT100 hast. (10mA sind zu viel...)

Wenn Du die Temperatur auf eine andere Weise messen willst,
gibt es eine einfache Möglichkeit mit einem NTC/PTC zu bauen
wirst Du hier unter anderem fündig:

http://www.mikrocontroller.net/articles/Temperatursensor

Gruß Sven

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
a) Was kommt den raus?
b) Hast du mal die "rohen" ergebnisse ausgegeben?

Autor: mani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sven:
Danke für die Links...gerade die Unterscheide der einzelnen
Temperatursensoren sind ziemlich interresant. Das ein PT100 nicht so 
ideal
ist (geringe Steigung) wusste ich...hatte aber gerade noch einen in der 
Kiste liegen
und dachte ich versuchs als Einstieg mal mit dem :-)

@Läubi:
a) Auf dem Hyperterminal bekomme ich etwa sowas ausgegeben: ccacssa....
b) Äääähm...was meinste damit genau? Versuche ja die "rohen" Daten als 
String
zu konvertieren und dann über den Uart auszugeben.
Meinste über JTAG?


Ich habe es auch schon ettliche male versucht mit dem AVR-Studio zu 
simulieren
(kam aber nur Mist raus).
Nach langem lesen hat sich dann herausgestellt dass ich anscheinend 
nicht alleine
bin und dass es allgemein schwierig ist sowas mit dem ATMEGA16 (evtl. 
auch andere) zu
simulieren!? (man möge mich verbessern wenn ich was falsches sage).

Ich habe auch schon die komplette temp. Messung in meinem Programm 
ausgeklammert
und als Wert eine konstante float Zahl eingetragen (z.B 25.65).
Aber irgendwie geht zwischen konvertierung von float in String (Array) 
bzw bei der
Übertragung etwas schief...so dass ich nur Buchstaben anstatt meiner 
Messwerte (Zahhlen) bekomme.

Die Funktionen uart_putc bzw. uart_puts hab ich aus dem Tutorial zu 
WinAVR.http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Was könnte das den sein? Bei dem compilierung bekomme ich weder Fehler 
noch warnungen angezeigt.

Gruß

Mani

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ADCW einfach mal über die Serielle schicken.
Also ohne Floatumrechnung.
Außerdem würd ich das so klammern, sonst geht dir doch der 
Nachkommanteil flöten. (ich weiß nicht wie genau das der Compiler 
handhabt!)
spannung=((float)(5* ADCW))/1024.0;    //Umrechnen von Binär

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

Bewertung
0 lesenswert
nicht lesenswert
Hallo Läubi,

danke für deine guten Tipps...mittlerweile "Funktioniert" es.
Waren allerdings 2 Fehler gleichzeitig :-)

Ich habe bei meinem vorherigen Programm das funktioniert hatte eine 
Wartezeit zwischen 2 Zeichen eingebaut, das war auch der Grund warum es 
funktioniert hat.
Als ich diese Wartezeit entfernt hatte ging DIESES Programm dann auch 
nicht mehr. Das hat mich dann etwas Stuzig gemacht. Hab mal den Quarz 
gewechselt und siehe da...es kam zumindest kein Schrott mehr dabei raus.
Genauer gesagt kam garnichts mehr...das war der 2.Fehler.Ich hatte 
vergessen das Flag TXEN (Sendefreigabe) zu setzen...peinlich,peinlich.

Es ist zwar nicht gerade ein Musterprogram, trotzdem hänge ich es mal 
mit an.

Gruß und vielen Dank nochmal.

Mani

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.