Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: i2c bus klappt nicht (PCF 8583) Kategorie: C-Control I V1.2/2.0 (von Windt H.J. - 28.06.2005 12:37)
 Als Antwort auf i2c bus klappt nicht (PCF 8583) von Michael - 27.06.2005 20:09
Maybe this will help you.
Greetings,
H.J. Windt

'****************** PORTS ******************'
define lcd_backlight_off port[16]
'*******************************************'
'**************** VARIABLES ****************'
define configuration byte[1]
define iic_nack bit[7]
define iic_nack_count byte[2]

define schleife byte[3]
define word_adress byte[4]
define slave_adress byte[5]
define data byte[6]
'*******************************************'
'**************** CONSTANTS ****************'
define uhr_schreiben &b10100010
define uhr_lesen     &b10100011
'*******************************************'
'****************** SETUP ******************'
put 0 'needed because of a bug in CCIUM2.01 rs232 communication'
print"#ON_LCD#";:print"#INIT#";:print"#CLR#";:print"#OFF#";:lcd_backlight_off = 1
'*******************************************'
'***************** PROGRAM *****************'
#start
slave_adress=uhr_schreiben
data=127
word_adress=21
#Schreiben_in_ram
print"Schreibe RAM Adresse:";word_adress;" Daten: ";data
print"#ON_IIC#";              'Umleitung auf I2C Bus Aktivieren
print"#START#";               'Sende Start Bedingung
put slave_adress
put word_adress
put data
print"#STOP#";                'Sende Stop Bedingung
print"#OFF#";                 'Umleitung aufheben
gosub check_for_iic_error
if iic_nack_count > 9 then goto no_ack_from_iic_device
if iic_nack then goto Schreiben_in_ram
print "daten geschrieben !"
'--------------------------------------------------------------------------------------------------
#lese_ram
print"lese RAM Adresse:";word_adress
print"#ON_IIC#";              'Umleitung auf I2C Bus Aktivieren
print"#START#";               'Sende Start Bedingung
slave_adress=uhr_schreiben
put slave_adress
put word_adress
print"#STOP#";
print"#OFF#";
gosub check_for_iic_error
if iic_nack then goto pass_read
print"#ON_IIC#";
print"#START#";               'Sende Start Bedingung
slave_adress=uhr_lesen
put slave_adress
get data
print"#STOP#";                'Sende Stop Bedingung
print"#OFF#";                 'Umleitung aufheben
gosub check_for_iic_error
#pass_read
if iic_nack_count > 6 then goto no_ack_from_iic_device
if iic_nack then goto lese_ram
print"gelesener wert :";data
goto start
'*******************************************'
'*************** SUBROUTINES ***************'
#check_for_iic_error
print"#ON_CONFIG#";
get configuration
if iic_nack = 0 then goto pass_iic_nack_clear
iic_nack = 0
put configuration
iic_nack = 1
iic_nack_count = iic_nack_count + 1
print"#OFF#";
return
#pass_iic_nack_clear
iic_nack_count = 0
print"#OFF#";
return
'*******************************************'
'******* INITIALIZATION SUBROUTINES ********'

'*******************************************'
'****************** DATA *******************'

'*******************************************'
'************* ERROR MESSAGES **************'
#no_ack_from_iic_device
print"No ACK from I2C device!!"
#end_it
goto end_it
'*******************************************'


> Hallo zusammen,
>
> Ich habe eine Echtzeit-uhr PCF8583 (als Fertigen baustein mit Gold cap bei cc-tools gekauft)
> Leider Klappt die Kommunikation nicht so, wie ich mir das vorstelle.
> beim lesen vom pcf8583 erhalte ich immer den wert 0 zurück, (bei nicht angeschlossenen
> Baustein 255) egal welche Speicherstelle ich auslese.
> ich hab mir den Bus schon mit einem Oszilloskop angesehen, und festgestellt, das der PCF8583
> jedes Byte brav mit einem ACK beantwortet.
> ich verwende die eingebauten I2C Routinen der M-unit 2.0
>
> Nachfolgend ein Test-programm das den Wert 127 an speicherstelle 21 schreibt (freier ram bereich)
> und anschliessend wieder einlesen soll. Zurück erhalte ich jedoch den wert 0
>
> da tut sich ein grosser abgrund von fragen auf
>
> was mache ich falsch ?
> ist das schreiben fehlerhaft, oder das Lesen ?
> kann man softwaremässig prüfen ob ein  ACK eingegangen ist, ohne neue I2C Routinen zu schreiben ?
> wieso entstehen mit dem get befehl 18 Impulse auf SDA (Oszilloskop) ?
> Es soll ja nur ein Byte gelesen werden und nicht 2
>
> '---------------------------------------------------------------------------
> '      Testprogramm Für PCF8583
> '---------------------------------------------------------------------------
>
> define schleife byte
> define word_adress byte
> define slave_adress byte
> define data byte
>
> define uhr_schreiben &b10100010
> define uhr_lesen     &b10100011
>
> #start
>
> '-----------------Schreiben in ram--------------------------------------------------------------------
>
> slave_adress=uhr_schreiben
> data=127
> word_adress=21
> print" Schreibe RAM Adresse:";word_adress;" Daten: ";data
> print"#ON_IIC#";              'Umleitung auf I2C Bus Aktivieren
> print"#START#";               'Sende Start Bedingung
> put slave_adress
> put word_adress
> put data
> print"#STOP#";                'Sende Stop Bedingung
> print"#OFF#";                 'Umleitung aufheben
> print "daten geschrieben !"
> '--------------------------------------------------------------------------------------------------
> slave_adress=uhr_schreiben
> print" lese RAM Adresse:";word_adress
> print"#ON_IIC#";              'Umleitung auf I2C Bus Aktivieren
> print"#START#";               'Sende Start Bedingung
> put slave_adress
> put word_adress
> print"#START#";               'Sende Start Bedingung
> slave_adress=uhr_lesen
> put slave_adress
> get data
> print"#STOP#";                'Sende Stop Bedingung
> print"#OFF#";                 'Umleitung aufheben
> print" gelesener wert :";data
> goto start
> end
>
>

 Antwort schreiben

Bisherige Antworten: