Forum: Mikrocontroller und Digitale Elektronik ATtiny DCF77 7-Segment Bascom Funkuhr und andere Tricks


von InkogNico (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Deutschland!

Ich habe bereits eine 7-Segment Multiplex-Uhr aufgebaut. Die Software 
war dabei von dieser großartigen Seite:
http://blackstrom.derschwarz.de/avr/avr_uhr/

Jetzt möchte ich die Uhr gerne mit DCF77 aufbauen. Der DCF77 Teil 
funktioniert, ich habe das bereits mit einem LCD getestet und die 
Status-Led blinkt im Takt...

Der Teil mit dem Multiplexen ist von http://blackstrom. Hat jemand eine 
Idee, wie man aus dem DCF77-Buffer die Stunden 1er und 10er rausbekommt? 
Ich kenne nur _hour...

Wenn ich im Quellcode feste Zahlen für die Werte angebe werden diese 
nicht angezeigt. Die Anzeige flackert nur... Wenn man viel Phantasie hat 
kann man GEGG lesen ;)

Hier der Code:
1
$regfile = "attiny2313.dat"
2
$crystal = 1000000
3
$swstack = 10
4
5
6
7
Config Dcf77 = Pind.0 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1 , Gosub = Sectic
8
Config Date = Dmy , Separator = .
9
Enable Interrupts
10
11
Config Portd.6 = Output                                     'PORTD.6 Led Dcf_status.0
12
Config Portb = Output                                       'Port B Ausgang
13
Ddrd = &B1011110
14
15
Led_dcf Alias Portd.6                                       'Pinb.0 Led Dcf_status.0
16
Segment_a Alias Portb.0
17
Segment_b Alias Portb.1
18
Segment_c Alias Portb.2
19
Segment_d Alias Portb.3
20
Segment_e Alias Portb.4
21
Segment_f Alias Portb.5
22
Segment_g Alias Portb.6
23
Dezimalpunkt Alias Portb.7
24
Ziffer_1 Alias Portd.1
25
Ziffer_2 Alias Portd.2
26
Ziffer_3 Alias Portd.3
27
Ziffer_4 Alias Portd.4
28
29
Dim Neue_sekunde As Bit
30
31
32
33
Dim Temp_ziffer As Byte                                     'welche ziffer soll bearbeitet werden
34
Dim Bcd_aus As Byte                                         'enthält den Wert der dez zahl die ausgegeben werden soll
35
36
Dim Ausgang As Byte                                         'Segmentfolge die Ausgegeben wird aus Segmentcode - Tabelle
37
Dim Sek_blink As Bit                                        'Blinkt im Sekunden Takt
38
39
40
41
42
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
43
' Timer0 für Multiplexausgabe
44
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
45
46
On Timer0 7segment                                          'Interrupt-Routine für Timer0-Overflow
47
Config Timer0 = Timer , Prescale = 64                       'Takt: Quarz/Prescale  (möglich: 1, 8, 64, 256, 1024)
48
Enable Timer0                                               'Timer0-Overflow-Interrupt einschalten
49
50
51
52
53
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
54
' Hauptprogramm
55
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
56
57
58
Do                                                          'Start Hauptschleife
59
Led_dcf = Dcf_status.0                                      'blinkt bei DCF77 empfang
60
61
'If Neue_sekunde = 1 Then
62
'Neue_sekunde = 0
63
'Gosub Anzeige
64
'End If
65
66
67
68
' ### Uhren Code ###
69
' Es wird für jede Ziffer einzelnd gezählt, das ermöglicht eine einfacher ausgabe
70
' auf den 7segmentanzeigen. Der Zählvorgang funktioniert ím prinzip wie z.B.
71
' bei einem normalen Logik Zähler-IC
72
73
74
75
76
77
78
79
80
81
Loop                                                        'Ende Hauptschleife
82
83
End                                                         'Programm Ende
84
85
86
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
87
' Interrupt-Routine für Ziffer ausgabe im 7 Segmentcode
88
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
89
' Bei jedem Aufruf wir nur eine Ziffer ausgegeben, d.h nur eine Anzeige wird
90
' angesteuert. Die anderen bleiben dunkel. Bei jedem Aufruf wird eine Anzeige
91
' weitergeschaltet.
92
'
93
' Anzeigen anordnung
94
'
95
' 1111  2222   3333  4444
96
' 1  1  2  2   3  3  4  4
97
' 1111  2222   3333  4444
98
' 1  1  2  2   3  3  4  4
99
' 1111o 2222o  3333o 4444o
100
'
101
'                        ^-- Dezimalpunkt
102
'                      ^---- 4. Ziffer | Minute Low Wert  | Variable Zl_minute
103
'                ^---------- 3. Ziffer | Minute High Wert | Variable Zh_minute
104
'         ^----------------- 2. Ziffer | Stunde Low Wert  | Variable Zl_stunde
105
'   ^----------------------- 1. Ziffer | Stunde High Wert | Variable Zh_stunde
106
107
108
7segment:
109
110
If Temp_ziffer = 4 Then Temp_ziffer = 0                     'bestimmt die auszugebende Ziffer (1 bis 4)
111
Incr Temp_ziffer                                            'bei jedem aufruf des Lable wir eine andere Ziffer ausgegeben
112
113
114
Portb = &B11111111                                          'Alle Ziffern aus, ansonsten gibt es "Geister" Anzeigen
115
116
117
Select Case Temp_ziffer                                     'welche Ziffer soll angesteuert werden
118
   Case 1 : Ziffer_1 = 1                                    '1. Ziffer
119
            Ziffer_2 = 0
120
            Ziffer_3 = 0
121
            Ziffer_4 = 0
122
            Bcd_aus = 1                                     '_hour
123
   Case 2 : Ziffer_1 = 0                                    '2. Ziffer
124
            Ziffer_2 = 1
125
            Ziffer_3 = 0
126
            Ziffer_4 = 0
127
            Dezimalpunkt = Sek_blink                        'Dezimalpunkt
128
            Bcd_aus = 2                                     '_hour
129
   Case 3 : Ziffer_1 = 0                                    '3. Ziffer
130
            Ziffer_2 = 0
131
            Ziffer_3 = 1
132
            Ziffer_4 = 0
133
            Bcd_aus = 3                                     '_min
134
   Case 4 : Ziffer_1 = 0                                    '4. Ziffer
135
            Ziffer_2 = 0
136
            Ziffer_3 = 0
137
            Ziffer_4 = 1
138
            Bcd_aus = 4                                     '_min
139
End Select
140
141
142
'Ermittelt aus der Segmentfolge-Tabelle den 7 Segmentcode für die auszugebende Zahl
143
Select Case Bcd_aus
144
    Case 1 : Ausgang = Lookup(1 , Segmentfolge)
145
    Case 2 : Ausgang = Lookup(2 , Segmentfolge)
146
    Case 3 : Ausgang = Lookup(3 , Segmentfolge)
147
    Case 4 : Ausgang = Lookup(4 , Segmentfolge)
148
    Case 5 : Ausgang = Lookup(5 , Segmentfolge)
149
    Case 6 : Ausgang = Lookup(6 , Segmentfolge)
150
    Case 7 : Ausgang = Lookup(7 , Segmentfolge)
151
    Case 8 : Ausgang = Lookup(8 , Segmentfolge)
152
    Case 9 : Ausgang = Lookup(9 , Segmentfolge)
153
    Case 0 And Temp_ziffer = 1 : Ausgang = Lookup(10 , Segmentfolge)       'Nullstellenunterdrückung  bei der ersten Ziffer
154
    Case 0 And Temp_ziffer > 1 : Ausgang = Lookup(0 , Segmentfolge)       'wenn nicht erste Ziffer Null anzeigen
155
End Select
156
157
158
'Ausgabe des 7 Segmentcodes (Invertierend [Not] bei Anz. mit gem. Anode)
159
Segment_a = Not Ausgang.0                                   'Segment A
160
Segment_b = Not Ausgang.1                                   'Segment B
161
Segment_c = Not Ausgang.2                                   'Segment C
162
Segment_d = Not Ausgang.3                                   'Segment D
163
Segment_e = Not Ausgang.4                                   'Segment E
164
Segment_f = Not Ausgang.5                                   'Segment F
165
Segment_g = Not Ausgang.6                                   'Segment G
166
167
168
Return
169
170
171
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
172
' Interrupt-Routine für Timer1 / Zeitbasis
173
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
174
175
176
177
178
179
180
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
181
' 7 Segmentcode - Tabelle
182
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
183
'
184
' --A--
185
' |   |
186
' F   B
187
' |   |
188
' --G--
189
' |   |
190
' E   C
191
' |   |
192
' --D--
193
194
195
Segmentfolge:                                               'GFEDCBA / "1" Segment AN
196
Data &B0111111                                              '0
197
Data &B0000110                                              '1
198
Data &B1011011                                              '2
199
Data &B1001111                                              '3
200
Data &B1100110                                              '4
201
Data &B1101101                                              '5
202
Data &B1111101                                              '6
203
Data &B0000111                                              '7
204
Data &B1111111                                              '8
205
Data &B1101111                                              '9
206
Data &B0000000                                              'leeres Feld (zur Nullstellenunterdrückung)
207
208
209
Sectic:
210
Neue_sekunde = 1
211
Toggle Sek_blink                                            'Ändert sich jede Sek., 1sec an 1sec aus
212
Return

: Gesperrt durch User
von Wilhelm S. (wilhelmdk4tj)


Lesenswert?

Hallo  InkogNico,

wie du die Zeit auf deine 7-Segmentanzeige bekommst, scheint
ja zu klappen. Die Sekundenimpulse aus der DCF77-Uhr sind ja auch
da, aber das reicht nicht; du musst das komplette DCF-Signal
dekodieren!

Geh mal auf die I-Seite von DH2FAA. Er beschreibt dort eine
DCF-Uhr mit einem Pollin-Modul (810 054) und einem 2313; zusätzlich
gibt es einen Umbau des Pollin-Spiels (810 148) zu einer Uhr.
Der Code ist ähnlich um nicht zusagen fast gleich.

Sieh dir den Quellcode an. Bestechend einfach, kurz und knapp.
Funzt prima. Ich habe damit die Steuerung eines Bakensenders
realiesiert. Andere Versuche mit Beispielcode aus der Bascom-Help
und vielen Beispielen aus dem Net und 'schlauen' Büchern haben
mich nicht weiter gebracht.

Noch vergessen zu erwähnen: Für die Bake brauche ich keine Anzeige
der Zeit. Zu Testzwecken kann ich mir aber die Zeit entweder
über RS232 oder ein externes I2C-Modul anzeigen lassen.
Dann sollte das doch auch mit deinen 7-Segmentanzeigen
funktionieren.

Zu dem Pollin DCF-Modul gibt es in diesem Forum viele Beiträge.
Erst suchen, bevor du Fragen stellst......


73
Wilhelm

: Bearbeitet durch User
von InkogNico (Gast)


Angehängte Dateien:

Lesenswert?

Vielen Dank, Wilhelm!
Das ist die Seite hier: http://www.dh2faa.de/
ist auch sehr interessant - aber mit dem LCD, das hab ich schon gemacht! 
Bei mir geht es um Aufteilen von 10ern und 1ern und Multiplexen!

von InkogNico (Gast)


Lesenswert?

'Konfiguration dcf-Empfang:
Config Dcf77 = Pind.0 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1 
, Gosub = Sectic
Config Date = Dmy , Separator = .
Enable Interrupts

'dcf Status LED an Portd.6
Led_dcf Alias Portd.6      'Pinb.0 Led Dcf_status.0
...
Do
Led_dcf = Dcf_status.0     'blinkt bei DCF77 empfang

Also das funktioniert bis hierhin! Ich habe in Frankfurt keine Probleme 
mit dem Empfang. Ich habe das Pollin Modul mit einem Spannungsteiler 
2,2K / 3,6K angeschlossen ohne Stabilisierungselko. Ich glaube der Elko 
auf dem Modul macht das.
Der Pon-Eingang (schaltet das Modul ein) ist in meiner Schaltung mit 10K 
gegen Masse. Das funktioniert mit einem LCD - nach 2 - 3 Minuten wird 
Zeit und Datum angezeigt...

mit _hour / _min kann man Stunden und Minuten extrahieren...
Kennt jemand eine Möglichkeit, 1er und 10er Minuten zu extrahieren?

von Oliver S. (magelan1979)


Lesenswert?

Damit ich das jetzt richtig verstehe. Du willst also aus z.B. einer 36 
eine 3 und eine 6 extrahieren ?

einser:= zahl modulo 10
zehner:= (zahl - einser) / 10

Kommt das in etwa dem gewünschtem nahe?

Gruß Ich

von InkogNico (Gast)


Lesenswert?

Ha!

MOD Calculates the remainder of a division.
also 22 MOD 10 = 2

_hour Mod 10

gibt die Stunden-Einer! Das geht auch prima durch!

(_hour -(_hour Mod 10)) / 10

das hier geht leider nicht durch: "reserved word may not be used"

von Oliver S. (magelan1979)


Lesenswert?

Wenn ich mich nicht irre, geht das in Bascom auch nicht. Ich meine, dass 
Du die einzelnen Berechnungen in Bascom aufeilen musst.


stundeEiner = _hour Mod 10
stundeZehner = _hour - stundeEiner
stundeZehner = stundeZehner / 10

Versuch es mal

Gruß Ich

von Paul Baumann (Gast)


Lesenswert?

Du wirst bestimmt die Formel "zersägen" müssen:

Hure = _hour mod 10
Hure = _hour - Hure
Hure = Hure / 10

MfG Paul

von InkogNico (Gast)


Lesenswert?

Schon gut, wenn man weiß, wiviel Hure es gerade hat =P
Es ist eine Mischung aus beidem geworden, die saubere Lösung ging nich - 
out of RAM!
Das mit den Huren müsste aber auch gehen! Ist es so, dass zuerst rechts 
ausgerechnet und dann links vom "=" neu zugeordnet wird? Er hats 
jedenfalls gefressen! 83% vom Speicher sind beschrieben =)
Jetzt muss ich mal schauen, wo das andere Problem liegt - es flackert 
nur!

Dim Stundezehner As Byte
Dim Minutezehner As Byte

...

Stundezehner = _hour Mod 10
Stundezehner = _hour - Stundezehner
Stundezehner = Stundezehner / 10

Minutezehner = _min Mod 10
Minutezehner = _min - Minutezehner
Minutezehner = Minutezehner / 10

Select Case Temp_ziffer    'welche Ziffer soll angesteuert werden
   Case 1 : Ziffer_1 = 1
            Ziffer_2 = 0
            Ziffer_3 = 0
            Ziffer_4 = 0
            Bcd_aus = Stundezehner
   Case 2 : Ziffer_1 = 0
            Ziffer_2 = 1
            Ziffer_3 = 0
            Ziffer_4 = 0
            Dezimalpunkt = Sek_blink
            Bcd_aus = _hour Mod 10
   Case 3 : Ziffer_1 = 0
            Ziffer_2 = 0
            Ziffer_3 = 1
            Ziffer_4 = 0
            Bcd_aus = Minutezehner
   Case 4 : Ziffer_1 = 0
            Ziffer_2 = 0
            Ziffer_3 = 0
            Ziffer_4 = 1
            Bcd_aus = _min Mod 10
End Select

von InkogNico (Gast)


Angehängte Dateien:

Lesenswert?

Irgendwas stimmt mit dem Multiplexen noch nicht... Es sieht fast so aus, 
als ob die Zahlen nacheinander ausgehen, wenn man langsam stellt (Timer 
hoch) kann man zusehen...

$regfile = "attiny2313.dat"
$crystal = 1000000
$swstack = 10



Config Dcf77 = Pind.0 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1 
, Gosub = Sectic
Config Date = Dmy , Separator = .
Enable Interrupts

Config Portb = Output                                       'Port B 
Ausgang
Ddrd = &B1011110

Led_dcf Alias Portd.6                                       'Pinb.0 Led 
Dcf_status.0
Segment_a Alias Portb.0
Segment_b Alias Portb.1
Segment_c Alias Portb.2
Segment_d Alias Portb.3
Segment_e Alias Portb.4
Segment_f Alias Portb.5
Segment_g Alias Portb.6
Dezimalpunkt Alias Portb.7
Ziffer_1 Alias Portd.1
Ziffer_2 Alias Portd.2
Ziffer_3 Alias Portd.3
Ziffer_4 Alias Portd.4

Dim Neue_sekunde As Bit

Dim Temp_ziffer As Byte                                     'welche 
ziffer soll bearbeitet werden
Dim Bcd_aus As Byte                                         'enthält den 
Wert der dez zahl die ausgegeben werden soll

Dim Ausgang As Byte 
'Segmentfolge die Ausgegeben wird aus Segmentcode - Tabelle
Dim Sek_blink As Bit                                        'Blinkt im 
Sekunden Takt

Dim Stundezehner As Byte
Dim Minutezehner As Byte


'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
++++++++
' Timer0 für Multiplexausgabe
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
++++++++

On Timer0 7segment 
'Interrupt-Routine für Timer0-Overflow
Config Timer0 = Timer , Prescale = 256                      'Takt: 
Quarz/Prescale  (möglich: 1, 8, 64, 256, 1024)
Enable Timer0 
'Timer0-Overflow-Interrupt einschalten




'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
++++++++
' Hauptprogramm
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
++++++++


Do                                                          'Start 
Hauptschleife
Led_dcf = Dcf_status.0                                      'blinkt bei 
DCF77 empfang




Loop                                                        'Ende 
Hauptschleife

End                                                         'Programm 
Ende


'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
++++++++
' Interrupt-Routine für Ziffer ausgabe im 7 Segmentcode
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
++++++++
' Bei jedem Aufruf wir nur eine Ziffer ausgegeben, d.h nur eine Anzeige 
wird
' angesteuert. Die anderen bleiben dunkel. Bei jedem Aufruf wird eine 
Anzeige
' weitergeschaltet.
'
' Anzeigen anordnung
'
' 1111  2222   3333  4444
' 1  1  2  2   3  3  4  4
' 1111  2222   3333  4444
' 1  1  2  2   3  3  4  4
' 1111o 2222o  3333o 4444o
'
'                        ^-- Dezimalpunkt
'                      ^---- 4. Ziffer | Minute Low Wert
'                ^---------- 3. Ziffer | Minute High Wert
'         ^----------------- 2. Ziffer | Stunde Low Wert
'   ^----------------------- 1. Ziffer | Stunde High Wert


7segment:

If Temp_ziffer = 4 Then Temp_ziffer = 0                     'bestimmt 
die auszugebende Ziffer (1 bis 4)
Incr Temp_ziffer                                            'bei jedem 
aufruf des Lable wir eine andere Ziffer ausgegeben


Portb = &B00000000                                          'Alle 
Ziffern aus, ansonsten gibt es "Geister" Anzeigen

Stundezehner = _hour Mod 10
Stundezehner = _hour - Stundezehner
Stundezehner = Stundezehner / 10

Minutezehner = _min Mod 10
Minutezehner = _min - Minutezehner
Minutezehner = Minutezehner / 10

Select Case Temp_ziffer                                     'welche 
Ziffer soll angesteuert werden
   Case 1 : Ziffer_1 = 1                                    '1. Ziffer
            Ziffer_2 = 0
            Ziffer_3 = 0
            Ziffer_4 = 0
            Bcd_aus = Stundezehner
   Case 2 : Ziffer_1 = 0                                    '2. Ziffer
            Ziffer_2 = 1
            Ziffer_3 = 0
            Ziffer_4 = 0
            Dezimalpunkt = Sek_blink 
'Dezimalpunkt
            Bcd_aus = _hour Mod 10
   Case 3 : Ziffer_1 = 0                                    '3. Ziffer
            Ziffer_2 = 0
            Ziffer_3 = 1
            Ziffer_4 = 0
            Bcd_aus = Minutezehner
   Case 4 : Ziffer_1 = 0                                    '4. Ziffer
            Ziffer_2 = 0
            Ziffer_3 = 0
            Ziffer_4 = 1
            Bcd_aus = _min Mod 10
End Select


'Ermittelt aus der Segmentfolge-Tabelle den 7 Segmentcode für die 
auszugebende Zahl
Select Case Bcd_aus
    Case 1 : Ausgang = Lookup(1 , Segmentfolge)
    Case 2 : Ausgang = Lookup(2 , Segmentfolge)
    Case 3 : Ausgang = Lookup(3 , Segmentfolge)
    Case 4 : Ausgang = Lookup(4 , Segmentfolge)
    Case 5 : Ausgang = Lookup(5 , Segmentfolge)
    Case 6 : Ausgang = Lookup(6 , Segmentfolge)
    Case 7 : Ausgang = Lookup(7 , Segmentfolge)
    Case 8 : Ausgang = Lookup(8 , Segmentfolge)
    Case 9 : Ausgang = Lookup(9 , Segmentfolge)
    Case 0 And Temp_ziffer = 1 : Ausgang = Lookup(10 , Segmentfolge) 
'Nullstellenunterdrückung  bei der ersten Ziffer
    Case 0 And Temp_ziffer > 1 : Ausgang = Lookup(0 , Segmentfolge) 
'wenn nicht erste Ziffer Null anzeigen
End Select


'Ausgabe des 7 Segmentcodes (Invertierend [Not] bei Anz. mit gem. Anode)
Segment_a = Ausgang.0                                       'Segment A
Segment_b = Ausgang.1                                       'Segment B
Segment_c = Ausgang.2                                       'Segment C
Segment_d = Ausgang.3                                       'Segment D
Segment_e = Ausgang.4                                       'Segment E
Segment_f = Ausgang.5                                       'Segment F
Segment_g = Ausgang.6                                       'Segment G


