Digitale Temperatur regelnde Lüftersteuerung mit einstellbaren Hysteresewerten

Hallo Knut!

Ich weiß jetzt nicht, warum du die Null immer vorne hast? :hmmmm:
Lass dir noch mal "K" ausgeben..... und schreib für beide Drehrichtungen die Reihenfolge der Zahlen auf!

Es kann eigentlich nicht sein, dass die "Null" in Ruhestellung ausgegeben wird.

BIST DU DIR GANZ SICHER?


Ich habe den Code mal etwas leserlicher gestaltet und die NULL bei "Encoder" wieder eingefügt.
Damit bleibt dein Programm nicht stehen, wenn der Encoder nicht gedreht wird!

Testweise kannst du ja mal "IF K = 3" verwenden".....
Code:
$regfile = "m8def.dat" 
$crystal = 16000000 

$framesize = 32 
$swstack = 32 
$hwstack = 64 

Ddrd = &B111_00_011 
Portd = &B000_11_100 

Ddrb = &B11111111 
Portb = &B00000000 

Config Lcdpin = Pin , Port = Portb , E = Portd.6 , Rs = Portd.5 
Config Lcd = 20 * 4 



Dim K As Byte

Dim Z As Byte
Z = 127

cls

Do

K = Encoder(pind.2 , Pind.3 , Runter , Rauf , [B][COLOR="Red"]0[/COLOR][/B] )

Locate 1 , 1 : Lcd Z

Loop


Rauf:
If K = 3 Then Incr Z
Return


Runter:
If K = 3 Then Decr Z
Return

End


Gruß,
Cassio
 
Hallo Knut!

Das erleichtert mich! ;)

Dann funktioniert es also mit der Null!
Fein, dann hätten wir das auch geklärt.


Hat der Drehencoder auch zufällig einen Drucktaster mit eingebaut?
Wenn das so sein sollte, dann kannst du ja jetzt mal versuchen die beiden Programme (von gestern und heute) in ein NEUES Programm zu schreiben.

Also....
Standardanzeige (irgendwas)

Wenn der Drucktaster betätigt wird, springt das Programm in eine Subroutine (Menue), das LCD zeigt dir das auch an und gleichzeitig wird der aktuelle "Z"-Wert mit angegeben.
Durch drehen (links & rechts) kannst du den Wert nun verändern.

Wenn du dann wieder auf den Drucktaster drückst, verlässt dein Programm die Subroutine (Menue) und befindet sich wieder in der Hauptschleife (LCD zeigt wieder die Standardanzeige).


Kleiner Tipp am Rande dazu....
"Bitwait var , Set/Reset" ;)

Bis später....
Cassio
 
Hi,

@ dino03:
Also muss ich meine Werte 0 1 3 2 immer mit sich selbst und verknüpfen um etwas genaues ohne Fehler auszugeben.

Vergiss den Hinweis von Dino erst mal...... :rolleyes:
DU musst gar nichts verknüpfen..... du hast BASCOM. ;)
Genau !
Ich glaube nicht das du ne State-Machine für die Verarbeitung der Zustände
des Encoders programmieren willst :rolleyes: Das ist in Bascom beim Befehl
"Encoder" unter der Haube. Das war nur ne zusätzliche Info die ich gegeben
habe. Also den Bascom-Befehl nehmen und entspannen :D

Ich hab das mal in Assembler selber gebaut ... hat glaube ich so 1-2 Tage
Gehirnakrobatik gebraucht. Läuft aber sehr stabil und zuverlässig.

Gruß
Dino
 
so ich weiß nicht schön aber es funktioniert bis auf das ich nicht rückwärts zählen kann da dann irgend wie nach der null die 255 komm ja ich weiß wegen des einen Minus was da vorsteht und das mit dem Taster funktioniert auch nur in den Moment in dem der Befehl auch an der reihe ist denke ich.
Code:
Dim Flag_lc As Byte
Dim Layout As Byte
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Byte
Dim Z As Byte
Dim K As Byte
Taster Alias Pind.4
 Z = 0
  D = 0
 C = 3
 A = 60
 B = 20

 Do
  If Taster = 0 Then
   Toggle Layout
   Flag_lc = 0
   Else

   End If
   If Layout = 0 Then

     Gosub Lcdanzeige

     Else
     Gosub Menue
     End If
     Loop





  Lcdanzeige:
  If Flag_lc = 0 Then
  Cls
  Locate 1 , 1 : Lcd "Kühlagregat"

  Locate 2 , 1 : Lcd "Kühlhaus"

  Locate 3 , 1 : Lcd "Obere Temp."

  Locate 4 , 1 : Lcd "Untere Temp."
     Flag_lc = 1
     End If

     Bitwait Taster , Set


     Return
     Menue:

If Flag_lc = 0 Then

    Cls
   Locate 1 , 1 : Lcd Z
   Locate 2 , 1 : Lcd "Temp. max."

   Locate 3 , 1 : Lcd "Temp. min."

   Locate 4 , 1 : Lcd "Abbrechen "
   End If
   Flag_lc = 1





  K = Encoder(pind.2 , Pind.3 , Rauf , Runter , 0)
   Bitwait Taster , Set
  Return
  Rauf:
  If K = 0 Then
  Decr Z

  End If
   If Z < D Then
   Z = 3
   End If
   Locate 1 , 1 : Lcd Z
  Return
  Runter:
  If K = 0 Then
  Incr Z
  End If
  If Z > C Then
  Z = 0
  End If
  Locate 1,1 : Lcd Z
  Return
 End
 
Brauch ja aber nur 3 Menue punkte also
If Z = 0 then
Z = 3
end if
also keine 255
 
das da irgendwwann 255 kommt is doch logisch , den ein byte kann nur 255zustände annehmen,
und wenn dann da z.B. steht 254 +2, dann springts wieder um auf 1,
bei 0-1 gehts auch automatisch wieder auf 254
 
so ich weiß nicht schön aber es funktioniert bis auf ......


Hallo Knut!

Nee nee..... das zählt nicht! :cool:


Entweder funktioniert das Programm fehlerfrei.... oder nicht! ;)


Tja und zum Thema "nicht schön".....
Da solltest du unbedingt noch mal Hand anlegen.
Da bekommt man ja Augenkrebs oder schlimmeres.

Je strukturierter dein Programm ist, je einfacher kann man sich hinein versetzen, mitdenken und auch Fehler finden.


Also.....
noch mal bitte! :)

Grüße,
Cassio
 
Hi,

Tja und zum Thema "nicht schön".....
Da solltest du unbedingt noch mal Hand anlegen.
Da bekommt man ja Augenkrebs oder schlimmeres.

Je strukturierter dein Programm ist, je einfacher kann man sich hinein versetzen, mitdenken und auch Fehler finden.
wofür gibt es eigentlich dieses Kommentarzeichen bei BASCOM mit dem man
so schöne viele Informationen in den Programmcode einfügen kann ? :rolleyes:
Nach ein bis zwei Wochen nicht mehr angesehen kann man das Programm auch
komplett neu schreiben weil man nicht mehr weiß wofür welche Zeile gut war ...

Gruß
Dino
 
so als ich habe jetzt einen Standard Bildschirm den ich mit Taster druck verlasse ( manchmal mehrfacher druck nötig )
und dann in ein Menue Komme in dem ich mit dem Drehen des Encoders die Variable Z verändern kann ( 1 , 2 oder 3 zuweisen ) mit erneuten tasten druck komme ich wieder zurück zu meinem standard Bildschirm.
Code:
$regfile = "m8def.dat"
$crystal = 16000000
$framesize = 32
$swstack = 32
$hwstack = 64

Ddrd = &B11100011
Portd = &B00011100

Ddrb = &B11111111
Portb = &B00000000

Config Lcdpin = Pin , Port = Portb , E = Portd.6 , Rs = Portd.5
 Config Lcd = 20 * 4
Dim Flag_lc As Byte                                         ' Lcd flag damit die LCD Anzeige nicht mit Daten Überschüttet wird
Dim Layout As Byte                                          'Layout für sprung ins Menue
Dim Z As Byte                                               ' Variable zum Zählen mit encoder
Dim K As Byte                                               ' Variable k für den encoder
Taster Alias Pind.4                                         ' Taster Alias damit nicht immer PIND.4 Geschrieben werden muss
 Z = 0                                                      ' Der Variablen Z einen Werd zuweisen

Do

  If Taster = 0 Then                                        ' ist der Taster betätigt ?
                                       ' Ja dann setze  Layout auf null oder eins abhänig davon welchen wert es vorher hatte.
   Toggle Layout

   Flag_lc = 0                                              ' Setze Flag LC auf 0


  End If

   If Layout = 0 Then                                       ' ist die LCD schon Beschrieben?

     Gosub Lcdanzeige                                       ' Nein Springe zur Routine LCDanzeige

     Else

     Gosub Menue                                            ' ja dan springe in menue

   End If

Loop





  Lcdanzeige:

  If Flag_lc = 0 Then
                                                     ' Standart Bildschirm festlegen
  Cls

  Locate 1 , 1 : Lcd "Kühlagregat"

  Locate 2 , 1 : Lcd "Kühlhaus"

  Locate 3 , 1 : Lcd "Obere Temp."

  Locate 4 , 1 : Lcd "Untere Temp."
                                                  ' festlegung Lcd ist schon beschrieben
     Flag_lc = 1

     End If

     Bitwait Taster , Set
                                                 ' darauf warten das taster wieder betätigt wird

     Return


     Menue:

If Flag_lc = 0 Then                                         ' festlegen des menues

    Cls
   Locate 1 , 1 : Lcd Z

   Locate 2 , 1 : Lcd "Temp. max."

   Locate 3 , 1 : Lcd "Temp. min."

   Locate 4 , 1 : Lcd "Abbrechen "

   End If

   Flag_lc = 1                                              ' festlegung Lcd ist schon beschrieben





   Bitwait Taster , Set                                     ' darauf warten das taster wieder betätigt wird

  K = Encoder(pind.2 , Pind.3 , Runter , Rauf , 0)          ' Encoder seine routinen zuweisen

  Return

  Runter:                                                   ' Routine Z runter zählen

  If K = 0 Then                                             ' ist K = 0  ?

  Decr Z                                                    ' Ja dann Z = Z - 1

  End If

   If Z = 0 Then                                            ' ist z = 0 ?

   Z = 3                                                    'ja dann Z = 3

   End If

   Locate 1 , 1 : Lcd Z                                     ' zeige Z auf der Lcd an

  Return

  Rauf:                                                     ' Routine Z rauf zählen

  If K = 0 Then                                             ' ist K = 0  ?

  Incr Z                                                    ' Ja dann Z = Z + 1

  End If

  If Z > 3 Then                                             ' ist z = 3 ?

  Z = 1                                                     'ja dann Z = 1

  End If

  Locate 1 , 1 : Lcd Z                                     ' zeige Z auf der Lcd an

  Return




End
 
ist das so besser ??
jetzt kann ich dann doch die Variable Z da zu benutzen bei tasten druck in bestimmte Menüpunkte zu springen um dort die werte zu verstellen oder ?
 
Hallo Knut!

Fein..... dass du schon weiter gemacht hast. :)


Mir ist vorhin erst eine Sache aufgefallen die recht schwerwiegend ist......
und so auch gar nicht sein kann. :eek:

Du verwendest immer:
$regfile = "m8def.dat"
$crystal = 16000000
$framesize = 32
$swstack = 32
$hwstack = 64


Da du einen Mega8 benutzt und dein LCD im 8bit-Mode am PortB hängt, sind deine Pins für den externen Quarz doch schon belegt.
Aus dem Grunde kann es auch nicht sein, dass du mit 16MHz arbeitest!

Der Mega8 kann intern maximal 8MHz und darum musst du.....
  1. die FUSES des Cotrollers überprüfen (und ggf. auf 8MHz ändern)
  2. die Anweisung im Programm ändern auf $crystal = 8000000

Danach können wir weiter machen!



