Digitale Temperatur regelnde Lüftersteuerung mit einstellbaren Hysteresewerten

knut89

Neues Mitglied
22. Feb. 2011
85
0
0
Sprachen
Moin alle zusammen,
vor ab ich bin Azubi im 3. Lehrjahr als Elektroniker für Geräte und
Systeme und habe damit angefangen eine digitale Lüftersteuerung mit
einstellbaren Hysterese werten zu entwickeln(für meine Abschlussarbeit).
Ich bitte meine Teilweise Unwissenheit was Fachsprache und
Programmierung angeht nach zu sehen.
So zur Steuerung habe einen Atmega 8 sowie eine LCD von Elektronik
Assembly und einem Encoder mit Return.
Mein Programm steht schon fast LCD funktioniert mit 2 Temperaturfühlern
Lm 235 bekomme ich beide angezeigt.
Nur bekomme ich es jetzt irgend wie nicht hin über den Encoder die
Hysterese-werte einzustellen es soll eigentlich so sein das man links
herum dreht den oberen Hysterese-wert sieht und ihn dann auch mit dem
Returntaster des Encoders Ändern kann. Rechts herum genau das Selbe nur
für den unter Hysterese wert zu ändern.
Ich bekomme einfach net hin das ich während des Interrupts den Port für den Taster so abfrage das er auch reagiert im Moment macht das Programm bei tasten druck gar nichts. Der Interrupts läuft sauber durch aber es Passiert nichts beim Drücken des Tasters hab sogar die Pins schon kurz geschlossen gehabt vor dem Interrupt nichts. :eek:
Bin echt am verzweifeln. :mad:


Schick das Programm mal mit das ihr euch ein Bild davon machen könnt.

Vorab schon einmal danke


Knut
 

Anhänge

  • abschlusprüfungLCDencode.bas
    4 KB · Aufrufe: 128
hab noch den Schaltplan vergessen.
 

Anhänge

  • schaltplan.PNG
    schaltplan.PNG
    86,5 KB · Aufrufe: 102
  • Unbenannt2.PNG
    Unbenannt2.PNG
    76,8 KB · Aufrufe: 76
Hallo Knut89!

Willkommen im AVR-Praxis Forum! :ciao:


Ich habe deine Pläne und den Programmcode mal überflogen.....

Nun rätsel ich gerade an den zwei 7805 rum. :hmmmm:
Warum hast du zwei 7805er verwendet?


Noch etwas:
Gibt es einen speziellen Grund dafür, warum du das LCD im 8Bit-Mode ansteuerst?


Dann mal zu deiner Messwiderstandsanordnung....
Du möchtest doch bestimmt die analogen Daten im AVR auswerten.
Warum verwendest du nicht die ADC-Anweisungen von BASCOM?
Wie bist du denn auf ADMUX und Highbyte sowie Lowbyte gekommen?


Nun mal zu deinem Tasterproblem, beim Drehencoder....
Ich finde überhaupt keinen Interrupt. :eek:
Was soll denn da sauber durchlaufen? :hmmmm:

Du verwendest lediglich "Debounce" für den Tastereingang.
Die Subroutine dafür hast du aber falsch erstellt. Die müsstest du genauso aufbauen wie bei "Links:" und "Rechts:" !
Also:
Taster:
'mach watt
Return

Dann kommt die Auswertung des Tasters......
Was soll denn:
"Portd.4 = Not Portd.4"
in deinem Programm bewirken?


Nur mal eine Frage zum Verständnis für mich....
Wann muss die Abschlussarbeit denn fertig sein?
Hast du dir mal ein Programmschema oder Blockbild aufgemalt wie das Programm arbeiten soll?


Apropos Programm und Abarbeiten des Selbigen:
Du solltest dir vor Beginn der Programmierung überlegen, welche Prioritäten du setzen musst.
Also zum Beispiel:
1. ADC-Messung (permanent)
2. Auswertung und Ausgangssteuerung (permanent)
3. Eingaben erfassen und bearbeiten (NUR wenn notwenig)
4. LCD-Ausgaben tätigen (NUR wenn notwendig)

Anschließend muss dein Programm auch diese Struktur aufweisen!

Du kannst zum Beispiel nicht oben einmal "Debounce" verwenden und erwarten, dass dein Programm dann gleich darauf reagiert... während es vielleicht gerade mit der ADC-Messung oder den LCD-Ausgaben beschäftigt ist.
Die "Debounce"-Anweisung erzeugt keinen Interrupt!


Gruß,
Cassio
 
Hallo!


Nur mal nebenbei....
Das wird so nicht funktionieren:
Code:
  Rechts:
  Cls

  Locate 1 , 1 : Lcd "Luefter aus:"

  Locate 2 , 11 : Lcd F

  Waitms 5


          If Portd.4 = 0 Then F = F + 5


      Locate 2 , 11 : Lcd F

      Waitms 5
   Return

Du gelangst in die Sub "Rechts",
die ganze Dispalyanzeige wird gelöscht,
dann wird schnell der Text und dein "F"-Wert am LCD angezeigt,
wenn du nun nicht genau nach Ablauf der 5ms auf den Taster drückst, wird wieder der "F"-Wert ausgegeben
und nach einer 5ms Pause verlässt das Programm die Subroutine.

Das wird so nichts! :cool:
Der Grundansatz dazu ist falsch!


Grüße,
Cassio
 
Danke erst mal für deine Antwort hatte die Zwei 7805 verwendet damit der Strom sich aufteilt. Verwende jetzt aber eine Externe Spannungsversorgung.

Nein eigentlich nicht hab nur gedacht das ich dem Prüfungsausschuss das so später besser erklären und beschreiben kann

Hab die Interrupts doch Benannt dachte ich mit
On Int0 Links
On Int1 Rechts


Rechts:
Cls

Locate 1 , 1 : Lcd "Luefter aus:"

Locate 2 , 11 : Lcd F

Waitms 5


If Portd.4 = 0 Then F = F + 5


Locate 2 , 11 : Lcd F

Waitms 5
Return
Links:
Cls

Locate 1 , 1 : Lcd "Luefter ein:"

Locate 2 , 11 : Lcd E

Waitms 5


If Portd.4 = 0 Then E = E - 5
bis auf die beiden If portd.4 macht das Programm auch alles

Locate 2 , 11 : Lcd E

Waitms 5
Return
oder etwa nicht?

hab das über Admux und so gemacht weil ich mit dem Buch von Roland Walter arbeite und er das dort Genauso gemacht hat.

Was das mit dem Portd.4 = Not Portd.4 bezwecken sollte weiß ich auch net genau was mich da geritten hat.


Der Abgabetermin ist am 1.6.

Programmschema Ja hab ich
Start

Abfrage Temperatur

Vergleichen mit Hysterese werten
Größer Kleiner

Lüfter an / aus

Ausgabe
über LCD

Return Start

Mit Interrupts Verstellen der Hysterese Werte

Die LCD Anzeige sollte aber am besten Permanent aktualisiert werden.

Gruß Knut
 
Du gelangst in die Sub "Rechts",
die ganze Dispalyanzeige wird gelöscht,
dann wird schnell der Text und dein "F"-Wert am LCD angezeigt,
wenn du nun nicht genau nach Ablauf der 5ms auf den Taster drückst, wird wieder der "F"-Wert ausgegeben
und nach einer 5ms Pause verlässt das Programm die Subroutine.

Das wird so nichts! :cool:
Der Grundansatz dazu ist falsch!


Grüße,
Cassio


Genau das mein Problem wie bekomme ich das hin das der den Tastendruck mit bekommt und umschaltet ??
 
gibts irgend wie einen Befehl in dem ich sagen kann warte bis der Taster gedrückt wird in einer Gewissen Zeit wenn nicht weiter, wenn wert ändern und wiederholen ??
 
Hi
Ich programmiere zwar nicht in Bascom, aber auch dort sollte es möglich sein, einen Timer zu integrieren. Die Timer ISR baust du so auf, das du daraus msek ableiten kannt. Wenn du nun Wartezyklen hast, kannst du in einer Variablen innerhalb der ISR einen Wert hochzählen. Bei Erreichen löst du dann die Aktion aus, die du gern erledigen möchtest. Das ist dann wieder im Programm möglich und unabhängig von der Timer -ISR. Wartezeiten wie Wait halten immer dein Programm auf.
Dein Programm sollte sich an "EVA" orientieren...

Eingänge lesen
Verarbeiten von Informationen
Ausgabe

Deine Timer ISR muß folgendes können:
Durchlaufen der Timer-ISR alle mSek
Incementieren einer oder mehrerer Variablen für Zeitaktionen

In der Verarbeitung im Programm fragst du die Variablen auf den gewünschten Wert ab. Ist er größer oder gleich, bearbeitest du einen Schritt und setzt die entsprechende Variable wieder auf 0. So kannst du Wartezeiten einbauen, ohne die Eingaben "unsicher" zu machen. Taster per Interrupt abfragen ist nicht erforderlich, weil dein Programm so schnell durchlaufen wird, das du es nicht schaffen wirst, den Taster so kurz zu drücken, das er nicht mehr erfasst werden kann. Den Interrupt für Eingänge setzt man in der Regel nur für ganz ganz kurze Impulse ein, da wo man Gefahr läuft, das durch die Zykluszeit bedingt ein Programm einen solchen Impuls nicht mitbekommt. Wenn dich interessiert, wie ich so etwas in Assembler löse, dann schau mal in die FAQ's .
Gruß oldmax
 
Hallo Knut!

Sei mir bitte nicht böse wenn ich schreibe, dass dein Programm eher zufällig das Macht was du dir denkst. ;)

Bis zum 01.06.2011 ist ja ein Glück noch laaaange hin. :)


Mir scheint so, als hättest du die Interrupts im Allgemeinen und die Funktion des Drehencoders im Speziellen falsch verstanden.
Da müssen wir also noch mal ran..... ;)


Tja und was dein Programmschema betrifft:
Programmschema Ja hab ich
Start

Abfrage Temperatur

Vergleichen mit Hysterese werten
Größer Kleiner

Das ist kein Programmschema..... sondern nur ein grober Gedankengang zur Funktion.

Vergleichen ist gut! An welcher Stelle wird denn verglichen und der Ausgang geschaltet?
Habe ich das übersehen?

Ich werde irgendwie das Gefühl nicht los, als hättest du dir da eine "Basis" zusammen kopiert und möchtest nun etwas dazwischen quetschen.
Kann das sein?

Also ich würde an deiner Stelle noch mal ganz von vorne anfangen.....
Hast ja noch genug Zeit! ;)



Was ist denn nun mit dem Display?
Warum verwendest du den 4Bit-Modus nicht?

Grüße,
Cassio
 
gibts irgend wie einen Befehl in dem ich sagen kann warte bis der Taster gedrückt wird in einer Gewissen Zeit wenn nicht weiter, wenn wert ändern und wiederholen ??

Hallo !

Na klar gibt es das......
In dem du es programmierst! :D

In BASCOM gibt es viele Anweisungen die einem Programmierer das Programmieren erleichtern, aber den Programmablauf muss er schon selbst erstellen.

BASCOM ist kein Setzkasten für AVR`s! ;)


Gruß,
Cassio



PS:
@Oldmax: Bring den armen Kerl nun nicht noch mit Timern durcheinander.
Das Thema kommt später von allein. ;)
 
@cassio:
Es kann schon sein das ich das nicht wirklich verstanden habe. so was bespricht man leider nicht in der Berufsschule arbeiten wir ab und an mal mit einer MFA und Assembler.
der Entwickler der mich unterstützt hat im Moment Urlaub und steht mir zwar bei fragen via E-mail zu Seite aber das irgendwie auch blöd ihn währendes Urlaubs zu Nerven.

Also hab das alles selbst geschrieben in einzelnen Programmen und dann zusammen kopiert da hast du recht.

das Vergleichen ist noch nicht mit eingebaut. würde aber so aussehen
zum
If X > E then Portd.1 = 1
end if
If J > F Then Portd.1 = 0
end if

Die LCD anzeige Funktioniert wunderbar
Der Entwickler der mich betreut hat gesagt um rechen zeit zu sparen nehmen wir den 8 bit Modus.

würde halt beim neu schreiben direkt den Befehl mit dem Interrupts ein bauen deswegen hab ich das noch nicht gemacht.

@ oldmax:
hab ich auch schon probiert das Programm soll halt direkt auf den Encoder reagiert sonst wird vielleicht eine Rastepunkt übergangen dachte ich, deswegen der Interrupt.

Danke allen für die antworten
 
Hallo !

Tja, alles schön und gut......
aber so wird das wirklich nur ein gefrickel im vorhandenen Programmcode. :rolleyes:

Die Sache mit der Rechenzeit und dem 8Bit-Modus für das LCD...... lassen wir das mal!
Wenn er das so gesagt hat und du es so beibehalten möchtest, dann bleibt das nun so.

Die Sache mit den Interrupts.....
Deine Anweisungen dürften keine produzieren!
Nimm doch mal die Anweisungen
"On Int0 Links"
"On Int0 Rechts"
heraus und dreh dann mal am Drehencoder.

Die Anweisung: "K = Encoder(pind.2 , Pind.3 , Links , Rechts , 1)" macht alles was du benötigst!
Es werden die Pins angegeben an dem der Encoder angeschlosen ist und du hast angegeben in welche Sub das Programm verzweigen soll.

Wofür benötigst du dann noch die externen Interrupts?
Ob eine Raststellung übergangen wird oder nicht ist doch völlig unerheblich.....
Welchen Wert du dann einstellst kannst du ja auf dem Display sehen. ;)

Die Variable "K" liefert dir außerdem das Encodersignal zurück.
Meist ist es diese Reihenfolge:
Rechts= 3-2-0-1
Links= 3-1-0-2

In den Subroutinen (Links und Rechts) musst du dann noch berücksichtigen, dass du von einer Raststellung zur Nächsten auch immer nur EINEN Schritt weiter möchtest.
Dafür kannst du z.B. die NULL überwachen.
Hat die "K" eine NULL, dann zähle hoch..... oder runter.


Der Drucktaster am Drehencoder ist ggf. überflüssig, wenn du einfach nur deine beiden Min/Max-Werte einstellen möchtest.
Ich würde aber den Drucktaster dazu verwenden um in das "Einstellmenü" zu gelangen und wieder zurück zu kommen.

Mögliches Schema dieser Idee:
1) Tasterdruck --> Sollwertemenü
2) durch links und rechts drehen den oberen oder unteren Wert auswählen, oder Abbrechen
3) Tasterdruck aktiviert die Sollwertänderung, oder bei Abbrechen: Verlässt das Menü
4) rechts/links drehen um den Wert einzustellen
5) Tasterdruck speichert den Wert ab und kehrt nach einer Anzeigenpause zu 2) zurück



Beginne aber erst mal mit den "einfachen" Dingen.
AVR, LCD und ein Taster

Lass den Drehencoder erst mal raus und auch die ADC-Wert Ermittlung.


Beginne gleich damit Subroutinen zu verwenden.
Deine Hauptschleife (Do-Loop) muss also nur den Taster überwachen.

Code:
Do

If Taster = 0 Then
   Gosub Lcd_anzeige
Else
End If

Loop


Die Subroutine "Lcd_anzeige" hat zum Beispiel folgenden Inhalt:
Code:
Lcd_anzeige:

Locate 1 , 1
Lcd "Erste Zeile des LCD"

Return


Worin liegt nun der Vorteil mit der Sub?
Der größte Pluspunkt ist dabei, dass die LCD-Anzeige nur dann aktualisiert wird, wenn der Tater gedrückt wurde.
Dein LCD wird also nur dann verwendet wenn es sinnvoll ist. ;)
Würdest du die Ausgabe in der Hauptschleife machen, steht dein LCD unter "Dauerfeuer" vom AVR.
Es bekommt ständig neue Daten, obwohl es doch gar nichts neues zum Anzeigen gibt.

Ein weiterer Pluspunkt ist, dass du später im Programm immer wieder auf diese Subroutine zurück spingen kannst und dein Display dann genau das anzeigt, was du dort angegeben hast.
Denk mal an den Punkt, wenn du in ein Menü springst..... oder danach wieder zur "Hauptanzeige" zurück möchtest. ;)

In meinen Programmen gehe ich sogar noch einen Schritt weiter.....
Es gibt immer ein "Layout" das geladen wird. In dem Layout befinden sich nur Displayausgaben die statisch sind.
Variable Displayausgaben werden an anderer Stelle aufgerufen und ggf. aktualisiert.

Ein Beispiel dazu:
Es soll auf dem Display folgendes angezeigt werden:
-------------------
|Sollwert 1 = 15.1°C|
|Sollwert 2 = 12.8°C|
|..........................|
|..Taster = Menue...|
-------------------

Die beiden Temperaturwerte sind Variablen die sich irgendwann mal verändern.
Der Rest ist quasi immer zu sehen.

Nun wird eine Subroutine erstellt, in der nur statische Angaben stehen.
Danach würde das Display nur dies anzeigen:
-------------------
|Sollwert 1 = ..... °C|
|Sollwert 2 = ..... °C|
|..........................|
|..Taster = Menue...|
-------------------

Da aber gleich danach die Variablenwerte übermittelt werden fällt der zeitliche Versatz nicht auf und im Programm musst du dich nur noch um die Aktualisierung der Variablen kümmern.


Versuch doch mal dein Programm so umzustellen (in einer NEUEN Datei !) damit du dies auch realisieren kannst.
Stelle den neuen Code dann hier ein (bitte direkt in den Beitrag) und dann gehen wir zum nächsten Schritt.

Grüße,
Cassio
 
Hallo Knut,

da die anderen sich grade mit der Software befassen mach ich mal die
Hardware :D

hatte die Zwei 7805 verwendet damit der Strom sich aufteilt. Verwende jetzt aber eine Externe Spannungsversorgung.
das geht leider so nicht. Wenn du geringe Fertigungstoleranzen hast (die immer
vorhanden sind) dann teilt sich der Strom unterschiedlich auf. Das ist wie bei
den LEDs die man aus dem Grund auch nicht direkt parallelschalten darf.
Also Glück gehabt das nix abgeraucht ist.

Noch ein Tip: Bei Eagle unter "Datei >> Export" kannst du ohne Screenshot
den Plan als PNG exportieren. Ab und zu frißt das Forum die erzeugten PNGs
aber nicht. Einfach dann mit nem Bild-Viewer in GIF konvertieren und es
geht. Das hat den Vorteil das die Dateien recht klein, komplett und die
Schrift gut lesbar ist. Zu Eagle gibts nen paar FAQs hier im Forum.

knut89_Unbenannt2.PNG
Wenn du Vcc in Eagle durch den Vcc-Pfeil aus der Bibliothek ersetzt (such
mal nach *vcc* ) und GND auch durch das entsprechende Symbol (nach
*gnd* suchen) dann hast du nur noch die Signaladern im Plan und der
Gordische Knoten entwirrt sich etwas ;) Ein Plan muß eine gewisse
Ästhetik aufweisen (schön anzusehen sein).

Beim LCD würde ich auch den 4Bit-Modus empfehlen so wie Cassio es schon
vorgeschlagen hat. Das spart ne Menge Drahtgewusel ;) und gibt wieder freie
Ports für anderen Firlefanz :D

Und beschrifte mal bei JP1 (LCD) und JP6 (ISP) mit Text die einzelnen
Signalpins damit es für die Fehlersuche und beim löten übersichtlicher wird.

R4 beim Kontrastpoti hat keinen Wert dranstehen. Für Kontrast reicht aber
auch nen 10k (nehme ich überall) und direkt von Vcc nach GND. Das spart
den Widerstand und nen LCD ist bei mir dadurch noch nie gestorben.

Und entwirr mal Vcc und GND durch die Vcc/GND-Symbole (ach ja .. hab ich
ja schon erwähnt) ... beim Kontrastpoti kriegt man nen Knoten ins Hirn :rolleyes:

So ... genug gemotzt :D Jetzt greif ich gleich mal selber zum Lötkolben ...
(schmurgel ... aua ...)

Gruß
Dino
 
Wisst ihr was ich finde das Forum hier geil.
Überall sonst ham sie mich als noob abgestempelt und mir nur gesagt das ich mich mit so was unter Profis lächerlich mache. Aber Lösungen hatte keiner bis auf euch.
(so genug Geschleimt )

@ Cassio: das werde ich machen stell es dann online.

@Dino03: hab eine Z Diode vorgeschaltet und den Widerstand über den der Strom von Atmega8 und der Ansteuerung der LCD fließt, das Relais ist direkt mit der Versorgungsspannung von 6 V verbunden und die LCD Hintergrundbeleuchtung über einen Widerstand genau auch an die Versorgungsspannung.2,2R 5W.

ist aber im Moment noch eine Experimentierschaltung werde eine Platine Ätzen und alles noch mal neu zeichnen und schreiben.
 
.....und mir nur gesagt das ich mich mit so was unter Profis lächerlich mache.

Hallo Knut89 !

Wie kann man sich denn als Anfänger lächerlich machen? :hmmmm:
Man kann höchstens den Unmut der Wissenden auf sich ziehen, wenn man ausführliche Hilfen doch nicht berücksichtigt...... oder schlimmeres.


Lass deine Schaltung erst mal noch auf dem Experimentierboard. Die Platine kannst du dann ätzen, wenn alles soweit OK ist und die Steuerung funktioniert.


Grüße,
Cassio
 
Hi,

Wisst ihr was ich finde das Forum hier geil.
Überall sonst ham sie mich als noob abgestempelt und mir nur gesagt das ich mich mit so was unter Profis lächerlich mache. Aber Lösungen hatte keiner bis auf euch.
(so genug Geschleimt )
Die Tastatur klebt hier auf einmal so ...und ich rutsche beim tippen immer ab :D

ist aber im Moment noch eine Experimentierschaltung werde eine Platine Ätzen und alles noch mal neu zeichnen und schreiben.
Würde ich auch erstmal auf dem Steckboard lassen. Da kann man kleine Fehler
besser ausmerzen.

Gruß
Dino
 
so das ist er funktioniert aber Irgendwie nicht spring andauernd in die LCDanz und wenn ich Portd.4 auf GND Lege passiert auch nix find den Fehler nicht.
Code:
$regfile = "m8def.dat"
$crystal = 16000000
$framesize = 32
$swstack = 32
$hwstack = 64

$baud = 38400

Ddrd = &B11110111
Ddrb = &B11111111

Portd = &B11111111
Portb = &B11111111

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

Declare Sub Taster
Dim Lcdanz As Word
Dim A As Byte


Config Lcd = 20 * 4
A = 0
Do

If A = &B00000020 Then
  Portd.4 = 1
Else
 Goto Lcdanz
 End If
 A = 2
 Debounce Pind.4 , 0 , Taster , Sub

  If Portd.4 = 0 Then

Gosub Taster
    Else

  End If

  Loop

 Lcdanz:
 Locate 1 , 1 : Lcd "1. Zeile"

 Locate 2 , 1 : Lcd "2. Zeile"

 Locate 3 , 1 : Lcd "3. Zeile"

 Locate 4 , 1 : Lcd "4. Zeile"
 Return

 Sub Taster

 Locate 1 , 10 : Lcd "Hallo"
 Locate 2 , 10 : Lcd "Hallo"
 Locate 3 , 10 : Lcd "Hallo"
 Locate 4 , 10 : Lcd "Hallo"
 End Sub
 Return
 
....find den Fehler nicht


Hallo Knut89 !

Hm... nun ja....
auf die Schnelle sind mir aber ein paar Fehler aufgefallen. ;)

Wo soll ich anfangen? :hmmmm:
Ich denke mal, einfach der Reihe nach wie sie mir aufgefallen sind.

Code:
Ddrd = &B11110111 
Ddrb = &B11111111 

Portd = &B11111111 
Portb = &B11111111

Wenn du im DDRx Register die Anweisungen vornimmst, um Ein- und Ausgänge zu bestimmen, dann solltest du dies auch im PORT-Register beachten.

In deinem Code wird PinD.3 als EINGANG definiert und alle anderen sind Ausgänge!
Im PORT-Register aktivierst du nun auch den Pullup für PinD.3 .......allerdings schaltest du alle Ausgänge High!
Benötigst du das wirklich so?

Das Gleiche machst du mit PORTB!

Ich behaupte einfach mal, dass du die Ausgänge bestimmt LOW haben möchtest und nur für PIND.3 der Pullup aktiviert sein soll.
Dann müsste es so aussehen:
Code:
Ddrd = &B1111_0111        '0=Eingang , 1=Ausgang
Portd = &B0000_1000       '1=Pullup(Eingang), High(Ausgang)


Ddrb = &B1111_1111 
Portb = &B0000_0000


Dann würde ich die Deklaration der Sub "Taster" rausnehmen und sie später mit "GOSUB" anspringen.
Da du keine globalen Variablen-Werte in lokale übergeben musst, ist das Deklarieren nicht notwendig.

Du kannst also die Zeile "Declare Sub Taster" entfernen!



Dann das Nächste, was ich sehr merkwürdg finde.....
Code:
Dim Lcdanz As Word

Code:
 Lcdanz:
 Locate 1 , 1 : Lcd "1. Zeile"

 Locate 2 , 1 : Lcd "2. Zeile"

 Locate 3 , 1 : Lcd "3. Zeile"

 Locate 4 , 1 : Lcd "4. Zeile"
 Return

Du definierst eine Variable "Lcdanz" ......und gleichzeitig eine Sub Lcdanz! :hmmmm:

Ab BASCOM-Version 2.0.3.0 ist dies sowieso nicht mehr möglich..... aber warum machst du das überhaupt?
Du verwendest doch gar keine Variable "Lcdanz"?



Nun kommt etwas zum Schmunzeln:
Code:
If A = &B000000[B][COLOR="Red"]2[/COLOR][/B]0 Then

Ein Bit kann doch immer nur 1 oder Null sein....... aber niemals 2! ;)

Warum hast du das überhaupt so umständlich geschrieben?
Was wolltest du denn damit erreichen?
Ein paar Zeilen später hast du doch auch einfach "A=2" geschrieben.



Jetzt kommt dein Sprung in die Subroutine für die Anzeige:
Code:
Goto Lcdanz

Wie man oben sehen kann, ist "Lcdanz" eine Subroutine......
Um diese aufzurufen verwendet man "GOSUB" !

Damit folgt dein Programm an der Stelle der Anweisung in die Sub zu verzweigen....
und das Return in der Sub "Lcdanz" sorgt dafür, dass die Sub ordnungsgemäß beendet wird und...
dein Programm an der nächsten Stelle vor dem Verlassen fortgeführt wird.

Versuche möglichst kein GOTO zu verwenden..... es sei denn, du springst innerhalb einer Sub oder des Hauptprogramms.



Die Erfassung deines Tasters an PinD.4.....
(wieso denn PinD.4....... wenn NUR PinD.3 als Eingang definiert wurde? :hmmmm: )
.....ist mit "Debounce" so auch nicht in Orndung.
Code:
Debounce Pind.4 , 0 , Taster , Sub

Wie eben schon drauf hingewiesen...... der PinD.4 ist KEIN Eingang! ;)

Hier noch mal die Einstellung von oben:
Code:
Ddrd = &B11110111


'Das ist PinD.3, weil.......
'Bits  =     7654_3210
'Ddrd = &B1111_0111

Nun gemerkt, was falsch gelaufen ist? ;)


Wenn du nun "Debounce" verwenden möchtest, um den Taster zu überwachen, eine kleine Prellzeit abzuwarten und dann in die Subroutine zu springen...... dann ist das ja OK.
Allerdings benötigst du dann keine "GOSUB"-Anweisung dafür mehr!
Daher kann diese Zeile entfallen:
Code:
Gosub Taster



So, damit wäre ich nun erst mal durch. ;)

Was ich aber noch anmerken möchte.....
Selbst wenn du alle o.g. Punkte änderst, wird dein Programm immer noch nicht so laufen wie du dir das vorstellst.

Du möchtest zwei unterschiedliche Anzeigen auf dem LCD realisieren.......
Die Daten für die Anzeige sollen jedoch nur "einmal" übertragen werden.

Ich denke, da musst du dein Hirn noch mal etwas quälen. ;)


Grüße,
Cassio
 
ohman wie hol das hätte mir auch auffallen können eigentlich muss ich mich dafür schämen :vroam: aber danke für das öffnen der Augen :adore:
werde mich gleich dran setzten die Fehler zu verbessern.
 
so gehts jetzt mano man sitzt den ganzen tag davor und sieht nix kerle die jugend von heute.:D
Code:
$regfile = "m8def.dat"
$crystal = 16000000
$framesize = 32
$swstack = 32
$hwstack = 64

$baud = 38400

Ddrd = &B11101111
Portd = &B00010000


Ddrb = &B11111111
Portb = &B00000000

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

Declare Sub Taster

Dim A As Byte


Config Lcd = 20 * 4
A = 0
Do

If A = 0 Then

 Gosub Lcdanz
 End If
 A = 2
 Debounce Pind.4 , 0 , Taster , Sub





  Loop

 Lcdanz:
 Locate 1 , 1 : Lcd "1. Zeile"

 Locate 2 , 1 : Lcd "2. Zeile"

 Locate 3 , 1 : Lcd "3. Zeile"

 Locate 4 , 1 : Lcd "4. Zeile"
 Return

 Sub Taster

 Locate 1 , 10 : Lcd "Hallo"
 Locate 2 , 10 : Lcd "Hallo"
 Locate 3 , 10 : Lcd "Hallo"
 Locate 4 , 10 : Lcd "Hallo"
 End Sub
 Return
Als nächstes werd ich jetzt die Menü führung in angriff nehmen das kann ich doch Bestimt mit dem Debunce befehl auch in der Subroutine Realisieren oder ?
 

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