Temperaturmessung mit DS18B20 und Dimmung der LCD Hintergrund-LED

Hi Micha,
na die 20 Km zu dir, kann er doch mit dem Fahrrad fahren , :D oder

Gruß micha
 
hehe, frag ihn doch mal...
 
Hallo,

ja, Ihr scheint recht nahe beieinander zu wohnen: Hannover, Schaumburger Land und ich sitze in Duisburg, ca. 300 km entfernt von Euch - sehr schade. Aber vllt. ergibt sich ja trotzdem mal eine Möglichkeit, sich persönlich kennen zu lernen. :D

Kennt Ihr Euch aus dem Großraum Hannover persönlich?

Schöne Grüße

Robin
 
Hi Robin,

Kennt Ihr Euch aus dem Großraum Hannover persönlich?
teilweise ...

Grandpa <-> Cassio (schon mal getroffen)
Grandpa <-> Dino (auch schon mal getroffen)
Grandpa <-> Dino <-> Cassio (3er Treffen demnächst ;) )

Ich hab auch schon mal dran gedacht, wenn man ne Woche Urlaub macht
(so im südlichen Deutschland) und dann auf der Hinfahrt ein Treffen mit
Dirk/maik und auf der Rückfahrt mit Markus/Knickohr (oder so ähnlich).

Gemütliches Zusammensitzen mit Bierchen und ein wenig rumlabern :D

mal sehen was sich da im nächsten Jahr so ergibt ;) und wofür man ein
wenig Zeit hat ...

Gruß
Dino
 
Hallo Cassio,

mit diesem von Dir gekennzeichneten Bereich des Programms hatte ich vor, die Error-Abfrage zu gestalten: If Err = 0 , ist der Sensor ok, erfolgt eine 1, dann sind der Sensor, die Zuleitung zum Sensor oder Steckverbinder nicht in Ordnung. Falls ein Fehler auftritt, sollte er auf dem Display angezeigt werden. Dabei traten noch Fehler auf. Aus diesem Grund hatte ich es erst einmal zurückgestellt. Lt. Datenblatt, so ich mich recht erinnere, ist das möglich und macht nach meiner Auffassung auch irgendwo Sinn.

Die Schleife For I = 1 to 8 stammt noch aus der Zeit, als das Programm erst die Temp. eines Sensors anzeigen konnte. Runde 50 Prozent zeigte mir Bascom an, würde dieses Programm an Speicherplatz verschlingen. Da wollte ich natürlich wissen, ob ich überhaupt 2 Sensoren an einem mega8 betreiben kann und hatte dann schrittweise mehr Sensoren "eingearbeitet", bis zur Anzahl von 9 Sensoren, dann ist aber Schluss, 99 Prozent des Speichers sind dann belegt. Ich hätte dies wohl entfernen können, aber weil ich noch daran
weiterarbeiten wollte, hatte ich's erst einmal zur Erinnerung stehen gelassen.

Ja, Cassio, Dein Angebot, das Programm blockweise umbauen zu wollen, nehme ich natürlich dankend an!:) :)

Schöne Grüße

Robin
 
Hi dino,

guter Vorschlag!

Wenn's zeitlich irgendwie machbar ist und sich der Kreis noch um eine "Nase" erweitern lässt, wäre ich gerne dabei.

Schöne Grüße
Robin
 
Hi Robin,

"Kreis erweitern" ist gut. Von mir aus gern. Die Entfernung ist dabei natürlich ein klein wenig hinderlich. Doch mal sehen, was sich nächstes Jahr so ergibt; da stimme ich Dino zu.


Grüsse,

Michael
 
Hi Micha,

klar, da hatte ich Dich gestern doch glatt vergessen. Nimmste mir hoffentlich nicht übel. Doch für mehr AVR'ler ist in meinem Rennbahnkeller nun wirklich kein Platz mehr...:rolleyes:


Grüsse,

Michael
 
yip.......:)
 
Hallo,

bevor sich der "Feiertagsgedanke" noch weiter manifestiert, noch mal ein technischer Tipp für all diejenigen, die mit kleineren Softwarelösungen Ihre Projekte angehen:) . Es gibt die prof. Version von Target 3001 kostenlos als (fast) voll nutzbare Version und umfasst:


* Platinen-Layout
* Simulation
* Schaltplan
* Autoplacer
* Autorouter
* EMV-Analyse

Kleiner Haken: Es können nur Gerber -Dateien an einen einzigen Platinenhersteller "weitergegeben" werden. Aber für den Hausgebrauch, ausdrucken etc., alles möglich. Wer's noch nicht kennt, guckst Du hier:

http://www.pcb-pool.com/ppde/service_downloads.html

Schöne Grüße

Robin
 
Hi Robin,

danke für den Hinweis, aber ich habe mir grad sPlan 7.0 zugelegt; damit komme ich hervorragend zurecht. Das Layout gestalte ich weiterhin mit einem alten DOS- Programm, dem 3DStudio R4. Das Rendern des Layouts damit ist nur durch Plattenplatz begrenzt :D , z. Zt. reichen mir aber 600dpi, mehr gibt mein Laserjet nicht her....


Grüsse,

Michael
 
Hallo Cassio,

wenn Du Zeit und Lust zum Umbau des Programms hast, kannst Du ja eine kurze Info einstellen. Nochmals Dank für Dein Angebot!:)

Schöne Grüße

Robin
 
Hallo,

da Cassio sich schon einige Tage nicht mehr gemeldet hatte gehe ich mal davon aus, dass er in warmen Gefilden am Pool liegend, seinen wohl verdienten Urlaub genießt:) .

In der Zwischenzeit hatte ich mal versucht, das beigefügte Programm um die Funktion eines Fototransistors zu erweitern. Mit dem Fototransistor möchte ich bei abgedunkeltem Raum die Helligkeit der Display-Hintergrundbeleuchtung deutlich absenken.

Außer erheblicher Fehlermeldungen beim Compilieren meiner Versuche kam da nichts Sinnvolles bei heraus. Ich hatte es mit Int1 versucht, mit Gosub oder mit Goto, alles half nicht weiter. Hat vielleicht jemand einen Tipp, der mir helfen könnte?:stupido3: Besten Dank schon mal im Voraus:flowers:

Code:
 $regfile = "m8def.dat"
$crystal = 1000000

Dim Hell As Word
Dim An As Word
Dim Aus As Word
Dim Pressed As Word
Dim Neu As Word
Dim Heller As Word
Dim Pwm As Word
Dim Dunkler As Word
Dim Standby As Word

' Festlegen der Starthelligkeit beim Antippen des Tasters
' 0=Dunkel, 255=Hell
Const Starthelligkeit = 254

Config Portb.1 = Output
Config Portd.1 = Output
Config Portd.0 = Input
Config Portd.2 = Input

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1

Compare1a = 255 : Portd.0 = 1
An = 0 : Neu = 0 : Pwm = 255

Hell = 255 - Starthelligkeit
Dunkler = Hell
If Dunkler = 0 Then Dunkler = 255
On Int0 Int0_isr
Config Int0 = Low Level
Enable Int0
Enable Interrupts

Entry:
Do
  Portd.1 = 0
  If Pind.0 = 0 Then
    Incr Pressed : Waitms 1 : Neu = Heller
  End If
  If Pwm = 0 Then Heller = 0
  If Pwm = 255 Then Heller = 1
  If Pressed > 250 Then
    If Heller = 0 Then Incr Pwm Else Decr Pwm
    Waitms 30
  End If
  If Pind.0 = 1 And Pressed > 0 And Pressed < 250 Then
    If Pressed < 50 Then
      If Pwm = 0 Then
        Do
          Incr Pwm : Compare1a = Pwm : Waitms 5
          Pressed = 0 : Neu = 1 : An = 1
        Loop Until Pwm = Dunkler Or Pind.0 = 0
      Else
        Do
          Decr Pwm : Compare1a = Pwm : Waitms 5
          Pressed = 0 : Neu = 0 : An = 1
        Loop Until Pwm = 0 Or Pind.0 = 0
      End If
    Elseif An = 1 Then
      Do
        Incr Pwm : Compare1a = Pwm : Waitms 5
        Pressed = 0 : Neu = 1 : An = 0
      Loop Until Pwm = 255 Or Pind.0 = 0
    Else
      Do
        Decr Pwm : Compare1a = Pwm : Waitms 5
        Pressed = 0 : Neu = 0 : An = 1
      Loop Until Pwm = Hell Or Pind.0 = 0
    End If
    If Pind.0 = 0 Then Pressed = 250
  Elseif Pressed > 0 And Pind.0 = 1 Then
    If Neu = 1 Then Heller = 0
    If Neu = 0 Then Heller = 1
    Pressed = 0 : Waitms 100
  End If
  If Pwm = 255 Then An = 0 Else If Aus > 5 Then An = 1
  Incr Aus : Compare1a = Pwm
  If Pwm = 255 Then Incr Standby Else Standby = 0
Loop Until Standby > 100
Standby = 0
Portd.1 = 1
Mcucr = Mcucr And &B10101111
Mcucr = Mcucr Or &B10100000
sleep
Goto Entry
End

Int0_isr:
  nop
Return
 

Anhänge

  • File0001.PDF
    44,6 KB · Aufrufe: 7
Hallo Robin!

Leider liege ich nicht im Süden am Pool.... owohl ich es mir ja verdient hätte! ;)

Sorry, aber momentan habe ich einfach nicht die Zeit mich darum zu kümmern.....
Auf Grund der vielen Feiertage hat man an den verbleibenden Werktagen irgendwie doppelt so viel zu erledigen.... und das trotz Urlaub! :eek:

Mir scheint aber, dass du die Funktion des Interrupt falsch vertstanden hast!
Wenn du den externen Int0 oder Int1 nutzen möchtest musst du ihn im Rumpf konfigurieren und dann springt der µC innerhalb der eingestellten Zeit immer von allein in die Subroutine!
Beispiel:
Code:
' Konfiguriere Timer1
Config Timer1 = Timer , Prescale = 256

On Timer1 Int1_sub
Enable Timer1

Dem Beispiel nach, springt der µC nach dem Überlauf des Timer1 in die Subroutine: Int1_sub
Ohne dass du dich darum weiter kümmern musst.


Du kannst den externen Interrupt aber auch so einstellen, dass er NUR bei einer steigenden, oder fallenden Flanke kurz in die Subroutine wechselt.
Beispiel:
Code:
Config Int0 = Rising
On Int0 Int0_sub

Enable Int0
Diesem Beispiel nach wird die Subroutine: Int0_sub nur dann ausgeführt, wenn du eine steigende Flanke am INT0 hast.


Mit beiden Methoden könntest du deinen Displaydimmer realisieren.

Ich würde z.B. die "Überlaufmethode" nehmen..... sie ist wesentlicher einfacher, weil du nicht zwei Flanken am INT auswerten musst!

So prüft der µC also ständig, ob dein Garagenlicht ein- oder ausgeschaltet ist und steuert dann deinen Ausgang für die Hintergrundbeleuchtung.


Spiel mal ein wenig mit den Möglichkeiten der externen Interrupts herum... ggf. auch separat und nicht in deinem bisherigen Programm.
Wenn dir die Funktionen dann vertraut sind, bau es in dein Programm mit ein. :)

Ich versuche mal, in den nächsten Tagen hier wieder öfter online zu sein.... aberversprechen kann ich nichts.

Schöne Grüße,
Cassio
 
Hallo Cassio,

schade, dass Du nicht im Süden an einem Pool liegen kannst, aber, für die Leute, für die das Jahresende und dessen Abschlussfeierlichkeiten immer so völlig unverhofft eintreffen, für die gibt's eine adäquate Strafe - Zeitmangel zur rechten Zeit!;) Ich gehöre ständig zu diesem Kreis Menschen, daher hatte ich auch jetzt erstmals wieder in diesen "Fred" geschaut.:)

Vielen Dank für Deine Tipps, doch hast Du mit Deiner Annahme recht, dass ich bei den Interrupts irgend etwas nicht verdaut habe. So sehe ich nicht ein, weshalb Du den Int0 noch verwenden willst, obwohl er vom "Hauptprogramm" schon genutzt wird. So würde ich auch den 0->1 Wechsel (hell - dunkel - Wechsel) als auch den 1 -> 0-Wechsel (dunkel - hell) auswerten wollen. Aber die Änderung zwischen krabbeln und aufrechtem Gehen ist halt etwas schwierig, macht die Sache aber um so interessanter!:)

Ich werde mich mal weiter versuchen.

Sollten wir uns vor den Festtagen nicht mehr hier treffen, wünsche Dir, Cassio sowie Grandpa, Dino,Dirk, Neuuser, Markus, bluelight electronic und natürlich auch allen anderen Usern des Forums erholsame Tage im Kreise der Lieben und der lieben Vielbeiner, die von Atmel in alle Welt versandt werden, um uns Freude, aber auch Grübeleien zu bescheren!:) :)
 
Hallo Robin!

Danke, für die Wünsche zu den Festtagen! :)


Meine oben gemachten Beispiele sollten einfach nur als Erkläung zu den Interrupt-Config-Möglichkeiten dienen.
Sie haben also nicht unmittelbar etwas mit deinem Programmcode zu tun!

Dann wünsch ich nun auch schon mal schöne Weihnachtstage und wenn das Kaffeetinken mit diversen Zweibeinern der Familie zu langweilig wird, können wir ja alle auf die Vielbeiner von Atmel zurück greifen. :D

Schöne Grüße,
Cassio
 
Hallo,

frohes Neues, die Feiertage sind vorbei und der Reiz des Grübelns lockt wieder.:confused:

Ich hatte versucht, mit Int1 irgendwie in den eigentlichen Programmablauf einzugreifen, um beim Sperren des Fototransistors die Hintergrundbeleuchtung auf den Wert 100 zu bringen; ohne jeden Erfolg:eek: . Nun habe ich dieses Programm erst einmal zur Seite gelegt und mich wieder der Temperaturmessung zugewandt, um dort die letzte Version vom Ablauf her zu verbessern. Bascom zeigt mir keine Fehler an, doch mit dieser Version messe ich nun wirre Temps, dir zudem noch negativ sind.:rolleyes: Ich hatte nur das Sub-Programm in die Hauptschleife übernommen. Was ist falsch daran?



CodeBox Bascom
$regfile "m8def.dat"
$crystal = 1000000
$hwstack = 82
$framesize = 68
$swstack = 68
'


Initlcd
Cursor Off



Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32

Cls

Config Lcdpin = Pin , Rs = Portc.5 , E = Portc.4 , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0
Config Lcd = 16 * 4
Config Lcdbus = 4
Config Portd.7 = Output
Config Portd.6 = Output
Config Portd.5 = Output
Config Portb.0 = Output
Config Portb.2 = Input
Config 1wire = Portb.2


Dim X As Byte
Dim Celsius As Integer

Dim T(2) As Single
Dim Ar1(2) As Single '1. 1wire
Dim Ar2(2) As Single '2. 1wire

Dim Mini(2) As Single 'minimaler Temperaturwert
Dim Maxi(2) As Single 'maximaler Temperaturwert

Dim I As Byte
Dim W As Word

Dim Frost As Single 'Variable für den Soll-Abgleich <=1°C
Dim Kalt As Single 'Variable für den Soll-Abgleich >=60°C
Dim Warm As Single 'Variable für den Soll-Abgleich >=70°C

Frost = 22
Kalt = 24
Warm = 27

Mini(1) = 999
Mini(2) = 999

Maxi(1) = 000
Maxi(2) = 000



Dim Sp(12) As Single '12 bit Genauigkeit



W = 1wirecount()
Locate 1 , 1
Lcd "Anzahl nutzbarer"
Locate 2 , 1
Lcd "Sensoren: " ; W 'Anzahl der Themperatursensoren werden angezeigt
Wait 3
Cls




Do

If Err = 0 Then
Ar1(1) = 1wsearchfirst() 'Sensorabfrage
For I = 1 To 8
Next

End If


If Err = 0 Then 'Sensorabfrage
Ar2(1) = 1wsearchnext()
End If
For I = 1 To 8
' beliebig erweiterbar


1wreset
1wwrite &HCC
1wwrite &H44

Waitms 300


Sp(1) = 1wread(12) '12-bit Genauigkeit

Wait 1


If Err = 0 Then
1wverify Ar1(1)
1wwrite &HBE
Sp(1) = 1wread(12)
For I = 1 To 12

Next


Celsius = Makeint(sp(1) , Sp(2))
Celsius = Celsius * 10
Celsius = Celsius / 16

T(1) = Celsius
T(1) = T(1) / 10


If T(1) < Frost Then
Portd.7 = 1
Else
Portd.7 = 0
End If


Lcd T(1)
Locate 1 , 1
Lcd "Aussen: " ; Fusing(t(1) , "#.#") ; Chr(0) ; "C "

If Mini(1) > T(1) Then Mini(1) = T(1)
If Maxi(1) < T(1) Then Maxi(1) = T(1)


Locate 3 , 1
Lcd "Min: " ; Fusing(mini(1) , "#.#") ; Chr(0) ; "C "

Locate 4 , 1
Lcd "Max: " ; Fusing(maxi(1) , "#.#") ; Chr(0) ; "C "


1wreset

Wait 5


If W >= 2 Then
1wverify Ar2(1)

1wwrite &HBE

Sp(1) = 1wread(12)



For I = 1 To 8

Next


Celsius = Makeint(sp(1) , Sp(2))
Celsius = Celsius * 10
Celsius = Celsius / 16
Print Celsius
T(2) = Celsius
T(2) = T(2) / 10

If T(2) > Kalt Then
Portd.6 = 1
Else
Portd.6 = 0
End If

If T(2) > Warm Then
Portd.5 = 1
Else
Portd.5 = 0
End If



Lcd T(2)
Locate 1 , 1
Lcd "Innen: " ; Fusing(t(2) , "#.#") ; Chr(0) ; "C "

If Mini(2) > T(2) Then Mini(2) = T(2)
If Maxi(2) < T(2) Then Maxi(2) = T(2)
Locate 3 , 1
Lcd "Min: " ; Fusing(mini(2) , "#.#") ; Chr(0) ; "C "
Locate 4 , 1
Lcd "Max: " ; Fusing(maxi(2) , "#.#") ; Chr(0) ; "C "



End If
1wreset

Wait 5

Next

End If




Return

Loop
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)