Als nächstes werden wir uns dann aber nicht um das Menü kümmern sondern um die automatische Abfrage des Drehencoders. ;)


Melde dich, wenn du die Angelegenheit mit dem Systemtakt erledigt hast!

Grüße,
Cassio
 
Hallo,

Da du einen Mega8 benutzt und dein LCD im 8bit-Mode am PortB hängt, sind deine Pins für den externen Quarz doch schon belegt.
Aus dem Grunde kann es auch nicht sein, dass du mit 16MHz arbeitest!

Der Mega8 kann intern maximal 8MHz und darum musst du.....
  1. die FUSES des Cotrollers überprüfen (und ggf. auf 8MHz ändern)
  2. die Anweisung im Programm ändern auf $crystal = 8000000
aber AUFPASSEN !! => 8MHz INTERNER RC-OSZILLATOR !! Sonst
erwartet der Atmel nen Quarz an den Pins wo grade dein Display dranhängt
und du kommst nicht mehr so ohne weiteres mit dem ISP-Progger an den
Controller dran.

Gruß
Dino
 
Hallo Knut!

Stimmt natürlich, das Dino da noch mal drauf hinweist!


Ich habe mal ein Snapshot von den FUSES gemacht:
ATMega8-FUSES-8MHz.gif


Kannst das ja mal mit deinen Einstellungen abgleichen!
Fusebit KLA987 = 000100 : Int. RC Osc. 8MHz

Gruß,
Cassio
 
Hallo Knut !

Ich habe mir überlegt, dass ich dein Projekt bis zu einem gewissen Grad "mit bastel".
Von daher wäre es einfacher, wenn wir uns an bestimmte "Vorgaben" halten.
Das Wichtigste dabei sind die Namen für Variablen, Konstanten und Subroutinen!

Da ich schon mal etwas vor gearbeitet habe ;) , stelle ich das derzeitige Programm hier mal als Basis ein.


CodeBox bascom


$regfile = "m8def.dat"
$crystal = 8000000

$framesize = 32
$swstack = 32
$hwstack = 64


'Aus- und Eingänge bestimmen
Ddrd = &B111_000_10
Portd = &B000_111_01
'PD0 = Eingang
'PD1 = Ausgang
'PD2 = Encoder
'PD3 = Encoder
'PD4 = Taster-Encoder
'PD5 = LCD-RS
'PD6 = LCD-E


Ddrb = &B1111_1111
Portb = &B0000_0000
'PB0 bis PB7 = LCD 8bit


'LCD konfigurieren (8bit)----------------------------------
Config Lcdpin = Pin , Port = Portb , E = Portd.6 , Rs = Portd.5
'LCD-Typ angeben
Config Lcd = 20 * 4
Cursor Off
Cls


'**********************************************************
Dim De As Byte 'DrehEncoder
Dim Z As Byte 'Encoder-Zähler

'LCD_flag dient dazu, die Daten nur einmal zum LCD zu senden
Dim Lcd_flag As Bit

'Anzeige_flag sorgt für den Wechsel der Anzeige (Standard oder Menü)
Dim Anzeige_flag As Bit

'Aliasnamen, z.B. für den Taster, um nicht immer PIND.3 schreiben zu müssen
Taster Alias Pind.4
BL Alias Portd.1 'Reserve Ausgang
Ein Alias 0 'EIN
Aus Alias 1 'AUS


'**********************************************************
' ----Systemstart----
'**********************************************************
'Hier kommen dann alle Einstellungen rein, die zum ersten Start wichtig sind!
BL = Ein
Z = 0 'Zähler auf NULL


'**********************************************************
' ----Hauptschleife----
'**********************************************************
Do

If Taster = 0 Then 'Taster abfragen
Toggle Anzeige_flag 'Anzeige wechseln (Standard <-> Menü)
Lcd_flag = 0 'LCD_Flag auf Null, damit es auch einmal angezeigt wird
Else
De = Encoder(pind.2 , Pind.3 , Rauf , Runter , 0)
End If



