DS1307 reagiert am I2C-Bus nicht (läuft jetzt)

dino03

Aktives Mitglied
27. Okt. 2008
6.760
20
38
Sprachen
  1. BascomAVR
  2. Assembler
Hallo zusammen,

nun hab ich auch mal ein Problemchen ...
( unter anderem auch mal wieder mit dem UMTS-Proxy :mad:
Die Buttons im Editor sind mal wieder tot :eek: )

Also wie im Titel geschrieben ... die DS1307 RTC will nicht so wie ich.

Hier der Programmcode in der ganzen Schönheit ...
Anhang anzeigen EvalBoard_m8_DS1307_v00.bas

und hier mal ein Foto vom Testaufbau ...
DS1307_I2C-Test.jpg

Ich hab mein kleines Zweikanal-Digital-Oszi drangenhängt und sehe alle
Signale auf dem Bus. Ich kann jedes gesendete Bit sehen und es paßt alles.
Nur die Ack-Bits vom DS1307 sind immer auf High (also kein ACK).
Das Mistding reagiert nicht. Ich hab alles komplett nach Datenblatt
angeschlossen. Pin8 auf +5V, Pin3 auf GND, Pin1+2 mit Uhrenquarz, am
Pin7 hab ich ne LED angeschlossen um den Taktausgang zu testen und
am Ubatt hab ich mit ner 3,3V-ZDiode eine Batterie simuliert. SDA/SCL hab
ich auch mehrfach überprüft. Die sind nicht vertauscht. Mit den beiden LEDs
am I2C-Bus sehe ich auch die Transfers kurz aufblitzen. Aber es geht auch
ohne LEDs nicht. Es liegt also auch nicht an der Last die ich mit den LEDs
erzeuge.

Das selbe Problem hatte ich schon am Mega128. Da hab ich auch einen auf
das Board gelötet und es lief nicht. Zur Übberprüfung hab ich also jetzt einen
an nen Mega8 gepackt und es ist die selbe Sch ... :eek: :p

Aus Verzweiflung hab ich dann einfach mal die Schreibadresse in einer Schleife
hochzählen lassen und von 00h-FEh alle getestet (Bit0 auf 0 wegen Write).
Alles ohne Erfolg. Er stellt den SQWE nicht auf 1Hz um damit ich sehe das er
reagiert hat. Auch kein ACK und nix.

Auf nem anderen Board hab ich nen PCF8583 drauf und der hat sofort seine
1Hz auf dem Testausgang rausgeschmissen. Auch ohne ein einziges gesendetes
Bit. Im Notfall werde ich die Teile verwenden und den DS1307 raushauen.

Ich pack die interessanten Teile hier nochmal so rein ...


CodeBox BASCOM

' ===== PortC =================================================================
' I=7= I=6= I=5= I=4= I=3= I=2= I=1= I=0= => 00000000 => DDRC
' ---- Reset SCL SDA ---- ---- ---- ---- => 00111111 => PORTC (init)
' x x | | | | | |
'
Ddrc = &B0000_0000
Portc = &B0000_1111

' ===== I2C/TWI initialisieren ================================================
Config Scl = Portc.5
Config Sda = Portc.4
I2cinit
Config Twi = 50000 ' Taktfrequenz 50 kBit/s
' TWI gleich einschalten, das macht BASCOM ansonsten erst beim I2CStart
'Twcr = &B00000100 ' nur TWEN setzen
' Optionale Einstellungen für TWI Kommunikation die nicht zwingend erforderliche sind
' Twsr = 0 ' Status und Prescaler Register
' Twbr = 152 ' Bit Rate Register, 72 = 100kHz 152 = 50kHz(0 bis 255)
' Config I2cdelay = 40

...
..
...

