Schönen guten Tag,
ich bastele grade an einer Binär-Uhr die ich mit einem DS1307 regeln
wollte.
Zu guter erst mein momentaner aufbau:
Die Spannungsversorgung läuft über USB und wird mit einem STEP-DOWN
Regler auf 3,3 V heruntergeregelt, und dann mit einem 100µF Kondensator
geglättet. Der STEP-DOWN Regler dient als Strombegrenzer und reduziert
etwas die Verluste durch vorwiderstände
Die Komplette Anzeige gegelt ein ATMega 46PU, Steuert die LEDS mit
3-Fach Multiplexing an.
Der DS1307 selbst, ist direkt an 5V angeschlossen. Der TWI-Bus ist mit
4,7kOhm Pullups auf 3,3V mit dem ATMega verbunden.
Die VBat wird mit Hilfe eines 2,22 F Gold-Cap und einer LED realisiert,
der Kondensator lädt sich auf 2,6V auf und hält einige Tage (bis er
unter die 2V laut Datenblatt fällt).
Laut Datenblatt des DS1307 ist ein low-Pegel < 0,8V und ein High-Pegel
> 2,2 V, von daher sollte der Bus 3,3V kompatibel sein.
zum Code:
Vorbild: Beitrag "DS1307 Lib für Fleury's I2C"
ich nutze einen sehr leicht abgeänderten code um den DS1307 zu
initialisieren:
Initialisierung der Pins:
/* Tell the DS1307 to start the oscillator (turn off CLOCK HALT) in
11
* case it has lost power. */
12
uint8_treg0;
13
14
/* Address, say read from memory slot 0, then read data. */
15
i2c_start_wait(DS1307+I2C_WRITE);
16
i2c_write(0x0);
17
i2c_rep_start(DS1307+I2C_READ);
18
reg0=i2c_readNak();
19
20
/* Turn off the clock halt if necessary. */
21
if(reg0&_BV(CLOCK_HALT)){
22
i2c_start_wait(DS1307+I2C_WRITE);
23
i2c_write(0x0);
24
i2c_write(reg0&~_BV(CLOCK_HALT));
25
}
26
27
/* Fire up the 1Hz interrupt. */
28
//hier habe ich die Abfrage heraus genommen, da ich die Interrupts in jedem Fall einschalten möchte.
29
i2c_start_wait(DS1307+I2C_WRITE);
30
i2c_write(SQW_CONTROL_REG);
31
i2c_write(_BV(SQW_SQWE)|SQW_RS1_RS0_1Hz);
32
i2c_stop();
33
34
35
}
in der Main schleife wird nun eigentlich nur folgendes gemacht:
1
intmain(void)
2
{
3
init_IO();
4
init_Interrupt();
5
6
i2c_init();
7
ds1307_init();
8
9
10
/*
11
//Test der Anzeige
12
time.hour = 20;
13
time.minute = 32;
14
time.second = 52;*/
15
16
sei();
17
while(1)
18
{
19
set_Time(time);
20
}
21
}
Der ATMega hängt irgendwo in der Funktiuon ds1307_init();, und mit
Irgendwo vermute ich den i2c_start_wait(..) Befehl..
Als beides noch auf 3,3 V lief, lief alles durch, jedoch passierte
nichts am Ausgang.
hat jemand eine Idee was ich falsch machen könnte?
lg Coco.
könnte es vielleicht sein, dass die Clock zu ungenau ist, da ich den
ATmega nur mit interner Clock laufen lasse?
>> hatte mich vertippt, es ist ein ATMega 48PU
>>Der DS1307 selbst, ist direkt an 5V angeschlossen. Der TWI-Bus ist mit>>4,7kOhm Pullups auf 3,3V mit dem ATMega verbunden.
das habe ich Eingehalten
PARAMETER || SYMBOL || MIN || MAX || UNITS || NOTES
Logic 1 || VIH || 2.2 || VCC+0.3 || V || 1
Logic 0 || VIL || -0.3 || +0.8 || V || 1
das habe ich meiner Meinung nach auch eingehalten...
Mach bei der geringen Spannung mal die Pullups kleiner - 2,2k oder so.
Wenn der Controller irgendwo hängt, dann schalte bei einem fraglichen
Abschnitt vorher eine LED ein, danach aus. So kannst Du Fehler
eingrenzen.
Die Sache mit der Schnittstelle und den Pegeln müßte passen so wie Du es
gemacht hast!
Wie schnell läuft denn dein I²C-Bus?
Um den Fehler zu finden wäre ein Oszilloskop gut!
Wenn Du keins hast, dann musst Du per Hardware debuggen. D.h. setze
hinter der Befehlszeile einen Ausgangsport auf high und schließe dort
eine LED an, dann siehst Du wo das Programm hängen bleibt!
TWBR=((F_CPU/SCL_CLOCK)-16)/2;/* must be > 10 for stable operation */
7
set_LED_debug(0x01);
8
}/* i2c_init */
mal eben schauen was ich da für einen Prescaler brauche
mein F_CPU ist 1000000UL //1 MHZ
SCL_CLOCK ist 10000UL
*edit
habe jetzt F_CPU auf 8000000UL hochgestellt und die FUSE clk/8 weg
gemacht. Leider kein Erfolg
Also ich habe jetzt noch einmal gemessen, die SDA und SCL line sind ohne
Initialisierung auf 3,310 V (laut Multimeter).
Hardware Debugging kommt bis set_LED_debug(0x01);
ich habe das komplette Projektfile als zip, und den Schaltplan
angehängt, ich würde mich echt freuen, wenn jemand noch eine Idee hat..
das ganze sollte ein Weihnachtsgeschenk jemanden aus meiner Familie
werden ;).
(bitte entschluldigt den Schaltplan, das ist im grunde der erste dieser
Größe den ich je gezeichnet habe)
Werte für den Schaltplan:
Uhrenquarz Q2 = 32,768 kHz 12.5pF
Elko C3 = 220 000F 5V
Widerstände:
R1, R2, R3, R4 = 470k
R5, R6 = 4,7kOhm
Im Schaltplan fehlen noch die Basiswiderstände der Transistoren (sie
sind 1,5kOhm)
Induktivität L1 = 13 Windungen (also kA, sie ist selbst gewickelt)
AREF und AVCC hängen beide an 3,3V waren aber irrelevant.
Der Mega8 ist Pingleich mit dem 48PU
die meine ich auch nicht, damit ein Schaltregler ein Schaltregler ist,
gehört da an der Spule auch noch eine Schottkydiode dran - schau mal ins
Datenblatt vom LM2574!
Sascha
hmm die habe ich wirklich nicht, aber wozu ist die da?
Leider habe ich auch keine Shottky hier zuhause rumliegen, kann ich da
irgendetwas anderes für nutzen?
ich habe jetzt "sowas wie 1Hz" am Ausgang des ds1307, aber nur wenn ich
mein Messgerät dran halte, außerdem fabriziert mir das ganze ungefähr 10
Impulse.
Ich habe den Glättungskondensator am Eingang vergessen einzulöten, und
scheinbar hat das den ds1307 derartig gestört dass er nicht mehr
funktionieren wollte.
coco jack schrieb:> hmm die habe ich wirklich nicht, aber wozu ist die da?> Leider habe ich auch keine Shottky hier zuhause rumliegen, kann ich da> irgendetwas anderes für nutzen?
Na, weil sonst ein Strom fließt der die Spannung wieder dem Eingang
anpasst?
Propier halt mal eine normale Diode, aber nicht wundern wenn es qualmt
;)
der Unterschied zw. einer normalen Diode und einer Shotky ist doch
ledigtlich der, dass die Shotky schneller schaltet. Außerdem wird sie
als Spannungsgesteuerte Kapatzität genutzt (in diesem Fall)
coco jack schrieb:> der Unterschied zw. einer normalen Diode und einer Shotky ist doch> ledigtlich der, dass die Shotky schneller schaltet.
genau, denn der Schaltregler soll ja die Spannungsreglung effizienter
machen. Mit einer normalen Diode wirds auch erst mal gehen, zumal du ja
auch keine für den Schaltregler geeignete Induktivität verwendest.
> Außerdem wird sie> als Spannungsgesteuerte Kapatzität genutzt (in diesem Fall)
????? wie kommst du jetzt darauf ?????
Du solltest dir mal die Funktionsweise eines Schaltreglers anschauen,
bevor du sowas einbaust! Und dann nicht auch noch Bauteile die
dazugehören weglassen.
Ohne Diode wird die Ausgangsspannung nur mit einer Art PWM reduziert!
Wie groß ist der Elko am rechten Anschluss von L1?
Sascha
der ist 220µF groß, wie es im Datenblatt stand. Jedoch vermutete ich
dass schon alles enthalten war, und die Induktivität nur zur glättung
der Ausganggspannung gedacht ist.
Egal, aus Fehlern lernt man, ich werde am Montag mal Conrad aufsuchen
und mir die fehlenden Bauteile herraussuchen.
Mit einem LM317, (den ich auf 3,3V variabel gebaut habe) funktioniert
alles einwandfrei.
Vielen dank erstmal für die zahlreiche Hilfe, ich denke nicht dass der
Fehler alleine so schnell gefunden wäre.
PS.: ich komme darauf, da ich in der Vorlesung "Elektronische Bauteile"
einmal eine Diode in Sperrichtung als Spannungsgesteuerte Kapatzität
gesehen habe.