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 

 Test mit EEprom 24C256 OK - Chipkarte nicht Kategorie: C-Control I Micro (von Jens - 25.03.2005 16:41)
 Als Antwort auf Speichererweiterung - Chipkarten am I2C-bus von Jens - 20.03.2005 22:26
Hallo

Ich habe mir jetzt ein Test Programm gebastelt was Teilweise funktioniert. Bei dem EEprom 24C256 habe ich vollen schreib und lese - Zugriff. Bei der Chipkarte (2K ohne Pin) habe ich nur lese - Zugriff. Es gelingt mir einfach nicht die Daten in den EEprom der Chipkarte zu übertragen. !!! WARUM NICHT !!!
Ich habe die I2C Routine total zerlegt und lasse mir fast jeden einelnen Schritt über den PC (Terminal) ausgeben. Aber selbst dabei kann ich einfach keinen Fehler finden. Sogar der "Ack" antwortet korreckt und das Programm hängt sich nicht auf. Kann mir bitte jemand sagen warum die gesendeten Daten nicht vom EEprom der Chipkarte gespeichert werden...

Das Test Programm sucht nach einschalten der Micro den I2C-Bus nach einem angeschlossensn I2C-Baustein ab. Findet er einen, so stelle er diese Adresse für das nachfolgende Programm ein. Wird kein I2C-Baustein gefunden fängt das Programm von forne an.
Nun begint das Programm eine 10 in die Position 1000 (Wordregister des EEproms) zu schreiben. Anschließend wird die Position 1000 wieder zurückgelesen. Danach wird eine 11 geschrieben und zurückgelesen. usw...

Bei dem EEprom 24C256 funktioniert es ohne Probleme. Auch in anderen Positionen des Word-Registers funktioniert das schreiben und lesen ohne Probleme. Bei der Chipkarte schreibt er in Position 1000 eine 10 und liest eine 232 aus. In Position 1300 schreibt er eine 10 und liest eine 20 aus. usw... !!! WARUM !!!

'***************************************************************************
'*                                                                         *
'*    C-Control Micro - Test Programm                                      *
'*                                                                         *
'*    - automatische Suche der I2c-Bus Adresse                             *
'*                                                                         *
'*    - schreib / lese - Zugriff auf einen EEprom 24C256 (32K)             *
'*                                                                         *
'*    - Text Ausgabe am PC (Terminal - Programm)                           *
'*                                                                         *
'***************************************************************************
'
'--- Definitionen der Ports ------------------------------------------------
'define Reset   port[4]              ' Reset Chipkarte
define SDA     port[6]              ' Datenleitung I2C-Bus (10K gegen +5V)
define SCL     port[5]              ' Tacktleitung I2C-Bus (10K gegen +5V)
'--- Variablen -------------------------------------------------------------
define I2C_tmp  byte[1]             'Daten Byte im I2C-Bus Intern
define B1        bit[1]             'Daten Bit1 im I2C-Bus Intern
define B2        bit[2]             'Daten Bit2 im I2C-Bus Intern
define B3        bit[3]             'Daten Bit3 im I2C-Bus Intern
define B4        bit[4]             'Daten Bit4 im I2C-Bus Intern
define B5        bit[5]             'Daten Bit5 im I2C-Bus Intern
define B6        bit[6]             'Daten Bit6 im I2C-Bus Intern
define B7        bit[7]             'Daten Bit7 im I2C-Bus Intern
define B8        bit[8]             'Daten Bit8 im I2C-Bus Intern
define Adresse  byte[2]             'EEprom Adresse
define Daten    byte[3]             'Daten im EEprom Speicher
define Highbyte byte[4]             'Highbyte Word Register im EEprom
define Lowbyte  byte[5]             'Lowbyte Word Register im EEprom
define N        byte[6]                    'Test Variable
'--- Initialisierung Hardware ----------------------------------------------
gosub I2C_Stop                      'Reset I2C-Bus
Baud 9600                           'RS232 Einstellen
'Reset = on : pause 25 : Reset = Off 'Reset Chipkarte
'--- Übergabe der Daten für den I2C-Bus ------------------------------------
'Highbyte = 117                      'Highbyte Position 30100
'Lowbyte =  148                      'Lowbyte Position 30100
Highbyte = 3                        'Highbyte Position 1000
Lowbyte =  232                      'Lowbyte Position 1000
' --- Test Programm Adresse automatisch finden -----------------------------
#suche
for Adresse = 0 to 254 step 2       'I2C-Bus Adresse zuweisen
N = 1                               'Reset Ack Auswertung
I2C_tmp = Adresse                   'EEprom Adresse - schreiben
gosub I2C_Start                     'Start und Daten übertragen
gosub Ack_suche                     'Auswertung Ack
gosub I2C_Stop                      'I2C-Bus Stop
if N = 0 then goto suche_end        'wenn I2C-Baustein gefunden, dann suche beenden
next
Print "nichts gefunden"             'Suche erfolglos
pause 250                                  'Test Pause 5 Sekunden
goto suche                          'wenn nichts gefunden, dann von forne anfangen
#suche_end
Print "Adr.gefunden = ";Adresse            'Test Ausgebe
pause 250                                  'Test Pause 5 Sekunden
' --- Test Programm Daten schreiben / lesen --------------------------------
#Loop
Print                                      'Test Ausgabe
for N = 10 to 25                    'Daten für den EEprom Speicher
Daten = N                           'Daten zuweisen
gosub I2C_schreiben                 'Daten in den EEprom übertragen
pause 200                                  'Test Pause 4 Sekunden
Print                                      'Test Ausgabe
gosub I2C_lesen                     'Daten aus dem EEprom einlesen
Print "Daten lesen = ";Daten               'Test Ausgabe
pause 200                                  'Test Pause 4 Sekunden
Print                                      'Test Ausgabe
Print                                      'Test Ausgabe
Print                                      'Test Ausgabe
next
goto loop                           'Endlosschleife
end

