Digitale Temperatur regelnde Lüftersteuerung mit einstellbaren Hysteresewerten

Hallo Knut!

Nun ja, so ganz zufrieden bin ich damit noch nicht. ;)


Das "Declare Sub Taster" muss drin bleiben, so lange du "Sub Taster" und "End Sub" verwendest.

Das "Sub" vor Taster und das "End Sub" muss weg und zur Definiton der Routine müssen Doppelpunkte dahinter.

Also so....
Code:
Taster:
Locate 1 , 10 : Lcd "Hallo" 
Locate 2 , 10 : Lcd "Hallo" 
Locate 3 , 10 : Lcd "Hallo" 
Locate 4 , 10 : Lcd "Hallo" 
Return

Das ist schon alles! :)



Wie aber oben schon geschrieben......
So ganz gefällt mir das noch nicht.
Es tritt noch ein Effekt auf, den du scheinbar noch nicht bemerkt hast. ;)

Aus dem Grunde würde ich noch nicht weiter machen sondern dein jetziges Programm noch etwas überarbeiten.


Schauen wir mal in die Hauptschleife....
Dort überwachst du einen Taster und wenn der gedrückt wird, soll das LCD etwas anderes anzeigen.
Damit dies aber nur einmal geschieht, musst du noch eine Überwachung einbauen.

Nun kommt das "Problem"........ wie lange soll die Meldung denn angeziegt werden, bevor wieder die "Standardwerte" angezeigt werden?

Etwa so lange wie der Taster gedrückt wurde, oder bis der selbe Taster noch einmal betätigt wurde?


Grüße,
Cassio
 
ja das setzte ich doch Config debounce = X
Code:
Config Debounce = 500
Um hatte ich vergessen ein zu Fügen mir ist jetzt nur nicht ganz Klar wie ich das mit der Menü Führung um setzte wenn ich in der Taster sub routine noch ein mal Debounce benutze klappt das nicht zu mindestens nicht bei mir
Code:
 Cls
 Locate 1 , 1 : Lcd "Hallo"
 Locate 2 , 1 : Lcd "Hallo"
 Locate 3 , 1 : Lcd "Hallo"
 Locate 4 , 1 : Lcd "Hallo"
 A = 0

 Debounce Pind.4 , 0 , Menu1 , Sub

 Return

  Menu1:
  Cls
  Locate 1 , 1 : Lcd "Menue 1"
   Return

Hast du eine Beispiel Menü Führung da die ich mir mal anschauen könnte ? Hab keine Idee wie ich das umsetzen kann.
 
ja das setzte ich doch Config debounce = X


Hallo Knut!


Code:
Config Debounce = 500

Autsch! :p


DAS ist mit Sicherheit nicht die Lösung!
Dann kannst du auch ein "Waitms 500" eintragen! ;)

Vielleicht solltest du dich mal vom "Debounce" komplett lösen!
Oder liegt dir das genauso am Herzen wie die 8bit-Ansteuerung deines LCD`s? :cool:

Ich denke auch, dass wie hier ohne Beispiele nicht weit kommen.
Dafür ist zum Einen so ein Forum zu "träge" und zum Anderen fehlt dir einfach noch zu viel Basiswissen.


Ich lasse mir mal etwas einfallen......
kann aber ein bisschen dauern. Also nicht in den nächsten fünf Minuten einen Beipiel-Code erwarten. ;)


Gruß,
Cassio
 
Mittlerweile Glaub ich das ich mich ein bisschen übernommen habe mit dem Projekt.:confused:
Find es Echt super wie ihr mir trotz meiner unwissenheit helft.
 
Hallo Knut!

So, nun hier mal ein Beispiel von mir, wie ich das gemeint habe. ;)
Kommentare habe ich ins Programm gestellt.
Wenn sonst noch Fragen sind..... einfach melden.



CodeBox bascom

$regfile = "m8def.dat"
$crystal = 16000000
$framesize = 32
$swstack = 32
$hwstack = 64


'Hast du eine RS232-Verbindzung zum PC, oder warum stellst du die Baudrate ein?
$baud = 38400


'Aus- und Eingänge bestimmen
Ddrd = &B1111_0110
Portd = &B0000_1001
'PD1 = RxD
'PD2 = TxD
'PD3 = Taster
'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


'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 für den Taster, um nicht immer PIND.3 schreiben zu müssen
Taster Alias Pind.3


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

If Taster = 0 Then 'Taster abfragen
Print ".............Taster gedrückt" 'Printausgabe
Toggle Anzeige_flag 'Anzeige wechseln (Standard <-> Menü)
Lcd_flag = 0 'LCD_Flag auf Null, damit es auch einmal angezeigt wird
Else
End If





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


Loop
'**********************************************************
' ----Hauptschleife----
'**********************************************************




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

'LCD Standardanzeige-------------------------------
Lcdanz:
If Lcd_flag = 0 Then 'wurde das LCD schon mal aktualisiert?
Print "Lcdanz ausführen" 'Printausgabe
Locate 1 , 1 : Lcd "1. Zeile "
Locate 2 , 1 : Lcd "2. Zeile "
Locate 3 , 1 : Lcd "3. Zeile "
Locate 4 , 1 : Lcd "4. Zeile "
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?
Print "Menue ausführen" 'Printausgabe
Locate 1 , 10 : Lcd "Hallo"
Locate 2 , 10 : Lcd "Hallo"
Locate 3 , 10 : Lcd "Hallo"
Locate 4 , 10 : Lcd "Hallo"
Lcd_flag = 1 'LCD wurde einmal aktualisiert
Bitwait Taster , Set 'warten ob der Taster losgelassen wurde
Else
End If

Return


End 'end program



Kannst es ja mal aufspielen und ausprobieren!


Hast du wirklich eine serielle Verbindung zum PC mit Terminalprogramm?
Wäre natürlich super.......
Lass dir ruhig mal die "Printausgaben" anzeigen! ;)

Grüße,
Cassio
 
Das Funktioniert leider nicht an dem PC an dem ich Programmiere hab es jetzt raus genommen.
das Programm das du geschrieben hast funzt kann ich jetzt wenn ich den encoder eingefügt habe die Menü Führung so machen das ich die eingestellten werte steuern kann ? Einfach eine Variable die ich mit dem Encoder hoch zähle und dem Bestimmten werten einen Menü Punkt zu weise sehe ich das richtig ?
 
Hallo Knut!

Wenn du an dem PC keine serielle Verbindung hast, dann ist das nicht so schlimm.....
Du kannst die "Print`s" aber ruhig erst mal noch drin lassen.

Du kannst das Programm auch mal im Simulator laufen lassen..... wenn du den ein wenig bedienen kannst.
Allerdings solltest du dann ein "$sim" oben in die erste Zeile schreiben.
Damit wird der Code für den Simulator optimiert.


Im seriellen Terminal hättest du auch nur sehen können, dass die Aktualisierungen des LCD`s wirklich nur einmal getätigt werden. ;)

Wenn du aber überhaupt keine RS232-Verbindung zum PC hast, dann würde ich "$baud = 38400" und die Prints rausnehmen!



Der von mir eingestellte Programmcode war nur ein Beispiel..... und keine wirkliche Basis für dein Programm.
Es ging mir "nur" darum, dass du folgendes dabei lernen kannst:
  • Verwenden von Flags
  • Verwenden von Gosub
  • Verwenden von Aliasnamen
  • getrennte Verarbeitung von Flags und Programmsprüngen (Subs)
  • struckturierter Programmaufbau
  • Einfügen von Kommentaren zur Übersicht
  • und das man mit "Leerzeichen" das Display an bestimmten Stellen "löschen" kann


Grüße,
Cassio
 
okay so weit so gut wie kann ich den Befehl K = Encoder(pind.2 , Pind.3 , Links , Rechts , 0) wird k von dem Encoder hoch gezählt oder wie Funzt der jetzt hab schon eine Idee wie ich das umsetzen könnte nur versteh ich den Encoder nicht.
 
Hallo Knut!

Ich weiß zwar nicht, warum du dich jetzt schon um den Drehencoder kümmern möchtest, aber OK.......


Tja, wie immer wenn man etwas nicht versteht......
man macht sich einen Testaufbau und probiert es aus. ;)
Du hast doch ein LCD.... lass dir die Variable "K" doch mal anzeigen.


Du hattest ja zu Beginn geschrieben, dass du bis Juni mit deiner Aufgabe Zeit hast.....
Ich würde also nun zu Beginn erst mal jedes Element einzeln ausprobieren.

Von mir aus auch den Drehencoder......

Schreib ein neues Programm (neue Datei) in der nur das Display und alles was du für den Drehencoder benötigst, enthalten ist.

Wenn du nicht weißt wie etwas funktioniert, schau auch mal in die Hilfe von BASCOM!
Dort sind immer Programmbeispiele zu den einzelnen Anweisungen enthalten. ;)


Stellle deine Test-Codes hier immer mit ein, damit man deine Versuche und Erfahrungen (und Fragen) ggf. ein wenig nachvollziehen kann.


Viel Spaß erst mal beim Testen....

Grüße,
Cassio
 
hatte die idee das ich das so machen kann
Code:
Menue:

If Lcd_flag = 0 Then                                        'wurde das LCD schon mal aktualisiert?

  Print "Menue ausführen"                                   'Printausgabe

  Locate 1 , 10 : Lcd "Menue"

   Locate 2 , 10 : Lcd "Oberer Temp"

   Locate 3 , 10 : Lcd "Unterer Temp"

   Locate 4 , 10 : Lcd "Abbrechen"

   Lcd_flag = 1

  K = Encoder(pind.2 , Pind.3 , Links , Rechts , 0)         ' LCD wurde einmal aktualisiert

   Bitwait Taster , Set                                     'warten ob der Taster losgelassen wurde

Else

End If

Return
  Rechts:
   B = B + 1
   If B = 0 Then
   Cls
   Locate 2 , 1 : Lcd "Obere Temp."
   End If
   If B = 1 Then
   Cls
   Locate 2 , 1 : Lcd "Untere Temp."

   End If
   If B = 3 Then
   B = 0
     Cls
   Locate 2 , 1 : Lcd "Abbrechen"
   End If
   Bitwait k , Set
   Bitwait Taster , Set
Return
ist noch nicht ganz fertig funktioniert aber noch nicht is das vom ansatz wenigsten ein wenig richtig??
 
..... is das vom ansatz wenigsten ein wenig richtig??


NEIN !




Hallo Knut!

Wie ich schon geschrieben hatte......
Neue (und leere) Datei..... neues Programm!
Nix mit der "zu Gutenberg"-Methode von "Copy`n Paste" !

Schau noch mal in die BASCOM-Hilfe.....
lass dir die Variable "K" auf dem Display ausgeben.....

MEHR ERST MAL NICHT!


Keine "obere Temp"..... nix mit "untere Temp" !


Versuch heraus zu finden WIE der Drehencoder funktioniert!
Dann kommen die Subroutinen "Max" und "Moritz" dran...... oder eben auch "links" und "rechts" genannt.

Grüße,
Cassio
 
Okay andere Ansatz mein Encoder hat 4 verschiedenen Stellungen
00 0
01 1
11 3
10 2
in der Reihenfolge
kann ich nicht eine Tabelle erstellen wenn 00 dann gehe auf punkt 1
wenn 01 dann gehe auf Punkt 2
wenn 11 dann gehe auf Punkt 3
wenn 10 dann gehe auf Punkt 4
also erste stelle ist Portd.2
zweite stelle ist Portd.3
kann ich die Zwei werte in eine Tabelle schreiben in denen dann eine Anweisung steht was zu tun ist ??
 
Hallo Knut!

Fein.... nun hast du heraus gefunden, welche Werte die Variable annehmen kann. ;)

Allerdings sind deine Überlegungen nicht in Ordnung.
Das vom Encoder die Werte 0 - 3 ausgeben werden, habe ich schon mal geschrieben....

Ist dir auch aufgefallen, dass die Werte immer in einer bestimmten Reihenfolge ausgegeben werden?
Welchen Wert hast du z.B. wenn der Encoder nicht gedreht wird?
Dieser kann eigentlich nicht Null sein.... weil die Pullups im AVR aktiviert sind und beide Kontakte im Encoder offen sind.
Also müsste in Ruhestellung immer eine "3" zurück gegeben werden.

Wenn du den Encoder dann drehst, müsste es so aussehen:
Links= 3-1-0-2
Rechts= 3-2-0-1

Wobei die Angabe "Links" und "Rechts" davon abhängt, welchen Draht du an welchen Pin angeschlossen hast. ;)

Tja und wozu benötigt man diese Variable nun?
Erst einmal für gar nichts. ;)
Die Auswertung kommt erst im zweiten Schritt.



Sobald du am Encoder drehst, springt dein Programm in die definierten Subroutinen..... zum Beispiel "Links" und "Rechts"..... oder auch "Hans" und "Wurst".

Versuch doch jetzt mal eine Variable "Z" mit dem Encoder zu verändern......

Beginne mit folgenden Vorgaben:
Code:
Dim Z as Byte

Z = 127

Da Z ein Byte ist, kann es nur Werte von 0 bis 255 annehmen.
Wir setzen den Startwert der Variable im Programm auf 127... also in die Mitte.

Dein Programm soll nun bei jeder Raststellung des Encoders den Wert um EINEN Zähler verändern!
Links drehen soll den Wert verkleinern,
Rechts drehen soll den Wert vergrößern.
(ggf. Drähte an den Pins tauschen)

Die Subroutinen dafür sollen "runter" und "rauf" heißen!
Die Eingänge sind PinD.2 und PinD.3 (ist das OK?)


Was du dafür benötigst hast du bereits zusammen.....
Die Konfig des Encoders..... und vielleicht auch der Einsatz der Variable "K". ;)


Es ist jetzt auch erst einmal egal, ob dein LCD nur einmal die Werte anzeigt oder permanent mit Daten befeuert wird.
Halte dich aber mit "Cls" zurück.... nicht das es nachher "flackert".
Hier geht es jetzt schließlich um den Encoder... und nicht um das Display!


Dann mal ran an die Arbeit! :)
Ich hätte dann als Nächstes gern ein fehlerfreies Programm und den Code dazu.


Gruß,
Cassio


PS: Wenn du gar nicht weiter kommst, dann melde dich.
 
Hi,

Okay andere Ansatz mein Encoder hat 4 verschiedenen Stellungen
00 0
01 1
11 3
10 2
in der Reihenfolge
kann ich nicht eine Tabelle erstellen wenn 00 dann gehe auf punkt 1
wenn 01 dann gehe auf Punkt 2
wenn 11 dann gehe auf Punkt 3
wenn 10 dann gehe auf Punkt 4
Das ist KEIN Binärcode. Encoder arbeiten IMMER im Gray-Code damit sich bei
einer kleinen Drehung immer nur ein Bit verändert. Das hat mit Genauigkeit
der Abtastung und Datenfehlern zu tun. Dafür gibt es extra den Gray-Code.
Lies dir mal bei Wikipedia was darüber durch (als Tip)

Gruß
Dino
 
Also es funzt aller Dings hab ich pro Rasten-Punkt (gefühlt im Finger) 2 werte hoch oder runter und schnell drehen ist auch nicht drin
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 Z As Byte
Dim K As Byte
 Z = 127

 Cls
 Do


  K = Encoder(pind.2 , Pind.3 , Rauf , Runter , 0 )
    Locate 1 , 1 : Lcd Z

  Loop
  Rauf:
  Z = Z + 1
  Return
  Runter:
  Z = Z - 1
  Return


 End
ist das so okay??
 
Also es funzt aller Dings hab ich pro Rasten-Punkt (gefühlt im Finger) 2 werte hoch oder runter und schnell drehen ist auch nicht drin ....

.... ist das so okay??

NEIN! :cool:


Hallo Knut!

Das ist ja der Punkt zum Knobeln an der Stelle. :)



Jetzt kommt nämlich die Variable "K" zum Einsatz! ;)

Was passiert denn, wenn du VOR dem Hoch- bzw. Runterzählen die Variable "K" auf den Wert NULL prüfst?

Ich meine das so:
Code:
If K = 0 Then
......
Else
End if


Du springst also zum Beispiel in die Sub "rauf" und dort wird nicht gleich Z um einen Zähler erhöht sondern erst mal geprüft, ob "K" auch Null ist.
Wenn das so sein sollte, wird "Z" um einen Zähler hinauf gesetzt.


Mal ein Tipp....
Wenn du eine Variable um einen Zähler vergrößern möchtest.... also inkrementieren möchtest, dann kannst du das mit "Incr" machen. ;)

Gleiches funktioniert mit "Decr" , um eine Variable zu dekrementieren.... also zu verkleinern.

Damit kannst du dir zum Beispiel das:
Z = Z + 1
sparen!


Gruß,
Cassio
 
@ dino03:
Also muss ich meine Werte 0 1 3 2 immer mit sich selbst und verknüpfen um etwas genaues ohne Fehler auszugeben.
@ Cassio:
jetzt hab ich 2 rasten Punkte für einen wert hoch oder runter geht aber nur wenn ich If K = 1 abfrage hier der code
Code:
Dim Z As Byte
Dim K As Byte
 Z = 127

 Cls
 Do


  K = Encoder(pind.2 , Pind.3 , Runter , Rauf , 1 )
    Locate 1 , 1 : Lcd Z

  Loop
  Rauf:
  If K = 1 Then
  Incr Z
  End If
  Return
  Runter:
  If K = 1 Then
  Decr Z
  End If
  Return


 End
 
Hallo Knut!

Vergiss den Hinweis von Dino erst mal...... :rolleyes:


DU musst gar nichts verknüpfen..... du hast BASCOM. ;)

Gruß,
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)