Forum: Mikrocontroller und Digitale Elektronik Hilfe bei vermeintlich einfachem Basic Programm


von Schweitzer (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ein vermeintlich einfaches Basic Programm liest eine i2c RTC vom Typ 
RV-3029 aus.

Der Chip ist OK, auch die Beschaltung.
In einer anderen Umgebung läuft die Hardware einwandfrei (PIC).

Die Uhr muss nicht gesetzt werden, zeigt nach Reset in der anderen 
Umgebung "Time is 0:0:1 Date is 0/0/2000".

Ich habe schon Tage gekämpft und finde einfach keinen Anhaltspunkt.
TWI Rate geändert, und vieles vieles mehr..
Anbei der recht übersichtliche Basiccode und ein Screenshot von dem 
Output des Programms. Es wäre eine große Hilfe wenn Ihr mir zeigen 
könntet wo ich etwas falsch mache.
Danke im Voraus.


CODE:


$regfile = "m1284pdef.dat"              ' 32
$crystal = 16000000                     ' 8 MHz
$hwstack = 40
$swstack = 16
$framesize = 32
Baud = 9600

$lib "I2C_TWI.LBX"
Enable Interrupts

Dim Weekday As Byte
Dim Tmp As Byte
Dim I As Byte

Dim Var_rv3029_seconds As Byte
Dim Var_rv3029_minutes As Byte
Dim Var_rv3029_hours As Byte
Dim Var_rv3029_days As Byte
Dim Var_rv3029_weekdays As Byte
Dim Var_rv3029_months As Byte
Dim Var_rv3029_years As Byte



Dim Alle_register(50) As Byte
Weekday = 2
Sda_port Alias Portc.1
Scl_port Alias Portc.0

Config Twi = 400000

Const Rv3029_write = &B10101100         'Adresse des DS1307 = &HD0 
(schreiben)
Const Rv3029_read = &B10101101          'Adresse des DS1307 = &HD1 
(lesen)

I2cinit

Gosub Rv3029_clear_pon

Do
   Gosub Read_clock_page
   Print Makedec(var_rv3029_hours) ; ":";
   Print Makedec(var_rv3029_minutes) ; ":";
   Print Makedec(var_rv3029_seconds)
   Print Makedec(var_rv3029_days) ; ".";
   'Print Makedec(var_rv3029_weekdays) ; " ";
   Print Makedec(var_rv3029_months) ; ".";
   Print Makedec(var_rv3029_years)
   Print ""
   Waitms 900
   I2cinit
Loop


Read_clock_page:
   I2cstart
   I2cwbyte Rv3029_write
   I2cwbyte &H08
   I2cstop
   I2cstart
   I2cwbyte Rv3029_read
   I2crbyte Var_rv3029_seconds , Ack
   I2crbyte Var_rv3029_minutes , Ack
   I2crbyte Var_rv3029_hours , Ack
   I2crbyte Var_rv3029_days , Ack
   I2crbyte Var_rv3029_weekdays , Ack
   I2crbyte Var_rv3029_months , Ack
   I2crbyte Var_rv3029_years , Nack
   I2cstop
Return


end

von Schweitzer (Gast)


Angehängte Dateien:

Lesenswert?

Der Vollständigkeit halber einmal die Fuses.

Die Hardware wir von einem STK500 gebildet.
I2C Bus ist etwa 7 cm lang, aber läuft wie gesagt einwandfrei in anderer 
HW Umgebung mit einem PIC...

von Bastler (Gast)


Lesenswert?

1
   I2cstart
2
   I2cwbyte Rv3029_write
3
   I2cwbyte &H08

Warum setzt du den Adresszeiger auf 8? Sekunden befinden sich ab Adresse 
0.

von Paul B. (paul_baumann)


Lesenswert?

Hast Du die Ziehwiderstände an SDA und SCL dran? Das vergißt man im 
Eifer
des Gefechts manchmal..

MfG Paul

von Schweitzer (Gast)


Lesenswert?

Bastler schrieb:
> Warum setzt du den Adresszeiger auf 8? Sekunden befinden sich ab Adresse
> 0.

Nein, bei dieser RTC ab &H08

von Schweitzer (Gast)


Lesenswert?

Paul Baumann schrieb:
> Hast Du die Ziehwiderstände an SDA und SCL dran? Das vergißt man im
> Eifer
> des Gefechts manchmal..
>
> MfG Paul

Wie ich erwähnte läuft die Hardware doch !
Natürlich sind da Pullups dran, 4,7k.
10K hatte ich auch probiert.

von Schweitzer (Gast)


Angehängte Dateien:

Lesenswert?

sorry, die DS1307 im Quelltext als Kommentar ist falsch.

Hier tickt eine RV3029 !!!

von MWS (Gast)


Lesenswert?

Konfiguriere SCL & SDA, das Alias allein nutzt Dir nichts, nimm das 
erste Stop I2C raus, reduziere den Bus-Clock , auch das Erlauben der 
Interrupts kann raus, es werden keine benutzt. Und stell den 
funktionierenden Code rein, damit man vergleichen kann.
Ausserdem hast Du keine Rv3029_clear_pon Sub, somit kannst Du gezeigten 
Code nicht kompilieren.

von Schweitzer (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

das ist definitiv der Originalcode per drag an drop.

I2Cstop raus oder rein bringt überhaupt nix.
Auch bei 100 KhZ Takt das gleiche Problem...(Anhang)



$regfile = "m1284pdef.dat"              ' 32
$crystal = 16000000                     ' 8 MHz
$hwstack = 40
$swstack = 16
$framesize = 32
Baud = 9600

$lib "I2C_TWI.LBX"


Dim Weekday As Byte
Dim Tmp As Byte
Dim I As Byte

Dim Var_rv3029_seconds As Byte
Dim Var_rv3029_minutes As Byte
Dim Var_rv3029_hours As Byte
Dim Var_rv3029_days As Byte
Dim Var_rv3029_weekdays As Byte
Dim Var_rv3029_months As Byte
Dim Var_rv3029_years As Byte

Var_rv3029_seconds = 5
Var_rv3029_minutes = 5
Var_rv3029_hours = 5
Var_rv3029_days = 5
Var_rv3029_weekdays = 5
Var_rv3029_months = 5
Var_rv3029_years = 15

Weekday = 2

Config Scl = Portc.0
Config Sda = Portc.1

Config Twi = 400000

Const Rv3029_write = &B10101100         'Adresse des DS1307 = &HD0 
(schreiben)
Const Rv3029_read = &B10101101          'Adresse des DS1307 = &HD1 
(lesen)

I2cinit


Print "Hier kommt der Muell ;-)))"

Do
   Gosub Read_clock_page
   Print Makedec(var_rv3029_hours) ; ":";
   Print Makedec(var_rv3029_minutes) ; ":";
   Print Makedec(var_rv3029_seconds)
   Print Makedec(var_rv3029_days) ; ".";
   'Print Makedec(var_rv3029_weekdays) ; " ";
   Print Makedec(var_rv3029_months) ; ".";
   Print Makedec(var_rv3029_years)
   Print ""
   Waitms 900
   I2cinit
Loop


Read_clock_page:
   I2cstart
   I2cwbyte Rv3029_write
   I2cwbyte &H08
   I2cstop
   I2cstart
   I2cwbyte Rv3029_read
   I2crbyte Var_rv3029_seconds , Ack
   I2crbyte Var_rv3029_minutes , Ack
   I2crbyte Var_rv3029_hours , Ack
   I2crbyte Var_rv3029_days , Ack
   I2crbyte Var_rv3029_weekdays , Ack
   I2crbyte Var_rv3029_months , Ack
   I2crbyte Var_rv3029_years , Nack
   I2cstop
Return


End

von MWS (Gast)


Lesenswert?

Beachte Power On Reset im DB und initialisiere die RTC mit gültiger Zeit 
und Datum.

von Fieber (Gast)


Lesenswert?

MWS schrieb:
> Beachte Power On Reset im DB und initialisiere die RTC mit
> gültiger Zeit
> und Datum.

Habe 3 von den RTC's und habe 2 im Tausch unter Bascom betrieben, die 3. 
mit nem PIC und mmbasic.


Die 2 mit denen ich Bascom getestet habe, haben ne HW Macke.
Die 3. funktioniert mit dem Code unter Bascom und am PIC.

Das ist echt der Hammer, so ein Zufall.

Danke für die Hilfe.
Es zeigt wieder:

" Es kann nicht sein, was nicht sein kann!"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.