'------------------------------------------
' I2C-Bus Routine
'------------------------------------------
#I2C_schreiben
I2C_tmp = Adresse                   'EEprom Adresse zuweisen
Print "Adresse = ";I2C_tmp;" = ";          'Test Ausgabe
gosub I2C_Start                     'Start und Daten übertragen
gosub Ack                           'warten auf Bestätigung vom Slave
'------------------------------------------
I2C_tmp = Highbyte                  'Highbyte (Word Register) zuweisen
Print "Highbyte = ";I2C_tmp;" = ";         'Test Ausgabe
gosub I2C_write                     'Daten übertragen
gosub Ack                           'warten auf Bestätigung vom Slave
'------------------------------------------
I2C_tmp = Lowbyte                   'Lowbyte (Word Register) zuweisen
Print "Lowbyte = ";I2C_tmp;" = ";          'Test Ausgabe
gosub I2C_write                     'Daten übertragen
gosub Ack                           'warten auf Bestätigung vom Slave
'------------------------------------------
I2C_tmp = Daten                     'Daten zuweisen
Print "schreibe = ";I2C_tmp;" = ";  'Test Ausgabe
gosub I2C_write                     'Daten übertragen
gosub Ack                           'warten auf Bestätigung vom Slave
'------------------------------------------
gosub I2C_Stop                      'Stop
return

'------------------------------------------
#I2C_lesen
I2C_tmp = Adresse                   'EEprom Adresse zuweisen
Print "Adresse = ";I2C_tmp;" = ";          'Test Ausgabe
gosub I2C_Start                     'Start und Daten übertragen
gosub Ack                           'warten auf Bestätigung vom Slave
'------------------------------------------
I2C_tmp = Highbyte                  'Highbyte (Word Register) zuweisen
Print "Highbyte = ";I2C_tmp;" = ";         'Test Ausgabe
gosub I2C_write                     'Daten übertragen
gosub Ack                           'warten auf Bestätigung vom Slave
'------------------------------------------
I2C_tmp = Lowbyte                   'Lowbyte (Word Register) zuweisen
Print "Lowbyte = ";I2C_tmp;" = ";          'Test Ausgabe
gosub I2C_write                     'Daten übertragen
gosub Ack                           'warten auf Bestätigung vom Slave
'------------------------------------------
I2C_tmp = Adresse + 1               'EEprom Adresse (lesen) zuweisen
Print "Adresse = ";I2C_tmp;" = ";          'Test Ausgabe
gosub I2C_Start                     'Re - Start und Daten übertragen
gosub Ack                           'warten auf Bestätigung vom Slave
'------------------------------------------
gosub I2C_read                      'Daten einlesen
Daten = I2C_tmp                     'Datenübergabe
gosub No_Ack                        'lese - Ende einleiten
'------------------------------------------
gosub I2C_Stop                      'Stop
return