' ===== DS1307 ===== Register =====
' I2C-Adresse : 1 1 0 1 0 0 0 rw => wr D0h / rd D1h
' =7= =6= =5= =4= =3= =2= =1= =0=
' 00h Ch | 10sec | seconds | 00-59 CH=1 -> ClockHalt
' 01h X | 10min | minutes | 00-59
' 02h X |12h|A/P|10h| hours | 01-12 12h=1 PM=1
' X |24h| 10h | hours | 00-23 24h=0
' 03h X X X X X | day | 1-7
' 04h X X |10date | date | 01-28/29,01-30,01-31
' 05h X X X |10m| month | 01-12
' 06h | 10year | year | 00-99
' 07h |out| X X |SQW| X X |RS1|RS0| Ctrl-Byte
' | | | | _
' | | |___|___| 00 1Hz -> SQW
' | | | 01 4096Hz
' | | | 10 8192Hz
' | |__ SQWE 1=enable |_11 32768Hz
' |
' |___ SQW/Out-Level bei SQW=0(disable)

' ----- RTC DS1307 -----
Dim Ds1307_ctrl_value As Byte
Ds1307_ctrl_value = &B0001_0000

Const Ds1307wr = &B11010000 ' Adresse des DS1307 = &HD0 (schreiben)
Const Ds1307rd = &B11010001 ' Adresse des DS1307 = &HD1 (lesen)

Const Ds1307_sec = &H00
Const Ds1307_min = &H01
Const Ds1307_hour = &H02
Const Ds1307_day = &H03
Const Ds1307_date = &H04
Const Ds1307_month = &H05
Const Ds1307_year = &H06
Const Ds1307_ctrl = &H07

Dim Loopcount As Word
Loopcount = 0
' ###############################################
' ##### Hauptschleife Start #####################
' ###############################################
Do




If Loopcount = 0 Then
Locate 1 , 1
Lcd A ; " "
Incr A

I2cinit ' Init

I2cstart ' Startsequenz senden

' I2cwbyte Ds1307wr ' feste Write-Adresse senden
W = A ' Write-Adresse bauen
W.0 = 0 ' Write-Adresse bauen
I2cwbyte W ' Chip suchen (Write-Adresse zaehlt hoch)

Waitus 30 ' Damit man beim Oszilloskop die Bytes unterscheiden kann

I2cwbyte Ds1307_ctrl ' Control-Byte adressieren

Waitus 30 ' Damit man beim Oszilloskop die Bytes unterscheiden kannv

I2cwbyte &B0001_0000 ' SQWE auf 1Hz stellen

I2cstop ' Stop-Sequenz senden

' === Oszilloskop ===
' Mode : Dual
' Ch1 : 2V/Div --- SCL
' Ch2 : 2V/Div --- SDA
' Time : 10us/Div
' Trigger : Single
' Display : __v________
' Source : Ch1 --__

End If

Incr Loopcount

Loop
' ###############################################
' ##### Hauptschleife Ende ######################
' ###############################################


Also seht euch mal den Kram an den ich da verzapft habe und dann laß ich
mich mal überraschen :cool:

Gruß
Dino
 
Hallo Dino!

Ich habe zwar gerade nicht viel Zeit und deswegen hatte ich den Code auch nur überflogen.....
Was mir aber gleich zu Beginn aufgefallen ist:


CodeBox BASCOM

' ===== PortC =================================================================
' I=7= I=6= I=5= I=4= I=3= I=2= I=1= I=0= => 00000000 => DDRC
' ---- Reset SCL SDA ---- ---- ---- ---- => 00111111 => PORTC (init)
' x x | | | | | |
'
Ddrc = &B0000_0000
Portc = &B0000_1111

' ===== I2C/TWI initialisieren ================================================
Config Scl = Portc.5
Config Sda = Portc.4
I2cinit
Config Twi = 50000 ' Taktfrequenz 50 kBit/s



Die Pins für den I2C müssen doch Ausgänge sein.... also Ports!
Warum hast du Eingänge ohne PullUp`s draus gemacht? :hmmmm:
Probiere es doch mal so:
Code:
Ddrc = &B00[B]11[/B]_0000
Portc = &B0000_1111

' ===== I2C/TWI initialisieren ================================================
Config Scl = Portc.5
Config Sda = Portc.4
I2cinit
[B]Config Twi = 100000[/B]                                          ' Taktfrequenz 100 kBit/s


Ansonsten habe ich mit dem DS1307 selber noch nicht gearbeitet und kann dir zu den Möglichkeiten nichts sagen.

Allerdings finde ich deine Programmierung zur Übermittlung der Daten etwas seltsam. :eek:
Warum machst du diese 30µs Pausen? Meinst du, die Bytes kommen sonst zu schnell nacheinander?

Hier mal ein Auszug aus dem Beispiel von BASCOM:
Code:
[B]Getdatetime:[/B]
I2cstart                                                 ' Generate start code
I2cwbyte Ds1307w                                         ' send address
I2cwbyte 0                                               ' start address in 1307

I2cstart                                                 ' Generate start code
I2cwbyte Ds1307r                                         ' send address
I2crbyte _sec , Ack
I2crbyte _min , Ack                                     ' MINUTES
I2crbyte _hour , Ack                                     ' Hours
I2crbyte Weekday , Ack                                   ' Day of Week
I2crbyte _day , Ack                                     ' Day of Month
I2crbyte _month , Ack                                   ' Month of Year
I2crbyte _year , Nack                                   ' Year
I2cstop

 

[B]Setdate:[/B]
I2cstart                                                 ' Generate start code
I2cwbyte Ds1307w                                         ' send address
I2cwbyte 4                                               ' starting address in 1307
I2cwbyte _day                                             ' Send Data to SECONDS
I2cwbyte _month                                           ' MINUTES
I2cwbyte _year                                           ' Hours
I2cstop

 

[B]Settime:[/B]
I2cstart                                                 ' Generate start code
I2cwbyte Ds1307w                                         ' send address
I2cwbyte 0                                               ' starting address in 1307
I2cwbyte _sec                                             ' Send Data to SECONDS
I2cwbyte _min                                             ' MINUTES
I2cwbyte _hour                                           ' Hours


Dort wird immer nach der IC-Adresse noch eine "Startadresse" für den DS1307 übermittelt.
Ist das bei dir auch so?


Grüße,
Cassio
 
Na denn will ich mal nen paar weitere Infos geben,

@ cargoo
Hab mal mit einem DS1307 und einem Code aus dem Netz
http://www.pirnaer.de/bascom_fuer_myavr_ds1307_(echtzeituhr,rtc).html
herumexperimentiert. Hat bei mir damals klaglos funktioniert.
Ansonsten gibts noch im Bascom Ordner unter Samples/I2C ein
DS1307 Beispiel.
Vielleicht hilfts Dir ja.
besten Dank erstmal :) Meinen Code hab ich glaube ich bei Markus hier im Forum
geklaut ;) Ich hab hier auch ne Info gefunden das wohl der Code bei BASCOM
nen Bug haben soll (die haben wohl zuviel Copy-n-Paste gemacht).
aber ich werds mir mal durchsehen. In der Not frißt der Teufel Fliegen :D

nun zu Cassio ...
Was mir aber gleich zu Beginn aufgefallen ist:


CodeBox BASCOM

' ===== PortC =================================================================
' I=7= I=6= I=5= I=4= I=3= I=2= I=1= I=0= => 00000000 => DDRC
' ---- Reset SCL SDA ---- ---- ---- ---- => 00111111 => PORTC (init)
' x x | | | | | |
'
Ddrc = &B0000_0000
Portc = &B0000_1111

' ===== I2C/TWI initialisieren ================================================
Config Scl = Portc.5
Config Sda = Portc.4
I2cinit
Config Twi = 50000 ' Taktfrequenz 50 kBit/s



Die Pins für den I2C müssen doch Ausgänge sein.... also Ports!
Warum hast du Eingänge ohne PullUp`s draus gemacht? :hmmmm:
Das paßt schon. Ich seh ja das Busprotokoll vom ATmega mit dem Scope.
Und durch den I2Cinit wird notfalls der richtige Pin-Zustand hergestellt wenn
es nicht passen sollte. So steht es jedenfalls in der Bascom-Referenz.

Allerdings finde ich deine Programmierung zur Übermittlung der Daten etwas seltsam. :eek:
Warum machst du diese 30µs Pausen? Meinst du, die Bytes kommen sonst zu schnell nacheinander?
Die Pausen sind drin damit ich am Oszilloskop besser sehe wenn das nächste
Byte übertragen wird. Sonst kommen die Bits der einzelnen Bytes direkt
hintereinander. Funktioniert aber mit und ohne Pausen gleich schlecht :eek:

Dort wird immer nach der IC-Adresse noch eine "Startadresse" für den DS1307 übermittelt.
Ist das bei dir auch so?
Mach ich auch.
- Start-Sequenz
- Write-Adresse
- Registeradresse wo man reinschreiben will
- Datenbyte senden
- Stop-Sequenz

Das komische ... Ich sehe ja alle Bits auf dem Oszilloskop. Ich sehe die
Starsequenz, die ganzen Bits kann ich mitzählen und sehen, die Adressen
alles so wie es sein sollte. Nur dieses verdammte ACK-Bit vom DS1307
zeigt keine Reaktion. Wenn die Write-Adresse stimmen sollte, dann müßte
ja wenigstens dor mal ein ACK-Bit vom DS1307 gesetzt werden. Aber nichts
ist. Der Mist-Chip reagiert ja nicht mal auf seine Write-Adresse. Das ist ja
das was ich nicht verstehe. Und die 8 Pins von dem DS1307 kann man auch
nicht unbedingt so falsch anschließen wenn man halbwegs das Datenblatt
versteht.

m8(28) PC5/SCL--->---DS1307(6) SCL (im Bild gelber Draht)
m8(27) PC4/SDA--->---DS1307(5) SDA (im Bild brauner Draht)

SDA/SCL sind auch nicht vertauscht. Dann würde ich es ja verstehen :(

====DS1307-Pins====
+SCD --> C = SCL , D = SDA , + = Vcc , S = SQWE-Out
8765 Pins
1234 Pins
XXBG --> XX=Quarz , B = 3Vbatt , G = GND

Ich hab sogar den I2C-Takt schon von 100kHz auf 50kHz runtergedreht. Nix ist.

ICH KAPPIER ES NICHT ! :eek: SCH...E :confused:

Oder ich hau mal mit dem Hammer drauf. Wenn das Mistding genug Angst
bekommt, evtl läuft es ja dann ... :D :rolleyes:

Gruß
Dino
 
Hallo zusammen,

ich hab die Tage noch nen PCF8574 in meinem "Vorrat" :rolleyes: gefunden :D
Da Cassio das Ding ja schon zum laufen gebracht hat hab ich mir gedacht ...
was der kann, das kann ich auch :eek: :p und siehe da ...
Wie ich die Zeilen für den DS1307 mit Copy/Paste um ein paar für den PCF8574
erweitert habe ... der IO-Baustein läuft am I2C-Bus sofort. Dabei habe ich
keine einzige Zeile Fremdcode für den PCF8574 verwendet. Lediglich die für
den DS1307 kopiert und angepaßt ...
Anhang anzeigen EvalBoard_m8_DS1307_v00.bas


CodeBox BASCOM

' ----- I/O PCF8574 -----
Const Pcf8574wr = &B0100_0000 ' Adresse des PCF8574 = &H40 (schreiben)
Const Pcf8574rd = &B0100_0001 ' Adresse des PCF8574 = &H41 (lesen)



Dim Loopcount As Word
Loopcount = 0
' ###############################################
' ##### Hauptschleife Start #####################
' ###############################################
Do




If Loopcount = 0 Then
Locate 1 , 1
Lcd A ; " "
Incr A

I2cinit ' Init

I2cstart ' Startsequenz senden

I2cwbyte Ds1307wr ' feste Write-Adresse senden
'W = A ' Write-Adresse bauen
'W.0 = 0 ' Write-Adresse bauen
'I2cwbyte W ' Chip suchen (Write-Adresse zaehlt hoch)

Waitus 30 ' Damit man beim Oszilloskop die Bytes unterscheiden kann

I2cwbyte Ds1307_ctrl ' Control-Byte adressieren

Waitus 30 ' Damit man beim Oszilloskop die Bytes unterscheiden kannv

I2cwbyte &B0001_0000 ' SQWE auf 1Hz stellen

I2cstop ' Stop-Sequenz senden

Waitus 100 ' Damit man beim Oszilloskop die Bytes unterscheiden kann
I2cstart ' Startsequenz senden
I2cwbyte Pcf8574wr ' feste Write-Adresse senden
Waitus 30 ' Damit man beim Oszilloskop die Bytes unterscheiden kannv
I2cwbyte A ' wechselnde Werte senden
I2cstop ' Stop-Sequenz senden


' === Oszilloskop ===
' Mode : Dual
' Ch1 : 2V/Div --- SCL
' Ch2 : 2V/Div --- SDA
' Time : 10us/Div
' Trigger : Single
' Display : __v________
' Source : Ch1 --__

End If

Incr Loopcount

Loop
' ###############################################
' ##### Hauptschleife Ende ######################
' ###############################################

und nun verrat mir mal einer warum dieses :angry: DS1307 :stupid: Mistding :banghead:
nicht funktioniert ... Er reagiert immer noch nicht auf meine Kommandos.
DS1307.png DS1307-DIP.png
hier der Schaltplan wie der DS1307 im Moment angeschlossen ist.

mach mich mal einer schlau ... :confused:

Bei der nächsten Bestellung besorg ich mir ne Rutsche PCF8583 RTCs ;)

Gruß
Dino
 
Hallo ,

aus irgendeinem Grund läuft das Mistding jetzt auf einmal.


CodeBox BASCOM

Dim Loopcount As Word
Loopcount = 0
' ###############################################
' ##### Hauptschleife Start #####################
' ###############################################
Do




If Loopcount = 0 Then
Locate 1 , 1
Lcd A ; " "
Incr A

I2cinit ' Init

Waitus 100 ' Damit man beim Oszilloskop die Bytes unterscheiden kann
I2cstart ' Startsequenz senden
I2cwbyte Ds1307wr ' feste Write-Adresse senden
Waitus 30 ' Damit man beim Oszilloskop die Bytes unterscheiden kannv
I2cwbyte 0 ' Sekunden adressieren
I2cwbyte 0 ' Auf 0 setzen (Oszillator starten)
I2cstop ' Stop-Sequenz senden


I2cstart ' Startsequenz senden

I2cwbyte Ds1307wr ' feste Write-Adresse senden
'W = A ' Write-Adresse bauen
'W.0 = 0 ' Write-Adresse bauen
'I2cwbyte W ' Chip suchen (Write-Adresse zaehlt hoch)

Waitus 30 ' Damit man beim Oszilloskop die Bytes unterscheiden kann

I2cwbyte Ds1307_ctrl ' Control-Byte adressieren

Waitus 30 ' Damit man beim Oszilloskop die Bytes unterscheiden kannv

I2cwbyte &B0001_0000 ' SQWE auf 1Hz stellen

I2cstop ' Stop-Sequenz senden

Waitus 100 ' Damit man beim Oszilloskop die Bytes unterscheiden kann
I2cstart ' Startsequenz senden
I2cwbyte Pcf8574wr ' feste Write-Adresse senden
Waitus 30 ' Damit man beim Oszilloskop die Bytes unterscheiden kannv
I2cwbyte A ' wechselnde Werte senden
I2cstop ' Stop-Sequenz senden


' === Oszilloskop ===
' Mode : Dual
' Ch1 : 2V/Div --- SCL
' Ch2 : 2V/Div --- SDA
' Time : 10us/Div
' Trigger : Single
' Display : __v________
' Source : Ch1 --__

End If

Incr Loopcount

Loop
' ###############################################
' ##### Hauptschleife Ende ######################
' ###############################################

Wenn ich die Reset-Taste am Atmel drücke hat der DS1307 Luft zum
verschnaufen und taktet den SQWE-Ausgang mit nem 1Hz-Signal :D
SIEG !!! :cool:

Das hat er vorher nicht gemacht. Er hat ja vorher nicht einmal nen ACK-Bit
auf dem I2C-Bus gesetzt. Evtl hat das was mit dem Vbatt-Anschluß zu tun.

