Forum: Mikrocontroller und Digitale Elektronik MC14499 - AVR


von Tony B. (tonykb)


Lesenswert?

Hallo Zusammen.. :)

Ich hab heute mal ein Problem bei dem ich selbst - soweit ich denke - an 
meine Programmiergrenzen stoße..

Und zwar möchte ich mit einem AVR einen Frequenzzähler realisieren. Dazu 
zählt ein Timer (COUNTER) und gibt dieses nach exakt einer Sekunde 
(2.Timer) an einen Interrupt der dann die Hz Zahl ermittelt.
Dieser Teil des Programmes ist fertig und funktioniert auch 
einwandfrei...

Jetzt Möchte ich diesen Wert über drei 7Segment Anzeigen ausgeben...
Direktes Multiplexing hat zwar funktioniert aber setzt leider nach jeder 
Sekunde (Während des Interrupts) aus, was zu einen Flackern führt... :(


Ich hab jetzt in der Bastelkiste den MC14499 von Motorola gefunden... 
alles laut Datenblatt aufgebaut und mal 3 Einsen drauf geschickt.. Geht 
ebenfalls. Ich möchte diesen nun auch gerne für die Anzeige nutzen da 
dieser Seperat vom AVR Timer und somit "flackerlos" Multiplext...

Nur wie realisiere ich im AVR (Syntaxseitig), dass der vom Interrupt 
kommende dreistellige Wert dann in 12 Bits (also 4 Bit pro Ziffer) 
umgewandelt und ausgegeben wird...

Gibt es da eine Möglichkeit?


PS.: Wer im Datenblatt nicht durchsieht wie der Chip die daten empfängt, 
ich kann es gerne noch erklären, spare es mir aber erstmal an dieser 
Stelle weil es eigentlich gut verständlich ist! :)


Bitte Helft mir schnellstmöglich! :)


Lg Tony

von Willi (Gast)


Lesenswert?

Tony B. schrieb:
> Und zwar möchte ich mit einem AVR einen Frequenzzähler realisieren.

> Bitte Helft mir schnellstmöglich! :)

Der Suchbegriff lautet: "reziproker Frequenzzähler"

von Tony B. (tonykb)


Lesenswert?

Hallo Willi! :)
Danke für deine schnelle Hilfe, jedoch finde ich mit diesem Suchbegriff 
ausschlieslich Projekte die mit LCD realisiert wurden.

Das hat neben dem Optischen Aspekt auch den Vorteil das es VIEL 
einfacher ist... Auch ich hatte meinen Zähler bereits mit LCD laufen und 
das Mit Erfolg... aber mir geht es eben darum diese 7Segment anzeigen zu 
verwenden und das über dewn Og. Treiber-Decoder-IC..


Hat noch jemand Vorschläge? :)

lg

von Tony B. (tonykb)


Lesenswert?

Hallo Nochmal! :)

Ich hab jetzt hier mal einen Syntax für euch bei dem ich noch einige 
Probleme Habe..:
1
$regfile = "m8def.dat"
2
$crystal = 1000000
3
4
Dim 0(4) As Byte
5
Dim 1(4) As Byte
6
Dim 2(4) As Byte
7
Dim 3(4) As Byte
8
Dim 4(4) As Byte
9
Dim 5(4) As Byte
10
Dim 6(4) As Byte
11
Dim 7(4) As Byte
12
Dim 8(4) As Byte
13
Dim 9(4) As Byte
14
15
16
Dim Frequenz As Integer
17
Dim Z1 As Integer
18
Dim Z2 As Integer
19
Dim Z3 As Integer
20
21
Dim X As Integer
22
Dim Y As Integer
23
24
Config Portd.0 = Output
25
Config Portd.1 = Output
26
Config Portd.2 = Output
27
28
Enb Alias Portd.0
29
Clk Alias Portd.1
30
Dat Alias Portd.2
31
32
33
Frequenz = 245
34
35
Do
36
37
Z1 = Frequenz Mod 10
38
Frequenz = Frequenz / 10
39
Z2 = Frequenz Mod 10
40
Frequenz = Frequenz / 10
41
Z3 = Frequenz Mod 10
42
43
For Y = 1 To 3
44
Do
45
   For X = 0 To 3
46
   Dat = Lookup(x , Zy)
47
   Clk = 1
48
   Clk = 0
49
   Next X
50
Loop Until X = 3
51
X = 0
52
Next Y
53
54
55
Loop
56
End
57
58
0:
59
Data 0
60
Data 0
61
Data 0
62
Data 0
63
64
1:
65
Data 0
66
Data 0
67
Data 0
68
Data 1
69
70
2:
71
Data 0
72
Data 0
73
Data 1
74
Data 0
75
76
3:
77
Data 0
78
Data 0
79
Data 1
80
Data 1
81
82
4:
83
Data 0
84
Data 1
85
Data 0
86
Data 0
87
88
5:
89
Data 0
90
Data 1
91
Data 0
92
Data 1
93
94
6:
95
Data 0
96
Data 1
97
Data 1
98
Data 0
99
100
7:
101
Data 0
102
Data 1
103
Data 1
104
Data 1
105
106
8:
107
Data 1
108
Data 0
109
Data 0
110
Data 0
111
112
9:
113
Data 1
114
Data 0
115
Data 0
116
Data 1

So ich weis das da noch einiges fehlt und bestimmt auch was zu viel ist, 
aber ich bin etwas am verzweifeln da der Kompiler in der Zeile
1
Dat = LookUp(x,zy)

eine StoreBit error [200] anzeigt...

Was hab ich denn Falsch gemacht!?

Noch kurz zum Plan wie es Funktionieren soll:

Eine Frequenz (hier zum Test auf 245) kommt vom Counter, wird in 
z1,z2,z3 aufgeteilt.

Dann wird die erste Ziffer (y=1) über die Loop an den Treiber geschickt 
(4Bits)... Dazu hab ich die Tabellen gem. DB angelegt... (Bsp.: "1" 
entspricht 0001) die X-Schleife läuft 4 mal durch und setzt den DAT pin 
auf das xte Niveau der Ziffer von zy (y ist ja bei der ersten ziffer 1 
also z1) dann folgt der Clk takt...


Kann mir bitte Jemand Helfen?

Lg :)

von Tony B. (tonykb)


Lesenswert?

Okay Daaaanke!

Dann die nächste Frage:
Das Problem scheint darin zu liegen dass der Wert von Z1 als integer 
NICHT als Bezeichnung für die Tabelle genuzt werden kann...
Desweiteren schein die Variablen Z1,Z2,Z3 nicht global nutzbar zu sein 
denn beim Compilieren des neuen (unten) Syntax, kommt die Meldung "Label 
Not Found[z1]" (und auch mit z2 und z3)

Kann mit endlich mal jemand weiterhelfen ich bin hier am Verzweifeln -.-

Wäre schön! :)
Lg
1
$regfile = "m8def.dat"
2
$crystal = 1000000
3
4
Dim 0(4) As Byte
5
Dim 1(4) As Byte
6
Dim 2(4) As Byte
7
Dim 3(4) As Byte
8
Dim 4(4) As Byte
9
Dim 5(4) As Byte
10
Dim 6(4) As Byte
11
Dim 7(4) As Byte
12
Dim 8(4) As Byte
13
Dim 9(4) As Byte
14
15
Dim Stat As Bit
16
17
Dim Frequenz As Integer
18
Dim Z1 As Integer
19
Dim Z2 As Integer
20
Dim Z3 As Integer
21
22
Dim X As Integer
23
Dim Y As Integer
24
25
Config Portd.0 = Output
26
Config Portd.1 = Output
27
Config Portd.2 = Output
28
29
Enb Alias Portd.0
30
Clk Alias Portd.1
31
Dat Alias Portd
32
33
Frequenz = 245
34
35
Do
36
37
Z1 = Frequenz Mod 10
38
Frequenz = Frequenz / 10
39
Z2 = Frequenz Mod 10
40
Frequenz = Frequenz / 10
41
Z3 = Frequenz Mod 10
42
43
44
Do
45
   For X = 0 To 3
46
   Dat = Lookup(x , Z1)
47
   Clk = 1
48
   Clk = 0
49
   Next X
50
Loop Until X = 3
51
X = 0
52
53
Do
54
   For X = 0 To 3
55
   Dat = Lookup(x , Z2)
56
   Clk = 1
57
   Clk = 0
58
   Next X
59
Loop Until X = 3
60
X = 0
61
62
Do
63
   For X = 0 To 3
64
   Dat = Lookup(x , Z3)
65
   Clk = 1
66
   Clk = 0
67
   Next X
68
Loop Until X = 3
69
X = 0
70
71
72
73
74
Loop
75
End
76
77
0:
78
Data &B00000000
79
Data &B00000000
80
Data &B00000000
81
Data &B00000000
82
83
1:
84
Data &B00000000
85
Data &B00000000
86
Data &B00000000
87
Data &B00000100
88
89
2:
90
Data &B00000000
91
Data &B00000000
92
Data &B00000100
93
Data &B00000000
94
95
3:
96
Data &B00000000
97
Data &B00000000
98
Data &B00000100
99
Data &B00000100
100
101
4:
102
Data &B00000000
103
Data &B00000100
104
Data &B00000000
105
Data &B00000000
106
107
5:
108
Data &B00000000
109
Data &B00000100
110
Data &B00000000
111
Data &B00000100
112
113
6:
114
Data &B00000000
115
Data &B00000100
116
Data &B00000100
117
Data &B00000000
118
119
7:
120
Data &B00000000
121
Data &B00000100
122
Data &B00000100
123
Data &B00000100
124
125
8:
126
Data &B00000100
127
Data &B00000000
128
Data &B00000000
129
Data &B00000000
130
131
9:
132
Data &B00000100
133
Data &B00000000
134
Data &B00000000
135
Data &B00000100

von eddi (Gast)


Lesenswert?

Hallo Tony B.

Hab dein posting zufällig gelesen, und mich gewundert.

Das Problem, das du beschreibst scheint mir ganz einfach, ja geradezu 
elementar zu sein. (Muß alledings zugeben, daß ich nichts von avr-basic 
verstehe).

Aus einer Zahl (245) die einzelnen Stellen zu isolieren und in passende 
Werte umzuwandeln.
Verstehe ich das richtig?

Na, dann benutzt man die so erhaltenen Ziffern (z1,...) als INDEX auf 
ein Array. Vielleicht so:
...
Dim Dispwert(10) as Byte
Z1 = Frequenz Mod 10
Dat = Dispwert(Z1)
...

Hilft das?

e.r.f.

p.s.
Sind die zeilen so wie "Dim 0(4) As Byte" legal? Dann wäre der 
Variablenbezeichner eine Ziffer? Scheint mir unwahrscheinlich,

von eddi (Gast)


Lesenswert?

Hallo Tony B.

Hab's gerade noch mal nachgelesen ...

Die Syntax für Lookup müsste so sein: erst der Index dann das Label.

(Das Label Z1 gibt es bei dir nicht.)


So vielleicht:
....

Tab:
  DATA   $00, $01, 23, ...........

Dat = Lookup(Z1 , Tab)

...


mfg e.r.f.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.