If Anzeige_flag = 0 Then 'Anzeige_flag auswerten
Gosub Layout 'gehe zur Standardanzeige
Else
Gosub Menue 'gehe zur Menüanzeige
End If


Loop
'**********************************************************



'**********************************************************
' ----Subroutinen----
'**********************************************************

'LCD Standardanzeige------------------------------------------------------------
Layout:
If Lcd_flag = 0 Then 'wurde das LCD schon mal aktualisiert?
Locate 1 , 1 : Lcd "Zeile 1 "
Locate 2 , 1 : Lcd "Zeile 2 "
Locate 3 , 1 : Lcd "Zeile 3 "
Locate 4 , 1 : Lcd "Zeile 4 "
Lcd_flag = 1 'LCD wurde einmal aktualisiert
Bitwait Taster , Set 'warten ob der Taster losgelassen wurde
Else
End If

Return

'Sub für Taster-----------------------------------------------------------------
Menue:
If Lcd_flag = 0 Then 'wurde das LCD schon mal aktualisiert?
Locate 1 , 1 : Lcd "Menue-Zeile 1 "
Locate 2 , 1 : Lcd "Menue-Zeile 2 "
Locate 3 , 1 : Lcd "Menue-Zeile 3 "
Locate 4 , 1 : Lcd "Menue-Zeile 4 "
Lcd_flag = 1 'LCD wurde einmal aktualisiert
Bitwait Taster , Set 'warten ob der Taster losgelassen wurde
Else
End If

Return


'Encoder-Sub----------------------------------------
Rauf:
If De = 0 Then Incr Z
Return

'Encoder-Sub----------------------------------------
Runter:
If De = 0 Then Decr Z
Return
'**********************************************************

End 'end program



Wenn es für dich OK ist, dass ich mit mache, dann nehmen wir ab jetzt nur noch dies als Ausgangsbasis.
Ich möchte dich auch eindringlich bitten, die Programmstruktur (mit Kommentaren) exakt so beizubehalten!

Grüße,
Cassio
 
Ich hätte ein quasi Fertiges Teil... (Prototyp, arbeitet bereits seit 2 Monaten in meinem Rechner)
6 Kanal
PWM 2 Voltage, bis ca. 100W pro Kanal (also reichlich Lüfter je Kanal LOL)
240x128 TouchGLCD
Mega128
6x DS18S20 in 0.1°C Auflösung
3 Punkt Regelung
einstellbares Regelintervall 5s- 240s
einstellbare Mindestdrehzahl
Abschalttemp > bei unterschreiten
Targettemp > versucht er zu halten
Maxtemp > Alarm > bei Überschreiten PC abschalten (noch nicht verwirklicht)

das ganze im Moment auf 3 Platinen a 100mmx75mm


bin aber bereits an der nächsten Version, die bekommt einen XMega A3

entweder Color TFT 320x240 oder GLCD 400x320 auf jeden Fall Touch
mit USB Unterstützung
Minimaldrehzahl wird Automatisch ermittelt (Lüfterstart)
Drehzahl wird Life ermittelt und angezeigt
vielleicht einen RGB Ausgang für RGBLEDs
Piezo Alarm
etc.
und das ganze auf 2 Platinen 100mmx75mm
 

Anhänge

  • HLLSglcdsmall.jpg
    HLLSglcdsmall.jpg
    155,8 KB · Aufrufe: 39
  • Foto0078small.jpg
    Foto0078small.jpg
    221,4 KB · Aufrufe: 34
Ich hätte ein quasi Fertiges Teil...


Hallo sBronco!

Super! Sieht recht gelungen aus.....
mal vom Fronteinbau abgesehen. ;)


Ich weiß jetzt aber nicht, wie dein Beitrag dem Knut helfen könnte? :hmmmm:


Wenn du deine Arbeit vorstellen und dokumentieren möchtest, dann eröffne doch einen neuen Thread im Projekte Bereich.
Ich könnte mir vorstellen, dass es für einige User ganz interessant sein würde.

Grüße,
Cassio
 
@Cassio: stimmt, helfen tats nicht.
Deshalb hier meine Subs zum DS auslesen:
Code:
'##################################################
SUB DSRESET
    For n = 0 to 5
        1wreset PinA , n
        1wwrite &HCC , 1 , PinA , n
        1wwrite &H44 , 1 , PinA , n
    Next
   Flag.0 = 1
End Sub
'##################################################
SUB DSREAD
    For n = 0 to 5
        1wreset PinA , n
        1wwrite &HCC , 1 , PinA , n
        1wwrite &HBE , 1 , PinA , n
        DsData(1) = 1wread(9 , PinA , n )
        1wreset PinA , n
        ch = n + 1
        TempA = DsData(1) And 1
        If TempA = 1 Then Decr DsData(1)
        TempA = Makeint(DsData(1) , DsData(2))
        TempA = TempA * 50
        TempA = TempA - 25
         TempB = DsData(8) - DsData(7)
         TempB = TempB * 100
         TempB = TempB / DsData(8)
            TempA = TempA + TempB
            Currenttemp(ch) = TempA / 10
            'If ch = 7 then Locate 16 , 5 : LCD Currenttemp(ch) ; "  "
            If Currenttemp(ch) < 6000 then
              Active.ch = 1
            else
                Active.ch = 0
                TempA = SensorLast(ch) - 20
                TempB = SensorLast(ch) + 20
                If SensorLast(ch) > 0 then
                    If Currenttemp(ch) < TempA OR Currenttemp(ch) > TempB then Currenttemp(ch) = SensorLast(ch)
                else
                    SensorLast(ch) = Currenttemp(ch)
                End If
      End If
      next
End Sub

Sub Dsreset wird alle 5sec aufgerufen, Sub Dsread 500ms später wenn Flag.0 = 1

Die letzten paar Zeilen (Das If ... then... else..) ist drin, weil ab und an falsche Werte ausgelesen werden, zu kurzes Delay vermutlich.

EDIT: 1Wire, hin oder her, ich habe meine Sensoren jeweils einzeln an einem Pin.
Pins habe ich genug (TQFP64), und ich spare mir viel Code, fest verdrahtet weiß der µC immer welchen Sensor er anspricht.
1Wire benötigt eine DS- Suchroutine, Kanalzuweisung, Löschen und/ oder Neuzuweisung, ungeachtet des Problems, ob ich jetzt auch wirklich den DS erwischt habe den ich haben wollte.




Der Fronteinbau war schnell und schlecht, ist aber nur der Prototyp.
In meinem neuen HAF sieht das ein bischen besser aus, das Display ist aber viel zu groß, es belegt 3x 5 1/4" Schächte, will da nur 2 Opfern deshalb gibts ein anderes Display, sobald es aus Amiland da ist.
 

Anhänge

  • HLLSinHAFl.jpg
    HLLSinHAFl.jpg
    153,5 KB · Aufrufe: 27
@Cassio: stimmt, helfen tats nicht.
Deshalb hier meine Subs zum DS auslesen:

Hallo!

Tja, aber leider kann er das auch nicht gebrauchen, da der Knut (sollte er sich hier jemals wieder melden) mit dem ADC die Temperaturen ermitteln möchte. ;)
Ich halte das zwar auch nicht für eine gute Lösung, aber es ist ja nur ein Schulprojekt.

Außerdem finde ich es auch nicht wirklich hilfreich wenn er nun einen Brocken Programmcode bekommt, aber letztlich keine Ahnung davon hat. :cool:
Er möchte es doch bestimmt verstehen und außerdem muss er die Funktionsweise doch erklären können.



Falls der Knut hier noch mal reinschauen sollte.....
Ich hatte ja schon mal etwas vorgearbeitet. ;)
Wie angedacht, wird alles mit nur einem Drehencoder bedient......
Hier mal ein paar Eindrücke dazu:
DSCF1161.JPG DSCF1162.JPG

DSCF1164.JPG DSCF1166.JPG


Wenn aber in laufe der Woche hier nichts mehr passiert, dann demontiere ich den Testaufbau und das Thema hat sich für mich erledigt.

Grüße,
Cassio
 

Ü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)