Retro LED Uhr von Elo 1983

adelinde

Mitglied
21. Feb. 2009
60
3
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:

 
Zuletzt bearbeitet:
  • Like
Reaktionen: Ditron


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


 
Hier mal noch den Beitrag aus der Elo Heft 3/1983
LEDA
 

Anhänge

  • Dokument4.pdf
    665,9 KB · Aufrufe: 43
  • Dokument2.pdf
    784,9 KB · Aufrufe: 31
  • Dokument3.pdf
    823,3 KB · Aufrufe: 29
  • Dokument1.pdf
    601,9 KB · Aufrufe: 32
Der 47154 hat 15 Ausgänge und bildet auch die Pseudotetraden ab. Müsste der nicht 4Bit Binär zu Dezimal heißen?
Ä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)?
 
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
 
Frage: Ist das Bord mit ATmega128 […]
OK ???
Das Board beschränkt sich mehr oder weniger auf die Minimalbeschaltung (wie angegeben), mich stören:
  • es scheint nur einen Abblockkerko für beide digitale Stromversorgungspaare zu geben.
  • zusätzlich zur üblichen Drossel zwischen Vcc und AVcc gibt es eine Drossel zwischen Gnd und AGnd. AVcc versorgt aber auch einige digitale Pins (Port F). Je nach Last können sich meiner Meinung nach Gnd und AGnd "gegeneinander verschieben" (@dino03 ?? )
  • LEDs an A1 und A0 - die beiden Pins sind damit über die antiparallelen LEDs nebst Vorwiderständen miteinander verbunden. Als digitales Bein sicher kein Problem, aber das sind mögliche Eingänge für den ADC, was dortige Messungen beeinflussen könnte (könnte man damit sogar Helligkeiten messen? Das ist ja ein differential ended ADC mit aufschaltbarem 200er Gain Amplifier)
  • 10k-Pullups an F7..4 (??) - also die sind immer da, wozu? Wenn JTAG enabled ist, aktiviert der Controller seine eigenen, wenn man sonst Pullups braucht, kann man die auch aktivieren, wenn man hingegen keine haben will...
Du kannst mit diesem Board selbst den Controller nicht Programmieren bzw nicht Adelinde's Programm flashen - dazu benötigst Du zusätzlich irgendeinen Programmer.
Für extern Takt kann man hier einen anderen Quarz einsetzen.
Laut Schaltplan gibt es zwei Quarze, von denen einer per Jumper gewählt werden soll. Laut Shop-Bild ist ein Quarz (8MHz??) bestückt, und eine dreifach-Präzisionsbuchse, in die man einen eigenen Quarz stöpseln könnte. Bürdekerkos sind laut Plan 22pF.
Adelindes Programm läuft mit 16MHz.

@Dirk hätte hier im Shop auch ein Mega128A-Board, wie's da mit den vier oben kritisierten Punkten aussieht, muß er selbst sagen.
Die USB-Buchse dient einerseits der Stromversorgung, außerdem hängt dort ein USB-UART-Wandler dran, der wiederum mit UART1 des Controllers verbunden ist (fest verbunden? die Pins könnten ja auch externe IRQs sein).
Optional wird das Board auch mit Bootloader im Controller angeboten, dann kannst Du den Controller grundsätzlich über USB flashen. ABER inwiefern das mit einem BASCOM-Programm geht, müßte Dirk sagen (vorausgesetzt, Adelindes Programm und der Loader haben beide Platz im Flash).
(@Dirk : Bascom erzeugt ein Intel HEX File)
 
Hallo zusammen

Erst mal vielen Dank für die Einschätzung zum Schaltplan.
Ich habe von diesen Boards schon vor Monaten zwei gekauft.
Das Board im Shop werde ich nochmal draufzurückkommen.
Ich war mir nur nicht ganz sicher ob die mit 16Mhz noch arbeiten.
Habe heute einfach mal Quarze besorgt.

ISP Programmer angeschlossen.
In Bascom den Programmer angewählt.
Indentify Chip sagt:

ATMega128 gefunden.
Unter Fuse Bits steht das der Chip mit intern 1Mhz läuft.
Jetzt kommts:
Was ist die richtige Einstellung für extern 16Mhz?

