Bascom Probleme mit DEBOUNCE und einem 16x2 LCD

Kokusnuss

Neues Mitglied
09. Jan. 2011
41
0
0
Sprachen
  1. BascomAVR
Hallo zusammen,

ich habe mir das LCD-Add-On für mein my-AVR-Programmierboard geholt.
Ich programmiere mir gerade eine Uhr, doch leider funktioniert der DEBOUNCE-Befehl zum Stellen der Uhr nicht.

Folgendes Problem: Sobald ich den Befehl Debounce einfüge, wird das LCD nicht mehr beschrieben.

Ich würde mich sehr freuen, wenn mir jemand auf die Sprünge helfen könnte.
Vielen Dank im Vorraus :):flowers:

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

$hwstack = 50
$swstack = 100
$framesize = 100

 Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2       'definiere die LCD-Pin's
 Config Lcd = 16 * 2                                        'definiere die Größe des LCD's

 Config Portd.3 = Input                                     'definiere die Eingänge
 Config Portd.4 = Input                                     'definiere die Eingänge

 Portd.3 = 1                                                'Pull_Up's setzen
 Portd.4 = 1                                                'Pull_Up's setzen

 Taster_1 Alias Pind.3                                      'bezeichne die Eingänge
 Taster_2 Alias Pind.4                                      'bezeichne die Eingänge

'- - - - - - - - - - - - - - - - - - - - -
'          Uhrzeit-Variablen
'- - - - - - - - - - - - - - - - - - - - -

 Dim Sekunden As Integer                                    'Sekunden
 Dim Minuten As Integer                                     'Minuten
 Dim Stunden As Integer                                     'Stunden

 Dim Sekunden_ovrly As String * 2                           'Sekunden_String
 Dim Minuten_ovrly As String * 2                            'Minuten_String
 Dim Stunden_ovrly As String * 2                            'Stunden_String

 Sekunden_ovrly = Str(sekunden)                             'gebe Sekunden_String einen Wert
 Minuten_ovrly = Str(minuten)                               'gebe Minuten_String einen Wert
 Stunden_ovrly = Str(stunden)                               'gebe Stunden_String einen Wert

 Dim Sek_act As Bit                                         'Aktualisierung Sekunden
 Dim Min_act As Bit                                         'Aktualisierung Minuten
 Dim Stu_act As Bit                                         'Aktualisierung Stunden

 Dim Stellenmerker As Byte

'- - - - - - - - - - - - - - - - - - - - -
'          Timer-Konfiguration
'- - - - - - - - - - - - - - - - - - - - -

 Config Timer1 = Timer , Prescale = 64                      'Konfiguriere Timer1
 Enable Timer1                                              'schalte den Timer1 ein
 On Timer1 Timer_1                                          'verzweige bei Timer1 überlauf zu   Isr_von_Timer1
 Enable Interrupts                                        'noch keine 1 Hz
 Timer1 = 45000

'- - - - - - - - - - - - - - - - - - - - -
'- - - - - - - - - - - - - - - - - - - - -
'             HAUPTPROGRAMM
'- - - - - - - - - - - - - - - - - - - - -
'- - - - - - - - - - - - - - - - - - - - -
 Initlcd                                                    'initialisier das LCD
 Cls                                                        'lösche das Display
 Sekunden_ovrly = Format(sekunden_ovrly , "00")             'Sekundenformat vorgeben
 Minuten_ovrly = Format(minuten_ovrly , "00")               'Minutenformat vorgeben
 Stunden_ovrly = Format(stunden_ovrly , "00")               'Stundenformat vorgeben
 Lcd "  " + Stunden_ovrly + ":" + Minuten_ovrly + ":" + Sekunden_ovrly + " Uhr"       'Stelle Text/Uhrzeit auf dem Display dar
 Locate 2 , 1                                               'zweite Zeile
 Lcd "Test - Programm"                                      'Stelle Text auf dem Display dar
 Cursor Off

Do

 If Sek_act = 1 Then
   Sekunden_ovrly = Str(sekunden)
   Sekunden_ovrly = Format(sekunden_ovrly , "00")
   Locate 1 , 9
   Lcd Sekunden_ovrly
   Sek_act = 0
 End If

 If Min_act = 1 Then
   Minuten_ovrly = Str(minuten)
   Minuten_ovrly = Format(minuten_ovrly , "00")
   Locate 1 , 6
   Lcd Minuten_ovrly
   Min_act = 0
 End If

 If Stu_act = 1 Then
   Stunden_ovrly = Str(stunden)
   Stunden_ovrly = Format(stunden_ovrly , "00")
   Locate 1 , 3
   Lcd Stunden_ovrly
   Stu_act = 0
 End If


Debounce Taster_1 , 0 , Anzeigemodus , Sub
Debounce Taster_2 , 0 , Stellenmodus , Sub

Loop

'- - - - - - - - - - - - - - - - - - - - -
'          Anzeigemodus - Sub
'- - - - - - - - - - - - - - - - - - - - -

Anzeigemodus:

 Incr Stellenmerker

 If Stellenmerker > 2 Then Stellenmerker = 0
Return

'- - - - - - - - - - - - - - - - - - - - -
'          Stellenmodus - Sub
'- - - - - - - - - - - - - - - - - - - - -

Stellenmodus:

 If Stellenmerker = 1 Then
   Incr Stunden
   Stu_act = 1
 End If

 If Stellenmerker = 2 Then
   Incr Minuten
   Min_act = 1
 End If

Return

'- - - - - - - - - - - - - - - - - - - - -
'       Timer1 - Routine (1Hz-Takt)
'- - - - - - - - - - - - - - - - - - - - -
Timer_1:

 Timer1 = 45000                                             '45000  bei Prescale = 64 ist --> 1Hz muss noch ermittelt werden
 Sek_act = 1                                                'aktualisiere Sekunden
 Incr Sekunden

 '-----------------------
'     Uhrenablauf
'-----------------------
 If Sekunden > 59 Then
   Incr Minuten
   Min_act = 1
   Sekunden = 0
 End If

 If Minuten > 59 Then
   Incr Stunden
   Stu_act = 1
   Minuten = 0
 End If

 If Stunden > 23 Then
   Stunden = 0
 End If

Return


End

Liebe Grüße
Kokusnuss
 
Ok.. Fehler gefunden ;-D
Entschuldigung, dass ich gleich ein neues Thema eröffnet habe.
Ich hatte die Portsbereits verwendet für das LCD. Jetzt funktioniert es auch.

Trotzdem vielen Dank euch

Liebe Grüße
Kokusnuss
 
So ich habe die Uhr jetzt fertig.

Jetzt will ich mich probieren daran mit einer IR-Fernbedienung meinen Atmega8 anzusprechen.
Folgendes. Ich möchte gerne den übersendeten Code der FB auf meinem LCD sichtbar machen. Das Program dazu hätte ich auch schon geschrieben.
Doch ich habe folgendes Problem:
Um RC5 Code zu erhalten muss ich den Eingang
Code:
Config Rc5 = Pind.2
deklarieren, doch
meine LCD-Pins habe ich wiefolgt deklariert
Code:
 Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Für das LCD muss ich ja Rs =Portd.2 zuweisen. Mit einem anderen Pin funktioniert es nicht. Ich habe schon viele andere Pins probiert, doch ohne Erfolg.

Jetzt meine Frage: Kann ich irgendwie einen anderen Pin für
Code:
Config Rc5 = PinX.Y
, oder für
Code:
, Rs = PortX.Y
, dass die Funktion immer noch gegeben ist? Ich bin mir da nämlich nicht sicher, da Portd.2 als INT0 fungiert?!


Vielen Dank im Vorraus

Liebe Grüße:)
Kokusnuss

P.S. Programm zum anzeigen das Codes
Code:
$regfile "m8def.dat"
$crystal = 8000000
$hwstack = 50                                               '32
$swstack = 100                                              '10

 Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2       'definiere die LCD-Pin's
 Config Lcd = 16 * 2                                        'definiere die Größe des LCD's

 Config Portc.0 = Output

 Config Rc5 = Pind.2                                        ' Pind.2 als Eingang für IR Signal

 Initlcd
 Cls

 Enable Interrupts

 Dim Address As Byte , Command As Byte
 Lcd "empfange Signal "

Do

   Getrc5(address , Command)                                'RC5 Adresse und Kommando wird abgefragt

   Locate 2 , 1
   Lcd Address + "/" + Command

'If Address <> 255 Then
'Locate 2 , 1
'Lcd Address + "/" + Command
'End If

Loop

End
 
Hallo!

Du kannst jeden Pin am AVR für den RC5-Empfang nutzen, wenn.....
du ihn als Eingang definierst und
der Pin für keine Alternativfunktion (z.B. INT0) verwendet wird.

Hier mal eine Übersicht des Mega8 :
(die man zur schnelleren Übersicht mit in den Programmcode kopieren sollte)
Code:
'                   +---v---+
'       (RESET) PC6 |1    28| PC5 (ADC5/SCL)
'         (RXD) PD0 |2    27| PC4 (ADC4/SDA)
'         (TXD) PD1 |3    26| PC3 (ADC3)
'        (INT0) PD2 |4    25| PC2 (ADC2)
'        (INT1) PD3 |5    24| PC1 (ADC1)
'      (XCK/T0) PD4 |6    23| PC0 (ADC0)
'               VCC |7    22| GND
'               GND |8    21| AREF
' (XTAL1/TOSC1) PB6 |9    20| AVCC
' (XTAL2/TOSC2) PB7 |10   19| PB5 (SCK)
'          (T1) PD5 |11   18| PB4 (MISO)
'        (AIN0) PD6 |12   17| PB3 (MOSI/OC2)
'        (AIN1) PD7 |13   16| PB2 (SS/OC1 B)
'        (ICP1) PB0 |14   15| PB1 (OC1A)
'                   +-------+


Du kannst also daher auch:
Code:
Ddrc = &B_11_0000                                           '1 ist Ausgang 0 ist Eingang
Portc = &B00_1111                                           'auf Hi (Pullup) oder Low setzen

Config Rc5 = PINC.0
verwenden.... wenn du den ADC nicht aktivierst! :wink:


Grüße,
Cassio
 
Hey Danke Cassio für deine schnelle Hilfe.

Ich habs jetzt so umgesetzt.
Kann ich statt mit Pull-Up's auch mit Pull-Downs arbeiten?
Also den Port nicht auf 1, sondern auf 0 setzen? Würde das funktionieren?

LG
Kokusnuss
 
Hallo!

Ich bin der Meinung, dass es mit Pulldown nicht funktionieren wird,
weil das Signal vom Empfänger (TSOP1x36) dann "invertiert" ankommt.

Außerdem wird der Pullup im AVR automatisch aktiviert, wenn du den Pin als Eingang definierst!
Einfacher geht es doch nun nicht.
Warum denkst du über einen Pulldown nach? :hmmmm:

Grüße,
Cassio
 
Ok. Naja ich denke darüber nach, damit ich keinen extra Transistor nehmen muss. (Wäre kein Problem aber der Einfachheit halber) ;-)
Und einen Transistor bräuchte ich weil ich keinen TSOP1x36 nehme sondern einen ausgebauten IR-Empfänger namens "GP1U5 21X"
Müsste doch eigentlich genauso funktionieren oder? Hauptsache die Impulse kommen bei Tastendruck an der FB, oder?

LG
 
Hallo!

Tut mir leid, aber den Empfänger kenne ich nun wirklich nicht.
Kannst du mal eine Zeichnung einstellen, wie du das mit dem Transistor meinst? :hmmmm:


Die TSOP1736 oder SFH5110 zum Beispiel sind ja nicht nur einfache IR-Licht-Empfänger sondern besitzen auch eine eigene Logik!
Das IR-Signal wird in den Bauteilen also gleich demoduliert, so dass du es direkt in den AVR schicken kannst.
Ich weiß nicht, ob dein ausgebauter Empfänger das auch kann?

Bevor du dir aber zusätzlichen Stress machst.....
So ein TSOP31236 kostet gerade mal 82 Cent ! :wink:

Grüße,
Cassio
 
Nun ja ich wollte es ja erstmal mit den Mitteln die ich bereits habe probieren.

Hier ist ein Link zum Datenblatt des IR-Empfängers.
http://pdf1.alldatasheet.com/datasheet-pdf/view/117563/SHARP/GP1U521X.html

Dieser Empänger enthält auch eine Logik und verstärkt außerdem das Empfangssignal, d.h. wenn ich am anderen ende des Raumes stehe und eine Taste an der FB drücke, kann ich eine LED an oder ausgehen lassen. Das funktioniert schonmal. ;)
Desweiteren filtert er bis 38 kHz (RC5 sind 36 kHz) --> müsste also klappen.

LG
 
Aso den Transistor brauche ich, damit ich auf den RC5 Pin Minus schalte und nicht den vom GP1U5 21X ausgegebenen PLus.
 
Hallo !

Also den Satz habe ich jetzt nicht verstanden.....

Ist aber auch egal!
Dein aktuelles IR-Problem passt auch nicht mehr zum ursprünglichen Thema!

Wenn du zu IR, RC5 und dessen Programmierung noch mehr Fragen haben solltest,
dann eröffne erst mal bitte einen neuen Thread! :wink:


Danke,
Cassio
 
Alles klaro.

Wollte nur sagen, dass ich es jetzt mit demGP1U5 X21 hinbekommen habe. Dank einer Universalfernbedienung und auto-code-suchlauf. :-D
Kannst dann eig. den Thread/Blog auch wieder schließen, wenn das geht. Sollte ich dann noch fragen haben, dann eröffne ich einen neuen Thread. ;-D

Und ich möchte mich auch nochmal rechtherzlich bedanken dafür, dass ihr einen immer so gut und schnell helft. Da habt ihr euch echt ein GROßES Lob verdient.
Insbesondere du Casio.
:flowers::kiss3:

Liebe Grüße
Kokusnuss
 
Probleme mit DEBOUNCE und einem 16x4 LCD

Hallo liebe Leute,
ich mache mal bei diesem Thema weiter, obwohl ich in meinem Programm Fehler habe und damit nicht weiter komme. Mal zuerst das Programm:
Code:
$regfile "m8def.dat"
$crystal = 1000000
$framesize = 100
$hwstack = 100
$swstack = 100

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

Cursor Off
Cls

Config Pind.4 = Input
Portd.4 = 1

Config Pind.0 = Output



Dim X As Bit
X = 1
Dim Y As Byte
Y = 0

Config Debounce = 50

Config Clock = Soft , Gosub = Sectic
Time$ = "00:00:00"

Enable Interrupts


Dim Flag_x As Byte
Flag_x = 0

Dim Flag_y As Byte
Flag_y = 255

Dim Flag_z As Word
Flag_z = 0



Do

Locate 1 , 4
Lcd Time$

Debounce Pind.4 , 0 , Anzeigen , Sub


Loop


'******************************


Anzeigen:



Cls
If Y = 0 Then
Locate 3 , 2
Lcd "Gut so"
Incr Y
End If



'------------------------------

Cls
If Y = 1 Then
Locate 3 , 2
Lcd "Weiter so"
Incr Y
End If

'------------------------------

Cls
If Y = 2 Then
Locate 3 , 2
Lcd " aha"
Incr Y
End If

'------------------------------


Cls

If Y = 3 Then
Do
Locate 3 , 2
Lcd Flag_x
Incr Y
End If

 Waitms 100

Loop Until Pind.4 = 0

Bitwait Pind.4 , Set


Cls

If Y = 4 Then
Do
Locate 3 , 2
Lcd Flag_y
Incr Y
End If

 Waitms 100

Loop Until Pind.4 = 0

Bitwait Pind.4 , Set



Cls

If Y = 5 Then
Do
Locate 3 , 2
Lcd Flag_z
Incr Y
End If

 Waitms 100

Loop Until Pind.4 = 0

Bitwait Pind.4 , Set





Cls
If Y = 6 Then
Y = 0
End If

'-------------------------------








Return

'********************************

Sectic:
Toggle Portd.0
Incr Flag_x

Decr Flag_y

Decr Flag_z

Return


Y startet mit "0" und soll nach Tastendruck eigentlich in der Sub dafür sorgen, dass "Gut so" auf dem LCD angezeigt wird. Wird es aber nicht! Stufe 0, 1 und 2 werden schon nach dem ersten Tastendruck übersprungen und es wird gleich das Inkrementieren des Flags X angezeigt. Nach erneutem Tastendruck kommt Flag_y, dann Flag_z und ein weiterer Tastendruck lässt die Schose wieder bei Flag_x beginnen. Mein schönes "Gut so" bis zum "aha" bleiben einfach außen vor. Wieso? Ich erkenne den Fehler, möglicherweise in der Reihenfolge der einzelnen Befehle nicht, obwohl ich die mehrfach schon getauscht hatte.

Kann mir dabei jemand freundlicherweise auf die Sprünge helfen, ich scheine blind zu sein!:cool: :confused: Danke schon mal vorab!

Gruß, Robin
 
Hallo Robin!

Das Problem liegt in der Subroutine bzw. im Aufbau deiner IF-Anweisungen.

Sobald das Programm das erste Mal in die Sub springt, wird die erste IF-Anweisung ausgeführt......
dabei auch gleich die Variable Y inkrementiert und damit auch gleich die Bedingung der nachfolgenden IF-Anweisung erfüllt. :wink:

Auf diese Weise geht es weiter, bis die Sub am Ende angekommen ist.

Was soll denn nun eigentlich passieren? :hmmmm:
Soll bei jedem Tastendruck ein anderer Text im LCD erscheinen, oder sollen alle nacheinander angezeigt werden?


Ich denke mal, dass du bei jedem Tastendruck den nächsten Text im LCD haben möchtest.
Ergo musst du die Sub auch so schreiben, dass immer nur EINE Bedingung erfüllt ist.
Auf diese Bedingung reagierst du dann mit dem entsprechenden Text im LCD und wenn alles fertig ist, inkrementierst du erst die Variable.

Um dies zu realisieren kannst du mit CASE oder auch ELSEIF arbeiten.
Generell würde ich dir aber zu SELECT CASE raten!
Die CASE-Anweisung ist wesentlich flexibler und einfacher zu erweitern.


Grüße,
Cassio
 
Hallo Cassio,
danke für deine hilfreichen Anregungen! Hat lange gedauert, bis mir mal einige Schuppen von den Augen fielen, manche wollen aber noch immer nicht runter!!!

Es sollen also nach dem ersten Tastendruck zuerst "Gut so", dann "Weiter so", "aha", danach die fortlaufenden Werte der Flag_x, Flag_y und Flag_z in einer Schleife angezeigt werden.
Beginne ich mit Y=0, so ist der erste Durchlauf noch korrekt, der zweite Durchlauf beginnt erst bei Y=1, da am Ende der Sub inkrementiert wird und demzufolge die erste Anzeige übersprungen wird. Beseitigt wird das Problem, wenn Y mit 1 startet und die erste Anzeige mit Y=1 anstatt mit Y=0 beginnt. Dann läuft's wie gewollt, bis zur vierten Anzeige.
Hier noch mal der neue Code, der aber auch noch eine Macke hat:

Code:
$regfile "m8def.dat"
$crystal = 1000000
$framesize = 100
$hwstack = 100
$swstack = 100

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

Cursor Off
Cls

Config Pind.4 = Input
Portd.4 = 1

Config Pind.0 = Output

Dim X As Bit
X = 1
Dim Y As Byte
[COLOR="#FF0000"]Y = 1[/COLOR]

Config Debounce = 50

Config Clock = Soft , Gosub = Sectic
Time$ = "00:00:00"

Enable Interrupts


Dim Flag_x As Byte
Flag_x = 0

Dim Flag_y As Byte
Flag_y = 255

Dim Flag_z As Word
Flag_z = 0



Do

Locate 1 , 4
Lcd Time$

Debounce Pind.4 , 0 , Anzeigen , Sub

[COLOR="#FF0000"]Locate 2 , 2
Lcd "0Y= " ; Y[/COLOR]

Loop


'******************************


Anzeigen:

Cls

[COLOR="#FF0000"]Locate 2 , 2
Lcd "--1Y = " ; Y[/COLOR]

If Y = 1 Then

[COLOR="#FF0000"]Locate 2 , 2
Lcd "1Y = " ; Y[/COLOR]

Locate 3 , 2
Lcd "Gut so"

[COLOR="#FF0000"]Locate 2 , 2
Lcd "1+ Y= " ; Y[/COLOR]

End If

'--------------------------------

If Y = 2 Then

[COLOR="#FF0000"]Locate 2 , 2
Lcd "2Y = " ; Y[/COLOR]

Locate 3 , 2
Lcd "Weiter so"

[COLOR="#FF0000"]Locate 2 , 2
Lcd "2+ Y = " ; Y[/COLOR]

End If

'---------------------------------

If Y = 3 Then

[COLOR="#FF0000"]Locate 2 , 2
Lcd "3Y = " ; Y[/COLOR]

Locate 3 , 2
Lcd " aha"

[COLOR="#FF0000"]Locate 2 , 2
Lcd "3+Y = " ; Y[/COLOR]

End If

'------------------------------

If Y = 4 Then


[COLOR="#FF0000"]Locate 2 , 2
Lcd "4Y = " ; Y[/COLOR]
Do
Locate 3 , 2
Lcd Flag_x

[COLOR="#FF0000"]Locate 2 , 2
Lcd "4+ Y = " ; Y[/COLOR]

Waitms 100

Loop Until Pind.4 = 0

Bitwait Pind.4 , Set
End If



If Y = 5 Then

[COLOR="#FF0000"]Locate 2 , 2
Lcd "5Y = " ; Y[/COLOR]

Do
Locate 3 , 2
Lcd Flag_y

[COLOR="#FF0000"]Locate 2 , 2
Lcd "5+ Y = " ; Y[/COLOR]

Waitms 100

Loop Until Pind.4 = 0

Bitwait Pind.4 , Set

End If


If Y = 6 Then

[COLOR="#FF0000"]Locate 2 , 2
Lcd "6Y = " ; Y[/COLOR]

Do
Locate 3 , 2
Lcd Flag_z

[COLOR="#FF0000"]Locate 2 , 2
Lcd "6+ Y = " ; Y[/COLOR]

Waitms 100

Loop Until Pind.4 = 0

Bitwait Pind.4 , Set
End If


If Y = 6 Then
Y = 0
End If

[COLOR="#FF0000"]Locate 2 , 2
Lcd "7Y = " ; Y[/COLOR]

Incr Y


Return

'********************************

Sectic:
Toggle Portd.0
Incr Flag_x

Decr Flag_y

Decr Flag_z

Return

Ab Y=4 wird's dann skuril. Der erste Flag_x - Wert, der angezeigt wird, ist korrekt. Es ist der fortlaufende Wert der Flag_x. Wird die Taste wieder gedrückt, wird der letzte Wert konstant angezeigt. Drücke ich wieder die Taste, wird der fortlaufende Flag_y - Wert angezeigt, danach wieder der Letzte usw. Es ist eine Systematik in der Darstellung der Flag - Werte, die ich aber programmtechnisch nicht ändern kann (einfach (noch) zu blöd dazu).

Um mal zu sehen, wie das Programm in Bezug auf die Änderung der Y-Werte abläuft, hatte ich mal die Y-Werte an verschiedenen Stellen des Programms anzeigen lassen und ich vermute, dass nach dem fortlaufenden Anzeigen des Flag_x -Wertes nach erneutem Drücken des Tasters das Programm in die Hauptschleife abwandert, dadurch der letzte Flag_x _Wert auf dem Display erhalten bleibt, die Uhrenanzeige zusätzlich erfolgt und erst mit dem darauffolgenden Tasterdruck das Programm bei Y=5 weiter macht. Wie ich aber die Anzeige des letzten Wert umgehen kann, weiß ich nicht.

Mit 'select case' habe ich mich noch überhaupt nicht befasst, weil ich dazu noch nichts nachvollziehbares an Programmtext gefunden hatte und aus der Bascom-Hilfe kann ich das nicht auf diesen Programmteil anwenden. Dies möchte ich auch erst angehen, wenn ich das oben geschilderte durchschaue. Ist wohl auch sinnvoll.

Gruß, robin
 
Es sollen also nach dem ersten Tastendruck zuerst "Gut so", dann "Weiter so", "aha", danach die fortlaufenden Werte der Flag_x, Flag_y und Flag_z in einer Schleife angezeigt werden.

Hallo Robin!

Sorry, ich weiß jetzt immer noch nicht was dein Programm eigentlich machen soll bzw. wie es eigentlich ablaufen soll? :hmmmm:

Bedeutet das jetzt, dass die "Infos" (Gut so, Weiter so, aha, ...) von allein nacheinander auf dem LCD angezeigt werden sollen, oder immer erst nach einem erneuten Tastendruck?
Ich verstehe das leider immer noch nicht. :wink:


Die Case-Anweisung ist eine sehr einfache, flexible und damit mächtige Anweisung.
Hier mal ein Beispiel für dich....

Wenn du deine Variable Y überwachen möchtest, um auf den Inhalt zu reagieren, dann könntest du das zum Beispiel auf diese Weise machen:
Code:
Locate 2 , 2

Select Case Y
   Case 1 : Lcd "Gut so   "
   Case 2 : Lcd "Weiter so"
   Case 3 : Lcd "aha...   "
   Case 4 to 9
      Locate 2 , 1
      Lcd "Variable Y=" ; Y
   Case Else
      Locate 2 , 1
      Lcd "                "
End Select


Ich hoffe, du kannst das Beispiel für dich entsprechend modifizieren und nutzen.
Solltest du trotzdem noch Schwierigkeiten mit der Durchführung haben, dann melde dich einfach noch mal. :)

Anschließend solltest du dich noch um die Überwachung des Tasters kümmern, sobald das Programm sich in der Sub befindet.


Grüße,
Cassio
 
Hallo Cassio,

bei jedem Tasterdruck (Pind.4) soll das Display etwas anderes anzeigen. Zuerst konstant bleibende Werte wie 'Gut so', nach Tastendruck dann 'Weiter so', danach 'aha'. Dann sollen variable Größen angezeigt werden.

Erst später möchte ich dann per einmaliger Tasterbetätigung die Darstellungen auf dem LCD nach einer bestimmten Zeitfolge, etwa 3 Sek pro Anzeige, sozusagen in einer Schleife automatisch durchlaufen lassen. Jetzt aber erst mal für jede neue Anzeige einmal den Taster drücken.

Danke auch für dein Beispiel, was ich mir jetzt mal genauer ansehen werde.

Gruß
Robin
 
Hallo Cassio,

Tschuldigung, meine Darstellung dessen, was ich bezwecken möchte, kann für einen Außenstehenden tatsächlich etwas verwirrend sein. Wenn man sich längere Zeit mit diesem Thema befasst, fallen einem die Nuancen nicht mehr so auf!Ich hab's mir gerade nochmals durchgelesen.

Ich versuche es nochmal mit weniger Worten darzustellen:

Bedeutet das jetzt, dass die "Infos" (Gut so, Weiter so, aha, ...) von allein nacheinander auf dem LCD angezeigt werden sollen, oder immer erst nach einem erneuten Tastendruck?

Erster Tastendruck: "Gut so" wird angezeigt
Zweiter Tastendruck: "Weiter so" wird angezeigt
Dritter Tastendruck: "aha" wird angezeigt
Vierter Tastendruck: " Ziffern/Zahlen von 0 bis 255 " werden durchlaufend angezeigt
Fünfter Tastendruck: " Ziffern/Zahlen von 255 bis 0 " werden durchlaufend angezeigt
Sechster Tastendruck: " Ziffern/Zahlen von 65536 bis 0 " werden durchlaufend angezeigt
Siebter Tastendruck: Es fängt wieder bei "Gut so" an

Die Case-Anweisung ist eine sehr einfache, flexible und damit mächtige Anweisung.

Aber dein 'Case' Beispiel zielt schon in die richtige Richtung und sieht zudem auch recht simpel aus. Weiß der Specht, weshalb ich bisher einen derartigen Bogen um diesen "Fall" gemacht habe:eek::eek::eek:


Solltest du trotzdem noch Schwierigkeiten mit der Durchführung haben, dann melde dich einfach noch mal.

Probleme habe ich noch. Wenn ich zum vierten Mal den Taster gedrückt habe, zeigt mir das LCD das Aufwärtszählen des Bytes an, also: o, 1, 2, 3 usw. Das ist auch richtig und gewollt. Nehmen wir an, ich drücke bei einem Anzeigewert 8 zum fünften Mal auf die Taste, dann bleibt dieser Wert dauerhaft auf dem Display. Eigentlich sollte das Programm hier von 255 abwärts zählen. Das Programm hängt sich hier auf. Warum das so ist, verstehe ich nicht. Um dahinter zu steigen, hatte ich an verschiedenen Stellen des letzten Quellcodes auch verschiedene Y-Werte anzeigen lassen, die ich auch im Code extra rot gekennzeichnet hatte. Da knacke ich dran rum und finde keine Lösung. Ich hoffe, ich konnte dir mein derzeitiges Problem nun verständlicher machen. Wenn nicht, versuche ich es nochmal anders, denn du kannst mir ja nur helfen, wenn du das Problem auch richtig verstehst.

Gruß
Robin
 
Hallo Robin!

Ich habe aktuell nicht so viel Zeit, um dir alles Stück für Stück zu erklären.....

Aus dem Grunde habe ich dein Programm mal leicht verändert, damit die "Grundfunktion" erst einmal stimmt. :wink:


Schau dir das Programm mal an und versuche es zu verstehen!
Du kannst damit auch mal etwas "rumspielen", wenn du die ein oder andere Anweisung nicht sofort verstehen solltest.

Hier nun mein Beispiel für dich, auf Grundlage deines Progammes:
Code:
$regfile "m8def.dat"
$crystal = 1000000
$framesize = 64
$hwstack = 64
$swstack = 64

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

Cursor Off
Cls


Config Pind.4 = Input
Portd.4 = 1

Config Pind.0 = Output


Dim X As Bit
X = 1
Dim Y As Byte
Y = 0


Config Debounce = 50

Config Clock = Soft , Gosub = Sectic
Time$ = "00:00:00"

Enable Interrupts


Dim Flag_x As Byte
Dim Flag_y As Byte
Dim Flag_z As Word


Dim Sec_flag As Bit
Dim Str_temp As String * 5


Do

Debounce Pind.4 , 0 , Anzeigen , Sub


If Sec_flag = 0 Then
   Locate 1 , 5
   Lcd Time$
   Sec_flag = 1
Else
End If



Loop


'******************************


Anzeigen:

Locate 2 , 1

Select Case Y
   Case 0 : Lcd " Gut so         "
   Case 1 : Lcd " Weiter so      "
   Case 2 : Lcd " aha            "
   Case 3
      Locate 3 , 1
      Lcd " Y-Zaehler="
      For Flag_y = 0 To 255
         Str_temp = Str(flag_y)
         Str_temp = Format(str_temp , "000")
         Locate 3 , 13 : Lcd Str_temp
         Waitms 100
      Next Flag_y
   Case 4
      Locate 3 , 1
      Lcd " X-Zaehler="
      For Flag_x = 255 To 0 Step -1
         Str_temp = Str(flag_x)
         Str_temp = Format(str_temp , "000")
         Locate 3 , 13 : Lcd Str_temp
         Waitms 100
      Next Flag_x
   Case 5
      Locate 4 , 1
      Lcd "Z-Zaehler= "
      For Flag_z = 0 To 65535
         Str_temp = Str(flag_z)
         Str_temp = Format(str_temp , "00000")
         Locate 4 , 12 : Lcd Str_temp
         Waitms 10
      Next Flag_z
   Case 6
      Locate 2 , 1 : Lcd "                "
      Locate 3 , 1 : Lcd "                "
      Locate 4 , 1 : Lcd "                "
End Select



Waitms 100
Bitwait Pind.4 , Set

If Y < 6 Then
   Incr Y
Else
   Y = 0
End If


Return

'********************************

Sectic:
Toggle Portd.0
Sec_flag = 0

Return



Eine Rückmeldung, wie du damit klar gekommen bist und ob es für dich nachvollziehbar war, wird natürlich gern gesehen .......bzw. gelesen. :)


Grüße,
Cassio :ciao:
 

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