Hallo, Leute, ich weiss, das Thema gab es schon oft genug, aber ich brauche noch ein wenig hilfe! Alles was ich kann, ist "Hallo World" auf dem LCD zu schreiben! Möchte aber Temperatur messen. Habe einen 16x2 LCD. Was ich schon rausbekommen habe es wird ein DS1820 benötigt.. Wie sieht dann die Schaltung aus?! Und mein grösstes Problem... Wie krige ich das hin, dass mein Atmega16 widerstand (oder soll ich einen Spannungsteiler bauer und dann die Spannung messen??) in °C umrechnet?? Wie soll ich dann diesen Wert auf dem LCD wiedergeben??! Kenne mich mit C nicht aus... arbeite in BAscom! Danke für die Hilfe!
Hallo Alex, >Alles was ich kann, ist "Hallo World" auf dem LCD zu schreiben Na, das ist doch schon was!! >Was ich schon rausbekommen habe es wird ein DS1820 benötigt.. Du kannst auch mit einem einfachen Temperatursensor KTY oder ein LM35 verwenden. >Wie soll ich dann diesen Wert auf dem LCD wiedergeben??! Zuerst sollte Dein ATmega16 einen Analogwert (Spannung) messen und diesen Wert auf dem Display darstellen können. Alle weiteren Funktionen lassen sich darauf hin aufbauen und an Deine Bedürfnisse (Sensoren) anpassen ;) Bernhard
Du kannst auch gleich einen digitalen Temperatursensor (z.B. SHT11) benutzen. Unter BASCOM sollte es aber auch problemlos möglich sein, einen AD-Wandler (im AVR integriert) anzusprechen und dessen Messwert noch etwas umzurechnen. Es gibt von den BASCOM-Machern ein wunderschönes Handbuch zum Download (ca. 32MB). Der DS1820 ist ein 1Wire-Sensor, also digital. Der spuckt seinen Messwert schon als °C aus, allerdings muß man da noch etwas an der Anzeige "drehen". >Wie sieht dann die Schaltung aus?! Steht im Datenblatt...(des Sensors). >Wie krige ich das hin, dass mein Atmega16 >widerstand (oder soll ich einen Spannungsteiler bauer und dann die >Spannung messen??) in °C umrechnet?? Brauchst du bei einem digitalen Sensor gar nicht. >Alles was ich kann, ist "Hallo World" auf dem LCD zu schreiben Mit'm Filzer? Übrigens müsste es entweder "Hello world" oder "Hallo Welt" heissen...
Also ich war gerade in meinem Elektronikladen geradeeben... hatte da eine schaltung mit Ds1820, Ds1994, Attiny12, 72HC164.. von den ganzen Teilen, die ich für die Schaltung brauche, würde ich nur Attiny und 74.... bekommen... die anderen können sie nicht bestellen! Was gibt es für eine Möglichkeit noch?? Gaht das mit einem PTC oder NTC? Oder Wird das schon viel zu ungenau???
Wie kann ich eine Spannung mit Atmega16 messen???????? Wie soll ich sie in °C unrechnen??? Das ist völlig dunkler Wald für mich!!!!!! Habe mir extra 2 LCD besorgt 16x2 und 27x4 um jetzt endlich was zu machen... aber ohne euch komme ich nicht weiter!!! BITTE!!!!!!!!
Spannungen kannst du mit dem ADC messen. Umrechnung musst du im Datenblatt deines Sensors schauen, wenn er pro Grad z.B. 10mV ausgibt dürfte es ja nicht allzu schwer sein. Bei einen NTC/PTC musst du halt nen Spannungsteiler bauen und daraus die Berechnung machen (je nach widerstand).
>Wie kann ich eine Spannung mit Atmega16 messen???????? Mit dem AD-Wandler. >Wie soll ich sie in °C unrechnen??? Das geht i.d.R. aus dem Datenblatt des Sensors hervor. >!!!!!!!! Unnötig viele Satzendezeichen sind ein Zeichen für Schizophrenie... Vielleicht solltest du dich von Bascom lösen und dir mal die Tutorien auf dieser Seite angucken (Links links oben!). Und hör auf zu jammern! Das kommt nie gut an! Oder sind wir daran schuld, dass du das (aus welchen Gründen auch immer) nicht hinbekommst?
Ich möchte das jetzt mit einem NTC machen! Sind die alle gleich, oder unterschiedlich? Nahmen wir an, ich habe schon einen Spannungswandler. LCD hängt bei mit am port B. Wie soll ich weiter vorgehen?! Mit "AD-Wandler" sagt mir leider nichts :((( Kann mir das vielleicht jemand etwas genauer erklähren?
> Geht das mit einem PTC oder NTC?
Klar geht das auch.
Soll das jetzt für dich einfach nur ein Übungsbeispiel sein,
oder soll das eher was professionelles werden?
Für ein Übungsbeispiel tuts ein PTC/NTC reichlich.
Zum Anfang würde ich mal an deiner Stelle die Temperatur
vergessen.
Irgendwo wirst du schon noch ein Poti rumliegen haben.
Das schliesst du so an:
+ o----------+
|
---
| |
| |
<--------------- zum ADC Pin deiner µC
| |
| |
---
|
GND o----------+
Also als ganz normaler Spannungsteiler. Der Wert der Potis
ist zunächst mal relativ unkritisch. Du kannst 10k nehmen oder
100k oder 4.7k. Irgendwas in dem Bereich.
Worum es geht: Mit dem Poti kannst du eine variable Spannung
an den ADC Eingang des µC legen. Deine Aufgabe ist es jetzt
diese Spannung mit dem ADC zu messen und eine entsprechende
Ausgabe auf dem LCD zu machen.
Konzentriere dich zunächst mal darauf einfach nur den Wert
vom ADC direkt auf das LCD zu kriegen. Danach überlegst du dir
wie du den ADC Wert umrechnen musst, damit tatsächlich die
am Eingang anliegende Spannung als Volt-Zahl angezeigt wird.
Warum diese Vorstufe:
Nun, weil ein NTC oder PTC zusammen mit einem 2.-ten Widerstand
auch nichts anderes als ein Spannungsteiler ist. Nur drehst du
halt nirgendwo, sondern der Spannungsteiler reagiert auf die
Temperatur und ändert so die Spannung am ADC Eingang. Von dor
weg ist dann wieder alles gleich: Du musst die Spannung am ADC
messen, umrechnen und anzeigen. Das hast du aber bereits mit dem
Poti geübt wie man das macht.
> Wie soll ich weiter vorgehen?!
Indem du 2 Dinge studierst:
1) Das Datenblatt deines µC.
Damit kriegst du raus, welcher Pin an welchem Port ein
ADC Eingang ist
2) Das Bascom Handbuch
Dort ist beschrieben, wie man den ADC Schaltkreis im µC
dazu bewegt, die Spannung an genau diesem Pin abzunehmen
und in einen Zahlenwert umzuwandeln.
Danke Karl Heinz Buchegger!!! "Deine Aufgabe ist es jetzt diese Spannung mit dem ADC zu messen und eine entsprechende Ausgabe auf dem LCD zu machen. Konzentriere dich zunächst mal darauf einfach nur den Wert vom ADC direkt auf das LCD zu kriegen." Wie soll ich da machen? ich verstehe schon, was ich machen soll, aber wie... Tutorials beschreiben das nicht. Bin auch in programmieren ein Anfänder. Wolle aber jetzt richtig anfangen damit, und brauche ERSTMAL ein wenig hilfe.
> Wie soll ich da machen? Schon mal ins Bascom Handbuch geschaut? Das gibts auch online http://avrhelp.mcselec.com/bascom-avr.html Schlage ich jetzt dort die Befehlsreferenz auf und scrolle mal so drüber, dann fällt mir zb. der Befehl CONFIG ADC auf. Super! Da kommt das Stichwort ADC schon mal vor. Wähle ich den Befehl an, dann erscheint mir rechts ein komplettes Beispiel, dass offensichtlich den ADC konfiguriert und abfrägt. War doch nicht so schwer, oder?
Soweit bin ich schon: Habe einen POti am ADC eingang. mas soll ich jetzt machen`?
Hast du es nur angeschlossen oder kannst du den ADC jetzt auch schon auslesen? WEnn nicht, dann ---> http://avrhelp.mcselec.com/bascom-avr.html Bei Suche adc eingeben und den Code aus "Config ADC" einfach nur kopieren und anpassen!!
Ich habe das hier bei Roboternetz gefunden: ' Die gemessene Spannung wird in der Variablen W gespeichert. ' Channel ist der Pin, an dem die Spannung gemessen werden soll. $baud = 9600 $crystal = 1000000 $regfile "m32def.dat" Config Adc = Single , Prescaler = Auto Start Adc Dim W As Word , Channel As Byte Channel = 0 Do W = Getadc(channel) Print "ADC-Pin " ; Channel ; ": Wert " ; W Incr Channel If Channel > 7 Then Channel = 0 Waitms 800 Loop End Soweit ich es mit SCHON klar... aber ich sehe ja das Ergebniss nicht.. was muss noch im Programm stehen, damit ich das auf LCD bekomme? Ich weiss nicht, wie ich das kombinieren soll! P.S. ich komme mir eurer Hilfe ganz gut voran. Danke!
> ich komme mir eurer Hilfe ganz gut voran Das denke ich nicht. Aber was solls. Ich denke du kannst etwas auf dem LCD ausgeben? Schon mal in der BASCOM Hilfe http://avrhelp.mcselec.com/bascom-avr.html (warum poste ich das überhaupt, du schaust ja anscheinend sowieso nicht rein), den Befehl LCD nachgeschlagen? Da kann man auch Variablen angeben!
>was muss noch im Programm stehen, damit ich das auf LCD bekomme? >Print "ADC-Pin " ; Channel ; ": Wert " ; W Leitet "Print" die Ausgabe nicht an das LCD? Dann wird es wohl irgendwo eine Einstellung geben, die dafür sorgt. >(warum poste ich das überhaupt, du schaust ja anscheinend sowieso >nicht rein) Karl Heinz, du bist ein viel zu netter Mensch! ;)
Doch, ich guck da schon rein... LCD habe ich auch teilweise geguckt...mein problem ist Ich weiss nicht WIE ich den gemessenen Wert auf LCD anzeigenlassen soll.
>Print "ADC-Pin " ; Channel ; ": Wert " ; W
wird (vermutlich) zu
LCD "ADC-Pin " ; Channel ; ": Wert " ; W
Wenn ich das also richtig verstehe, lautet das Programm so: $regfile = "m16def.dat" $crystal = 16000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4 Config Adc = Single , Prescaler = Auto Start Adc Dim W As Word , Channel As Byte Channel = 0 Do W = Getadc(channel) Print "ADC-Pin " ; Channel ; ": Wert " ; W Incr Channel If Channel > 7 Then Channel = 0 Waitms 800 Loop End Richtig????
LCD initialisieren ADC initialisieren Do W = Getadc(channel) LCD W Waitms 800 Loop Hab jetzt kein BASCOM da, aber so sollte es gehen.
> Wenn ich das also richtig verstehe, lautet das Programm so:
Wo wird in diesem Program die Ausgabe gemacht?
Wahrscheinlich hier:
Print "ADC-Pin " ; Channel ; ": Wert " ; W
Wenn du jetzt nachschlägst, was PRINT macht, so kommt da raus,
dass der die Ausgabe auf die serielle Schnittstelle macht.
Du willst aber nicht auf die serielle Schnittstelle, du willst
auf das LCD. Also wirst du wohl diesen Teil gegen eine Ausgabe
auf das LCD ersetzen muessen. Und der Befehl dafür heist bei
BASCOM sinnigerweise LCD. In der Hilfe steht auch, dass sich
LCD gleich wie PRINT verhält.
Aber Achtung: das nächste Problem wartet schon :-)
Dein Lcd hat nicht unbegrenzt Platz zur Anzeige.
Da alle 7 ADC Kanäle in dieser Form auszugeben wird nicht unbedingt
sinnvoll sein.
Ich sehe in deinem Programm nirgends wo 'W' definiert wurde! Auch die Variable 'channel' wird nirgends vereinbart. Warum hast du denn das rausgeschmissen? Ein bischen mitdenken musst du schon. Dim W As Word , Channel As Byte Channel = 0 Versuch wenigstens den Code zu verstehen und tippe ihn nicht einfach nur ab. Sonst kommst du nicht weiter.
Aber Achtung: das nächste Problem wartet schon :-) Dein Lcd hat nicht unbegrenzt Platz zur Anzeige. Da alle 7 ADC Kanäle in dieser Form auszugeben wird nicht unbedingt sinnvoll sein. Genau!!! Aber ich habe zumindestens was auf dem Display!!!!!!!!!!!!!!!!! Was muss ich ändern, damit nur ein pin, PA0 abgelesen wird?
ich habe jetzt das hier: $regfile = "m16def.dat" $crystal = 16000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4 Config Adc = Single , Prescaler = Auto Start Adc Dim W As Word , Channel As Byte Channel = 0 Do W = Getadc(channel) Lcd "ADC-Pin " ; Channel ; ": Wert " ; W Incr Channel If Channel > 7 Then Channel = 0 Waitms 800 Loop End aber er fragt alle pins am port A ab! ich brauche ja nur A0. Wie löse ich das Problem?
Und das > Incr Channel > If Channel > 7 Then Channel = 0 kann dann auch weg...
Leute, versteht mich bitte nicht falsch, ich bin ein Totaler anfänger! Jetzt habe ich alles was davor war begriffen!
>ich bin ein Totaler anfänger!
12 Jahre alt?
Sooooo... es klappt jetzt FAST alles Der Wert ändert sich! Aber Avr schreibt mit Display voll mit " "Pin 0 Wert 192" Ich brauche das je nur einmal auf einer zeile! Wo ist das Problem?
> ich brauche ja nur A0.
Noch mal: versuch wenigstens zu verstehen was da in deinem
Programm vor sich geht.
Wenn er alle Pins abfrägt, dann musst du dir halt mal den Abfrage-
Befehl genauer anschauen. Wwelcher da wäre GETADC.
Wie wird GETADC in deinem Pgm verwendet?
W = Getadc(channel)
Aha. Was passiert mit channel? Was ist channel überhaupt.
Wieder in der Hilfe nachgeschaut: Das ist der Pin der
abgefragt wird. Die Zahl die in channel steht, bestimmt also
welcher ADC abgefragt wird. Was passiert mit channel.
Incr Channel
If Channel > 7 Then Channel = 0
Aha. Bei jedem Schleifendurchlauf wird channel um 1 erhöht
(incr channel). Ist der Wert 7 erreicht, wird channel wieder auf
0 gesetzt und beim nächsten Schleifendurchlauf wird daher
wieder der ADC Kanal 0 abgefragt.
Wenn du nur den ADC 0 abfragen willst, dann wirst du das wohl
ändern müssen. Am einfachsten ist es, du vergisst den ganzen
Hack-Mack mit channel und sagst dem µC was du willst.
Du willst: einfach immer nur den Kanal 0 abfragen. Also:
W = getadc( 0 )
anstelle von
W = getadc( channel )
Alternativ hätte man die Variable channel auch beibehalten können
und einfach nur dafür sorgen müssen, dass channel einfach immer
nur den Wert 0 enthält:
Channel = 0
Do
W = Getadc(channel)
Lcd "ADC-Pin " ; Channel ; ": Wert " ; W
Waitms 800
Loop
So. Jetzt wird channel in der Schleife nicht mehr verändert und
behält daher in jedem Schleifendurchlauf den Wert 0, der ihm
vor der Schleife zugewiesen wurde.
> Ich brauche das je nur einmal auf einer zeile! > Wo ist das Problem? Das Problem ist, das LCD immer fortlaufend auf das LCD schreibt. Das ist ganz praktisch wenn man mehrere Texte ausgeben will. Aber in deinem Fall möchtest du das nicht. Du möchtest, dass dein Text immer in der 1. Zeile, 1. Spalte beginnt. Schau mal in der Hilfe nach dem Befehl: LOCATE
>Schau mal in der Hilfe nach dem Befehl: LOCATE
Danke bin am Probieren
Und studier mal das Beispiel, welches in der Hilfe bei LCD angegeben ist. Da sind noch eine Menge anderer interessanter Dinge enthalten. Studieren heist nicht: abklopfen und laufen lassen (kann es auch heissen). Studieren heist: Programmtext durchlesen, den Kommentar zu jedem Befehl durchlesen und die Befehle die dann immer noch unklar sind in der Hilfe nachschlagen.
Ich glaube es selbst kaum, aber es funktioniert!!! habe da aber Zahlen z.B. 355, die sich mit dem Widerstand vom Poti verändern! Was sind das für Zahlen? Wie mache ich daraus eine Spannung oder Temperatur, was ich eigentlich wollte?!
>Was sind das für Zahlen?
Dezimalzahlen.
Der Wert spiegelt die Stellung deines Poti zum Vollauschlag wider.
Wenn du das Poti voll aufdrehst, sollte 1023 oder (in die andere
Richtung gedreht) 0 angezeigt werden.
>Der Wert spiegelt die Stellung deines Poti zum Vollauschlag wider.
Wenn du das Poti voll aufdrehst, sollte 1023 oder (in die andere
Richtung gedreht) 0 angezeigt werden.
Danke tut er tatsächlich!
Wie mache ich daraus eine Spannung oder Temperatur, was ich eigentlich
wollte?!
>Wie mache ich daraus eine Spannung oder Temperatur, was ich >eigentlich wollte?! Durch etwas Rechnen... Dazu besorgst du dir einen Temperatursensor (kann auch ein NTC sein), der bei einer bestimmten Temperatur entweder eine bestimmte Spannung abgibt (LM75 heisst wohl einer von der Sorte) oder einen bestimmten Widerstand hat (NTC). Zu beiden gibt es ein Datenblatt, in dem beschrieben ist, wie sich der Sensor bei welcher Temperatur verhält. Bei NTC hat man meist eine Temperatur-Widerstandskurve gegeben.
ok, und wie bringe ich dem AVR bei, dass wenn die Spannung z.B. 2,0 Volt ist, dass es 20°C sind? und was ist mit 2,2 Volt? Muss man das alles per hand schreiben? Oder wie geht das?
Der ADC teilt die Referenzspannung in 1024 gleiche Teile. Wenn Du das Poti zwischen VCC (z.B. 5 V) und GND angeklemmt hast, dann entspricht "0" 0V und 1023 5V*1023/1024, also ca. 4,995V. Aufgrund der Funktionsweise des ADC fehlt oben immer ein LSB (also ein 1024tel bei 10 Bit Auflösung). Der Wert 1023 bedeutet also eigentlich, dass die Spannung größer oder gleich 4,995V ist. Die Formeln für die Berechnung des Spannungswertes stehen im Datenblatt vom AVR. Wenn Du einen Temperatursensor anschließt, musst Du eben noch die Kennlinie des Sensors berücksichtigen. Die wiederum findet sich im Datenblatt des Sensors. Wenn Du einen NTC o.ä. in einem Spannungsteiler verwendest, wird das etwas komplizierter.
Etwas rechnen (Dreisatz): 2,0V entspricht 20°C 2,2V entspricht x°C
ok, ich glaube ich gehe euch allen schon auf den Sack, aber die Letzte Frage habe ich noch: Wo soll ich im Programm angeben, dass er bei 2.0 Volt , also sagen wir mal beim "Wert" den ich jetzt habe 338 z.B. 20°C anzeigen soll??? Noch was.. NTC´s sind ja bestimmt nicht linear. Muss man da fast jeden Wert ausschreiben, oder wie geht das?
Kennst du EVA?
_E_ingabe _V_erarbeitung _A_usgabe.
Eingabe: Messwert einlesen
Verarbeitung: aus 338 20°C machen
Ausgabe: 20°C ausgeben.
Johnny.m hat die Berechnungsgrundlage ja schon hingeschrieben.
>ok, ich glaube ich gehe euch allen schon auf den Sack
Das kann man so nicht sagen; nur die Pausen zwischen deinen Fragen sind
zu kurz...Das wirkt, als hättest du gerne eine fertige Lösung
präsentiert bekommen.
> Muss man das alles per hand schreiben?
Jaaaaa.
Das nennt man programmieren.
Und das ist das was du versuchst zu machen.
Also gewöhn dich daran.
Wie ich schon sagte: Kennlinien gibts im Datenblatt des NTC, meist steht da auch ne Formel dabei, die Du nur in Dein Programm einbauen musst. Wenn Du den NTC in einem Spannungsteiler betreibst, musst Du natürlich den Festwiderstand mit einrechnen. Da Du aber weißt, welchen Widerstand der NTC bei einer bestimmten Temperatur hat, ist das dann auch kein großes Problem mehr (U(T) = U_ref * R_NTC(T) / (R_NTC(T) + R) mit R = Festwiderstand, R_NTC(T) = temperaturabhängiger Widerstand des NTC und U_ref = Referenzspannung bzw. Spannung über dem Spannungsteiler)
Kennlinie kann man mit excel ne Tabelle erstellen und die dann ins Flash packen, mit dem Z-Register kann man bei Atmel recht einfach auf solche Tabellen zugreifen (braucht man aber ein paar Assembler-Befehle zu). Oder man nimmt kleine Fehler in Kauf und unterstellt eine lineare Kennlinie, dann multipliziert man den Meßwert mit einem Linearfaktor und addiert einen Offset drauf. Es gibt auch neue ATtinys mit integriertem Temperatursensor ATtiny 24/44/84 und 25/45/85.
Ach ja, und das R_NTC(T) errechnet sich dann eben nach der Formel im Datenblatt. Die Formel musst Du dann nach der Temperatur auflösen (weiß jetzt natürlich nicht, wie weit Deine mathematischen Kenntnisse gehen, aber wenn Du nicht weiterkommst, kannste Dich ja noch mal melden), so dass Du dann eine Formel wie T = f(ADC_Wert) bekommst...
> Wo soll ich im Programm angeben, dass er bei 2.0 Volt , also sagen > wir mal beim "Wert" den ich jetzt habe 338 z.B. 20°C anzeigen > soll??? beschränk dich erst mal darauf, dass bei einem ADC Wert von 338 in der Anzeige 2.0 Volt stehen soll. Also: Bei einem ADC Wert von 0, liegen da 0 Volt an Bei einem ADC Wert von 1023, liegen 4,995 Volt an. Weiters nehmen wir mal an, es gibt einen linearen Zusammenhang: V = A * k + d V ... Volt A ... Wert vom ADC Die Frage ist also: wie gross ist k? Wie gross ist d? Nun wir kennen 2 Werte-Paare 0 = 0 * k + d 4,995 = 1023 * k + d Das sind 2 Gleichungen in 2 Unbekannten (k, d). Das muesste doch mit dem Teufel zugehen, wenn wir daraus k und d nicht bestimmen könnten. Aus der ersten Gleichung folgt sofort: d = 0 Dieses d in die 2. Gleichung eingesetzt ergibt 4,995 = 1023 * k oder 4,995 k = ----------- = 0.00488 1023 Also lautet der Zusammenhang zwischen ADC Wert und Volt V = A * 0.00488 + 0 Das + 0 können wir uns in die Haare schmieren :-) Jetzt liegt es an dir, diese Umrechnung in dein Programm zu integrieren. Definiere dir eine Variable die das Ergebnis aufnimmt (Aufpassen: Da sind Kommazahlen im Spiel, also wird das eine FLOAT Variable sein muessen) und lass das mal berechnen. Das Ergebnis gibst du dann am LCD aus. Wenn wir richtig gerechnet haben, dann muesste am LCD dieselbe Voltzahl stehen, die dir auch ein Multimeter am ADC Eingang anzeigt. (Na ja, mehr oder weniger :-)
Schau mal hier: http://www.sprut.de/electronic/temeratur/temp.htm#ptc Da steht eine Temperaturmessung mit einem (preiswerten) KTY81-Sensor beschrieben. Wenn Du den Festwiderstand wie angegeben wählst, hast Du eine fast lineare Kennlinie. Das vereinfacht die Berechnung noch mal erheblich.
>Das + 0 können wir uns in die Haare schmieren :-)
Falls (inzwischen) noch genug vorhanden sind...
>Verarbeitung: aus 338 20°C machen
Genau das ist das Problem!!!
Ich kann was machen, was ich sehen kann.. zum beispiel mit einem Messer
die Wurst schneiden :)))))))
An welcher Stelle soll ich das machen und vor allem WIE?
Habe jetzt sowas:
$regfile = "m16def.dat"
$crystal = 16000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 ,
Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4
Config Adc = Single , Prescaler = Auto
Start Adc
Dim W As Word , Channel As Byte
Channel = 0
Cls
Locate 1 , 1
Lcd " Alex"
Locate 2 , 1
Lcd " Test"
Cursor Blink
Waitms 1000
Cursor Off
Cls
Do
W = Getadc(channel)
Lcd "TEMP out" ; Channel ; "=" ; W
Locate 1 , 1
Waitms 60
Loop
> FLOAT Variable sein muessen
Tschuldigung.
Das heist in BASCOM gar nicht FLOAT. Dort heist es
entweder SINGLE oder DOUBLE.
SINGLE Einfache Fliesskommagenauigkeit
DOUBLE Erhöhte Fliesskommagenauigkeit.
Du darfst halt nicht "W" direkt ausgeben, sondern musst es erst umrechnen. Also die Berechnung (Formel) zwischen dem "W = Getadc(channel)" und dem "Lcd "TEMP out" ; Channel ; "=" ; W". Wenns ne Spannung zwischen 0 und 5V bei 10 Bit Auflösung sein soll, dann einfach was in der Art W = W * 5V / 1024 (weiß jetzt nicht, ob das in BASCOM-Syntax so geht, aber mit BASCOM kenne ich mich halt net aus...)
Ach ja, "W" muss dann natürlich ein anderer Datentyp sein. Um Fließkommageschichten zu vermeiden, kannst Du den ADC-Wert vorher mit 1000 multiplizieren. Dann bekommst Du die Anzeige in Millivolt.
>An welcher Stelle soll ich das machen und vor allem WIE?
Na an welcher Stelle wird das wohl passieren muessen.
(Du musst besser nachdenken)
* Kannst du die Umrechnung machen bevor du den Wert vom ADC
hast? Nein. Wohl kaum. Also wird diese Umrechnung iregendwann
nach dem holen des Wertes vom ADC passieren muessen.
* Kannst du die Umrechnung machen, nachdem du den Wert auf das
LCD ausgegeben hast? Können tust du schon. Nur ist das dann halt
sinnlos. Denn der Wert wurde ja bereits ausgegeben. Nach der
Ausgabe kannst du rechnen so vil du willst, hilft aber alles
nichts, denn der Wert steht schon am LCD.
Also wirst du wohl die Umrechnung zwischen
* Wert vom ADC holen
* Wert auf LCD ausgeben machen muessen
Wo ist das in deinem Programm
(enttäusch mich jetzt nicht, das musst du einfach finden. Ansonsten
ist Hopfen und Malz verloren).
danke! Ich werde mal zusehen, dass ich ein kty81 bekomme! DANKE erstmal an alle! Ich melde mich noch! Alex!
>DANKE erstmal an alle! Gern geschehen. Was man nicht so alles für die Jugend tut. >Ich melde mich noch! War das jetzt eine Drohung? ;-)
> W = W * 5V / 1024 > (weiß jetzt nicht, ob das in BASCOM-Syntax so geht, aber mit > BASCOM kenne ich mich halt net aus...) soviel ich weiss, geht das in BASCOM so nicht. Du kannst in einer Anweisung immer nur eine Berechnung machen (Keine Ahnung warum die das so gemacht haben. Ich kann mir ehrlich nicht vorstellen, dass der Parser bzw. Codegenerierung deswegen einfacher wird) Man muesste das also so machen V = W * 5 V = V / 1024 V muss natürlich vorher als neue Variable deklariert werden. Irgendwas in der Art DIM V as SINGLE oder so.
Hallo, Hier bin ich wieder! Und schon mit einem neuem problem... Habe mir einen NTC genommen. weiss aber nicht wie ich das anschliessen soll. Die richtwerte erstmal: -10°C - 1kOhm , +20°C - 2,3kOhm , +50°C - 5kOhm. Soll es denn so sein, dass bei -10°C am ADC-pin z.B. 0,5 Volt anliegen, und bei +50°C 4,5 Volt??????? Wie kriege ich das so hin, dass ich mit dem NTC die Spannung fast von 0 Volt auf 5 Volt regeln kann??? Weiss das jemand? Stecke an dieser stelle echt tief fest!
Ist doch ganz einfach: Du brauchst einen Spannungsteiler. Einer der beiden Widerstände in dem Spannugnsteiler ist der NTC. Ohne Spannungsteiler geht gar nichts, weil du sonst keine variable Spannung erzeugen kannst. Wie gross die Spannung am Abreifpunkt nun tatsächlich ist, hängt natürlich vom Verhältnis der Widerstände ab und natürlich davon welche Spannungen an den beiden Enden des Spannungsteilers anliegen. Wenn dir also der Bereich 0.5V bis 4.5V nicht gefäält, dann könnte man an den Enden des Spannungsteilers einfach eine andere Versorgung anschliessen. Eine andere Möglichkeit wäre, vom Ausgang des Spannungsteilers eine konstante Offsetspannung mit einem OP zu subtrahieren und danach deie Spannung in den Bereich 0 bis 5V zu spreizen (wieder mit einem OP, der als Verstärker verschaltet ist). Aber: Das lohnt alles nicht. Dein ADC hat genug Auflösung um aus dem Bereich 0.5 bis 4.5V noch was ordentliches zu machen. Und ob der NTC so genau ist, dass der tatsächlich jedes 1/10 Grad sauber auflöst, steht auch noch in den Sternen. Mal ganz von der Nichtlinearen Kennlinie abgesehen. Merke: Nur weil auf irgendeinem Display 6 Nachkommastellen angezeigt werden, heist das noch lange nicht dass der Wert auch tatsächlich so genau gemessen wurde.
"Regeln" kannst Du da gar nichts... Das was Du beschreibst, ist eben der Nachteil der (im Aufbau dafür sehr einfachen) Konfiguration mit einem einfachen Spannungsteiler: Du kannst prinzipbedingt nicht den kompletten Messbereich ausnutzen, weil Dein NTC weder ganz auf 0 Ohm runter geht (für 0 V) noch auf unendlich rauf (wäre für 5 V erforderlich), außer, Du versorgst den Teiler mit einer anderen Spannung (wie von Karl Heinz beschrieben), was es aber erforderlich macht, den ADC-Eingang zusätzlich gegen Überspannung abzusichern. Du musst den Wertebereich eben skalieren und kannst z.B. die 0°C-Spannung (bzw. der Einfachheit halber direkt den entsprechenden ADC-Ausgangswert) von Deinem Wandlungsergebnis abziehen. Die Skalierung kann dann weitgehend linear erfolgen (vorausgesetzt, die Genauigkeit genügt Dir...). Alternativ wäre es möglich, den NTC in einer Brückenschaltung zu betreiben und die Differenzspannung zu messen (entweder mit einem OP verstärken oder direkt über einen der Differenz-Eingänge des Mega16). Dann kommste auch bis auf 0 runter, und je nachdem, welche Referenzspannung Du verwendest, kannst Du den Messbereich beliebig ausnutzen. Das ist aber erheblich aufwändiger. Mit der Teiler-Methode verlierst Du eben u.U. 20% Deines Messbereiches (vorausgesetzt, Du willst tatsächlich nur von -10 bis +50°C messen...), aber überleg mal, ob das nicht vielleicht gar nicht mal so schlimm ist. BTW: Das was Du beschreibst scheint mir eher ein PTC zu sein und kein NTC (Widerstand nimmt mit steigender Temperatur zu -> positiver Temperaturkoeffizient)
Also ich habe jetzt mal mit Kältespray und Lötkolben am NTC rumgespielt/ experementiert... Bei der ges.Spng von 5,5 V, geht beim Abkühlen die spannung auf 5,3 Volt... Beim Arwärmen auf 1,0V aber das sind die Extremwerte.. Habe einen 2.2kOhm in Reihe zum NTC! Was meint ihr.. reicht das???
Lieber Fragesteller, liebe geduldige Beantworter, ich brauche Eure Freigabe für diesen Thread. Ich möchte dies als Buch herausgeben. Titel noch unklar, aber das Buch soll beschreiben, was der Unterschied zwischen einem "inschinörmässigen" Vorgehen und einem Wirren drauflostippen ist. Im Sinne von: Erst (selbst) nachdenken, dann machen. Und auch ein bischen selbst recherchieren.
Kann mir mal einer die Icq nummer geben? also, der, der mir helfen könnte! ICh BRAUCHE die Hilfe!!! Ode schreibt mich an, alle,die mir helfen möchten! BITTE! 168419332
> Was meint ihr.. reicht das???
Die Frage kann dir keiner beantworten.
Den die Frage lautet eigentlich: Reicht Dir das?
Mal ein bischen überschlagsmässig rechnen:
Du hast einen Spannungshub von 1.0 bis 5.3 Volt
Bei 5.5 wäre Vollausschlag, da würde der ADC 1023 melden.
Also meldet er bei 1.0 Volt
5.5 ... 1023
1.0 ... x
-----------------
1023 * 1.0
x = -------------- = 186
5.5
Dementsprechend kommen bei 5.3 Volt raus
5.5 ... 1023
5.3 ... x
-----------------
1023 * 5.3
x = ------------ = 986
5.5
Dein ADC hat also einen Wertebereich von 986 - 186 = 800
Werten.
Nun weiss ich nicht, welche Temperaturen du mit dem Kältespray bzw.
dem Lötkolben erzielt hast. Das eine ist Arschkalt das andere
ist Aua. Aber beides ist nichts womit man mal ein bischen rechnen
könnte. Ausser der simplen Rechnung: zwischen 'brrr' und 'Aua'
liegen am ADC 800 verschiedene Werte.
Wenn du das nächste mal Versuche machst, nimm irgendwas was
du reproduzieren kannst: zb. Eiswasser ( 0°C) und kochendes
Wasser ( ~100°C ). Dann kann man aus den dabei gemessenen Werten
auch ermitteln, wie gross die Auflösung werden wird.
Mein gott wo liegt denn dein Problem? Klemm den Spannungsteiler an den ADC und dann kannst du nachlesen wie du das dann berechnen muss und zwar hier: http://de.wikipedia.org/wiki/Spannungsteiler Einfach einlesen, Wert umrechnen, anzeigen, Fertig! Schritt 1 und 3 dürftest du ja wohl noch schaffen, oder hast du ja schon. Bei 2 musst du dein Köpfchen halt bisschen anstrengen.
@Klaus: mit 13 geht man noch nicht indschenjörmässig vor...
Danke, Karl Heinz Buchegger!!! Nun kommt die Frage, bei der bestimmt alle sagen: "OH NEIN!!!!" Ich habe jetzt wie du ausgerechnet hast 800 werte! Ich kenne leider Syntax von Bascom nicht! Aber ich weiss schon an welche Stelle das Ganze soll! Wie schreibe ich dass Wert 530 18°C antspricht? Ich weiss was ich machen muss, aber wie gesagt Syntax ist das problem. Wenn mir jemand paar beispiele schreibt, dann kann ich auch alleine weiter. also 150 entspricht ca. 120°C 980 -------------- -40°C Wie mache ich das jetzt? Seit bitte nicht böse, ist ja keine Absicht, dass ich so nerve!
Scroll mal ein wenig rauf. Weiter oben hab ich dir den Rechengang schon mal angegeben. War damals für Spannungen. Ist aber hier genau dasselbe, kommen halt nur andere Zahlenwerte vor. (Es läuft auf das Lösen 2-er Gleichungen in 2 Unbekannten hinaus um damit eine Umrechnungsgleichung aufzustellen. 2 Gleichungen in 2 Unbekannten lösen kannst du doch, oder?)
ja, kann ich! Soll ich diese gleichung dann ins programm irgendwie integrieren? Das problem ist ja PTC ich nicht linear.. oder ist das nicht sooo schlimm?
Guck mal, wo er nichtlinear ist. Ist der vielleicht in einem Bereich nichtlinear, wo dich die Temperatur eh nicht interessiert? Sonst gibt es so nette Sachen wie Linearisierung mit Hilfe irgendwelcher Polynome... Eine andere Möglichkeit wäre die Verwendung einen annäherend linearen Temperatursensor (kty8x, LM135 oder wie der heisst).
Ich habe keine Ahnung! Habe da schon alles mögliche probiert! Das letzte sah bei mir so aus: $regfile = "m16def.dat" $crystal = 16000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4 Config Adc = Single , Prescaler = Auto Start Adc Dim W As Word , Channel As Byte Channel = 0 Cls Locate 1 , 1 Lcd " Alex" Locate 2 , 1 Lcd " Test" Cursor Blink Waitms 1000 Cursor Off Cls Do W = Getadc(channel) DIM V as SINGLE V = 100 * 800 V = V * 150 Lcd "TEMP out" ; Channel ; "=" ; V Locate 1 , 1 Waitms 60 Loop Kann das mal jemand korrigieren?
V = 100 * 800 V = V * 150 Lcd "TEMP out" ; Channel ; "=" ; V Dürfte 12000000 anzeigen...und zwar konstant.
irgendwas mit 12000000 habe ich auch! Was ist das aber für ein Wert??? Bin schon echt am verrecken mit der ganzen Sache... hatte von 2 minuten Hammer in der Hand.. ohne Witz!
Ich weiß zwar nicht was du da rechnest, aber ich sehe, dass die Variable W in deiner Berechnung gar nicht vorkommt. Was willst du damit bezwecken?
>ich sehe, dass die Variable
W in deiner Berechnung gar nicht vorkommt.
Sobald ich da irgendwo W habe, schreibt mir Bascom einen Fehler.
Was denn für ein Fehler? Zeig doch erst mal W auf dem LCD an statt irgendnem Scheiß den du garnicht brauchst.
W hatte ich schon.. diese dezimalzahl, oder was das auch immer war! Ich habe da schon alles mögliche probiert.. komme nicht weiter!
>Sobald ich da irgendwo W habe, schreibt mir Bascom einen Fehler.
Das liegt vielleicht daran, dass SINGLE Zwölfmillionen nicht abbilden
kann; dazu ist der Wertebereich von SINGLE zu klein.
Die Geradengleichung y=m*x+b ist dir bekannt?
Wenn du als PTC ein KTY81 nimmst ist die Temperatur-Spannung verlauf von -20°c bis ca. 100°C linear. Siehe genau der Anhang. Jede Temperatur Änderung von 0,5°C bewirkt das sich ADC-Wert um 1 ändert. Ich habe mit dem BASCOM nie gearbeitet, aber dein Code sollte ungefähr so aussehen: . Do W = Getadc(channel) W=W-NULLPUNKT Lcd "TEMP out" ; Channel ; "=" ; W/2 // Temperatur als Ganzzahl Lcd "." // Dezimalpunkt Lcd 5*(W%2) // Nachkommastelle(in 0,5 Schritte) Lcd "°C " // °C Anzeige Locate 1 , 1 Waitms 60 Loop NULLPUNK ist Wert welche ADC liefert bei 0°C(Siehe Anhang). Aref Spannung ist mit einem Trimmerpoti einzustellen. Richtige wert steht in die Tabelle. Bei mir ist KTY81-110(1Kohm bei 25°C); R=2,7Kohm 1%;NULLPUNKT=300 und Aref=3,95V. Am ende hast du Temperaturanzeige von -20°C bis ca. 100°C mit Auflösung von 0,5°C. Grüß Branko
Rechne erst W in Volt um. Wie das geht steht mehrfach oben. Aber weil ich ja so sozial bin geb ich dir nochmal nen Denkanstoß: W = 0 -> 0 Volt W= 1023 -> 5 Volt Dann machst du es so, dann hast du Volt. V = 5/1023 V = V*W Dann schaust du halt im DAtenblatt deines Sensors welchen Widerstand er bei wieviel Grad hat. Dannach berechnest du den Spannungsteiler d.h. wie viel Volt bei welcher Temperatur am ADC anliegen. Dannach musst ja nur noch schauen was am ADC anliegt und die passende Temperatur aufs LCD schreiben.
@Branko Habe ich probiert! Guck mal bitte Anhang.
Ich kenne die Kommentarzeichen in Basic nicht, aber die meisten der Fehler beziehen sich anscheinend darauf, dass der Compiler die Kommentare nicht als solche erkennt. Also ist "//" anscheinend nicht korrekt. Außerdem scheint NULLPUNKT nirgends definiert zu sein...
Kommentare in Basic werden vermutlich nicht mit // eingeleitet. Das ist C/C++-Syntax.
Man jetzt mal ehrlich hast du dir mal überlegt erst mal ein klein bisschen programmieren zu lernen? Dir ist schon klar das variablen erst mal deklariert werden müssen?? @Branko: Kommentare macht man in Bascom mit ' nicht mit Slash, aber kannst du ja nicht wissen. Aber Alex: Nur Codeschnipsel kopieren funktioniert einfach nicht, überleg doch bitte ein wenig. Mach das was ich dir gesagt hab.
ich glaube ich geschäftige mich schon viel zu lange heute damit.. seit 07.30 oder so... kann das ganze nicht mehr sehen! Es geht einfach nicht! Immer wieder neue Fehler! falls jemand noch eine Idee hat > reinschreiben.. ich habe für heute echt keine Lust mehr! Danke!!!!
Ich denke auch, dass du schon zu lang davor hängst. Erstmal ne Nacht drüber schlafen. Das mit der NULLPUNKT Variable stimmt natürlich. Und es hängt damit nicht an deiner "W" Variable. Am besten immer alle Fehlermeldungen lesen. Und ganz wichtig. Von oben beginnen. Meist bedingen alle weiteren Fehlermeldungen die erste.
> Man jetzt mal ehrlich hast du dir mal überlegt erst mal ein klein
bisschen programmieren zu lernen? Dir ist schon klar das variablen
erst
mal deklariert werden müssen??
Mal genz ehrlich:
Ich bin 13 jahre alt, ich habe erst "gestern" erfahren was eine
Variable ist.... ich versuche es.... aber nicht alles bringt mich
weiter.. was ich schon mal geschafft habe, dann habe ich es begriffen,
und kann es noch mal selber machen..
Wenn es so einfach für einen ist.. dann kopier doch meine Code, und
ändere da 3 zeilen, so dass es funktioniert!
Ich bin nicht zu Faul, ich habe schon alles mögliche probiert... bis
ich auf englich 2 Stunden lang mit Wörterbuch verstanden was ADC
überhaupt ist.. hatte ich schon kein Bock mehr.. ich habe es übersetzt,
aber erst verstanden, als ich das gemacht habe!
Das meiste was die Leute hier schreiben, sagt mir überhaupt nichts!
Nicht darum, weil es falsch ist.. ich bin noch zu Jung, oder ich weiss
nicht sonst was...
Erst wenn ich eine Funktionierende Zeile habe, dann kann ich schon
nachdenken, wie sie entstanden ist, und wo das ganze herkommt!
Für mich ist das schwer, eine Zeile selbst zu schreiben, weil ich
Syntax GARNICHT kenne!
Bascom Handbuch lesen??? 700 seiten auf Englich , nein,
danke!!!!!!!!!!!
Ja eins hab ich noch zu sagen: Tut mir Leid, aber mit dem was du im Moment fabrizierst musst du morgen warscheinlich auch gar nicht erst anfangen. Warum lässt du dir nichts sagen? Es ist doch wohl klar, dass wenn du nur irgendwelche Pseudo Code Schnipsel kopierst, die irgendjemand hier reinschreibt kopierst und nciht selber überlegst nicht weiterkommst. Es ist doch wirklich nicht so schwer, ich habe das Gefühl du hast dir deinen eigenen Thread noch nicht mal komplett durchgelesen, sonst hättest du nämlich bemerkt, dass die Lösung hier schon mehrfach steht. Darum mal n Tip: Lesen, dann überlegen, das hier ist wohl eins der einfachsten Projekte und ich denk echt nicht das du so blöd bist und nicht einfach mal normal überlegen kannst, dann würdest du nämlich auch auf die Lösung kommen. Nochmal: So kommst du nciht weiter!
>Bascom Handbuch lesen??? 700 seiten auf Englich , nein,
Das wäre für mich ein Grund, auf C oder so umzusteigen. Denn einerseits
gibt es dazu hier auf der Seite ein Tutorium und C ist wesentlich
verbreiteter als BASCOM.
Nachteil ist natürlich, dass man keine vorgefertigten Funktionsblöcke
hat.
Um Englisch wirst du nicht herumkommen, wenn du mit Elektronik weiter
"rumspielen" willst.
Also meiner Meinung nach ist es für Bascom nicht mal (unbedingt) nötig ein Handbuch zu lesen. Ich weiß nicht ob du schonmal mit Bascom gearbeitet hast, aber es ist echt simpel. Ich arbeite auch vorwiegend damit und hab auch kein Handbuch gelesen und bekomm alles auf die Reihe. Wenn man sich mal ein paar fertige Programme anschaut erklärt es sich sozusagen von selbst. Und wenn ich mal garnicht weiterkomm gibts ja immer noch die Onlinehilfe.
Hallo, also wenn du es ganz simpel haben möchtest, nimm nen TWI fähigen Sensor z.B den DS1621. Und dann brauchst du nur noch zwei Widerstände und die passenden Befehle in BASCOM und schon kannst du wunderbar die Temperatur auslesen. Gruß Nico
Huch, da waren andere schon schneller. Also wenn du noch gar nicht so richtig programmieren kannst, würde ich erstmal ein paar Programme für PC's schreiben. Damit du erstmal überhaupt ein Gefühl fürs Programmieren bekommst. Nimm da meinetwegen Pascal, Basic oder Delphi sind seh gute Einsteigersprachen. Und dann wenn du dich damit ausreichend befasst hast, kannst du entweder ne "mächtigere" Sprache wie C/C++/C# lernen oder dich halt mir BASCOM un Mikrocontroller Programmierung befassen. Wobei du natürlich auch einen Mikrocontroller in C programmieren kannst. Es gibt da auch sehr gute Bücher für den Programmiereinstieg. Z.B Delphi für Kids oder Turbo Pascal für Kids <- Sind echt nicht übel diese Bücher wenn auch die Beipiele meist nicht sehr produktiv sind. Aber man lern die Programmiersprache kennen. Und auch für C++ gibt es ein Buch namens C++ für Kids. Gruß Nico
Irgendwie ein toller Thread! Fehlt nur noch das Erfolgserlebnis. Wird schon werden...
Oh Mann
> Sobald ich da irgendwo W habe, schreibt mir Bascom einen Fehler.
Aha. Und deshalb lässt du sie einfach weg.
Mann. V berechnet sich aus W. Also muss in deiner Formel das
W auch in irgendeiner Form vorkommen! Ein Computer ist auch nur
ein Mensch!
Das ist doch nicht so schwer.
Hast du das Gleichungssystem mitlerweile (am Papier) gelöst?
Welche Werte kriegst du für k und für d?
Sagen wir mal, du hast ausgerechnet, dass k gleich 0.5 ist
und d gleich 20 ist.
Dann programmierst du in BASCOM:
V = 0.5 * W
V = V + 20
Und das wars dann schon. Für 0.5 bzw. 20 musst du natürlich
die Zahlen einsetzen, die du ausgerechnet hast.
Falls du die Werte nicht bestimmen kannst, dann helf ich dir auch
damit. Aber dann brauch ich von dir für 2 Temperaturen den
gemessenen ADC-Wert (also das W). Also für welche Temperatur x
hat der ADC welchen Wert y ausgespuckt.
Jungs. Können wir uns darauf einigen erst mal Themen wie Linearisierung der Kennline aussen vor zu lassen? Alex hat auch so schon genug Schwierigkeiten. Hier gehts nicht darum, dass er ein Präzisions- instrument baut, sondern dass sein µC was Sinnvolles macht, das einigermassen richtige Ergebnisse liefert. Wenn ihm das Teil im Zimmer 24 Grad anzeigt und draussen vor dem Fenster 5 Grad, (und der Fehler nicht größer als ein Paar Zerquetschte ist) dann sollten wir das schon als Erfolg werten. Was wir Alex beibringen muessen, ist die ganz banale Schleife Schleife Werte vom Sensor lesen Sensorwerte in die benötigte Zieldimension umrechnen Ergebnisse ausgeben End Schleife Anscheinend hat er da mehr als nur ein Paar Schwierigkeiten mit Dingen die Euch und mir noch nicht mal ein Lächeln kosten.
also ich bewundere hier manche,mit welcher gedult sie die dinge erklären.nur ist es hier bestimmt noch keinen aufgefallen, entschuldigt die direktheit, das die grundkenntnisse noch nicht vorhanden sind. an meiner strelle würde ich mir das bascom handbuch unters kopfkissen legen und es studieren und alles nach und nach ausprobieren.von einfachen sachen wie z.b. "hallo welt" bis einfaches lauflicht und eben zu diesem vorhaben ,ein termometer. also alex,von nichts kommt nichts.denke darüber mal nach, bin selbst am anfang und am lernen.manche sachen gehen halt nicht so schnell.auch ist es mit viel arbeit verbunden,bis man am ziel ist. ein tipp suche hier im forum mal nach "einfacheslauflicht" ,"thermometer,bascom". gruß mike
Also ich finde, nach dem ich alles nocheinmal gelesen habe, nach wie vor er sollte erstmal ein bisschen nochmale PC programme schreiben, muss ja nichts extrem aufwendiges sein. Aber so lernt man unabhängig der Eigenschaften eines uC erstmal Programmieren. Und dann kann man seine Kenntnisse auf uC's ausweiten. Also ich finde das ist der bessere Weg als gleich beides auf einmal zu machen Elektrotechnik und Programmieren lernen. Ich habe selber ca. 3 Jahre in C++ programmiert und mich dann erst als ich mit der Ausbildung angefangen habe, mit Elektrotechnik beschäftigt.
> nach wie vor er sollte erstmal ein bisschen nochmale PC programme > schreiben, Da geb ich dir grundsätzlich recht. Das kann durchaus auch auf dem PC ein BASIC sein, auch wenn BASCOM mit einem normalen BASIC nicht allzuviel gemein hat. Aber die Möglichkeiten die auf dem PC vorhanden sind, ich denke da zb. an Debugging Möglichkeiten, sind schon ein enormer Vorteil gegenüber allem was man auf einem µC hat. Da ist Debugging oft mehr ein Stochern im Nebel. Alex hat halt momentan das Problem so wie alle Neulinge, dass er gleichzeitig allgemeine Programmiertechniken, eine spezifische Programmiersprache, English, Aufbau eines µC und seiner speziellen Hardware und auch noch etwas Elektronik lernen muss. Wenn davon 2 Dinge wegfallen könnten (µC und Elektronik) wäre schon einiges gewonnen und die Aufgabe leichter.
Was auch wichtig für ihn wäre: Literatur. Ich kenn aber kein deutsches BASCOM Programmierbuch.
... aber ich. 1. AVR Mikrocontroller Lehrbuch von Roland Walter (sehr gut) 2. Programmieren mit Bascom-Avr von Claus Kühnel Das erstere habe ich hier und kann es sehr empfehlen. MfG Paul
@Karl Heinz
>BASCOM mit einem normalen BASIC nicht allzuviel gemein
Naja, ich find schon das es eingiges gemein hat, der ganze Syntax und
so passt ja schon. Naja, also ic komm auch aus der Basic Ecke (hab
schon einige PC Programme geschrieben) und das erleichterte mir die
Sache am Anfang schon ungemein.
Ihr habt meinen Respekt. Ich habe keine Geduld einem 13 jährigen Hyperaktiven die Grundsätze der Elektronik und Programmierung anhand eines fortgeschrittenen Beispiels zu erklären.
Jeder hat mal angefangen. Und am Anfang ist es schwierig, weil du 20 Sachen gleichzeitig lernen bzw. berücksichtigen musst. Besonders schwer ist es wenn man so wie Alex ins kalte Wasser springt und ohne Literatur an die Sache rangeht. Ein Buch hat den Vorteil, dass es von 0 weg die Dinge systematisch aufbaut. Das hat aber den vermeintlichen Nachteil, dass die ersten Kapitel extrem fad sind und sich praktisch nichts am Rechner rührt, weil es da um Dinge wie 'Was sind Variablen', 'Wie werden Berechnungen angestellt' und solch grundlegende Dinge geht. Genauso sehen dann auch die ersten Programme aus: extrem fad. Aber da muss er durch.
Wie wäre es mit einem Experimentier-Board, bei dem so was alles schon als Beispiel dabei ist? Das spart Frust und kostet weniger, als sich die Nächte um die Ohren zu schlagen. Elektor hat so was zum Beispiel. http://www.elektor.de/Default.aspx?tabid=28&year=2006&month=5&art=5550740&PN=On&SearchText= Ist zwar dann in C, aber dafür ist da ein funktionierendes LCD und auch eine einfache Temp.messung als kostenloses Download verfügbar.
@Florian: Das ist unsportlich. Den einfachen Weg gehen kann jeder. Alex hat einfach nur das Problem, dass er etwas hyperaktiv ist und auf Krampf Erfolg haben muß/will. Würde er es etwas ruhiger angehen, würde es vermutlich mehr bringen.
Na anscheinend kann halt nicht jeder den einfachsten Weg gehen ;-) Deshalb mein Schubser in diese Richtung. Manchmal ist es nicht nur einfacher, sondern auch kostengünstiger und vor allem nervenschonender erst zu investieren und dann zu lernen. Vor allem angesichts des Umstandes, das bisher >100 Beiträge nicht gereicht haben, das Thema zu klären. Aber ich gestehe: Ich erfinde das Rad auch immer wieder gerne neu.
> Falls du die Werte nicht bestimmen kannst, dann helf ich dir auch
damit. Aber dann brauch ich von dir für 2 Temperaturen den
gemessenen ADC-Wert (also das W). Also für welche Temperatur x
hat der ADC welchen Wert y ausgespuckt.
18°C - 571 (ADC Wert)
0 °C - 800 (Adc Wert)
T= -0,08°C*N + 64°C T Temperatur in °C N ADC-Wert Kannst du durch Einsetzen deiner Werte überprüfen. Es wird mit gewissen Rundungsfehler funktionieren. Habt ihr in der Schule schon die Geradegleichung (y=m*x+b)?
> Habt ihr in der Schule schon die Geradegleichung (y=m*x+b)?
Nein, leider noch nicht! :(
Ich probiere deine formel jetzt aus! :)
Dass du die in BASCOM erst zerlegen mußt, ist dir klar, oder? BASCOM kann AFAIK immer nur eine Berechnung pro Zeile.
> Dass du die in BASCOM erst zerlegen mußt, ist dir klar, oder?
BASCOM kann AFAIK immer nur eine Berechnung pro Zeile.
Habe es jetzt so stehen:
Do
W = Getadc(0)
Dim T As Single
T = -0.08 * W
T = W + 64
Lcd "Pin " ; Channel ; ":°C" ; T
Locate 1 , 1
Waitms 60
Loop
Kommt leider "-C639.0" raus :(((
Passt irgendwie nicht! :((((
"°C" musste ich rauslassen, Bascom versteht es so nicht!
Was mache ich falsch?
>T = -0.08 * W >T = W + 64 Muss ja auch T = -0.08 * W T = T + 64 heissen!
Noch was zur Verschönerung: Lcd "Pin " ; Channel ; " "; T ; ":°C"
und 60ms sind relativ wenig. Nimm lieber 1000ms (falls das geht). So schnell kommt die Temperatur nämlich nicht hinterher...
Ja, danke!!! Endlich!!! Zwar noch bisschen ungenau, aber ich sehe schon Zahlen, die passen können! Kannst du mir noch kurz schreiben, wie du gerechnet hast, damit ich dass etwas genauen einstellen kann??? Sieht aber schon viel besser aus! Danke!
> 18°C - 571 (ADC Wert) > 0 °C - 800 (Adc Wert) ok. Wie ich schon mal ausgeführt habe: Wir postulieren einen linearen Zusammenhang. Das heist es gibt eine lineare Gleichung y = k * x + d sodass, wenn wir den ADC Wert für x einsetzen, wir den Temperatur Wert aus dieser Gleichung (das y) erhalten. Die Frage ist daher, wie gross ist k und wie gross muss d sein, damit wenn du für x 571 einsetzt, als Ergebnis 18 rauskommt und wenn man für x 800 einsetzt dann auch 0 rauskommt. Setzen wir einfach mal ein was wir haben. Wir haben ja 2 x/y Paare, die du gemessen hast: 18 = k * 571 + d und 0 = k * 800 + d Die 2.te Gleichung lässt sich ganz leicht so umformen, dass wir einen Ausdruck für k erhalten: 0 = k * 800 + d | -d -d = k * 800 + d - d | + d - d ergibt 0 -d = k * 800 | / 800 -d / 800 = k * 800 / 800 | * 800 / 800 ergibt 1 -d / 800 = k k ist also -d / 800 das setzen wir mal in die 1. Gleichung ein: 18 = (-d/800) * 571 + d Super. 1 Gleichung mit nur noch 1 Unbekannten. Da lösen wir doch gleich mal die Klammer auf -d * 571 18 = -------- + d und bringen auf gemeinsamen Nenner -d 571 800 d 18 = ---------- + ---------- 800 800 Jetzt können die Brüche addiert werden 800 d - 571 d 18 = ---------------------- 800 das d herausheben d * ( 800 - 571 ) 18 = --------------------- 800 und 800 - 571 ausrechnen: d * 229 18 = ---------- 800 die ganze Gleichung mal 800 (damit der Bruch wegfällt) 800 d 229 18 * 800 = ---------------- 800 ( 800 / 800 auf der rechten Seite ist ja gerade 1 ), gekürzt macht das 18 * 800 = d * 229 | / 229 18 * 800 / 229 = d * 229 / 299 | * 229 / 299 ergibt 1 18 * 800 / 229 = d rechne ich das links vom = mal aus, dann ergibt sich 62.882 Diesen Wert benutze ich jetzt um k zu bestimmen. k war ja: k = -d / 800 k = -62.882 / 800 oder als Zahl: -0.0786 Somit lautet die Gleichung: y = -0.0786 * x + 62.882 Machen wir mal die Probe: setzen wir mal einen ADC Wert von 571 ein: y = -0.0786 * 571 + 62.882 ausgerechnet ergibt das y = 18.0014 also so wir wir das wollen. Du hast ja gemessen, dass bei einem ADC Wert von 571 es tatsächlich 18 Grad hat. Dass wir nichtgenau 18 erhalten liegt daran, dass ich zwischendurch bei der Berechnung von d ein paar Kommastellen unter den Tisch hab fallen lassen. Was ist mit dem anderen gemessenen Wert? y = -0.0786 * 800 + 62.882 y = -62.88 + 62.882 y = 0.002 also de fakto 0 sagen wir mal dein ADC liefert dir einen Wert von 320. Welcher Temperatur entspricht das? Wir benutzen wieder die Gleichung y = -0.0786 * 320 + 62.882 und erhalten: y = 37.73 Ein ADC Wert von 320 entspricht also grob einer Temperatur von 37.7 Grad. Was ist bei einem ADC Wert von 1016? Wieder: In die Gleichung eingesetzt: y = -0.0786 * 1016 + 62.882 und erhalten: y = -16.9756 Also bereits empfindlich kalte -17.0 Grad
sooo! An dieser Stelle sage ALLEN Danke schön!!! Ich bin mir jetzt sichen, ich komme jetzt alleine weiter!!! VIELEN VIELEN DANK!!!!
>Ich bin mir jetzt sichen, ich komme jetzt alleine weiter!!!
Versprochen? ;-)
wie wärs mal mit buch kaufen und lesen und am besten assembler mal bisschen was machen anstatt gleich bascom wenn man nicht weiss was ein ad wandler ist...
> Versprochen? ;-)
ich werde alles mögliche tun, um dieses Versprechen zu halten! :)))
sorry, leute.. es gibt noch was... finde selbst nicht. Wie kann ich die Variable "T" für temperatur auf 2 stellen nach komma begrenzen? Danke!
Wäre ich froh gewesen, wenn ich mit 13 solche Unterstützung bekommen hätte, wie man sie jetzt (und hier) bekommen kann/bekommt. Mit 13 hatte ich einen Apple ][... (den habe ich immer noch...) @Alex: Stell dir das Bascom-Manual wie ein grosses Vokabelheft vor... Leg es dir am besten unters Kopfkissen, dann wandert das Wissen über Nacht in deinen Kopf...;-)
Das englische Manual zu Bascom ist für einen 13jährigen eine zu harte Nuss; über altersgerechte Lektüre sollten sich einige Member mehr Gedanken machen. Empfehlenswert sind daher ausschließlich deutschsprachige Bücher, wie sie bereits von Kühnel und R. Walter angesprochen wurden. Den Ansatz, erst einmal am PC zu programmieren kann ich aus didaktischer Sicht nicht nachvollziehen. In Zeiten von grafischen Oberflächen wird niemand mehr freiwillig mit TurboPascal experimentieren, moderne Sprachen setzen jedoch schon fast die Einarbeitung in GUIs voraus. Das empfinde ich als wesentlich komplexer als die Programmierung mit Bascom. Viel entscheidender für das weitere Vorankommen in der µC-Thematik sind gute bis sehr gute Elektronikkenntnisse: Ich habe mir den gesamten Thread durchgelesen, da fiel mir schon auf, dass der Fragesteller kaum in der Lage war, einen Spannungsteiler zu berechnen. Und der nächste kommt an und erzählt was von OpAmps und Offset... Viel wichtiger wäre da eher die Empfehlung eines verständlichen Elektronikbuches, beispielsweise "Der leichte Einstieg in die Elektronik" von Bo Hanus oder etwas anspruchsvoller "Grundwissen Elektronik" von Burkhard Kainka, Martin Häßler und Hans-Werner Straub. Programmieren lernt man nicht vom 4.10 bis zum 5.10.06, in zwei Tagen hat man auch nicht die komplette Bascom-Syntax drauf. Ich habe mit 14 Jahren mit GW-Basic am PC programmieren gelernt. Da habe ich auch nur kompletten Code abgetippt, den ich aus der (deutschsprachigen) Referenz entnommen habe. Wieder und wieder, bis ich kapiert habe, was ich mache und dann nach Wochen bzw. Monaten auch erste eigene Sachen programmieren konnte. Viel wichtiger ist es doch, das Interesse für "unser Hobby" zu wecken. Wenn die Anfrage von Alex nur für ein einmaliges Projekt sein sollte ohne Ausblick auf eine weitere Beschäftigung mit der Thematik, so verstände ich auch das Anliegen, ein fertiges Programm serviert zu bekommen.
Liebe Leute!!!!! ich weiss, das ist jetzt ein wenig blöd, aber.... ich wollte meine Temp. ergebnisse etwas verfeinert.. und habe mein ADC wert bei raum temp aufgenommer.. war ca. 317 bei 19°C und 100°C (koch.Wasser) 400 Habe ein 81-110 genommen! so habe ich gerechnet: T= k x W + d 19°C - 317 ADC 100°C - 400 ADC 19= k * 317 + d / -d 19 - d = k * 317 / 317 (19-d)/317 = k 100 = ( ( 19 - d ) : 317 ) * 400 + d 'klammer auflösen 100 = ( 0,06 - 0,0031d ) * 400 +d 'nochmal auflösen 100 = 24 - 1,2618d + d 'd zusammenfassen 100 = 24 - 0,2618d /-24 76 = -0,2618d d = -290,298 k = (19 + 290,298) / 317 ' "-"+"-" ergibt ja "+" k = 0,9757 soweit ok.... programm rauf... zeigt er mir bei meiner Raumtemp 16°C an Kältespray kann nur bis -55°C abkühler.. er zeigt aber -103 an!!! Habe ich irgendwo in der Rechnung Fehler gemacht?? Ich kann leider bei 0°C kein ADC wert messen.. 0°C ist ja so eine sache...... Bitte!!!!!!!!! Danke!
>Habe ein 81-110 genommen!
Kty81-110?
Hast du dir mal die Kennlinie deines Sensors im Datenblatt angeguckt?
Deine Werte sind übrigens richtig.
da hat mir mal jemand geschrieben, dass 81-110 von -20°C bis 100°C ziemlich lienear ist! Wenn sie richtig sind.. wieso habe ich raumtemp. von 15°C?
> 19°C - 317 ADC > 100°C - 400 ADC Delta Temp: 100 - 19 = 89 Delta ADC: 400 - 317 = 87 d.h. du hast pro ADC Wert ziemlich etwas weniger als 1 Grad. Das deckt sich auch mit dem k Wert von 0.97 (etwas weniger als 1 Grad). Nun musst du aber schon einen sehr guten ADC Aufbau haben, damit dir der ADC nicht durch Rauschen +/- 1 oder +/- 2 ausgibt. Leider wirkt sich aber ein ADC Fehler von +/- 2 bei dir schon als fast ein ganzes Grad aus. Merke: Wer misst, misst viel Mist! Du darfst dem ADC die letzte Stelle nicht glauben. Wenn du 5 mal misst, kriegst du jedesmal ein anderes Ergebnis. Wie gesagt: ausser du hast einen extrem guten ADC Aufbau (hardware). Ändere also deinen Spannungsteiler, so ab dass sich der ADC Wert um mindestens 5, besser 10 Einheiten pro Grad ändert. Dein ursprünglicher Spannungsteiler mit einem viel kleineren k war da wesentlich besser.
> 0°C ist ja so eine sache......
Wieso?
Sensor in einen Plastikbeutel.
In ein Glas etwas Wasser und ein paar Eiswürfel. Ne Zeitlang
warten, dann hat das Wasser ~0°C. Den eingepackten Sensor
in das Wasser hängen und du hast deinen Wert für 0°C
An deiner Berechnung ist grundsätzlich nichts dran auszusezten. Trotzdem denke ich, dass der Berechnungsweg nicht gerade der einfachste ist. Meiner Meinung nach ist folgender Weg einfacher: 19 °C - 317 ADC 100 °C - 400 ADC Daraus ergeben sich die Geradengleichungen: 19 = 317 * k + d 100 = 400 * k + d Jetzt zieht man einfach die erste Gleichung von der zweiten ab: 100 - 19 = (400 * k + d) - (317 * k + d) Löst man die Klammern auf, ergibt sich: 100 - 19 = 400 * k + d - 317 * k - d Das ergibt: 81 = 83 * k Also ist k = 81 / 83 = 0,9759 Um d zu berechnen, k einfach in eine der beiden Formeln einsetzen: 19 = 317 * 0,9759 + d Also ist d = 19 - 317 * 0,9759 = -290,36 Für beliebige Messwerte ergibt sich damit folgende Rechenvorschrift: gemessenene Werte: T1 - ADC1 T2 - ADC2 k = (T2 - T1) / (ADC2 - ADC1) d = T1 - k * ADC1 = T2 - k * ADC2 Ich hoffe, dass dir das ganze vielleicht die Rechnung ein wenig erleichtert
> Meiner Meinung nach ist folgender Weg einfacher...
Danke!!!! Ist echt VIEL einfacher und schneller! :))))
> Nun musst du aber schon einen sehr guten ADC Aufbau haben, damit
dir der ADC nicht durch Rauschen +/- 1 oder +/- 2 ausgibt.
Leider wirkt sich aber ein ADC Fehler von +/- 2 bei dir schon
als fast ein ganzes Grad aus.
Ja, das verstehe ich ja auch...
als ich den einfachen PTC mit dem KTY81-110 ersetzt habe, habe ich
schon gesehen, dass der ADC wert sich nicht so breit verändert!
Widerstand anders dimensioniert.. > das selbe ergebniss...
Kann man das irgendwie anpassen?
damit sich der ADC wenigstens um 500 ändert??
Sonst ich das ja echt so, dass adc wert von 1 schon 1°C ausmacht.. und
das ist schon tatsächlich VIEL zu ungenau... leider!
Es ist ein Genuss die Beiträge von Karl Heinz Buchegger zu lesen. Sie sind fachlich kompetent und lesefreundlich geschrieben, im Gegensatz zum abgewrackten Deutsch von Thomas(22:13).
Hallo! Thomas, wer bist du? blos das selbe problem habe ich auch! :) baust du das auch? Wie weit bist du schon? Karl Heinz Buchegger ist echt spitze! :) danke! Wenn jemand dem Thomas eine Antwort gibt, hilft mir auch weiter! :)
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.