Retro LED Uhr von Elo 1983

Dieses Thema im Forum "Bascom-Projekte" wurde erstellt von adelinde, 13. Februar 2018.

  1. adelinde

    adelinde Mitglied

    Registriert seit:
    21. Februar 2009
    Beiträge:
    60
    Zustimmungen:
    3
    Punkte für Erfolge:
    8
    :good:Zur Geschichte:

    1983 baute ich die „LEDA“ und verschenkte Sie.
    Wie das Leben so spielt, fand diese Uhr nun den Weg zu mir zurück.

    Leider hat(e) diese Schaltung ein paar kleine Unschönheiten. So muss man zum Stellen zuerst den Stunden.- und Minutenzeiger, einzeln auf eine volle Stunde stellen. Im 2. Gang die Uhr auf die gewünschte Zeit gestellt. (Mit ca. 3-4 Hz).

    Ein noch größeres Problem, war die schlechte EMV. So haben Störungen, z.B. das Einschalten einer Leuchtstoffröhre, die Uhr um mehrere Minuten oder gar Stunden vorgestellt.


    Ide:
    Anstatt nun die Uhr Störresitstent zu machen, die Steuerung durch einen Atmel zu ersetzen. Auf diese weise, erledigt sich auch das mühselige Stellen.



    Die Uhr „Anzeigeplatine“:

    Jeweils 5 LED‘s pro Minute, werden über 4 BCD zu Dez. Treiber 47154 angesteuert. Weitere 4 BCD Treiber für die Stunden, sind nach der 3. LED angeschlossen und sorgen so für den verkürzten Zeiger. Aus der Ursprünglichen Ansteuerung wurden Minuten und Sekunden gemultiplext.
    Die Stunden wurden unabhängig davon angesteuert.

    (Der 47154 hat 15 Ausgänge und bildet auch die Pseudotetraden ab. Müsste der nicht 4Bit Binär zu Dezimal heißen?)

    Über eine Atmega 128 werden nun alle BCD Treiber parallel mit der errechneten Zeigereposition gespeist und über eine weiteren Port gemultiplext. Da der Atmel keine weiteren Aufgaben bekommt, konnte ich das Multiplexern direkt aus dem Programm verwirklichen.

    Der Atmega bezieht seine Zeit aus einem DCF-Empfänger von Conrad und füttert damit eine RTC mit DS 1307 . Den Code hierfür hatte ich bereits vor Jahren von Frank geklaut. ( DCF77 und RTC mit ATmega unter BASCOM).
    Hier nochmals herzlichen Dank an Frank.:date:

     
    #1 adelinde, 13. Februar 2018
    Zuletzt bearbeitet: 13. Februar 2018
    Ditron gefällt das.
  2. adelinde

    adelinde Mitglied

    Registriert seit:
    21. Februar 2009
    Beiträge:
    60
    Zustimmungen:
    3
    Punkte für Erfolge:
    8


    CodeBox BascomAVR
    #####################################################################
    ' Atmega 128                                        2/2018 Siggi
    ' DCF77 Conrad, COM2, RTC DS1307
    '
    '
    '##############################################################################
    '
    '
    
    '------------------------------------------------------------------------------
    ' Compilerinstruktionen und Compilerdirektiven
    '------------------------------------------------------------------------------
    $Regfile="m128def.dat"
    $Crystal=16000000
    $hwstack=32
    $swstack=32
    $framesize=40
    
    
    
    
    
    '========== Für Testumgebung  ==========
    'Config Com2 = 57600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    
    'Open "com2:" For Binary As #2    'Uart an Pin: PD2;PD3
    
    '========== TWI ==========
    $lib "i2c_twi.lbx"                              ' we do not use software emulated I2C but the TWI
    
    Config Twi = 100000                             ' Init TWBR und TWSR
    
    Config Scl = Portd.0                            ' Ports fuer IIC-Bus, nicht Standard !
    Config Sda = Portd.1
    
    I2cinit
    
    ' TWI gleich einschalten, das macht Bascom ansonsten erst beim I2CStart !
    TWCR = &B00000100                                 ' nur TWEN setzen
    
    
    '------------------------------------------------------------------------------
    ' Definition von Variablen, Konstaten
    '------------------------------------------------------------------------------
    
    ' ----- DCF77 -----
    Dim Dcf77_hour As Byte                                      ' Globale Stundenvariable
    Dim Dcf77_min As Byte                                       ' Globale Minutenvariable
    Dim Dcf77_sec As Byte                                       ' Globale Sekundenvariable
    Dim Dcf77_weekday As Byte                                   ' Globaler Wochentag
    Dim Dcf77_day As Byte                                       ' Globale Tagvariable
    Dim Dcf77_month As Byte                                     ' Globale Monatsvariable
    Dim Dcf77_year As Byte                                      ' Globale Jahresvariable
    
    ' ----- RTC DS1307/DS3231 -----
    Const Rtc_address_write = &hd0                              'Adresse des DS1307 = &Hd0 (schreiben)
    Const Rtc_address_read = &hd1                    '          'Adresse des DS1307 = &Hd1 (lesen)
    'Const Rtc_address_write = &hd0                              ' Adresse des DS3231 = &HD0 (schreiben)
    'Const Rtc_address_read = &hd1                               ' Adresse des DS3231 = &HD1 (lesen)
    
    Const Rtc_address_seconds = &H00
    Const Rtc_address_minutes = &H01
    Const Rtc_address_hours = &H02
    Const Rtc_address_day = &H03
    Const Rtc_address_date = &H04
    Const Rtc_address_month = &H05
    Const Rtc_address_year = &H06
    Const Rtc_address_control = &H07
    ' ----- RTC DS1307 -----
    'Dim Rtc_control_test_value As Byte
    'Rtc_control_test_value = &B00000000
    '                          |  |  ||               RS1  RS0  SQWE Output Frequency
    '                          |  |  |+---- RS0        0    0    1 Hz
    '                          |  |  +----- RS1        0    1    4.096 kHz
    '                          |  +-------- SQWE       1    0    8.192 kHz
    '                          +----------- OUT        1    1    32.768 kHz
    
    
    '========== Für Berechnung der Zeigerposition ==========
    Dim tempA as byte
    dim TempB as byte
    dim TreiberIC as byte     '1-4 Minuten und Sekunden; 5-8 Stunden (BCD-Treiber)
    '--Pausen für Muliplex,
    'Über die nächsten zwei Variablen, reduziere ich die Helligkeit des Sekundenzeigers
    'zu Gunsten der Helligkeit von Stunden und Minuten
    Const PauseMin = 12
    const PauseSec = 2
    
    Dim dayOld as byte                                        'zu Feststellen, ob die Uhr tägl. syncronisiert
    
    Config Porta = Output    'Selecht Treiber IC 1-8
    Config Portc = Output     'Binäre Ausgabe der Zeit
    
    Config Portf.0 = Output   'LED auf der Platine
    'Config Portf.1 = Output
    'Config Portf.2 = Output
    'Config Portf.3 = Output
    
    ' print#1 , "test"   ;  dayOld
    
    
    ' ----- DCF77: Routinen und Einstellungen -----
    
    '  CONFIG DCF77 = pin , timer = timer [ INVERTED=inv, CHECK=check, UPDATE=upd, UPDATETIME=updtime , TIMER1SEC=tmr1sec, SWITCHPOWER=swpwr, POWERPIN=pin, POWERLEVEL = pwrlvl , SECONDTICKS=sectick ,DEBUG=dbg , GOSUB = Sectic ]
    '  PIN          = input pin that is connected to the DCF-77 signal
    '  TIMER        = The timer that is used to generate the compare interrupts
    '  INVERTED     = This value is 0 by default. When you specify 1, the compiler will assume you use an inverted DCF signal.
    '  CHECK        = The DCF-77 parity bits are checked
    '  UPDATE       = Upd determines how often the internal date/time variables are updated with the DCF received values.
    '  UPDATETIME   = This value depends on the used UPDATE parameter.
    '  TIMER1SEC    = 16 bit timers with the right crystal value can generate a precise interrupt that fires every second.
    '                 Wichtig: Wird der Parameter TIMER1SEC = 1 gesetzt, wird während der synchronisationsfreien Zeit der Compare-Wert so verändert, dass nur mehr 1 Interrupt pro Sekunde ausgelöst wird.
    '  SWITCHPOWER  = This option can be used to turn on/off the DCF-77 module with the control of a port pin.
    '  POWERPIN     = The name of a pin like pinB.2 that will be used to turn on/off the DCF module.
    '  POWERLEVEL   = This option controls the level of the output pin that will result in a power ON for the module.
    '  SECONDTICKS  = The number of times that the DCF signal state is read.
    '  DEBUG        = Optional value to fill 2 variables with debug info.
    '  GOSUB        = The Sectic option will call a label in the main program every second.
    
    ' Config mit stündlichem Update
    ' Config Dcf77 = Pinb.2 , Timer = 1 , Inverted = 0 , Check = 1 , Update = 1 , Updatetime = 59 , Timer1sec = 1 , Debug = 1 , Gosub = Sectic
    
    Config Dcf77 = Pind.7 , Timer = 1 , Inverted = 1   , Check = 1 , Update = 0 , Updatetime = 59 , Timer1sec = 1 , Debug = 0 , 'Gosub = Sectic
    '               |        |           |               |          |            |               |            |
    ' Use PinB.0 ---+        |           |               |          |            |               |            |
    ' Timer 1 is default ----+           |               |          |            |               |            |
    ' DCF77 signal wird nicht invertiert +               |          |            |               |            |
    ' Vergleich akt. Minutes mit vorheriger Minute ------+          |            |               |            |
    ' Perform kontinuierliches Update der empfangenen Daten --------+            |               |            |
    ' Updatetime ist nicht relevant da Update = 0 ------------------+            |               |            |
    ' Timer sorgt für SoftClock Update ------------------------------------------+               |            |
    ' Switchpower, Powerpin und Powerlevel wird nicht benutzt da Interface nicht vorhanden!      |            |
    ' Secondticks wird dem Compiler überlassen und nicht neu gesetzt!                            |            |
    ' Debug für die Variablen  bDCF_Pause und bDCF_Impuls ist aktiv -----------------------------+            |
    ' Jede Sekunde wird Gosub-Routine Dcf77_sectic angesprungen ----------------------------------------------+
    
    Enable Interrupts                                           ' Interrupts aktivieren
    Config Date = Dmy , Separator = -                           ' Datumsformat einstellen
    Portd.7 = 0
    
    
    ' ----- DCF77 -----
    Dim Sec_old As Byte                                         ' Schleifenvaraible SoftClock Sec
    Sec_old = 99
    
    Dim Dcfsec_old As Byte                                      ' Schleifenvariable DCF77 Sec
    Dcfsec_old = 99
    
    Dim Dcf_sync_count As Byte                                  ' Zähler für Anzahl der Syncs
    Dcf_sync_count = 0
    
    
    
    Dim Temp_byte_1 As Byte                                     ' Temporäre Byte Variable
    'Dim Temp_integer_1 As Integer                               ' Temporäre Integer Variable
    'dim Temp2 as Byte
    
    
    '##############################################################################
    ' Hauptprogramm
    '##############################################################################
    
    Gosub Rtc_set_softclock
    
    set portf.0
    set Portf.2
    waitms 50
    reset portf.0
    reset portf.2
    set portf.1
    set Portf.3
    waitms 50
     reset portf.1
    reset portf.3
    waitms 50
    set portf.0
    set portf.1
    set Portf.2
    set Portf.3
    
    
    Do
    
       ' DCF77 Statusbits abfragen und maskieren
    Temp_byte_1 = Dcf_status And &H80
    
       ' Prüfung ob SoftClock durch DCF77 synchronisiert (Bit 7 aus Statusbyte)
    If Temp_byte_1 = &H80 Then
    
       Incr Dcf_sync_count                                   ' Sync-Counter erhören
    
          ' Zur Kontrolle bei erfolgreichem SYNC Status-Bit zurücksetzen
       Reset Dcf_status.7
    
          ' DS1307 synchronisieren
       Gosub Rtc_set_rtc_clock
    
    End If
    
    ' Beim Tageswechsel prüfen ob DCF77 syncronisirt
    if dayOld <> _day  then
       DayOld = _day
       if   Dcf_sync_count <= 2  then   'wenn nicht mehr als eine Syncronisation
            Dcf_sync_count = 0          'Sync zurücksetzen  (noch keine Sync)
            Gosub RTC_set_softclock     'Da kein dcf-Empfang, zeit aus RTC holen
       else
            Dcf_sync_count = 1          'Sync auf 1 stellen, Syncronisation hat stadgefunden
    
       endif
    endif
    
    
    ' ----- Datum und Uhrzeit BCD formatieren und formatiert auf LCD ausgeben -----
       Dcf77_hour = Makebcd(_hour)
       Dcf77_min  = Makebcd(_min)
       Dcf77_sec  = Makebcd(_sec)
    
       'Dcf77_weekday = Makebcd(_weekday)
    
       'Dcf77_day = Makebcd(_day)
       'Dcf77_month = Makebcd(_month)
       'Dcf77_year = Makebcd(_year)
    
    
    
    '---Stunden berechen
    Tempa = _hour
    
    
     '24h zurück auf 12h
    if Tempa > 12 then
       tempa = tempa - 12
    endif
    
    Tempa = Tempa *5  ' eine Stunde = 60min,
    
    TempB = _min /12   ' Stundenzeiger alle 12min um 1me min weiter
    Tempa = tempa + TempB
    
    TreiberIC = 5 ' Stunden werden mit Treiber 5-8 angezeigt
    while Tempa >= 15
       Tempa = tempa -15
       incr TreiberIC
    wend
    
    Porta =255 ' alle TreiberIC aus
    
    portc = tempa 'Portc stellen
    
    'TreiberIC auswählen und einschalten
    Select Case TreiberIc
    
      'Case 1 : Porta.0 = 0
    
      'Case 2 : Porta.1 = 0
    
      'Case 3 : Porta.2 = 0
    
      'Case 4 : Porta.3 = 0
    
      Case 5 : Porta.5 = 0   'Fehler beim Verbinden, Stunden Treiberic mit 2 begonnen
    
      Case 6 : Porta.6 = 0
    
      Case 7 : Porta.7 = 0
    
      Case 8 : Porta.4 = 0
    
    End Select
    
    Waitms PauseMin
    
    
    '---Minuten berechen
    Tempa= _min
    
    TreiberIC = 1
    
    while Tempa >= 15
       Tempa = tempa -15
       incr TreiberIC
    wend
    
    Porta =255
    
    portc = tempa
    
    Select Case TreiberIc
    
      Case 1 : Porta.0 = 0
    
      Case 2 : Porta.1 = 0
    
      Case 3 : Porta.2 = 0
    
      Case 4 : Porta.3 = 0
    
     ' Case 5 : Porta.5 = 0   'Fehler beim Verbinden, Stunden Treiberic mit 2 begonnen
    
     ' Case 6 : Porta.6 = 0
    
     ' Case 7 : Porta.7 = 0
    
     ' Case 8 : Porta.4 = 0
    
    End Select
    
    Waitms PauseMin
    
    
    '---Sechkunden berechen
    Tempa= _sec
    
     'wen noch kein DCF sync (Zeiger spingt alle 2 Sekunden)
    if Dcf_sync_count = 0  then 'noch keine Syncroniation von DCF
       set portf.1               'LED auf Platine Blinkt
       TempB = _sec mod 2
    
       if TempB  = 0  then   'Bei gerader Sekunde
          incr tempa         'Zeiger 1Sekunde weiter stellen
          if tempa > 60  then
             tempa =0
          endif
    
       else
    
          reset portf.1
    
       endif
    
    endif
    
    '(
    'zu Kontrolle beim 2. sync LED auf Plantine ein
    if    Dcf_sync_count >= 2  then
       reset portf.0
       else
       set portf.0
    endif
    ')
    
    
    
    TreiberIC = 1
    
    while Tempa >= 15
       Tempa = tempa -15
       incr TreiberIC
    wend
    
    Porta =255
    portc = tempa
    
    Select Case TreiberIc
    
      Case 1 : Porta.0 = 0
    
      Case 2 : Porta.1 = 0
    
      Case 3 : Porta.2 = 0
    
      Case 4 : Porta.3 = 0
    
     ' Case 5 : Porta.5 = 0   'Fehler beim Verbinden, Stunden Treiberic mit 2 begonnen
    
      'Case 6 : Porta.6 = 0
    
     ' Case 7 : Porta.7 = 0
    
      'Case 8 : Porta.4 = 0
    
    End Select
    
    Waitms PauseSec
    
    
    Loop
    
    '## End Hauptprogramm #########################################################
    
    
    '******************************************************************************
    ' Interruptroutinen
    '******************************************************************************
    
    '------------------------------------------------------------------------------
    ' Service-Routine DCF77_sectic für DCF77 Softclock
    ' Routine wird als Parameter bei Config DCF77 übergeben und automatisch jede
    ' Sekunde ausgeführt. Damit ist SekundenTick für Gesamtsystem ohne zusätzlichen
    ' Timer möglich.
    '------------------------------------------------------------------------------
    'Sectic:
    
    
    'nop
     'print#2 , _hour;"  ";   _min;"  ";  _sec
     ' print#2  ,    Bdcf_impuls ; " " ; Bdcf_pause
     '  print#2 ,   dcf_sync_count
      'print#2  ,tempa
    'gosub      Rtc_read_softclock
    'Return
    '-- End Dcf77_sectic ----------------------------------------------------------
    
    
    
    
    
    
    '******************************************************************************
    ' GOSubroutinen
    '******************************************************************************
    
    '------------------------------------------------------------------------------
    ' RTC - Gosub-Routine: Rtc_set_rtc_clock
    ' Subroutine übernimmt bei erfolgreicher Synchronisation durch DCF77 die
    ' aktuellen Zeit und Datumsinformationen in die RTC DS1307
    '------------------------------------------------------------------------------
    Rtc_set_rtc_clock:
    'Daten zum Speichern in BCD Format aufbereiten
       Dcf77_hour = Makebcd(_hour)
       Dcf77_min = Makebcd(_min)
       Dcf77_sec = Makebcd(_sec)
       Dcf77_weekday = Makebcd(_weekday)
       Dcf77_day = Makebcd(_day)
       Dcf77_month = Makebcd(_month)
       Dcf77_year = Makebcd(_year)
    'RTC DS1307 synchronisieren
       I2cstart                                                 ' START-Sequenz senden
       I2cwbyte Rtc_address_write                               ' Daten schreiben initiieren
       I2cwbyte Rtc_address_seconds                             ' Adresse übertragen = &H00
       I2cwbyte Dcf77_sec                                       ' Byte 1 übertragen
       I2cwbyte Dcf77_min                                       ' Byte 2 übertragen
       I2cwbyte Dcf77_hour                                      ' Byte 3 übertragen
       I2cwbyte Dcf77_weekday                                   ' Byte 4 übertragen
       I2cwbyte Dcf77_day                                       ' Byte 5 übertragen
       I2cwbyte Dcf77_month                                     ' Byte 6 übertragen
       I2cwbyte Dcf77_year                                      ' Byte 7 übertragen
       I2cstop                                                  ' STOP-Sequenz
    Return
    '-- End Rtc_set_rtc_clock -----------------------------------------------------
    
    
    '------------------------------------------------------------------------------
    ' RTC - Gosub-Routine: Rtc_set_softclock
    ' Subroutine übernimmt bei Aufruf der Routine die in der RTC "mitlaufenden"
    ' Zeitinformationen in die SoftClock.
    ' Damit kann bereits zu Systemstart ohne DCF77 Empfang mit "realer" Zeit
    ' gestartet werden.
    '------------------------------------------------------------------------------
    Rtc_set_softclock:
    'RTC DS1307 auslesen
       I2cstart                                                 ' START-Sequenz senden
       I2cwbyte Rtc_address_write                               ' Daten schreiben initiieren
       I2cwbyte Rtc_address_seconds                             ' Adresse übertragen = &H00
    '  I2cstop                                                ' STOP-Sequenz wird nicht zwingend benötigt
       I2cstart                                                 ' START-Sequenz erneut senden
       I2cwbyte Rtc_address_read                                ' Daten lesen initiieren
       I2crbyte Dcf77_sec , Ack                                 ' Byte 1 lesen
       I2crbyte Dcf77_min , Ack                                 ' Byte 2 lesen
       I2crbyte Dcf77_hour , Ack                                ' Byte 3 lesen
       I2crbyte Dcf77_weekday , Ack                             ' Byte 4 lesen
       I2crbyte Dcf77_day , Ack                                 ' Byte 5 lesen
       I2crbyte Dcf77_month , Ack                               ' Byte 6 lesen
       I2crbyte Dcf77_year , Nack                               ' Byte 7 lesen und fertig (NACK)
       I2cstop                                                  ' STOP-Sequenz
    'ausgelesene Daten in SoftClock Variablen übernehmen
       _hour = Makedec(dcf77_hour)
       _min = Makedec(dcf77_min)
       _sec = Makedec(dcf77_sec)
       _weekday = Makedec(dcf77_weekday)
       _day = Makedec(dcf77_day)
       _month = Makedec(dcf77_month)
       _year = Makedec(dcf77_year)
    Return
    '-- End Rtc_set_softclock -----------------------------------------------------
    
    '##############################################################################
    End
    
    
    
     
  3. adelinde

    adelinde Mitglied

    Registriert seit:
    21. Februar 2009
    Beiträge:
    60
    Zustimmungen:
    3
    Punkte für Erfolge:
    8
    Hier mal noch den Beitrag aus der Elo Heft 3/1983
    LEDA
     

    Anhänge:

  4. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    2.957
    Zustimmungen:
    45
    Punkte für Erfolge:
    48
    Sprachen:
    BascomAVR, Assembler
    Ähm... Du meinst nicht etwa zufällig den 4-zu-16-Demultiplexer (74)154? Der schaltet genau den Ausgang Low den die vier Eingänge binär codieren.

    Warum hast Du keine kaskadierten, gelatchten Schieberegister ingesetzt? Oder, da Du eh 'ne I²C-RTC nutzt, keine I²C-Schieberegister (aka Portexpander)?
     
  5. adelinde

    adelinde Mitglied

    Registriert seit:
    21. Februar 2009
    Beiträge:
    60
    Zustimmungen:
    3
    Punkte für Erfolge:
    8
    Hallo LotadaC,
    Du hast natürlich recht, es ist ein 74154 Demultplexer, da ist bei mir was durcheinander geraten. :angel:
    Die Auswahl der Bauteile stammte vom Franzisverlag und ist schon mehr als 30 Jahre her. Ich hab nun nur die original TTL Steuerung gegen einen Atmel ausgetauscht. Die Anzeigeplatine ist noch die Alte:dirol:

    Liebe Grüße
    Siggi
     
  • Über uns

    Unsere immer weiter wachsende Community beschäftigt sich mit Themenbereichen rund um Mikrocontroller- und Kleinstrechnersysteme. Neben den Themen Design von Schaltungen, Layout und Software, beschäftigen wir uns auch mit der herkömmlichen Elektrotechnik.

    Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  • Coffee Time

    Unser makerconnect-Team arbeitet hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und unser eigener makerconnekt-Server regelmäßig gewartet wird. Wir nehmen das Thema Datensicherung und Datenschutz sehr ernst und sind hier sehr aktiv, auch sorgen wir uns darum, dass alles Drumherum stimmt!

    Dir gefällt das Forum und die Arbeit unseres Teams und du möchtest es unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft, unser Team freut sich auch über eine Spende für die Kaffeekasse :-)
    Vielen Dank!
    Dein makerconnect-Team

    Spende uns! (Paypal)
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren und die Seite optimal für dich anzupassen. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden