Guten Tag So ich wollte mit meinen Atmel mega 8 ein paar Temp werte erfassen und diese auf dem LCD ausgeben. ich habe dazu 2 - 3 Fragen. Frage 1: ist ein PT 100 besser als ein KTY ? Frage 2: wie realesire ich das mit dem Mega 8 das ich ein AD eingang nehmen muß ist soweit klar aber wie linearesire ich und wie scallire ich den und gebe den auf den LCD aus ich wollte das in C oder Assambler machen. Frage 3 oder sollte ich direckt den https://www.distrelec.com/distrelec/datasheets.nsf/WebAttachments/471AB81E27A257EAC12571B900467357/$File/LM75_e.pdf nehmen? ist das besser und Billiger? Ich danke erstmal Mumpitz p.s. die schaltung die ich angehängt habe kommt von der Seite http://www.sprut.de/
Was willst Du denn genau (woran) messen? Mal "PT100" in Google eingeben und den ersten (und zweiten) Treffer anklicken und lesen. Vorteil einer PT100/PT1000 (letzerer ist besser) gegenüber einem KTY ist die annähernd lineare Widerstandskennline und die Wiederholgenauigekeit beim Einsatz verschiedener Sensoren des gleichen Typs (auch wenn man den Sensor mal auswechselt, braucht ggf nichts neu angeglichen werden). @LM75, was besser, billiger? Kommt drauf an, was Du willst. Preise kannst Du sicherlich selber rausfinden und damit entscheiden, was billiger ist. Wenn Du einen Tauchsensor mit Temperaturen > 200°C hast, ist der LM75 (und jeder andere Siliziumsensor) ungeeignet. @Linearisierung: a. Lookup-Tabelle mit Zwischenwertinterpolation (schnell). b. Anwenden der umgestellten Formel der Widerstandskennline. Also aus dem Widerstand die Temperatur berechnen (erfordert eventuell viele Berechnungen). c. Linearisierung mittels Opamps/Spezial-IC Auch hier kommt es drauf an, was Du willst (Messgenauigkeit).
Hallo Thx erstmal Ich wollte eigentlich nur Raumpenperaturen Messen. Aber um später noch leistung frei zu haben wollte ich eigentlich so wenig Software wie möglich schreiben.(ich muss sowieso noch schauen wie ich das schreibe fange greade erst damit an :) ) Der LM 75 ist für knapp 5 Euro schon zu bekommen da ist er aber schon auf einer kleinen Platiene drauf (das ist besser weil es SMD Technik ist). Ein KTY oder PT kostet schon so 2-4 Euro ... Gibt es einen Assambler Quode den ich mir anschauen kann wie die Auswertung des Signales und die Ausgabe auf ein LCD geht? Sage schon mal THX. Mumpitz
Wenn das Dein Einstiegsprojekt in die AVR-Controllerfamilie ist und Du vielleicht sogar bisher nichts oder sehr wenig in Assembler gemacht hast, empfehle ich Dir als Programmiersprache entweder C (WinAVR/AVR-Studio; kostenlos erhältlich, gut ausgereift, kein Ärger über Demoversionen mit eingeschränktem Leistungsumfang) oder Bascom (Compiler-Basic; viele spezielle Routinen z.B. für Ansteuerung eines LCD bereits integriert. Einstieg relativ schnell möglich; Demoversion mit Beschränkung auf 4kB Codegröße frei erhältlich, Vollversion kostet jedoch etwa 90 Euro, und die Sprache ist im Vergleich zu C etwas unflexibler). Als Temperatursensoren für Raumtemperaturmessung würde ich solche verwenden, die direkt eine der Temperatur proportionale Gleichspannung liefern, z.B. LM35, LM335 o.ä. Es gibt verschiedene Varianten mit unterschiedlicher Genauigkeit. Man sollte diese Sensoren direkt an die Analogeingänge des Mega8 anschließen können - für PT100 braucht man einen vorgeschalteten Verstärker. Die lineare Kennlinie erspart einem die Arbeit mit Tabellen und Interpolation. Viel Erfolg!
@ Nix hallo und guten Morgen. Erstmal danke für die Antwort das Problem mit dem LM 35 ist das die Kabellänge nicht so hoch werden darf den wenn ich greade mal 25 C° bei 3,5 V habe dann habe ich nach 5 Metern nichts mehr zum messen :( Zu Assambler ich habe mal in der Abendschule einen 8085 mit Assambler beschrieben und auch gelernt, deswegen wollte ich bei dieser "Sprache" bleiben. Ein Buch zu C habe ich mir schon gekauft aber mir fehlt da irgentwie der einstig (Moderne C-Prorammierung). Ein paar Sachen sind in C einfach einfacher als in Assambler und deswegen habe ich damals schon darüber nachgedacht... Das beste ist das ich mir das HOWTO c von dieser Seite mal anschaue. Programmiren tuhe ich im moment mit SISY AVR das war dabei und geht eigentlich ganz gut.Soll angeblich auch C und C++ können. Schauen wir mal was passirt, habe jetzt etwas zeit mich damit zu beschäftigen. Sage erstmal Danke Mumpitz
So ich habe nochmal nachgeschaut und mit dem SISY helper wollte ich was erstellen aber ich bekomme bei dem Kompeliren den Fehler Kompiliere die Datei unbenannt.cc. unbenannt.cc:24: error: expected unqualified-id before '{' token Ende. der Quode Lautet
1 | //-------------------------------------------------------------------------
|
2 | // Titel :
|
3 | //-------------------------------------------------------------------------
|
4 | // Funktion :
|
5 | // Schaltung :
|
6 | //-------------------------------------------------------------------------
|
7 | // Prozessor : ATmega8
|
8 | // Takt : 3686400 Hz
|
9 | // Sprache : C
|
10 | // Datum : 12.10.2009
|
11 | // Version : 1.0
|
12 | // Autor :
|
13 | // Programmer:
|
14 | // Port :
|
15 | //-------------------------------------------------------------------------
|
16 | // created by myAVR-CodeWizard
|
17 | //-------------------------------------------------------------------------
|
18 | //
|
19 | #define F_CPU 3686400
|
20 | #include <avr\io.h> |
21 | #include <util\delay.h> |
22 | |
23 | //---------------------------------------------------------------------------
|
24 | void waitMs(int miliSec) |
25 | {
|
26 | _delay_loop_2( 1*(F_CPU/(1000/4)) * miliSec); // 4 Zyklen warteschleife |
27 | }
|
28 | //////////////////////////////////////////////////////////////////////////////
|
29 | // LCD-Funktionen für myAVR-Board + myAVR-LCD
|
30 | // 4-BitModus an PortD Bit 4-7
|
31 | // PortD Bit 2 = RS, high=Daten, low=Kommando
|
32 | // PortD Bit 3 = E, high-Impuls für gültige Daten
|
33 | //---------------------------------------------------------------------------
|
34 | // lcdSend(..) - sendet ein Byte an LCD im 4-Bit-Modus
|
35 | // RS muss vorher richtig gesetzt sein
|
36 | // PE: data=zu sendendes Byte
|
37 | //---------------------------------------------------------------------------
|
38 | void lcdSend(char data) |
39 | {
|
40 | // aktuelles RS ermitteln
|
41 | char rs=PORTD; |
42 | rs&=4; |
43 | // High-Teil senden
|
44 | char tmp=data; |
45 | tmp&=0xf0; |
46 | tmp|=rs; |
47 | PORTD=tmp; |
48 | // Schreibsignal
|
49 | sbi(PORTD,3); |
50 | cbi(PORTD,3); |
51 | // Low-Teil senden
|
52 | tmp=data; |
53 | tmp&=0x0f; |
54 | tmp*=16; |
55 | tmp|=rs; |
56 | PORTD=tmp; |
57 | // Schreibsignal
|
58 | sbi(PORTD,3); |
59 | cbi(PORTD,3); |
60 | // verarbeiten lassen
|
61 | waitMs(1); |
62 | }
|
63 | //---------------------------------------------------------------------------
|
64 | // lcdCmd(..) - sendet ein Kommando an LCD
|
65 | // PE: cmd=Kommando-Byte
|
66 | //---------------------------------------------------------------------------
|
67 | void lcdCmd(char cmd) |
68 | {
|
69 | cbi(PORTD,2); // RS löschen = Kommando |
70 | lcdSend(cmd); // senden |
71 | }
|
72 | //---------------------------------------------------------------------------
|
73 | // lcd_write(..) - sendet ein Zeichen (Daten) an LCD
|
74 | // PE: text=Zeichen
|
75 | //---------------------------------------------------------------------------
|
76 | void lcdWrite(char text) |
77 | {
|
78 | sbi(PORTD,2); // RS setzen = Daten |
79 | lcdSend(text); // senden |
80 | }
|
81 | //---------------------------------------------------------------------------
|
82 | // lcdWrite(..) - sendet eine Zeichenkette an LCD
|
83 | // Die Zeichenkette muss mit 0x00 abgeschlossen sein
|
84 | // PE: pText=Zeiger auf Zeichenkette
|
85 | //---------------------------------------------------------------------------
|
86 | void lcdWrite(char* pText) |
87 | {
|
88 | while(pText[0]!=0) |
89 | {
|
90 | lcdWrite(pText[0]); |
91 | pText++; |
92 | }
|
93 | }
|
94 | //---------------------------------------------------------------------------
|
95 | // lcdClear(..) - löscht die Anzeige im LCD
|
96 | //---------------------------------------------------------------------------
|
97 | void lcdClear() |
98 | {
|
99 | lcdCmd(0x01); |
100 | waitMs(2); // warten |
101 | }
|
102 | //---------------------------------------------------------------------------
|
103 | // lcdOn(..) - schaltet das LCD an
|
104 | //---------------------------------------------------------------------------
|
105 | void lcdOn() |
106 | {
|
107 | lcdCmd(0x0E); |
108 | }
|
109 | //---------------------------------------------------------------------------
|
110 | void waitUs(int mikroSec) |
111 | {
|
112 | _delay_loop_2( 1*(F_CPU/(1000000/4)) * mikroSec); // 4 Zyklen warteschleife |
113 | }
|
114 | //---------------------------------------------------------------------------
|
115 | // lcdInit(..) - Schaltet die Ports und Initialisiert das LCD
|
116 | //---------------------------------------------------------------------------
|
117 | void lcdInit() |
118 | {
|
119 | // Port D = Ausgang
|
120 | DDRD=0xff; |
121 | PORTD=0; |
122 | // warten bist LCD-Controller gebootet
|
123 | waitMs(50); |
124 | // SOFT-RESET
|
125 | PORTD = 0x30; //0b00110000; |
126 | sbi(PORTD,3); |
127 | cbi(PORTD,3); |
128 | waitMs(5); |
129 | PORTD = 0x30; //0b00110000; |
130 | sbi(PORTD,3); |
131 | cbi(PORTD,3); |
132 | waitUs(100); |
133 | PORTD = 0x30; //0b00110000; |
134 | sbi(PORTD,3); |
135 | cbi(PORTD,3); |
136 | waitMs(5); |
137 | |
138 | // 4-BitModus einschalten
|
139 | PORTD=0x20; |
140 | // Schreibsignal
|
141 | sbi(PORTD,3); |
142 | cbi(PORTD,3); |
143 | waitMs(5); |
144 | |
145 | // ab hier im 4-Bit-Modus
|
146 | lcdCmd(0x28); // Funktions-Set: 2 Zeilen, 5x7 Matrix, 4 Bit |
147 | lcdCmd(0x06); // Entry Mode |
148 | lcdOn(); |
149 | lcdClear(); |
150 | }
|
151 | //---------------------------------------------------------------------------
|
152 | // lcdWrite(..) - sendet eine Zeichenkette an LCD
|
153 | // PE: pText=Zeiger auf Zeichenkette
|
154 | // count=Anzahl der zu sendenden Zeichen
|
155 | //---------------------------------------------------------------------------
|
156 | void lcdWrite(char* pText, int count) |
157 | {
|
158 | while(count!=0) |
159 | {
|
160 | lcdWrite(pText[0]); |
161 | pText++; |
162 | count--; |
163 | }
|
164 | }
|
165 | //----------------------------------------------------------------------
|
166 | // Titel : C-Funktion Zeichenkette senden.
|
167 | //----------------------------------------------------------------------
|
168 | // Funktion : ...
|
169 | // IN : char *buffer, Zeichenkette mit NUll abgeschlossen
|
170 | // OUT : ...
|
171 | //----------------------------------------------------------------------
|
172 | void lcdString(char *buffer) |
173 | {
|
174 | for (int i=0; buffer[i] !=0;i++) |
175 | lcdWrite (buffer[i]); |
176 | }
|
177 | //---------------------------------------------------------------------------
|
178 | // lcdOff(..) - schaltet das LCD aus
|
179 | //---------------------------------------------------------------------------
|
180 | void lcdOff() |
181 | {
|
182 | lcdCmd(0x08); |
183 | }
|
184 | //------------------------------------------------------------------------
|
185 | // Initialisierungen
|
186 | //------------------------------------------------------------------------
|
187 | void init() |
188 | {
|
189 | lcdInit(); |
190 | lcdWrite('H'); |
191 | lcdWrite('a'); |
192 | lcdWrite('l'); |
193 | lcdWrite('l'); |
194 | lcdWrite('o'); |
195 | }
|
196 | |
197 | /////////////////////////////////////////////////////////////////////////////
|
198 | // Main-Funktion
|
199 | /////////////////////////////////////////////////////////////////////////////
|
200 | main() |
201 | {
|
202 | init(); // Initialisierungen |
203 | while (true) // Mainloop-Begin |
204 | {
|
205 | //...
|
206 | } // Mainloop-Ende |
207 | }
|
208 | //---------------------------------------------------------------------------
|
ich bedanke mich schonmal
> main() Ist das so erlaubt (als Definition)? (Besonders in C++) Probier mal >> void main(void) ps.: Du könntest: a) deinen Code auf ein Minimum reduzieren b) deinen Code anhängen c) die Zeile aus der Fehlermeldung markieren hth, Jörg
OK thx Ich mache das jetzt etwas anders werde klein anfangen und den Quode nach und nach aufbauen. Die Grundbefehle zum ansprechen der Ports bleiben ja gleich nur das drumherum ist anders :) das werde ich mal nach und nach schauen. ich betrachte jetzt die sache als erledigt. mumpitz
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.