'------------------------------------------
#I2C_Stop
SDA = off : SCL = on : SDA = on     'Stop Bedingung
return

'------------------------------------------
#I2C_Start
SDA = on : SCL = on                 'Start Bedingung Re - Start
SDA = off : SCL = off               'Start Bedingung
#I2C_write
if B8 = on then SDA = on else SDA = off 'Bit8 an den I2C-Bus legen
if B8 = on then Print "1"; else Print "0"; 'Test Ausgabe
gosub I2C_Pulse                     'Pulse - Bit8 senden
if B7 = on then SDA = on else SDA = off 'Bit7 an den I2C-Bus legen
if B7 = on then Print "1"; else Print "0"; 'Test Ausgabe
gosub I2C_Pulse                     'Pulse - Bit7 senden
if B6 = on then SDA = on else SDA = off 'Bit6 an den I2C-Bus legen
if B6 = on then Print "1"; else Print "0"; 'Test Ausgabe
gosub I2C_Pulse                     'Pulse - Bit6 senden
if B5 = on then SDA = on else SDA = off 'Bit5 an den I2C-Bus legen
if B5 = on then Print "1"; else Print "0"; 'Test Ausgabe
gosub I2C_Pulse                     'Pulse - Bit5 senden
if B4 = on then SDA = on else SDA = off 'Bit4 an den I2C-Bus legen
if B4 = on then Print "1"; else Print "0"; 'Test Ausgabe
gosub I2C_Pulse                     'Pulse - Bit4 senden
if B3 = on then SDA = on else SDA = off 'Bit3 an den I2C-Bus legen
if B3 = on then Print "1"; else Print "0"; 'Test Ausgabe
gosub I2C_Pulse                     'Pulse - Bit3 senden
if B2 = on then SDA = on else SDA = off 'Bit2 an den I2C-Bus legen
if B2 = on then Print "1"; else Print "0"; 'Test Ausgabe
gosub I2C_Pulse                     'Pulse - Bit2 senden
if B1 = on then SDA = on else SDA = off 'Bit1 an den I2C-Bus legen
if B1 = on then Print "1" else Print "0"   'Test Ausgabe
gosub I2C_Pulse                     'Pulse - Bit1 senden
return

'------------------------------------------
#I2C_read
I2C_tmp = 0                         'Reset Daten
deact SDA                           'Datenleitung = Eingang
SCL = on                            'Start Einlesen
if SDA then B8 = on                 'Bit8 zuweisen
gosub I2C_Pulse_int                 'Pulse ohne SDA
if SDA then B7 = on                 'Bit7 zuweisen
gosub I2C_Pulse_int                 'Pulse ohne SDA
if SDA then B6 = on                 'Bit6 zuweisen
gosub I2C_Pulse_int                 'Pulse ohne SDA
if SDA then B5 = on                 'Bit5 zuweisen
gosub I2C_Pulse_int                 'Pulse ohne SDA
if SDA then B4 = on                 'Bit4 zuweisen
gosub I2C_Pulse_int                 'Pulse ohne SDA
if SDA then B3 = on                 'Bit3 zuweisen
gosub I2C_Pulse_int                 'Pulse ohne SDA
if SDA then B2 = on                 'Bit2 zuweisen
gosub I2C_Pulse_int                 'Pulse ohne SDA
if SDA then B1 = on                 'Bit1 zuweisen
SCL = off                           'Stop Einlesen
return

'------------------------------------------
#I2C_Pulse_int
SCL = off : SCL = on                'Pulse für Read
return

'------------------------------------------
#Ack 'I2C-Bus Auswertung
deact SDA                           'Datenleitung = Eingang
wait not SDA                        'warten auf Antwort vom Slave
SCL = on : SCL = off : SDA = on     'Pulse und SDA High
return

'------------------------------------------
#No_Ack 'I2C-Bus ohne Auswertung
SDA = on : SCL = on : SCL = off     'SDA High und Pulse
return

'------------------------------------------
#I2C_Pulse
SCL = on : SCL = off : SDA = off    'Pulse und SDA Low
return

'------------------------------------------
#Ack_suche 'wartet nicht auf Antwort vom Slave, nur Auswertung Slave
deact SDA                           'Datenleitung = Eingang
if not SDA then N = 0               'Wenn Slave gefunden, dann Auswertung
SCL = on : SCL = off                'Pulse
return


 Antwort schreiben

Bisherige Antworten: