Forum: Mikrocontroller und Digitale Elektronik LCD ansteuerung mit Atmega8


von G. M. (knut89)


Lesenswert?

Moin ,

Hätte da mal kurz eine Frage und zwar möchte ich eine Digitale 
temperaturregelnde Lüftersteuerung mit LCD-Display Bauen.

Ich verwende einen LM235 zum Messen  der Temperatur die Spg wandle ich 
über den AD Wandler des Atmega8 um nun möchte ich aber auf dem LCD die 
Temp. ausgeben und muss das ganze wieder um Wandeln.

Wie sag ich der LCD anzeige sie soll den Inhalt der Variablen A aus 
geben.

Schon mal vor ab danke für etwaige Hilfe

Gruß Knut

von XXX (Gast)


Lesenswert?

Hallo

Wie gibst du denn bisher etwas auf das LCD aus??
Da wird doch bestimmt auch eine Variable dabei sein.

Gruß
Joachim

von G. M. (knut89)


Lesenswert?

mh nein arbeite mit BASCOM im moment gebe ich nur schrift aus.
hier das programm

$regfile = "m48def.dat"
$crystal = 4000000
$baud = 19200

$hwstack = 32

$swstack = 10

$framesize = 40



'
Ddrd = &B01111110
Ddrc = &B00000000
Ddrb = &B11111111
Admux = &B11000000

Adcsra = &B11100010

Portd = &B11111101
Portc = &B11111100
Portb = &B11111111
Mcucr = &B00001110

Sreg.7 = 1

'Config Lcdpin = Pin, Db0 = Portb.0   Db1 = Portb.1 Db2 = Portb.2, Db3 = 
Portb.3,   Db4 = Portb.4,   Db5 = Portb.5, Db6 = Portb.6,  Db7 = 
Portb.7,  E = Portd.6 , Rs = Portd.5 ,

Config Lcdpin = Pin , Port = Portb , E = Portd.6 , Rs = Portd.5

Dim Lb As Word
Dim Hb As Word
Dim A As Word
Dim B As Word
Dim C As Word
Dim D As Word



Config Lcd = 20 * 4






  Cls

  Lcd "Willkomen"
   Waitms 500
   Cls



    If A > 601 Then
      Portd.1 = 1

         Elseif A < 586 Then
            Portd.1 = 0


    Waitms 1


    End If

     Do

von pacer (Gast)


Lesenswert?

Wenn du in Bascom programmierst, schau doch mal im Roboternetz.de - 
Forum vorbei.

von G. M. (knut89)


Lesenswert?

seh grad da fehlt ja die hälfte



     Do

   Hb = Adch.0
   Lb = Adcl.0
   Hb = Hb And &B00000011
   Hb = Hb * 256
   A = Lb + Hb



   Udr = A

    A = B
   D = &B100100101 / &B00001010

   C = B / D





    Cls
    Locate 3 , 1 : Lcd "Kuehlagregat"
    Locate 4 , 12 : Lcd C
     Waitms 500
    Loop

    End
gibts Kühlagregat
                0 _
aus

von XXX (Gast)


Lesenswert?

Hallo

Kenne BASCOM nicht, aber ziemlich weit unten in deinem Programm
gibst du mit Lcd C eine Variable C aus. Dann sollte doch
mit Lcd A die Variable A ausgegeben werden.

Gruß
Joachim

von Willkomen (Gast)


Lesenswert?

> gibts Kühlagregat
>                0 _

Diese Ausgabe ist korrekt für das Programm (bessere formatoerung, und 
Anmerkungen s.u.). Zuvor muss noch für 0,5s ein "Willkomen" sichtbar 
gewesen sein.
1
$regfile = "m48def.dat"
2
$crystal = 4000000
3
$baud = 19200
4
$hwstack = 32
5
$swstack = 10
6
$framesize = 40
7
8
' ### Initialisierungen ###
9
Ddrd = &B01111110
10
Ddrc = &B00000000
11
Ddrb = &B11111111
12
Admux = &B11000000
13
Adcsra = &B11100010
14
Portd = &B11111101
15
Portc = &B11111100
16
Portb = &B11111111
17
Mcucr = &B00001110
18
Sreg.7 = 1
19
20
Config Lcdpin = Pin , Port = Portb , E = Portd.6 , Rs = Portd.5
21
22
Dim Lb As Word
23
Dim Hb As Word
24
Dim A As Word
25
Dim B As Word
26
Dim C As Word
27
Dim D As Word
28
29
Config Lcd = 20 * 4
30
31
' ### Hauptprogramm ###
32
Cls
33
Lcd "Willkomen"
34
Waitms 500
35
Cls
36
37
If A > 601 Then      ' ### A = 0 ###
38
  Portd.1 = 1
39
Elseif A < 586 Then
40
  Portd.1 = 0
41
  Waitms 1
42
End If
43
44
Do
45
  Hb = Adch.0
46
  Lb = Adcl.0
47
  Hb = Hb And &B00000011
48
  Hb = Hb * 256
49
  A = Lb + Hb
50
  Udr = A
51
  A = B             ' ### B=0 => A=0 ###
52
  D = &B100100101 / &B00001010
53
  C = B / D         ' ### B=0 => C=0 ###
54
  Cls
55
  Locate 3 , 1 : Lcd "Kuehlagregat" 
56
  Locate 4 , 12 : Lcd C
57
  Waitms 500
58
Loop
59
End

von G. M. (knut89)


Lesenswert?

so hier nur das LCD programm griege Für A immer 771 aus gegeben ob wohl 
das ein tempfühler ist den ich erhitzt habe

$regfile = "m48def.dat"
$crystal = 4000000
$baud = 19200

$hwstack = 32

$swstack = 10

$framesize = 40



'
Ddrd = &B01111110
Ddrc = &B00000000
Ddrb = &B11111111
Admux = &B11000000

Adcsra = &B11100010

Portd = &B11111101
Portc = &B11111100
Portb = &B11111111
Mcucr = &B00001110

Sreg.7 = 1

'Config Lcdpin = Pin, Db0 = Portb.0   Db1 = Portb.1 Db2 = Portb.2, Db3 = 
Portb.3,   Db4 = Portb.4,   Db5 = Portb.5, Db6 = Portb.6,  Db7 = 
Portb.7,  E = Portd.6 , Rs = Portd.5 ,

Config Lcdpin = Pin , Port = Portb , E = Portd.6 , Rs = Portd.5

Dim Lb As Word
Dim Hb As Word
Dim A As Word
Dim B As Word
Dim C As Word
Dim D As Word



Config Lcd = 20 * 4






  Cls

  Lcd "Willkomen"
   Waitms 500
   Cls






  Do
 Hb = Adch
   Lb = Adcl
   Lb = Lb And &B00000011
   Lb = Lb * 256
   A = Lb + Hb

   C = A / 38





    Cls
    Locate 3 , 1 : Lcd "Kuehlagregat"
    Locate 4 , 12 : Lcd A
     Waitms 50




    Loop

    End


Also LCD zeigt immer 771 an egal ob ich mit dem LM135 erhitze oder nicht

von Seltsam (Gast)


Lesenswert?

Ich bin zu faul die Bits aufzudröseln:
Admux = &B11000000
Adcsra = &B11100010

Admux
Vielleicht ist der LM135 (oder LM235?) falsch an deinen Atmega8 
angeschlossen.

Adcsra
Wie betreibst du den ADC: freerunning oder single conversion? Welchen 
Takt bzw. Prescaler gibst du dem ADC? Wenn single conversion, dann sehe 
ich nicht, wie du nach der ersten Messung die nächste Messung anstößst. 
ich sehe auch nicht wie du wartest, bis der ADC mit der Wandlung fertig 
ist.

von snowfly (Gast)


Lesenswert?

Also in der Hilfe (F1) stehe Sachen wie diese.

Config Adc = Single , Prescaler = Auto
'Now give power to the chip
Start Adc
[...]
W = Getadc(channel)

von G. M. (knut89)


Lesenswert?

@aeltsam

ADmux = &B11000000 `internereferenz von 2,56V benutzen

ADCSRA = &B11100010  'BIT7 ADC an bit6 start bit5 Freilaufend bit2+1+0 
adcclock = avrclock/4

dachte damit wüsste der atmega alles was erwissen muss

von Seltsam (Gast)


Lesenswert?

>  Hb = Adch
>  Lb = Adcl

"ADCL must be read first, then ADCH."

> ADmux = &B11000000 `internereferenz von 2,56V benutzen

Und der Sensor muss an ADC0 angeschlossen sein (MUX3..0 = 0000)

> $crystal = 4000000
> ADCSRA = &B11100010
> => adcclock = avrclock/4

Prescaler 32 wäre passender (125 kHz statt 1 MHz).

"By default, the successive approximation circuitry requires an input 
clock frequency between 50 kHz and 200 kHz to get maximum resolution. If 
a lower resolution than 10 bits is needed, the input clock frequency to 
the ADC can be higher than 200 kHz to get a higher sample rate."

von G. M. (knut89)


Lesenswert?

so jetzt Klappts nur ändert sich der Faktor D und das ist nicht 
berücksichtigt so das nicht die richtige temp aus gegeben wird je höher 
die Temp dest Kleiner wird der Faktor und zwar um 5 % das heist D * 0,95 
wie setzt ich das im program um


$regfile = "m8def.dat"
$crystal = 4000000
$baud = 19200

$hwstack = 32

$swstack = 10

$framesize = 40



'
Ddrd = &B01111110
Ddrc = &B00000000
Ddrb = &B11111111
Admux = &B11000000

Adcsra = &B11100010

Portd = &B11111101
Portc = &B11111100
Portb = &B11111111
Mcucr = &B00001110

Sreg.7 = 1

'Config Lcdpin = Pin, Db0 = Portb.0   Db1 = Portb.1 Db2 = Portb.2, Db3 = 
Portb.3,   Db4 = Portb.4,   Db5 = Portb.5, Db6 = Portb.6,  Db7 = 
Portb.7,  E = Portd.6 , Rs = Portd.5 ,

Config Lcdpin = Pin , Port = Portb , E = Portd.6 , Rs = Portd.5

Dim Lb As Word
Dim Hb As Word
Dim A As Word
Dim B As Word
Dim C As Word
Dim D As Word



Config Lcd = 20 * 4
D = 30
  Do
  Lb = Adcl
  Hb = Adch

  Hb = Hb And &B00000011
  Hb = Hb * 256
  A = Lb + Hb


  B = A



  C = B / D

  Cls

  Lcd "Willkomen"
   Waitms 500













    Cls
    Locate 2 , 1 : Lcd "Kuehlagregat"
    Locate 3 , 12 : Lcd C
    Locate 4 , 12 : Lcd B
     Waitms 500




    Loop

    End

von Seltsam (Gast)


Lesenswert?

> 5%

Das verstehe ich nicht bzw. bezweifele das, wenn ich mir das Datenblatt 
des Sensors ansehe.

von G. M. (knut89)


Lesenswert?

was meinst du das es was ausgibt ?? ich wandle den wer der an ADC0 
anliegt um in einen binären Wert um en ich dan wie man sieht im Programm 
über den Faktor in die Grad zahl umwandle nur muss ich diesen Faktor 
ändern und die Gradanzeige genau zu machen.

von Seltsam (Gast)


Lesenswert?

Der Sensor gibt eine Spannung aus. Und zwar 10 mV pro Grad Kelvin ab 
absolutem Nullpunkt.

Den Sensor kann man ohne Kalibrierung anschliessen und mit Kalibrierung. 
Für die Kalibrierung braucht man ein 10K Potentiometer plus ein 
kalibriertes Voltmeter plus ein kalibriertes Thermometer.

Bei 25 °C erwarte ich in etwa 2,982 V vom kalibrierten Sensor :-) Bei 
Aref=5V (wobei die Frage ist, wie genau die sind!) und 10-Bit ADC ist 
der erwartete ADC Wert 610.

Mache ich dann eine Messung und bekomme den Wert adcwert = 610 rechne 
ich den in Grad Kelvin ab dem Nullpunkt um:
1
gradkelvin  = (adcwert * 5 * 1000/10) / 1024

Die Umrechnung Grad Kelvin in Grad Celcius ist eine einfache Rechnung.
1
gradcelcius = gradkelvin - 273.15

von Seltsam (Gast)


Lesenswert?

Da in der ADC Messung Integerwerte benutzt werden und Nachkommastellen 
wegfallen, ist das Ergebnis nicht exakt 25 °C.

von Seltsam (Gast)


Lesenswert?

Deine magischen D = 30 verstehe ich nicht

>>> ADmux = &B11000000 `internereferenz von 2,56V benutzen

Die interne Referenz würde ich nur bei Temperaturen kälter -17,2 °C 
benutzen. Sonst ist beim kalibrierten Sensor der Messwert aus dem ADC 
Messbereich raus.

von G. M. (knut89)


Lesenswert?

Hallo also die Spg des LM halbiere ich über einen spg teiler zwei 10k 
das heißt ich habe bei 25° eine spg von 1,491 V und meine interne Vref 
ist 2,6 V
dauert ein bisschen bis er da aus dem Messbereich drausen ist.

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.