Uhr mit LCD Display funktioniert nicht

OP #3302962
Lesenswert?

Hallo,

ich hab dieses Projekt nachgebaut (als Einstieg mit einem LCD Display).

http://www.pro-qwerty.com/lcd_clock.php

Verwendet wird ein HD44780 kompatibles Display.

Ich verwende das TC1602E-01(auch HD44780 kompatibel). Aber es zeigt 
nichts auf dem Display an außer die erste Zeile alles Pixel. Es wird ein 
Quarz 8MHZ verwendet. Ich hab nur ein 10MHZ. Es sollte auch ohne gehen. 
Das zumindest was angezeigt wird.

Oder muss am Quellcode was verändert werden?
OP #3303276
Lesenswert?

Ich verwende jetzt das 4MHZ Quarz und habe die Zeile geändert nach:

$crystal = 4000000

Jetzt muss ja di e Uhr auch anders takten. Also 1024/2=512



$crystal = 4000000
$baud = 19200

Declare Sub Lover_text()

Config Pind.2 = Input
Config Pind.3 = Input
Config Pind.4 = Input
Config Pind.6 = Output
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portd.6 = 0

Dim A As Integer
Dim Secounds As Byte
Dim Minutes As Byte
Dim Hours As Byte
Let Secounds = 0
Let Minutes = 0
Let Hours = 0
Let A = 0

Config Lcd = 16 * 2
Deflcdchar 0 , 32 , 21 , 14 , 4 , 4 , 10 , 17 , 17          ' replace ? 
with number (0-7)
Deflcdchar 1 , 32 , 4 , 14 , 14 , 14 , 4 , 4 , 4            ' replace ? 
with number (0-7)

Config Timer1 = Timer , Prescale = 1024
On Ovf1 Tim1_isr
Load Timer1 , 7812


Ändere ich jetzt die Zeile
>Config Timer1 = Timer , Prescale = 1024

nach

Config Timer1 = Timer , Prescale = 512

so meldet Bascom den Fehler:

Error 96, Line 33: Prescale value must be 1, 8, 64, 256 or 1024


Also kann ich nur ein 8MHZ, ein 2MHZ usw. verwenden.

Wie kann ich das jetzt umschreiben, sodas ich ein 4MHZ Quarz nehmen 
kann.

Ich hätte auch noch ein 10 und 15MHZ Quarz...
Gast #3303366
Lesenswert?

Nein im Code passt du die Frequenz an deinen Quarz an.

Damit die Sekunde wieder eine Sekunde hat musst du das Vorbesetzen des 
Timers ändern auf einen Wert der zu deinem Quarz passt.

...
Tim1_isr:
   Load Timer1 , 7812

...
#3305530
Lesenswert?

Ich (auch Anfänger) habe diese Uhr jetzt nachgebaut. Ich finde das ein 
prima Testprojekt, man kann einiges probieren und lernen. Bei mir läuft 
es auf Mega 8 mit 9.830400 MHz, das teilt sich günstig mit Timer= 9600, 
und die Bauds stimmen auch.
Ich hätte nur gerne die Anzeige so wie bei einer Uhr üblich, d.h. 
rechtsbündig und mit Vornull bei Minute und Sekunde. Ich hab schon 
einiges versucht, aber noch keinen Durchbruch :)
Joachim
#3311614
Lesenswert?

Also wenn Du garnichts siehst, liegt das nicht an der Quarzfrequenz, 
damit ändert sich nur die Zeit.
Hast Du schon alle Anschlüsse am LCD nachgeprüft?
Kannst Du mit dem Kontrastregler von ganz hell bis zu lauter schwarzen 
Quadraten einstellen?
Hast Du Pin5 (R/W) an GND angeschlossen?
Mehr fällt mir erstmal nicht ein.
Joachim
OP #3311739
Lesenswert?

Simon R. schrieb:
> J. H. schrieb:
>> Hast Du Pin5 (R/W) an GND angeschlossen?
>
> Nein, laut Schaltplan wird Pin 5 nirgends angeschlossen...

Okay die Uhr funktioniert jetzt einwandfrei, bis auf das Quarz.