Jetzt muß das Ding nur noch sauber hingestrickt werden und dann setz ich
den Beispielcode mal hier rein ...

Gruß
Dino
 
Hallo zusammen,

und das Elend geht weiter ...

Der Mega128 steuert den PCF8574 und den DS1307 auf dem Experimentierboard
ohne Probleme an. Allerdings will er vom DS1307 auf der Platine nix wissen.
Über Jumper kann ich die beiden DS1307 unabhängig voneinander anschließen.
Tja ... aber nix.

Ich werd mal den Vbatt-Anschluß über nen weiteren Jumper umschaltbar machen.
Entweder Goldcap, Offen oder auf GND. Dann kannn ich ihm wenigstens mal
den Saft abdrehen. Evtl hat sich das Ding intern verhakt.

Der DS1307 auf dem Board läuft jetzt komischerweise absolut zuverlässig
und bei jedem mal. Als ob man die Dinger erst einmal energisch überreden
muß :D

EDIT: Wie im Datenblatt angegeben sollte man den Vbatt-Pin entweder auf
GND legen oder an einen Goldcap/Batterie anschließen. Der Chip läßt sich
nur ansprechen wenn die Betriebsspannung mindestens 1,25 x Vbatt ist.
Bei 5V Betriebsspannung darf Vbatt also maximal 4V sein damit man den
Chip über den I2C-Bus dran kommt. Aber bei mir zickt er immer noch :(

EDIT2: :eek: :banghead: :banghead: :banghead: Bei dem ganzen Gebrutzel auf der Platine ist
mir SCL und SDA durcheinandergeraten :p :rolleyes: ES LÄUFT JETZT :D :cool:
SCL und SDA sind über mehrere Steckverbinder und Jumper für Bus-PullUps
und Abtrennung der Chips vom Mega128 zum DS1307/AT24C512 verbunden.
Da bin ich dann wohl etwas durcheinandergekommen. Vor allem weil die
Fädeldrähte doch recht schnell zu verwechseln sind wenn sie direkt
nebeneinander liegen. Naja ... Problem gelöst. Es läuft ... Yippieh !
Der Goldcap hält auch alles aufrecht. :)

Gruß
Dino
 
@dino:
welche Kapazitätsgrösse des Goldcap nimmst du denn dafür?
Und wie lang hält er durch?

Grüsse
Wolfgang
 
Hi Wolfgang,

welche Kapazitätsgrösse des Goldcap nimmst du denn dafür?
Und wie lang hält er durch?
ich hab nen 0,22F/5,5V reingebaut und den über Dioden auf ca 3V geladen.
Über die 3x 1N4148 und den 100 Ohm braucht der Goldcap ca eine Minute um
auf volle Spannung (3V) zu kommen. Wie lange er durchhält hab ich noch
nicht getestet. Laut Datenblatt zieht der DS1307 aber 500nA im Standby.
Sollte also einige Tage ausreichen (wenn nicht sogar Wochen).

Ich hab bei reichelt jetzt ne RTC mit temperaturkompensierten internen Quarz
gefunden => RV 3029-C2 (kostet 4,30) . Das Ding sieht verdammt interessant
aus. Da werde ich mir bei der nächsten Bestellung mal einen mitbesorgen ;)

EDIT: Ich hab das Ding heute mal wieder mit Saft versorgt (29.11.2010). Also
der GoldCap hat jetzt ohne Probleme um die 2 Wochen durchgehalten.

Gruß
Dino
 
RTC läuft und beschreibt die SoftClock

Hallo,

es ist vollbracht ;) :cool:

Der DS1307 läuft, ist gestellt und lädt beim booten die Zeit in die SoftClock.
Anhang anzeigen EvalBoard_m128_I2C_DS1307_v02.bas
Da ist der Quellcode. Ist noch unter 4kByte. Aber schon recht knapp.

Ich werd wohl mal an ne Vollversion denken müssen :D :rolleyes:
Bei dem Zeugs was ich schon alles mache wird das langsam fällig.

Aber man merkt doch das die Programme gegenüber Assembler recht stark
aufgebläht werden. Meine Assembler-Proggis sind mit gleicher Funktionalität
etwas nur die hälfte so groß gewesen. Das sehe ich vor allem bei meinem
Analyzer.

Das hier ...
DS1307 (Datum/Uhrzeit) offline mit Goldcap versorgen
ist auch noch ein Thread über den DS1307 der evtl interessant sein könnte.

Gruß
Dino
 
Der letzte Akt ...

der DS1307 läuft ja jetzt bei mir. Da der Takt von nem Uhrenquarz relativ
genau ist hab ich mir so ein paar Sachen ausgedacht wie man den Chip
etwas besser auslasten kann ...

Der DS1307 hat ja einen SQWE-Ausgang an dem man einen Quarzgenauen
Takt anschalten kann. Also zB 1Hz, 4096Hz, 8192Hz, 32768Hz. Wenn man
jetzt den 4kHz-Takt verwendet dann könnte man damit zB in diesem Takt
Interrupts erzeugen die auf 10-20ppm in der Frequenz genau sind (was so
das Quarz hergibt). Dadurch könnte man eine Softwareuhr betreiben und
man hat auch eine Frequenz um zB an einem Eingang das Signal eines
DCF77-Empfängers abzutasten. Man benötigt keinen internen Timer dafür
und hat außerdem noch die Pins frei die sonst für das Uhrenquarz draufgehen
würden. Dafür hat man natürlich nen INT-Eingang verbraucht (OK ... Schwund
ist immer irgendwo). Aber dadurch kann man zB bei nem Mega8 die CPU
wieder mit 16MHz betreiben ;) Was mit dem Uhrenquarz am Atmel auch nicht
möglich wär.

Mal sehen was man da so stricken kann ...

Aber zu dem DS1307 selber : ...
Am Vbatt-Pin muß entweder GND oder eine Spannung von maximal 3,5V anliegen.
Sonst läßt sich der Chip über I2C nicht ansprechen. Die Timekeeper-Funktion
schaltet den Chip bei Vcc unter 1,25*Vbatt auf passiv um den internen
Registerinhalt vor eine durch Niedrigspannung Amok laufende CPU zu
schützen. Außerdem muß man beim ersten Zugriff die Register einmal
initialisieren damit kein Schrott mehr drin ist. Dazu gehört auch das CH-Bit
(ClockHalt) im Sekundenregister. Mit diesem Bit wird der zentrale Takt
gesperrt. Schade das es keine Alarm-Register gibt um zB den Atmel über
einen Interrupt zeitgesteuert zu wecken. Das kann zB der PCF8583. Dafür
muß man bei dem beim Lesen aufpassen das man nicht grade nen
Zählerübertrag erwischt. Das Problem wird im DS1307 über einen zweiten
internen Registersatz für Leseoperationen gelöst in den dann der Zählerstand
kopiert wird.

Für Weckzeiten könnte man zwar den DS1337 verwenden. Allerdings hat der
eine etwas komplizierte Anschaltung der Backup-Batterie (oder Goldcap).
Die Backup-Spannung muß über Dioden mit Vcc zusammen auf dem Pin für
die Betriebsspannung gelegt werden. Wenn die Spannung dann auf 1,3-1,8V
absinkt geht der Chip in den Timekeeper-Betrieb. Wie will man das einfach in
eine Schaltung gießen ? Man müßte über 2 Dioden (Si oder Schottky) einmal
+5V und einmal eine Batterie (1,5V) oder nen Goldcap (maximal 2V!!) auf
diesen Pin bringen. Die Bandbreite der Spannung von Normalbetrieb zum
totalen Ausfall ist aber mit 0,5V Differenz recht gering. Man muß die
Durchlaßspannung der Dioden sehr genau mit der anliegenden Spannung der
Backup-Spannungsquelle (Batterie/Goldcap) in dieses Spannungsfenster
bringen. Ich würde sagen ... ein ziemliches Gefrickel.

Gruß
Dino
 

Ü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)