Return


'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
++++++++
' Interrupt-Routine für Timer1 / Zeitbasis
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
++++++++






'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
++++++++
' 7 Segmentcode - Tabelle
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
++++++++
'
' --A--
' |   |
' F   B
' |   |
' --G--
' |   |
' E   C
' |   |
' --D--


Segmentfolge:                                               'GFEDCBA / 
"1" Segment AN
Data &B0111111                                              '0
Data &B0000110                                              '1
Data &B1011011                                              '2
Data &B1001111                                              '3
Data &B1100110                                              '4
Data &B1101101                                              '5
Data &B1111101                                              '6
Data &B0000111                                              '7
Data &B1111111                                              '8
Data &B1101111                                              '9
Data &B0000000                                              'leeres Feld 
(zur Nullstellenunterdrückung)


Sectic:
Neue_sekunde = 1
Toggle Sek_blink                                            'Ändert sich 
jede Sek., 1sec an 1sec aus
Return

von Paul Baumann (Gast)


Lesenswert?

Wie sieht Deine Schaltung aus? Hast Du denn auch Anzeigen mit 
gemeinsamen
Anoden, wie der Mann im Originalbeitrag?

Das liest sich nämlich hier so, als ob das hier bei Dir die Segmente
genau falsch herum ansteuert, d.h. was aus sein muß leuchtet und um-
gekehrt.

MfG Paul

von InkogNico (Gast)


Lesenswert?

Jap! Ich hab ein Display mit gemeinsamer Kathode!

Segment_a = Ausgang.0                                       'Segment A
Segment_b = Ausgang.1                                       'Segment B
Segment_c = Ausgang.2                                       'Segment C
Segment_d = Ausgang.3                                       'Segment D
Segment_e = Ausgang.4                                       'Segment E
Segment_f = Ausgang.5                                       'Segment F
Segment_g = Ausgang.6                                       'Segment G

Das war vorher invertiert:
Segment_a = Not Ausgang.0                                       'Segment 
A
...

Kann sein, dass man noch was ändern muss!?

von Paul Baumann (Gast)


Lesenswert?

>Kann sein, dass man noch was ändern muss!?

Du hast doch Deine Schaltung vor Dir. Da siehst Du doch, ob Du H oder L
Pegel ausgeben mußt, um die Segmente zum Leuchten respektive die 
Transis-
toren zum Aufsteuern oder zum Sperren brauchst.

Spiel das mal im Schaltplan durch und gucke dann im Programm, ob die
Data-Zeilen dafür stimmen (und auch die Ansteuereung der 4 
Transistoren),
oder ob Du das entweder invertierend ausgeben mußt. Dann kannst Du aber
auch gleich die Tabelle richtig herum schreiben.

MfG Paul

von InkogNico (Gast)


Lesenswert?

Das ist hier gegeben:
Segment_a Alias Portb.0
Segment_b Alias Portb.1
Segment_c Alias Portb.2
Segment_d Alias Portb.3
Segment_e Alias Portb.4
Segment_f Alias Portb.5
Segment_g Alias Portb.6
Dezimalpunkt Alias Portb.7
Ziffer_1 Alias Portd.1
Ziffer_2 Alias Portd.2
Ziffer_3 Alias Portd.3
Ziffer_4 Alias Portd.4

Die Anzeige ist mit 680 Ohm Widerständen direkt an den Ports - mit 
dieser Anzeige braucht man keine Transistoren: 8 Segmente (mit Punkt) x 
5 mA sind 40 mA.

Ich verstehe nicht, wie das mit dem Timer und dem Multiplexen in der 
Schaltung funktioniert!
Unten sind nochmal die Segmente:

Segmentfolge:                                               'GFEDCBA /
"1" Segment AN
Data &B0111111                                              '0
Data &B0000110                                              '1
Data &B1011011                                              '2
Data &B1001111                                              '3
Data &B1100110                                              '4
Data &B1101101                                              '5
Data &B1111101                                              '6
Data &B0000111                                              '7
Data &B1111111                                              '8
Data &B1101111                                              '9
Data &B0000000                                              'leeres Feld
(zur Nullstellenunterdrückung)

Wurden doch schon oben zugewiesen!?

von MWS (Gast)


Lesenswert?

> Die Anzeige ist mit 680 Ohm Widerständen direkt an den Ports - mit
> dieser Anzeige braucht man keine Transistoren: 8 Segmente (mit Punkt)
> x 5 mA sind 40 mA.

Und auch kein Transistor für die Spalten? Also bekommt der Spaltenpin 
dann 40mA ab. Sic...

Wenn da nicht soviel Füllraum an Beschreibung und völlig unnötigem Zeugs 
stände, wäre evtl. der Zusammenhang klarer:
1
   Case 2 : Ziffer_1 = 0                                    '2. Ziffer
2
            Ziffer_2 = 1
3
            Ziffer_3 = 0
4
            Ziffer_4 = 0
5
            Dezimalpunkt = Sek_blink 
6
...
7
Data &B0111111                                              '0
Na, fällt der Groschen ?

Wo sind übrigens bei der Topic:

>  ATtiny DCF77 7-Segment Bascom Funkuhr und andere Tricks

die Tricks ?

Seh' hier keine Tricks, ist eigentlich nur wildes Rumgerudere, basierend 
auf gering inspiriertem Fremdcode.

Bei der Topic hätte ich eigentlich erwartet, dass der TO hier nützliche 
Information für andere Mitglieder präsentieren möchte. Liest man dann 
rein, ist's das völlige Gegenteil.

Das hier ist ja auch noch gruselig:
1
Select Case Bcd_aus
2
    Case 1 : Ausgang = Lookup(1 , Segmentfolge)
3
    Case 2 : Ausgang = Lookup(2 , Segmentfolge)
4
    Case 3 : Ausgang = Lookup(3 , Segmentfolge)
5
    Case 4 : Ausgang = Lookup(4 , Segmentfolge)
6
    Case 5 : Ausgang = Lookup(5 , Segmentfolge)
7
    Case 6 : Ausgang = Lookup(6 , Segmentfolge)
8
    Case 7 : Ausgang = Lookup(7 , Segmentfolge)
9
    Case 8 : Ausgang = Lookup(8 , Segmentfolge)
10
    Case 9 : Ausgang = Lookup(9 , Segmentfolge)
11
    Case 0 And Temp_ziffer = 1 : Ausgang = Lookup(10 , Segmentfolge) 
12
'Nullstellenunterdrückung  bei der ersten Ziffer
13
    Case 0 And Temp_ziffer > 1 : Ausgang = Lookup(0 , Segmentfolge) 
14
'wenn nicht erste Ziffer Null anzeigen
15
End Select
Das ließe sich mit einem Bruchteil an Code schreiben. Wo lernt man denn 
sowas?

von TdB Fan (Gast)


Lesenswert?

Ist Thomas schon wieder aus seinem Fernurlaub zurück?
Prog.Sprache stimmt! Durchblick stimmt! Er muß es sein!

von InkogNico (Gast)


Lesenswert?

Du hattest wohl schon lange keinen Sex mehr, was =P
Freut mich auf jeden Fall, das Dir mein Thread gefällt und vielen Dank 
für Deine Hilfe!
Nett, dass Du auch Deine Freunde mitbringst, dann könnt ihr Gurken ja n 
bisschen über das langweilige Internet lästern mit euerm super 
Gehirnschmalz. Pass nur auf, dass du mit deinem Kopf noch durch die Tür 
passt!

von MWS (Gast)


Lesenswert?

InkogNico schrieb:
> Du hattest wohl schon lange keinen Sex mehr, was =P
> Freut mich auf jeden Fall, das Dir mein Thread gefällt und vielen Dank
> für Deine Hilfe!
> Nett, dass Du auch Deine Freunde mitbringst, dann könnt ihr Gurken ja n
> bisschen über das langweilige Internet lästern mit euerm super
> Gehirnschmalz. Pass nur auf, dass du mit deinem Kopf noch durch die Tür
> passt!

Dummschwätzen liegt Dir sichtlich besser als Programmieren, Du solltest 
umsatteln. LOL

von InkogNico (Gast)


Lesenswert?

Ja, genau! Dann könnt ihr beiden hier euer Kaffekränzchen weitermachen!

von Paul Baumann (Gast)


Lesenswert?

@Inkog-Nico
Nicht porös machen lassen und nicht varrickt werden -das behebt die
Fehler nicht....

Du hast Anzeigen mit gemeinsamen Kathoden. Das bedeutet aber auch, daß
im schlimmsten Fall (wenn eine "8" angezeigt wird) der Pin, der die
Kathode schalten soll, 40mA liefern muß. Das ist aber zuviel -da sagt
der Kontroller bei Zeiten: "Ich geh kaputt!"
Setze 4 NPN-Transistoren rein, die die 4 Kathoden schalten. Da reichen
BC547 aus. Vergiss nicht, denen Basiswiderstände zu verpassen (nimm
1-10 KOHm), denn so wie in der Originalschaltung (Transitoren als
Emitterfolger) geht es mit Deinen Anzeigen nicht.

So, das bedeutet dann: Es sind NPN-Transistoren drin, die einen H-
Pegel benötigen, um angesteuert zu werden. Das heißt: Immer nur der
Transistor, der gerade die entsprechende Stelle der Anzeige ansteuert,
muß H-Pegel an der Basis haben -die anderen 3 Kollegen L-Pegel.

Jetzt geht die Überlegung weiter: Bei Deinen Anzeigen liegen die
Anoden am Kontroller. Das heißt: Es muß dort H-Pegel anliegen,
für die Segmente, die leuchten sollen, zum Bleistift bei einer "8"
alle 7 Ausgänge.

Jetzt kannst Du (nachdem Du die Transistoren eingesetzt hast)
(im Programm) nachgucken, ob die Pegel wirklich so sind, wie
sie sein müssen.

MfG Paul

von MWS (Gast)


Lesenswert?

InkogNico schrieb:
> Ja, genau! Dann könnt ihr beiden hier euer Kaffekränzchen
> weitermachen!

Hör mal, ich kann doch auch nicht dafür, dass Du geistig zu gering 
begabt bist, um den Inhalt meines Posts als Hilfe zu verstehen. Dir mag 
meine Kritik nicht gefallen haben, nichts desto trotz war's berechtigt 
und mit ein klein wenig Hirn hättest Du den Nutzen erkannt.

von InkogNico (Gast)


Lesenswert?

Das ganze soll halt für einen Freund sein, deshalb brauche ich auch 
Hilfe. Damit ich mich nicht schon wieder plamier.

von Mitleser (Gast)


Lesenswert?

Wenn MWS nichts mehr einfällt holt TdB..beim  MWST muss was falsch 
gepolt sein.

von Maxi (Gast)


Lesenswert?

Echt plamapel !

von MWS (Gast)


Lesenswert?

InkogNico schrieb:
> Das ganze soll halt für einen Freund sein, deshalb brauche ich
> auch
> Hilfe. Damit ich mich nicht schon wieder plamier.

Dann ist's kontraproduktiv die Helfer anzupflaumen, noch dazu ich Dir 
den Fehler Deiner Falschanzeige genannt habe. Bei Verwendung von 
Spaltentransistoren wäre der Code übrigens ok, da Transistoren das 
Spaltensignal invertieren.

von InkogNico (Gast)


Lesenswert?

MWS schrieb:
> InkogNico schrieb:
>> Das ganze soll halt für einen Freund sein, deshalb brauche ich
>> auch
>> Hilfe. Damit ich mich nicht schon wieder plamier.
>
> Dann ist's kontraproduktiv die Helfer anzupflaumen, noch dazu ich Dir
> den Fehler Deiner Falschanzeige genannt habe. Bei Verwendung von
> Spaltentransistoren wäre der Code übrigens ok, da Transistoren das
> Spaltensignal invertieren.

Das hab ich nie geschrieben - ich könnte auch mal den Router neu starten 
und mich als Irgendjemand anmelden.
Es ist so, dass hier nichts produktives von den Leuten kommt und dass 
MWS offenbar Fimose und Menstruationszwischenblutungen hat.
Seine Unfreundliche Art ist schon behindert und Behinderte können 
bekanntlich nichts für ihre Behinderungen - wir können ihm nicht böse 
sein und müssen mit ihm auskommen! Bitte nehmt ihn in Zukunft ernst! Es 
ist nicht seine Schuld, dass er dauermenstruiert.

von Karl H. (kbuchegg)


Lesenswert?

InkogNico schrieb:

> Es ist so, dass hier nichts produktives von den Leuten kommt und dass
> MWS offenbar Fimose und Menstruationszwischenblutungen hat.
> Seine Unfreundliche Art ist schon behindert und Behinderte können
> bekanntlich nichts für ihre Behinderungen - wir können ihm nicht böse
> sein und müssen mit ihm auskommen! Bitte nehmt ihn in Zukunft ernst! Es
> ist nicht seine Schuld, dass er dauermenstruiert.


Es reicht.
Such dir woanders ein paar Blöde, die dir was beibringen.

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.