Noch eine Frage zum Bascom Listing:
in Zeile 94 steht:
Config Portf.0 = Output 'LED auf der Platine
Ich habe LEDs an PA0 und PA1.


Danke
Gruss Wolle
 
Hi,

- es scheint nur einen Abblockkerko für beide digitale Stromversorgungspaare zu geben.
normalerweise gönnt man jedem Versorgungspaar einen Abblock-Keramikkondensator. Das Problem von einem für den gesamten Chip sieht man, wenn er mehr Strom an den Ausgängen liefern soll. Dann könnte das durch Versorgungseinbrüche alles instabil werden.

- zusätzlich zur üblichen Drossel zwischen Vcc und AVcc gibt es eine Drossel zwischen Gnd und AGnd. AVcc versorgt aber auch einige digitale Pins (Port F). Je nach Last können sich meiner Meinung nach Gnd und AGnd "gegeneinander verschieben" (@dino03 ?? )
Laut der Applikation-Note von Atmel sollte nur am AVcc eine Drossel zum Vcc gehen. Die wollten es wohl besonders gut machen und haben damit voll in den Eimer gegriffen. Bei Last an den Digitalausgängen der Analogabteilung wird AGND floaten (so wie du schon geschrieben hast) damit bekommt man Spannungsschwankungen in den Chip und damit wieder instabile Zustände. Die Drossel würde ich durch ne Drahtbrücke ersetzen.
AGND ist darum einzeln herausgeführt, damit man die Analogmasse einzeln zu einem gemeinsamen Masse-Sternpunkt führen kann. Da treffen sich dann die Masseleitungen der einzelnen Schaltungsteile. Das verhindert Einkopplungen von einem Schaltungsteil in ein anderes.

Gruß
Dino
 
ISP Programmer angeschlossen.
Grundsätzlich ist es schwer, Vorkenntnisse oder vorhandenes Equipment einzuschätzen, wenn man sich nicht kennt, insofern kannst Du die Anmerkungen zum nicht vorhandenen Programmer oben ignorieren.

Der Code aus #2 erwartet 16MHz Takt, wie der Controller getaktet wird ist dabei erstmal egal. Außerdem sind die Beine durch den damals verwendeten Schaltplan festgelegt gewesen. Es steht Dir natürlich frei, Plan und Code anzupassen.
Ich habe mir weder den ELO-Artikel durchgelesen, noch den Code durchgearbeitet.

In Deinem Mitglieder-Profil hast Du C als Programmiersprache angegeben - möglicherweise siehst Du es als Herausforderung, das selbst in C umzusetzen?
(in C kann ich Dir nicht helfen - aber diverse andere User hier...)

Unter Fuse Bits steht das der Chip mit intern 1Mhz läuft.
Jetzt kommts:
Was ist die richtige Einstellung für extern 16Mhz?
Der Mega128 verfügt über einen internen RC-Oszillator, der auf per Fuse ausgewählt, und auf 1, 2, 4 oder 8MHz eingestellt werden kann (meiner Meinung nach werden da dann einfach entsprechende Rs oder Cs zugeschaltet).
Grundeinstellung eines neuen Mega128 ist der interne Oszillator mit 1MHz.
Auf Deinem Board verwendest Du einen externen Quarz (welche Frequenz der hat, mußt Du wissen - zumindest willst Du später einen mit 16MHz verwenden.
Ein Blick ins Datenblatt des Mega128 zu den Clock Options (ab Seite 35) zeigt, daß der Controller neben dem Internen RC-Oszi auch über einen externen RC-Oszi, eine externe Clock, einen Low Frequenzy Crystal Oszi (32,...kHz Uhrenquarz) oder einen externen Crystal Oszi getaktet werden kann.
Für Deinen (schnellen) Quarz ist also der externe Crystal zu wählen (CKSEL[3..1]=1111..1010.
Ab Seite 38 gibts dann näheres dazu.
Bei mehr als 8MHz soll die CKOPT-Fuse programmiert werden (also =0) - das entspricht bei späteren Controllern dem (externen) Full Swing Oszillator. Außerdem empfiehlt sich zur Sicherheit die maximal mögliche Startup-Zeit.
Was bietet BASCOM denn zum Timer zur Auswahl an?
Ich verwende da BASCOM grundsätzlich nicht, sondern immer das Atmel Studio (oder das AVR Studio). (Was wird Dir hier angeboten?)

Edit:
so wie du schon geschrieben hast
Danke, dann hat mein Bauch recht gehabt...
 
Guten Morgen!

Ja C habe als Programmiersprache angegeben.
Mit Armel Studio 7 und der avrlib kratze ich aber noch an der Oberfläche.
Habe einige Artikel aus alten Elektonikprojekten der Zeitschriften nachgebaut.
Wegen des Lerneffekt.
Hier geht es aber um Bascom. Wenn dir Uhr mit Programm läuft ist doch OK.
Mit AtmelStudio wird es nicht besser laufen.
Ich habe mal einige Bilder angehangen was mir in der Fuse Einstellungen
angeboten wird.
Welche wäre denn da für 16Mhz richtig.





AtmelStudio_1.jpg AtmelStudio_2.jpg bascom_1.jpg bascom_2.jpg bascom_3.jpg bascom_4.jpg
 
Ja C habe als Programmiersprache angegeben.
Mit Armel Studio 7 und der avrlib kratze ich aber noch an der Oberfläche.
Ich war davon ausgegangen, daß es Dir leichter fallen würde einen C-Code als ein Bascom-Code anzupassen.
Hier geht es aber um Bascom. Wenn dir Uhr mit Programm läuft ist doch OK.
Ja, aber Du wirst den Code an den Schaltplan Deines Boardes anpassen müssen. Oder die Uhr so an Dein Board anschließen, wie Adelinde es vorgesehen hatte. Wobei diesbezüglich auch kein Schaltplan vorhanden ist - Du ihn also aus dem Code rekonstruieren mußt.
Mit AtmelStudio wird es nicht besser laufen.
Ich vertraue Bascom beim Flashen meiner Controller nicht, ich flashe immer mit dem Studio. Und wenn ich eben erst das von Bascom erzeugte .hex im Studio suchen muß. Ist 'ne Marotte von mir, aber ich hab hier 'n Mega88, den Bascom als 88A oder 88P oder so erkannt hatte, und der sich nach einem Versuch mit Bascom nicht mehr (auch nicht mit dem Studio) flashen läßt. Auch nicht nach einem Chip Erase. Fuses lesen kann ich, setzen glaub ich auch, aber eine gesetzte (=0) Fuse läßt sich nicht mehr löschen (=1). ->Elektroschrott
nur am Rande...
Welche wäre denn da für 16Mhz richtig.
Die ersten beiden Bilder sind aus dem Studio.
Du hast einen Quarz mit einer hohen Frequenz (aus AVR-Sicht), extern als Crystal. Dieser soll mit dem Treiber hinter XTAL1 und XTAL2 einen Crystal-Oszillator bilden, es handelt sich aber nicht um einen Crystaloscillator (diese ICs mit vier Beinen zB -> die wären als externe Clock zu verstehen).
In der Liste fehlt 'ne Menge, aber "Ext. Crystal/Resonator High Freq." klingt schon mal passend. Davon gibt's acht, welcher solls sein?
sich zur Sicherheit die maximal mögliche Startup-Zeit.
Nach dem Reset (PowerUp) wartet der Controller erstmal 'ne Zeitlang, wobei die Zeit durch den Watchdog-Oszillator festgelegt ist. Das ist die Millisekundenangabe hinten. 64ms wären das Maximum. In der Zeit sollte Vcc quasi stabil anliegen.
Danach versucht der Treiber hinter den XTALs, den angeschlossenen Quarz sauber und frequenzstabil schwingen zu lassen, Du hast jetzt die Wahl, wie viele Schwingungen Du warten lassen willst, bevor der Controller aus dem Reset entlassen wird (und mit dem Programm beginnt). zur Auswahl stehen 258 Schwingungen, 1K (Tausend) Schwingungen oder 16K (sechzehntausend) Schwingungen.
Wenn der Controller also nicht sehr schnell auf Reset und co. reagieren muß, sind 16K CK+64ms am sichersten.
Außerdem sollte CKOPT aktiviert werden (=0).

Auf den Bildern sieht man ganz links am Rand noch die Reste der Kästchen, wo die Fusebytes angezeigt werden, wenn Du irgendwas anderes aus der Clocksettings-Liste auswählst, wird die Anzeige der Fusebytes aktualisiert (ebenso, wenn Du oben was änderst.)
Achtung: Solange Du das nicht in den AVR brennen läßt, passiert nichts, nach dem Brennen gelten die Einstellungen. Also erstmal nicht's brennen lassen.

Wähle mal den letzten Eintrag (Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 64ms", Aktiviere CKOPT, und Poste mal, was da bei den drei Fuses steht (aber nicht in den AVR Programmieren)...
 
Ich war davon ausgegangen, daß es Dir leichter fallen würde einen C-Code als ein Bascom-Code anzupassen.

Ja das stimmt schon aber ich muss mich erst noch mit der avrlib beschäftigen.

Ja, aber Du wirst den Code an den Schaltplan Deines Boardes anpassen müssen. Oder die Uhr so an Dein Board anschließen, wie Adelinde es vorgesehen hatte. Wobei diesbezüglich auch kein Schaltplan vorhanden ist - Du ihn also aus dem Code rekonstruieren mußt.

Das muss ich auch so machen. Habe ja Zeit dafür. Die Verdrahtung zur Anzeigeplatine habe ich schon mal aufgemalt.
Mechanisch muss erst alles befestigt werden. Es sind da der DCF Empfänger mit Ferritstab und die RTC.

Ich vertraue Bascom beim Flashen meiner Controller nicht, ich flashe immer mit dem Studio. Und wenn ich eben erst das von Bascom erzeugte .hex im Studio suchen muß. Ist 'ne Marotte von mir, aber ich hab hier 'n Mega88, den Bascom als 88A oder 88P oder so erkannt hatte, und der sich nach einem Versuch mit Bascom nicht mehr (auch nicht mit dem Studio) flashen läßt. Auch nicht nach einem Chip Erase. Fuses lesen kann ich, setzen glaub ich auch, aber eine gesetzte (=0) Fuse läßt sich nicht mehr löschen (=1). ->Elektroschrott
nur am Rande...

Au, da muss man richtig vorsichtig sein ...

Die ersten beiden Bilder sind aus dem Studio.

Ja vergaß ich zu erwähnen. Das wird mit einer Combobox ausgewählt. Bei jedem Bild einen Schritt weiter.

Du hast einen Quarz mit einer hohen Frequenz (aus AVR-Sicht), extern als Crystal. Dieser soll mit dem Treiber hinter XTAL1 und XTAL2 einen Crystal-Oszillator bilden, es handelt sich aber nicht um einen Crystaloscillator (diese ICs mit vier Beinen zB -> die wären als externe Clock zu verstehen).
In der Liste fehlt 'ne Menge, aber "Ext. Crystal/Resonator High Freq." klingt schon mal passend. Davon gibt's acht, welcher solls sein?Nach dem Reset (PowerUp) wartet der Controller erstmal 'ne Zeitlang, wobei die Zeit durch den Watchdog-Oszillator festgelegt ist. Das ist die Millisekundenangabe hinten. 64ms wären das Maximum. In der Zeit sollte Vcc quasi stabil anliegen.
Danach versucht der Treiber hinter den XTALs, den angeschlossenen Quarz sauber und frequenzstabil schwingen zu lassen, Du hast jetzt die Wahl, wie viele Schwingungen Du warten lassen willst, bevor der Controller aus dem Reset entlassen wird (und mit dem Programm beginnt). zur Auswahl stehen 258 Schwingungen, 1K (Tausend) Schwingungen oder 16K (sechzehntausend) Schwingungen.
Wenn der Controller also nicht sehr schnell auf Reset und co. reagieren muß, sind 16K CK+64ms am sichersten.
Außerdem sollte CKOPT aktiviert werden (=0).

Auf den Bildern sieht man ganz links am Rand noch die Reste der Kästchen, wo die Fusebytes angezeigt werden, wenn Du irgendwas anderes aus der Clocksettings-Liste auswählst, wird die Anzeige der Fusebytes aktualisiert (ebenso, wenn Du oben was änderst.)
Achtung: Solange Du das nicht in den AVR brennen läßt, passiert nichts, nach dem Brennen gelten die Einstellungen. Also erstmal nicht's brennen lassen.

Wähle mal den letzten Eintrag (Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 64ms", Aktiviere CKOPT, und Poste mal, was da bei den drei Fuses steht (aber nicht in den AVR Programmieren)...



27-01-_2019_15-13-56.png
 
Datenblatt Seite 287ff.
  • extended fusebyte ist 0xFF, also alle Bits gesetzt. Was heißt das? Daß keines der dortigen Fusebits "aktiviert" sind. Im Extended sind nur die untersten beiden Bits belegt:
    • Bit1 - M103C - ATMega103 Kompatibilitätsmodus, der Mega128 würde sich weitgehend wie ein Mega103 verhalten - brauchst Du nicht
    • Bit0 - WDTON - Watchdog Timer Always on - damit wäre der Hund immer scharf.
Beide Bits sind nicht "aktiviert", erkennt man auch an den leeren Checkboxes auf dem Bild.
  • high fusebyte ist 0x99 bzw 10011001bin
    • Bit7 - OCDEN - On Chip Debuggung Enabled - Damit könnte man via JTAG (?) direkt auf dem Chip debuggen, ist hier (korrekt) deaktiviert
    • Bit6 - JTAGEN - JTAG enabled - Damit kannst Du den Chip programmieren(?) und debuggen (siehe OCDEN). Da Du scheinbar einen SPI-Programmer nutzt, solltest Du diese Fuse deaktivieren. JTAGEN setzt unter anderem die internen Pullups (Dein Board hat zusätzlich auch noch welche). Also solange Du JTAG nicht nutzen willst, machs aus (@Dirk korrekt?)
    • Bit5 - SPIEN - SPI-Programming enabled - nur wenn diese Fuse (wie hier) aktiviert ist, kann der Chip via SPI programmiert werden - brauchst Du also bei Verwendung eines SPI-Programmers. Dann nie deaktivieren. (Das sollte via SPI aber auch gar nicht gehen/ das Studio sollte meckern...)
    • Bit4 - CKOPT - die bereits genannte CKOPT-Fuse. Bei Verwendung eines externen Quarzes wird mehr Strom durch die XTALs gejagt. Das macht den Oszillator (insbesondere bei höheren Frequenzen) störunanfälliger, erhöht aber auch den Stromverbrauch. Hat bei anderen ClockSources möglicherweise andere Auswirkungen. Solltest Du also noch aktivieren (=0, Haken rein)
    • Bit3 - EESAVE - EEPROM memory is preserved through the Chip Erase - wenn diese Fuse aktiviert wäre, würde ein Chip Erase den EEPROM nicht mitlöschen. Also falls Du irgendwelche Daten im EEPROM ablegst, und später den Code noch veränderst, würde diese Fuse ein unnötig häufiges beschreiben des EEPROMs unterdrücken
    • Bit2 - Bootsz1..0 - legen die Größe des Bootloaders fest - interessiert Dich erstmal nicht, da Du eh keinen nutzt
    • Bit1 - Bootrst - würde den Reset-Vektor umleiten, interessiert Dich erstmal auch nicht
  • low fusebyte - 0xFF bzw 11111111
    • Der Brown Out Detector ist deaktiviert (Bit6), folglich ist der Level (Bit7) irrelevant.
    • Zur StartUpTime und Clock Source Select blättern wir zu den Clock Sources auf Seite 36 (Table 6).
Für einen externen Quarz wäre für CKSEL3..0 also 1111..1010 zu wählen.

Auf Seite 38 (Crystal Oszillator) wird's genauer, in Table8 wird nochmal auf CKOPT hingewiesen, CKSEL3..1 soll also 101, 110 oder 111 sein. Obs da'n Unterschied gäbe weiß ich nicht...
Auf der folgenden Seite in Table9 dann die SUT-Bits und CKSEL0 - wenn die drei Bits auch noch gesetzt werden, hättest Du also die maximale StartUpTime mit 16K Clocks + 65ms (64ms ? egal)

Also das LowFuseByte würde mit xx111111binär (oh welch Überraschung) zu dem angegebenen Eintrag passen.

Wie Dirk schon sagte: CKOPT anhaken, und ich würde außerdem JTAGEN rausnehmen. Wenn Du das dann "Programmieren" läßt, läuft der Chip nur noch mit externem Quarz (wobei man den noch mit einer externen Clock übersteuern könnte) - ohne externe Taktquelle kann der Chip dann nicht mehr Programmiert werden, insbesondere können die Fuses dann auch nicht mehr ohne zurückgesetzt werden...
Klar?
 
Zuletzt bearbeitet:
Ja, JTAG würde ich auch deaktivieren (wird ja wahrscheinlich nicht verwendet).

Also Haken bei JTAGEN weg.
 
Guten Morgen!

Ich möchte mich ganz herzlich bedanken für diese ausführliche Erklärungen der FUSE Bit.
Ganz große Klasse.
Ins Datenblatt schaue ich jetzt auch öfter. Man scheut eigentlich immer nur das Englisch.
Das Board vom Shop sehe ich mir genauer an.

Bei mir sehen die FUSE Bits jetzt so aus:


studio.pngbascom.png
 
Guten Tag zusammen!

Ich möchte mich hier nochmal melden.
Habe die Steuerplatine der alten Uhr um der es hier geht ausgetauscht.
Siehe Bilder im Anhang. Das ging auch ganz gut.
Nach ein par Stunden Verdrahten habe ich zum ersten Mal eingeschaltet.
Und siehe da sie läuft!
Bei genauen Hinsehen bemerkte ich aber das nur Sekunden und Minutenzeiger laufen.
Stundenzeiger nicht.
Die Variablen _hour u.s.w werden durch DCF nicht gesetzt.
DCF Synconisation findet nicht statt.
Mit diesen Problem ärgere ich mich jetzt schon Tage rum.
Habe im Programm zum test Dcf_status über Terminal anzeigen lassen.
Bit 7 wird nie gestzt.
Mit Ozzi am Ausgang des DCF Moduls kann mann Impulse feststellen.

alt.jpg neu.jpg



CodeBox BascomAVR
'#####################################################################
' Atmega 128
' DCF77 Conrad, COM2, RTC DS1307
'
'
'##############################################################################

'------------------------------------------------------------------------------
' Compilerinstruktionen und Compilerdirektiven
'------------------------------------------------------------------------------
$Regfile="m128def.dat"
$Crystal=16000000
$hwstack=128
$swstack=128
$framesize=128

'========== Hardware Uart für Terminal  ==========
Config com2 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "com2:" For Binary As #2    'Uart an Pin: PD2;PD3
' print #2, "test"
' Change the baud rate in a program:
' Baud = 9600

' Eine separate Angabe einer LIB für DCF77 ist bei BASCOM gar nicht notwendig

' ========== TWI i2c ==========
' AVR Controller, die I2C hardwaremäßig Unterstützen, haben das TWI-Modul,
' die Ports für Data und Clock sind dabei vorgegeben. TWI ist bei den meisten
' ATMegas vorhanden, z.B. dem ATMega32.
' $lib "ds1307clock_ger.lib"

$lib "i2c_twi.lbx"     ' Für Hardware TWI
Config Twi = 100000                             ' wanted clock frequency when using $lib "i2c_twi.lbx"

' bei Software I2C:
'Config Scl = Portd.0                          ' Ports angeben wenn Software I2C
'Config Sda = Portd.1

I2cinit                                        ' we need to set the pins in the proper state

' 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_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

'========== Fuer Berechnung der Zeigerposition ==========
Dim tempe as byte
dim TempB as byte
dim TreiberIC as byte     '1-4 für Minuten, Sekunden und 5-8 für die Stunden (BCD-Treiber)

'--Pausen fuer Muliplex,
'Ueber 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 porte = Output     'Select Treiber IC 1-8
Config Portc = Output     'Binäre Ausgabe der Zeit

Config porta.0 = Output   'LED auf der Platine
Config porta.1 = Output

' Beispiele:
'PinB.1 auf Ausgang alle anderen auf Eingang
'   Ddrb = &B00000010
'Pull-up aktiviert ausser PinB.1
'   Portb = &B11111101


' ----- 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.
'  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 = Pina.7 , Timer = 1 , Inverted = 1 , Check = 1 , Update = 0 , Updatetime = 59 , Timer1sec = 1 , Debug = 1  ' , Gosub = Sectic
'               |        |           |               |          |            |               |            |
' Use PinB.0 ---+        |           |               |          |            |               |            |
' Timer 1 is default ----+           |               |          |            |               |            |
' DCF77 signal wird       invertiert +               |          |            |               |            |
' Vergleich akt. Minutes mit vorheriger Minute ------+          |            |               |            |
' Perform kontinuierliches Update der empfangenen Daten --------+            |               |            |
' Updatetime ist nicht relevant da Update = 0 ------------------+            |               |            |
' Timer sorgt fuer SoftClock Update ------------------------------------------+               |            |
' Switchpower, Powerpin und Powerlevel wird nicht benutzt da Interface nicht vorhanden!      |            |
' Secondticks wird dem Compiler ueberlassen und nicht neu gesetzt!                            |            |
' Debug fuer die Variablen  bDCF_Pause und bDCF_Impuls ist aktiv -----------------------------+            |
' Jede Sekunde wird Gosub-Routine Dcf77_sectic angesprungen ----------------------------------------------+


'##############################################################################
' Beim Einstellen der Datum-/Zeitfunktion in BASCOM dabei werden automatisch die Variablen
' _year,
' _month,
' _day,
' _hour,
' _min,
' _sec
' im BCD Format angelegt
' Datumsformat deutsch Tag.Monat.Jahr und als Trennzeichen den Punkt
Config Date = Dmy , Separator = .                           ' Datumsformat einstellen
Enable Interrupts                                           ' Interrupts aktivieren


' ----- 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 fuer Anzahl der Syncs
Dcf_sync_count = 0
Dim Temp_byte_1 As Byte                                     ' Temporäre Byte Variable


'##############################################################################
' Hauptprogramm
'##############################################################################

Gosub Rtc_set_softclock

' Led Spielerei beim Start
while Temp_byte_1 < 4
  set porta.0
  waitms 500
  reset porta.0
  set porta.1
  waitms 500
  reset porta.1
  incr Temp_byte_1
wend



' Folgende Zeilen zum Test Dcf_status
   ' DCF77 Statusbits abfragen und maskieren
   Temp_byte_1 = Dcf_status And &H80
   print #2, "Dcf_status"
   Print #2, Dcf_status
   print #2, "Temp_byte_1"
   Print #2, Temp_byte_1



Do

   ' DCF77 Statusbits abfragen und maskieren
   Temp_byte_1 = Dcf_status And &H80

   ' Pruefung ob SoftClock durch DCF77 synchronisiert (Bit 7 aus Statusbyte)
   If Temp_byte_1 = &H80 then
      Incr Dcf_sync_count               ' Sync-Counter erhören
      Reset Dcf_status.7                ' Zur Kontrolle bei erfolgreichem SYNC Status-Bit zuruecksetzen
         ' DS1307 synchronisieren
      Gosub Rtc_set_rtc_clock
   End If

   ' Beim Tageswechsel pruefen 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 zuruecksetzen  (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
' ##############################################################################################
   tempe = _hour

   '24h zurueck auf 12h
   if tempe > 12 then
      tempe = tempe - 12
   endif
   tempe = tempe *5  ' eine Stunde = 60min,
   TempB = _min /12  ' Stundenzeiger alle 12min um 1me min weiter
   tempe = tempe + TempB

   TreiberIC = 5 ' Stunden werden mit Treiber 5-8 angezeigt
   while tempe >= 15
      tempe = tempe -15
      incr TreiberIC
   wend

   porte = 255   ' alle TreiberIC aus
   portc = tempe 'Portc stellen

   'TreiberIC auswählen und einschalten
   Select Case TreiberIc
     'Case 1 : porte.0 = 0
     'Case 2 : porte.1 = 0
     'Case 3 : porte.2 = 0
     'Case 4 : porte.3 = 0

     Case 5 : porte.4 = 0
     Case 6 : porte.5 = 0
     Case 7 : porte.6 = 0
     Case 8 : porte.7 = 0

' Folgende 4 Zeilen sind original Original:
'     Case 5 : Porte.5 = 0   'Fehler beim Verbinden, Stunden Treiberic mit 2 begonnen
'     Case 6 : Porte.6 = 0
'     Case 7 : Porte.7 = 0
'     Case 8 : Porte.4 = 0
   End Select

   Waitms PauseMin


' ##############################################################################################
' Minuten berechen
' ##############################################################################################
   tempe= _min
   TreiberIC = 1
   while tempe >= 15
      tempe = tempe -15
      incr TreiberIC
   wend

   porte = 255   ' alle TreiberIC aus
   portc = tempe 'Portc stellen

   Select Case TreiberIc
     Case 1 : porte.0 = 0
     Case 2 : porte.1 = 0
     Case 3 : porte.2 = 0
     Case 4 : porte.3 = 0
    ' Case 5 : porte.5 = 0
    ' Case 6 : porte.6 = 0
    ' Case 7 : porte.7 = 0
    ' Case 8 : porte.4 = 0
   End Select
   Waitms PauseMin


' ##############################################################################################
'  Sechkunden berechen
' ##############################################################################################
   tempe= _sec

   'wen noch kein DCF sync (Zeiger spingt alle 2 Sekunden)
   if Dcf_sync_count = 0  then  'noch keine Syncroniation von DCF
      set porta.1               'LED auf Platine Blinkt
      TempB = _sec mod 2
      if TempB = 0  then   'Bei gerader Sekunde
         incr tempe        'Zeiger 1Sekunde weiter stellen
         if tempe > 60  then
            tempe = 0
         endif
      else
         reset porta.1
      endif
   endif

   'zu Kontrolle beim 2. sync LED auf Plantine ein
   if    Dcf_sync_count >= 2  then
      reset porta.0
      else
      set porta.0
   endif

   TreiberIC = 1
   while tempe >= 15
      tempe = tempe -15
      incr TreiberIC
   wend

   porte = 255   ' alle TreiberIC aus
   portc = tempe 'Portc stellen

   Select Case TreiberIc
     Case 1 : porte.0 = 0
     Case 2 : porte.1 = 0
     Case 3 : porte.2 = 0
     Case 4 : porte.3 = 0
    ' Case 5 : porte.5 = 0
     'Case 6 : porte.6 = 0
    ' Case 7 : porte.7 = 0
     'Case 8 : porte.4 = 0
   End Select

   Waitms PauseSec

Loop

'## End Hauptprogramm #########################################################


'------------------------------------------------------------------------------
' RTC - Gosub-Routine: Rtc_set_rtc_clock
' Subroutine uebernimmt bei erfolgreicher Synchronisation durch DCF77 die
' aktuellen Zeit und Datumsinformationen in die RTC DS1307
'------------------------------------------------------------------------------
Rtc_set_rtc_clock:

   print #2, "Bin in 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 stellen also synchronisieren
   I2cstart                                                 ' START-Sequenz senden
   I2cwbyte Rtc_address_write                               ' Daten schreiben initiieren
   I2cwbyte Rtc_address_seconds                             ' Adresse uebertragen = &H00
   I2cwbyte Dcf77_sec                                       ' Byte 1 uebertragen
   I2cwbyte Dcf77_min                                       ' Byte 2 uebertragen
   I2cwbyte Dcf77_hour                                      ' Byte 3 uebertragen
   I2cwbyte Dcf77_weekday                                   ' Byte 4 uebertragen
   I2cwbyte Dcf77_day                                       ' Byte 5 uebertragen
   I2cwbyte Dcf77_month                                     ' Byte 6 uebertragen
   I2cwbyte Dcf77_year                                      ' Byte 7 uebertragen
   I2cstop                                                  ' STOP-Sequenz
Return
'-- End Rtc_set_rtc_clock -----------------------------------------------------




'------------------------------------------------------------------------------
'  RTC - Gosub-Routine: Rtc_set_softclock
'  Subroutine uebernimmt 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 uebertragen = &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 uebernehmen
   _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
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)