Retnuoc schrieb:
> Nein im Code passt du die Frequenz an deinen Quarz an.
>
> Damit die Sekunde wieder eine Sekunde hat musst du das Vorbesetzen des
> Timers ändern auf einen Wert der zu deinem Quarz passt.
>
> ...
> Tim1_isr:
>    Load Timer1 , 7812
>
> ...

Ich verstehe das nicht ganz. Muss ich die 7812 durch 2 teilen? Ich will 
ein 4MHZ Quarz nutzen...
#3312145
Lesenswert?

Ich habe die Uhr testweise mit Quarzen von 3 bis 20 MHZ betrieben, nach 
dem ändern des Timer-Startwertes ging es immer ohne Fehler.
Die 200ms stellen sich doch durch die Angabe der Frequenz in "$crystal" 
richtig ein(?).
Den Timer-Startwert ermittelt man durch 
=Quarzfrequenz/Prescalewert(1024).
Bloß für mein Problem - die vorlaufenden Nullen - hab ich noch immer 
keine Lösung. Vielleicht weiß einer was.
Ich hab mal meine Version der Uhr angehängt.
Joachim
Angehängte Dateien:
OP #3312390
Lesenswert?

J. H. schrieb:
> Den Timer-Startwert ermittelt man durch
> =Quarzfrequenz/Prescalewert(1024).

Das heißt, wenn ich ein 4MHZ Quarz nutzen will, muss ich einfach die 
4000000/1024 machen? Ich hätte dann 3906,25.

Ich schreibe also:

>$crystal = 4000000

>Load Timer1 , 3906

und bei Zeile 80...

Aber was passiert mit den ,25 (3906,25)? Wird die Uhr dann ungenau?
Bei 8MHZ wären ja noch ,5 übrig (7812,5)
OP #3312439
Lesenswert?

Ich hab das jetzt mal so geschrieben:

$crystal = 4000000
$baud = 19200

Declare Sub Lover_text()

Config Pind.2 = Input
Config Pind.3 = Input
Config Pind.4 = Input
Config Pind.6 = Output
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portd.6 = 0

Dim A As Integer
Dim Secounds As Byte
Dim Minutes As Byte
Dim Hours As Byte
Let Secounds = 0
Let Minutes = 0
Let Hours = 0
Let A = 0

Config Lcd = 16 * 2
Deflcdchar 0 , 32 , 21 , 14 , 4 , 4 , 10 , 17 , 17          ' replace ? 
with number (0-7)
Deflcdchar 1 , 32 , 4 , 14 , 14 , 14 , 4 , 4 , 4            ' replace ? 
with number (0-7)

Config Timer1 = Timer , Prescale = 64
On Ovf1 Tim1_isr
Load Timer1 , 3036

Setclock:
Disable Interrupts
Let Secounds = 0
Cls

Cursor On Blink

Lcd "Time: "
Lowerline
Lcd "Set Clock!"
Locate 1 , 9
Lcd ":"
Locate 1 , 12
Lcd "."


Do
  If Pind.3 = 0 Then
      Minutes = Minutes + 1
      If Minutes = 60 Then Minutes = 0
      Waitms 200
   End If
   If Pind.2 = 0 Then
      Hours = Hours + 1
      If Hours = 24 Then Hours = 0
      Waitms 200
   End If
   If Pind.4 = 0 Then Exit Do
   Locate 1 , 7
   Lcd "  "
   Locate 1 , 7
   Lcd Hours
   Locate 1 , 10
   Lcd "  "
   Locate 1 , 10
   Lcd Minutes
   Locate 1 , 13
   Lcd "  "
   Locate 1 , 13
   Lcd Secounds
   Waitms 50
Loop


Enable Timer1
Enable Interrupts

Cursor Off Noblink

Call Lover_text()

Do
  Toggle Portd.6
  Waitms 100
  If Pind.4 = 0 Then
      Waitms 10
      While Pind.4 = 0
         Nop
      Wend
      Goto Setclock
  End If
Loop

Tim1_isr:
   Load Timer1 , 3036

   If Secounds = 60 Then
      Secounds = 0
      Minutes = Minutes + 1
      If Minutes = 60 Then
         Minutes = 0
         Locate 1 , 10
         Lcd "  "
         Hours = Hours + 1
         If Hours = 24 Then
            Hours = 0
            Locate 1 , 7
            Lcd "  "
            Call Lover_text()
            nop
            nop
         End If
      End If
   End If

   Locate 1 , 7
   Lcd Hours
   Locate 1 , 10
   Lcd Minutes
   Locate 1 , 13
   Lcd "  "
   Locate 1 , 13
   Lcd Secounds

   Locate 1 , 16
   If A = 0 Then
      Lcd Chr(0)
      A = 1
   Elseif A = 1 Then
      Lcd Chr(1)
      A = 0
   End If
   Secounds = Secounds + 1
Return

End


Sub Lover_text()
   Locate 2 , 0
   Lcd "   Hello Simon  "
End Sub


Die Uhr läuft zehnmahl so schnell...
#3312443
Lesenswert?

Hallo Thomas!
Wie kommst Du auf diese Zahl?
Ich hab das gleich mal ausprobiert, da geht die Post ab! Die Sekunden 
sind garnicht mehr zu sehen, die Minuten laufen fast im Sekundentakt :)
Nach der Formel soll der Timerstartwert 62500 sein. Hab ich 
reingeschrieben, alles wieder OK!

@ Simon:
Glatte Quarzfrequenzen geben meistens ungerade Teilerwerte, ich hab in 
der Kiste einen 9,8304 MHz gefunden, der muß auch in was seriellem drin 
gewesen sein, wegen der Baudrate.
Die Datei mußte ich nochmal überarbeiten, da war ein Fehler drin ;) 
Deshalb nochmal.
Joachim
Angehängte Dateien:
OP #3312537
Lesenswert?

Das wäre der Code:

   '  - -  -   - - - - - - - - - - - - - - - - - - - - - - - - - - -
'Made by Szymon Dyja
'from www.pro-qwerty.com
''  - -  -   - - - - - - - - - - - - - - - - - - - - - - - - - -

$crystal = 4000000
$baud = 19200

Declare Sub Lover_text()

Config Pind.2 = Input
Config Pind.3 = Input
Config Pind.4 = Input
Config Pind.6 = Output
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portd.6 = 0

Dim A As Integer
Dim Secounds As Byte
Dim Minutes As Byte
Dim Hours As Byte
Let Secounds = 0
Let Minutes = 0
Let Hours = 0
Let A = 0

Config Lcd = 16 * 2
Deflcdchar 0 , 32 , 21 , 14 , 4 , 4 , 10 , 17 , 17          ' replace ? 
with number (0-7)
Deflcdchar 1 , 32 , 4 , 14 , 14 , 14 , 4 , 4 , 4            ' replace ? 
with number (0-7)

Config Timer1 = Timer , Prescale = 64
On Ovf1 Tim1_isr
Load Timer1 , 62500

Setclock:
Disable Interrupts
Let Secounds = 0
Cls

Cursor On Blink

Lcd "Time: "
Lowerline
Lcd "Set Clock!"
Locate 1 , 9
Lcd ":"
Locate 1 , 12
Lcd "."


Do
  If Pind.3 = 0 Then
      Minutes = Minutes + 1
      If Minutes = 60 Then Minutes = 0
      Waitms 200
   End If
   If Pind.2 = 0 Then
      Hours = Hours + 1
      If Hours = 24 Then Hours = 0
      Waitms 200
   End If
   If Pind.4 = 0 Then Exit Do
   Locate 1 , 7
   Lcd "  "
   Locate 1 , 7
   Lcd Hours
   Locate 1 , 10
   Lcd "  "
   Locate 1 , 10
   Lcd Minutes
   Locate 1 , 13
   Lcd "  "
   Locate 1 , 13
   Lcd Secounds
   Waitms 50
Loop


Enable Timer1
Enable Interrupts

Cursor Off Noblink

Call Lover_text()

Do
  Toggle Portd.6
  Waitms 100
  If Pind.4 = 0 Then
      Waitms 10
      While Pind.4 = 0
         Nop
      Wend
      Goto Setclock
  End If
Loop

Tim1_isr:
   Load Timer1 , 62500

   If Secounds = 60 Then
      Secounds = 0
      Minutes = Minutes + 1
      If Minutes = 60 Then
         Minutes = 0
         Locate 1 , 10
         Lcd "  "
         Hours = Hours + 1
         If Hours = 24 Then
            Hours = 0
            Locate 1 , 7
            Lcd "  "
            Call Lover_text()
            nop
            nop
         End If
      End If
   End If

   Locate 1 , 7
   Lcd Hours
   Locate 1 , 10
   Lcd Minutes
   Locate 1 , 13
   Lcd "  "
   Locate 1 , 13
   Lcd Secounds

   Locate 1 , 16
   If A = 0 Then
      Lcd Chr(0)
      A = 1
   Elseif A = 1 Then
      Lcd Chr(1)
      A = 0
   End If
   Secounds = Secounds + 1
Return

End


Sub Lover_text()
   Locate 2 , 0
   Lcd "   Hello Simon  "
End Sub
OP #3312559
Lesenswert?

Wenn ich also schreibe:

    '  - -  -   - - - - - - - - - - - - - - - - - - - - - - - - - - 
-
'Made by Szymon Dyja
'from www.pro-qwerty.com
''  - -  -   - - - - - - - - - - - - - - - - - - - - - - - - - -
$regfile = "2313def.dat"
$crystal = 4000000
$baud = 19200
$hwstack = 32
$swstack = 10
$framesize = 40

Declare Sub Lover_text()

Config Pind.2 = Input
Config Pind.3 = Input
Config Pind.4 = Input
Config Pind.6 = Output
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portd.6 = 0

Dim A As Integer
Dim Secounds As Byte
Dim Minutes As Byte
Dim Hours As Byte
Let Secounds = 0
Let Minutes = 0
Let Hours = 0
Let A = 0

Config Lcd = 16 * 2
Deflcdchar 0 , 32 , 21 , 14 , 4 , 4 , 10 , 17 , 17          ' replace ? 
with number (0-7)
Deflcdchar 1 , 32 , 4 , 14 , 14 , 14 , 4 , 4 , 4            ' replace ? 
with number (0-7)

Config Timer1 = Timer , Prescale = 64
On Timer1 Tim1_isr

do

Loop



Tim1_isr:
Incr Count
Timer1 = 3036
Return



Setclock:
Disable Interrupts
Let Secounds = 0
Cls

Cursor On Blink

Lcd "Time: "
Lowerline
Lcd "Set Clock!"
Locate 1 , 9
Lcd ":"
Locate 1 , 12
Lcd "."


Do
  If Pind.3 = 0 Then
      Minutes = Minutes + 1
      If Minutes = 60 Then Minutes = 0
      Waitms 200
   End If
   If Pind.2 = 0 Then
      Hours = Hours + 1
      If Hours = 24 Then Hours = 0
      Waitms 200
   End If
   If Pind.4 = 0 Then Exit Do
   Locate 1 , 7
   Lcd "  "
   Locate 1 , 7
   Lcd Hours
   Locate 1 , 10
   Lcd "  "
   Locate 1 , 10
   Lcd Minutes
   Locate 1 , 13
   Lcd "  "
   Locate 1 , 13
   Lcd Secounds
   Waitms 50
Loop


Enable Timer1
Enable Interrupts

Cursor Off Noblink

Call Lover_text()

Do
  Toggle Portd.6
  Waitms 100
  If Pind.4 = 0 Then
      Waitms 10
      While Pind.4 = 0
         Nop
      Wend
      Goto Setclock
  End If
Loop

Tim1_isr:
   Load Timer1 , 3036

   If Secounds = 60 Then
      Secounds = 0
      Minutes = Minutes + 1
      If Minutes = 60 Then
         Minutes = 0
         Locate 1 , 10
         Lcd "  "
         Hours = Hours + 1
         If Hours = 24 Then
            Hours = 0
            Locate 1 , 7
            Lcd "  "
            Call Lover_text()
            nop
            nop
         End If
      End If
   End If

   Locate 1 , 7
   Lcd Hours
   Locate 1 , 10
   Lcd Minutes
   Locate 1 , 13
   Lcd "  "
   Locate 1 , 13
   Lcd Secounds

   Locate 1 , 16
   If A = 0 Then
      Lcd Chr(0)
      A = 1
   Elseif A = 1 Then
      Lcd Chr(1)
      A = 0
   End If
   Secounds = Secounds + 1
Return

End


Sub Lover_text()
   Locate 2 , 0
   Lcd "   Hello Simon  "
End Sub




Meldet er Fehler siehe Bild......
Angehängte Dateien:
OP #3312596
Lesenswert?

Ich habe jetzt geschrieben:
1
    ' * - - * - * * - - - - - - - - - - - - - - - - - - - - - - - - - - -
2
'Made by Szymon Dyja
3
'from www.pro-qwerty.com
4
'' * - - * - * * - - - - - - - - - - - - - - - - - - - - - - - - - -
5
$regfile = "2313def.dat"
6
$crystal = 4000000
7
$baud = 19200
8
$hwstack = 32
9
$swstack = 10
10
$framesize = 40
11

12

13
Declare Sub Lover_text()
14

15
Config Pind.2 = Input
16
Config Pind.3 = Input
17
Config Pind.4 = Input
18
Config Pind.6 = Output
19
Portd.2 = 1
20
Portd.3 = 1
21
Portd.4 = 1
22
Portd.6 = 0
23

24
Dim A As Integer
25
Dim Secounds As Byte
26
Dim Minutes As Byte
27
Dim Hours As Byte
28
Let Secounds = 0
29
Let Minutes = 0
30
Let Hours = 0
31
Let A = 0
32

33
Config Lcd = 16 * 2
34
Deflcdchar 0 , 32 , 21 , 14 , 4 , 4 , 10 , 17 , 17          ' replace ? with number (0-7)
35
Deflcdchar 1 , 32 , 4 , 14 , 14 , 14 , 4 , 4 , 4            ' replace ? with number (0-7)
36

37
Config Timer1 = Timer , Prescale = 64
38
On Timer1 Tim1_isr
39

40
do
41

42
Loop
43

44

45
Setclock:
46
Disable Interrupts
47
Let Secounds = 0
48
Cls
49

50
Cursor On Blink
51

52
Lcd "Time: "
53
Lowerline
54
Lcd "Set Clock!"
55
Locate 1 , 9
56
Lcd ":"
57
Locate 1 , 12
58
Lcd "."
59

60

61
Do
62
  If Pind.3 = 0 Then
63
      Minutes = Minutes + 1
64
      If Minutes = 60 Then Minutes = 0
65
      Waitms 200
66
   End If
67
   If Pind.2 = 0 Then
68
      Hours = Hours + 1
69
      If Hours = 24 Then Hours = 0
70
      Waitms 200
71
   End If
72
   If Pind.4 = 0 Then Exit Do
73
   Locate 1 , 7
74
   Lcd "  "
75
   Locate 1 , 7
76
   Lcd Hours
77
   Locate 1 , 10
78
   Lcd "  "
79
   Locate 1 , 10
80
   Lcd Minutes
81
   Locate 1 , 13
82
   Lcd "  "
83
   Locate 1 , 13
84
   Lcd Secounds
85
   Waitms 50
86
Loop
87

88

89
Enable Timer1
90
Enable Interrupts
91

92
Cursor Off Noblink
93

94
Call Lover_text()
95

96
Do
97
  Toggle Portd.6
98
  Waitms 100
99
  If Pind.4 = 0 Then
100
      Waitms 10
101
      While Pind.4 = 0
102
         Nop
103
      Wend
104
      Goto Setclock
105
  End If
106
Loop
107

108
Tim1_isr:
109
   Load Timer1 , 3036
110

111
   If Secounds = 60 Then
112
      Secounds = 0
113
      Minutes = Minutes + 1
114
      If Minutes = 60 Then
115
         Minutes = 0
116
         Locate 1 , 10
117
         Lcd "  "
118
         Hours = Hours + 1
119
         If Hours = 24 Then
120
            Hours = 0
121
            Locate 1 , 7
122
            Lcd "  "
123
            Call Lover_text()
124
            nop
125
            nop
126
         End If
127
      End If
128
   End If
129

130
   Locate 1 , 7
131
   Lcd Hours
132
   Locate 1 , 10
133
   Lcd Minutes
134
   Locate 1 , 13
135
   Lcd "  "
136
   Locate 1 , 13
137
   Lcd Secounds
138

139
   Locate 1 , 16
140
   If A = 0 Then
141
      Lcd Chr(0)
142
      A = 1
143
   Elseif A = 1 Then
144
      Lcd Chr(1)
145
      A = 0
146
   End If
147
   Secounds = Secounds + 1
148
Return
149

150
End
151

152

153
Sub Lover_text()
154
   Locate 2 , 0
155
   Lcd "   Hello Simon  "
156
End Sub

Das Display zeigt nur ein komisches Zeichen an...
#3312785
Lesenswert?

Ich habe jetzt das ganze auf dem Steckbrett mit nem Tiny 2313 aufgebaut. 
Das läuft tadellos mit dem angehängten Programm. Ich habe aber die 
interne Taktquelle benutzt.
Getestet mit 1MHz, 4MHz und 8MHz. Das Programm habe ich etwas 
"verschlankt", und angehängt.
Wenn Du keinen groben Fehler beim Aufbau hast, müßte es auch bei Dir 
laufen.
Ich hatte zunächst Probleme mit dem LCD, weil die Leitungen doch 
ziemlich lang sind. Probiers aus!
Joachim

Edit: Deine Quarze sind alle nicht gut, weil sich immer was hinter dem 
Komma ergibt. Da ist die Abweichung schon absehbar.
Angehängte Dateien:
#3312875
Lesenswert?

Also hast Du doch nicht alles so gemacht wie ich.
Du hast den Prescaler auf 64, dazu gehört der Startwert 62500.
Das geht auch, habs eben probiert. Du hast aber jetzt einen sehr hohen 
Startwert, was Dir die Möglichkeit gibt, sehr fein die genaue Zeit 
einzustellen. Das müßte (Mit Quarz!) ziemlich genau werden! Ich versuch 
das mal. Einfach den Startwert etwas erhöhen/vermindern.
#3313000
Lesenswert?

Simon R. schrieb:
> Ich habe jetzt geschrieben:
>     '  - -  -   - - - - - - - - - - - - - - - - - - - - - - - - - -
> -
> 'Made by Szymon Dyja
> 'from www.pro-qwerty.com
> ''  - -  -   - - - - - - - - - - - - - - - - - - - - - - - - - -
> $regfile = "2313def.dat"

Was immer das auch für ein Device ist.
Das Regfile für einen Tiny 2313 heisst

$regfile = "attiny2313.dat"
OP #3313523
Lesenswert?

Karl Heinz Buchegger schrieb:
> E2 ist interner Oszillator
>
>> aber jedoch ungenau...
>
> Logisch ist der ungenau. Deswegen benutzt man ja Quarze.

Okay, das heißt ich muss beim flashen E2 nicht wählen.
Aber wieso läuft die Uhr immmer weiter auch wenn ich kein Quarz an den 
Tiny stecke. Mir kommt es so vor, als ob immer noch der interen 
Oszillator verwendet wird. Die Uhr müsste doch anhalten...
#3313643
Lesenswert?

Simon R. schrieb:
> Karl Heinz Buchegger schrieb:
>> E2 ist interner Oszillator
>>
>>> aber jedoch ungenau...
>>
>> Logisch ist der ungenau. Deswegen benutzt man ja Quarze.
>
> Okay, das heißt ich muss beim flashen E2 nicht wählen.
> Aber wieso läuft die Uhr immmer weiter auch wenn ich kein Quarz an den
> Tiny stecke. Mir kommt es so vor, als ob immer noch der interen
> Oszillator verwendet wird. Die Uhr müsste doch anhalten...

welchen Teil von
"E2 ist der interne Oszillator"
hast du nicht verstanden?

interner Oszillator heißt 'Dein Quarz ist schmückendes Beiwerk, wird 
aber nicht benutzt'.
Und damit kannst du den selbstverständlich abziehen oder anstecken, wie 
du lustig bist. Nicht benutzt ist nicht benutzt und hat auch keine 
Auswirkungen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren