Hallo zusammen!
Ich hatte hier seit einiger Zeit die bekannten Schieberegister 74HC595 und
die BCD-zu-7-Segment Decoder Chips CD4543 rumliegen.
Um diese nun endlich einmal zu kombinieren...... und auch zu programmieren..... hatte ich mir folgendes ausgedacht:
Als "Herzstück" sollte maximal ein ATMega8 zum Einsatz kommen.
Um auch permanent ändernde Werte ausgeben zu können, wird eine DCF77 Uhr verwendet.
Die Schieberegister (74HC595) sollen mit LED`s eine Binäruhr darstellen, oder verschiedene Lauflichter anzeigen. So kann man das Verhalten der IC`s und auch die verschiedenen Möglichkeiten in der Programmierung testen.
Die Decoder-IC`s treiben (bestimmungsgemäß) eine 7-Segment-Anzeige an und geben die übermittelten Werte als Zahl aus.
Allerdings werden die CD4543 nicht direkt mit dem AVR verbunden, sondern erhalten ihre Daten- und Latchbefehle von einem weiteren 74HC595.
Auf dieser Grundlage habe ich mir erst mal einen Schaltplan gezeichnet.
Um den Testaufbau zu einfach wie möglich zu halten, wurde z.B. ein einzelner FET (BF256) zur Strombegrenzung der LED`s verwendet.
Um bei einer späteren richtigen Anwendung alle LED`s gleichmäßig hell leuchten zu lassen, kommt man um Einzelwiderstände nicht herum.
Für diesen Testaufbau ist es mir aber egal, dass die Helligkeit der LED`s stetig abnimmt, je mehr LED`s in Betrieb sind.
Hier nun der erste Schaltplan für die Binäruhr mit drei Stück 74HC595:
In der Realität sind das dann so aus:
Nun kommen noch die BCD-zu-7-Segment Decoder zum Einsatz.
Damit ich später die DCF-Zeit auch wirklich ablesen kann, habe ich mich für vier 7-Seg.-Einheiten entschieden.
Jedes 7-Segment wird von einem CD4543 angesteurt und alle IC`s bekommen ihre "Daten" von einem 74HC595.
Der Schaltplan dazu sieht so aus:
Und nun auch wieder ein Bild vom echten Aufbau:
Am gemeinsamen Anodenschluss zweier 7-Segmente wird wieder nur ein FET (BF256) verwendet, um den Strom zu begrenzen.
Natürlich müsste man auch hier bei einer richtigen Anwendung wieder einzelne Widerstände einbauen!
Insgesamt sieht der vollständige Testaufbau nun so aus:
Wie auf den Bildern zu erkennen ist funktioniert auch meine Software, die euch natürlich nicht vorenthalten möchte.
Ach so.....
Das Programm ist extra nicht optimiert, damit jeder Interessierte die einzelnen Schritte auch nachvollziehen kann!
CodeBox BascomAVR
So, dass soll es erst einmal gewesen sein.
Warum ich gerade die CD4543 IC`s so interessant und praktisch finde, werde ich demnächst mal berichten.
Grüße,
Cassio
Ach so...
Kommentare und Fragen hierzu sind jederzeit Willkommen.
Ich hatte hier seit einiger Zeit die bekannten Schieberegister 74HC595 und
die BCD-zu-7-Segment Decoder Chips CD4543 rumliegen.
Um diese nun endlich einmal zu kombinieren...... und auch zu programmieren..... hatte ich mir folgendes ausgedacht:
Als "Herzstück" sollte maximal ein ATMega8 zum Einsatz kommen.
Um auch permanent ändernde Werte ausgeben zu können, wird eine DCF77 Uhr verwendet.
Die Schieberegister (74HC595) sollen mit LED`s eine Binäruhr darstellen, oder verschiedene Lauflichter anzeigen. So kann man das Verhalten der IC`s und auch die verschiedenen Möglichkeiten in der Programmierung testen.
Die Decoder-IC`s treiben (bestimmungsgemäß) eine 7-Segment-Anzeige an und geben die übermittelten Werte als Zahl aus.
Allerdings werden die CD4543 nicht direkt mit dem AVR verbunden, sondern erhalten ihre Daten- und Latchbefehle von einem weiteren 74HC595.
Auf dieser Grundlage habe ich mir erst mal einen Schaltplan gezeichnet.
Um den Testaufbau zu einfach wie möglich zu halten, wurde z.B. ein einzelner FET (BF256) zur Strombegrenzung der LED`s verwendet.
Um bei einer späteren richtigen Anwendung alle LED`s gleichmäßig hell leuchten zu lassen, kommt man um Einzelwiderstände nicht herum.
Für diesen Testaufbau ist es mir aber egal, dass die Helligkeit der LED`s stetig abnimmt, je mehr LED`s in Betrieb sind.
Hier nun der erste Schaltplan für die Binäruhr mit drei Stück 74HC595:
In der Realität sind das dann so aus:
Nun kommen noch die BCD-zu-7-Segment Decoder zum Einsatz.
Damit ich später die DCF-Zeit auch wirklich ablesen kann, habe ich mich für vier 7-Seg.-Einheiten entschieden.
Jedes 7-Segment wird von einem CD4543 angesteurt und alle IC`s bekommen ihre "Daten" von einem 74HC595.
Der Schaltplan dazu sieht so aus:
Und nun auch wieder ein Bild vom echten Aufbau:
Am gemeinsamen Anodenschluss zweier 7-Segmente wird wieder nur ein FET (BF256) verwendet, um den Strom zu begrenzen.
Natürlich müsste man auch hier bei einer richtigen Anwendung wieder einzelne Widerstände einbauen!
Insgesamt sieht der vollständige Testaufbau nun so aus:
Wie auf den Bildern zu erkennen ist funktioniert auch meine Software, die euch natürlich nicht vorenthalten möchte.
Ach so.....
Das Programm ist extra nicht optimiert, damit jeder Interessierte die einzelnen Schritte auch nachvollziehen kann!
CodeBox BascomAVR
'Test für eine Binäruhr mit Schieberegister 74HC595 'und BCD-Decoder CD4543 für 7-Segmente $regfile = "m8def.dat" $crystal = 1000000 $hwstack = 32 ' default use 32 for the hardware stack $swstack = 10 ' default use 10 for the SW stack $framesize = 40 ' default use 40 for the frame space $baud = 4800 Ddrb = &B1100_0011 '1 ist Ausgang 0 ist Eingang Portb = &B0011_1100 'auf Hi oder Low setzen 'PB.0 = Ein/Aus 4543-Anzeigen Ddrc = &B00_0000 '1 ist Ausgang 0 ist Eingang Portc = &B11_1111 'auf Hi oder Low setzen Ddrd = &B1111_1110 '1 ist Ausgang 0 ist Eingang Portd = &B0000_0001 'auf Hi oder Low setzen 'PD.0 = RxD 'PD.1 = TxD 'PD.4 = Data 'PD.3 = Latch 'PD.2 = Clock 'PD.7 = Data-4543 'PD.6 = Latch-4543 'PD.5 = Clock-4543 '------------------------------------------------------------------------------ ' Timereinstellungen '------------------------------------------------------------------------------ 'Config Timer1 = Timer , Prescale = 64 'Timer1 für Keyboard 'On Timer1 Eingaben 'Enable Timer1 Daten Alias Portd.4 Latch Alias Portd.3 Takt Alias Portd.2 Daten2 Alias Portd.7 Latch2 Alias Portd.6 Takt2 Alias Portd.5 Set Latch Set Latch2 '------------------------------------------------------------------------------ ' DCF77-Uhr Config (Pollin, invertierter Ausgang) '------------------------------------------------------------------------------ Config Dcf77 = Pinc.0 , Timer = 1 , Timer1sec = 1 , Debug = 1 , Update = 0 , Check = 1 , Inverted = 1 , Gosub = Sectic Config Date = Dmy , Separator = . Enable Interrupts Time$ = "19:48:00" Date$ = "01.01.07" Dim Puls As Bit , Sync As Bit Dim I As Byte , I2 As Byte , I3 As Byte Dim Z1 As Byte , Flag1 As Bit , 4543flag As Bit Dim S1 As String * 1 , Zeit As String * 8 Dim L As Long '------------------------------------------------------------------------------ ' Shiftregister 595 '------------------------------------------------------------------------------ '74HC595-()---<|---R---+5V 'Der 74HC595-Ausgang ist Low, wenn eine 0 gesendet wird! 'Damit alle LEDs (mit +5V versorgt) dunkel sind, müssen alle Bits High sein! 'Daher werden zu Beginn &HFFFFFFFF gesendet! Print "Start, alle LEDs aus!" L = &HFFFFFFFF 'Alle Bits High setzen Shiftout Daten , Takt , L , 0 , 32 '32bit rausschieben Reset Latch 'Latch auf Low = neue Bits übernehmen Set Latch '------------------------------------------------------------------------------ ' Anzeigentest '------------------------------------------------------------------------------ 4543flag = 0 Do Zeit = Time$ Gosub 4543 ' ------------------------------------- 'DCF-Syncbit zurück setzen If Dcf_sec > 1 Then Reset Dcf_status.7 'DCF-Sync anzeigen If Dcf_sec < 2 Then If Dcf_status.7 = 1 Then Sync = 1 Else Sync = 0 End If Else End If ' ------------------------------------- If Pinc.5 = 0 Then Gosub Balken1 Elseif Pinc.4 = 0 Then Gosub Balken3 Else Gosub Bin_uhr End If Loop '------------------------------------------------------------------------------ Sectic: Toggle Puls 4543flag = 0 Return ' ------------------------------------- Balken1: 'Bitsweise Steuerung des Byte mit MSB Shiftout Daten , Takt , L , 0 , 32 '32 bit rausschieben Reset Latch Set Latch Waitms 1 I = &H00 'LEDs der Reihe nach einschalten For Z1 = 1 To 24 Shiftout Daten , Takt , I , 0 , 1 Reset Latch Set Latch Waitms 100 Next Z1 I = &HFF 'LEDs der Reihe nach wieder ausschalten For Z1 = 1 To 24 Shiftout Daten , Takt , I , 0 , 1 Reset Latch Set Latch Waitms 100 Next Z1 Gosub Balken2 Return ' ------------------------------------- Balken2: 'Bitweise Steuerung des Byte mit LSB Shiftout Daten , Takt , L , 0 , 32 '32 bit rausschieben Reset Latch Set Latch Waitms 1 I = 252 'Immer 2 LEDs der Reihe nach einschalten For Z1 = 1 To 12 Shiftout Daten , Takt , I , 2 , 2 '2 bit rausschieben Reset Latch Set Latch Waitms 100 Next Z1 I = 3 'Immer 2 LEDs der Reihe nach wieder ausschalten For Z1 = 1 To 12 Shiftout Daten , Takt , I , 2 , 2 '2 bit rausschieben Reset Latch Set Latch Waitms 100 Next Z1 Return ' ------------------------------------- Balken3: 'Lauflicht mit einer LED Shiftout Daten , Takt , L , 0 , 32 '32 bit rausschieben Reset Latch Set Latch Waitms 1 I = 0 Print I Shiftout Daten , Takt , I , 2 , 1 '1 bit rausschieben Reset Latch Set Latch I = 1 For Z1 = 1 To 24 Shiftout Daten , Takt , I , 2 , 1 '1 bit rausschieben Reset Latch Set Latch Waitms 100 Next Z1 L = &HFFFFFFFF Return ' ------------------------------------- Bin_uhr: ' Darstellen einer binären Uhr mit LEDs ' Da alle LEDs mit +5V verbunden sind, müssen ' die Ausgänge "invertiert" werden (255 - X)! If Puls = 1 Then If Sync = 1 Then I = 127 - _hour Else I = 255 - _hour End If Shiftout Daten , Takt , I , 0 , 8 I = 255 - _min Shiftout Daten , Takt , I , 0 , 8 I = 255 - _sec Shiftout Daten , Takt , I , 0 , 8 Reset Latch Set Latch Else I = _hour I = Not I Shiftout Daten , Takt , I , 0 , 8 I = _min I = Not I Shiftout Daten , Takt , I , 0 , 8 I = _sec I = Not I Shiftout Daten , Takt , I , 0 , 8 Reset Latch Set Latch End If Return ' ------------------------------------- 4543: 'Der Befehl "mid()" funktioniert NICHT mit der Variable "Time$". 'Daher wird der String "Time$" in die Stringvariable "Zeit" kopiert!!! If 4543flag = 0 Then If Pinc.3 = 1 Then '------MIN-Einer------ S1 = Mid(zeit , 5 , 1) I3 = Val(s1) I2 = I3 + 16 Shiftout Daten2 , Takt2 , I2 , 0 , 8 Reset Latch2 Set Latch2 Shiftout Daten2 , Takt2 , I3 , 0 , 8 Reset Latch2 Set Latch2 '------MIN-Zehner------ S1 = Mid(zeit , 4 , 1) I3 = Val(s1) I2 = I3 + 32 Shiftout Daten2 , Takt2 , I2 , 0 , 8 Reset Latch2 Set Latch2 Shiftout Daten2 , Takt2 , I3 , 0 , 8 Reset Latch2 Set Latch2 '------STD-Einer------ S1 = Mid(zeit , 2 , 1) I3 = Val(s1) I2 = I3 + 64 Shiftout Daten2 , Takt2 , I2 , 0 , 8 Reset Latch2 Set Latch2 Shiftout Daten2 , Takt2 , I3 , 0 , 8 Reset Latch2 Set Latch2 '------STD-Zehner------ S1 = Mid(zeit , 1 , 1) I3 = Val(s1) I2 = I3 + 128 Shiftout Daten2 , Takt2 , I2 , 0 , 8 Reset Latch2 Set Latch2 Shiftout Daten2 , Takt2 , I3 , 0 , 8 Reset Latch2 Set Latch2 4543flag = 1 Else '------SEC-Einer------ S1 = Mid(zeit , 8 , 1) I3 = Val(s1) I2 = I3 + 16 Shiftout Daten2 , Takt2 , I2 , 0 , 8 Reset Latch2 Set Latch2 Shiftout Daten2 , Takt2 , I3 , 0 , 8 Reset Latch2 Set Latch2 '------SEC-Zehner------ S1 = Mid(zeit , 7 , 1) I3 = Val(s1) I2 = I3 + 32 Shiftout Daten2 , Takt2 , I2 , 0 , 8 Reset Latch2 Set Latch2 Shiftout Daten2 , Takt2 , I3 , 0 , 8 Reset Latch2 Set Latch2 '------MIN-Einer------ S1 = Mid(zeit , 5 , 1) I3 = Val(s1) I2 = I3 + 64 Shiftout Daten2 , Takt2 , I2 , 0 , 8 Reset Latch2 Set Latch2 Shiftout Daten2 , Takt2 , I3 , 0 , 8 Reset Latch2 Set Latch2 '------MIN-Zehner------ S1 = Mid(zeit , 4 , 1) I3 = Val(s1) I2 = I3 + 128 Shiftout Daten2 , Takt2 , I2 , 0 , 8 Reset Latch2 Set Latch2 Shiftout Daten2 , Takt2 , I3 , 0 , 8 Reset Latch2 Set Latch2 4543flag = 1 End If Else End If Return End 'end program
So, dass soll es erst einmal gewesen sein.
Warum ich gerade die CD4543 IC`s so interessant und praktisch finde, werde ich demnächst mal berichten.
Grüße,
Cassio
Ach so...
Kommentare und Fragen hierzu sind jederzeit Willkommen.
Zuletzt bearbeitet: