@Rage_Empire
Besten Dank für die schnelle Hilfe...
jetzt klappt alles.
Habe den Code von dir mal in mein Testprogi eingebaut, ist doch ok, oder?
Habe sicherheitshalber auch noch den Writeprotect-Pin des EEPROM auf masse gelegt.
hier ist mein 'alles mögliche Test-Programm'
Wenn Pina.0, Pina.2 oder Pina.4 auf null gehen, wirs jeweils die Eingabe einer Variablen gefordert und in den EEPROM geschrieben.Code:'####################################################### '# Erster Versuch ATMega16 # '# 3 Taster # '# 2 LEDs # '# I2C, ISP, serial-232, extra 4MHz Oszi # '# I2C EEPROM 24c256 # '####################################################### $regfile = "m16def.dat" $framesize = 32 $swstack = 32 $hwstack = 32 $crystal = 12000000 '12mhz $baud = 9600 '$lib "i2c_TWI.lib" Config Adc = Single , Prescaler = Auto , Reference = Internal 'Avcc Config Portb.2 = Output 'Ein Pin wird aus Ausgang konfiguriert PC0 (also Pin0 von Port C) Config Portb.3 = Output Config Porta.0 = Input Config Porta.2 = Input Config Porta.4 = Input Config Porta.5 = 0 Config Scl = Portc.0 'PINs für I2C Bus Config Sda = Portc.1 Config I2cdelay = 10 'geht auch ohne .lib I2cinit Config Twi = 400000 Dim Eehead(2) As Byte Dim Eebyte(4) As Byte Dim Eesingle As Single At Eebyte Overlay Dim Eeword(2) As Word At Eesingle Overlay Dim Eebanz As Byte Dim Ee_adresse01 As Word At Eehead Overlay Dim Eead As Word Dim I As Word Dim W As Word Dim S As Single Const 24c256w = &B10100000 Const 24c256r = &B10100001 Config Timer1 = Timer , Prescale = 256 'konfiguriere Timer1 Enable Timer1 'schalte Den Timer1 Ein On Timer1 Isr_von_timer1 'verzweige Bei Timer1 überlauf Zu Isr_von_timer1 Config Timer0 = Timer , Prescale = 256 'konfiguriere Timer0 Enable Timer0 'schalte Den Timer1 Ein On Timer0 Isr_von_timer0 Enable Interrupts Load Timer1 , 46875 Load Timer0 , 183 Porta.0 = 1 Porta.2 = 1 Porta.4 = 1 Declare Function Loadbyte(byval Ee_adresse As Word) As Byte Declare Function Loadword(byval Ee_adresse As Word) As Word Declare Function Loadsingle(byval Ee_adresse As Word) As Single Declare Sub Savebyte(byval Ee_daten As Byte , Byval Ee_adresse As Word) Declare Sub Saveword(byval Ee_daten As Word , Byval Ee_adresse As Word) Declare Sub Savesingle(byval Ee_daten As Single , Byval Ee_adresse As Word ) Goto 001 Sub Savebyte(byval Ee_daten As Byte , Byval Ee_adresse As Word) Eebyte(1) = Ee_daten Ee_adresse01 = Ee_adresse Eebanz = 1 : Gosub Write_ee End Sub Sub Saveword(byval Ee_daten As Word , Byval Ee_adresse As Word) Eeword(1) = Ee_daten Ee_adresse01 = Ee_adresse Eebanz = 2 : Gosub Write_ee End Sub Sub Savesingle(byval Ee_daten As Single , Byval Ee_adresse As Word ) Eesingle = Ee_daten Ee_adresse01 = Ee_adresse Eebanz = 4 : Gosub Write_ee End Sub Function Loadbyte(byval Ee_adresse As Word) As Byte Ee_adresse01 = Ee_adresse Eebanz = 1 : Gosub Read_ee Loadbyte = Eebyte(1) End Function Function Loadword(byval Ee_adresse As Word) As Word Ee_adresse01 = Ee_adresse Eebanz = 2 : Gosub Read_ee Loadword = Eeword(1) End Function Function Loadsingle(byval Ee_adresse As Word) As Single Ee_adresse01 = Ee_adresse Eebanz = 4 : Gosub Read_ee Loadsingle = Eesingle End Function 'Routine zum schreiben von Daten in das EEPROM ++++++++++++++++++++++++++++++++ Write_ee: Disable Interrupts Eead = Eead + Eebanz Eebanz = Eebanz + 2 I2csend 24c256w , Eehead(1) , Eebanz Waitms 10 Enable Interrupts 'If Err = 1 Then Call Error(55) Return 'Routine zum lesen von Daten aus dem EEPROM ++++++++++++++++++++++++++++++++++++ Read_ee: Disable Interrupts Eead = Eead + Eebanz I2csend 24c256w , Eehead(1) , 2 Waitms 10 I2creceive 24c256r , Eebyte(1) , 0 , Eebanz Waitms 1 Enable Interrupts 'If Err = 1 Then Call Error(55) Return Isr_von_timer1: 'isr Von Timer1 Load Timer1 , 46875 'Timer1 soll wieder von 34286 wegzählen Toggle Portb.2 'z.B. erhöhe Variable um 1 Return Isr_von_timer0: 'isr Von Timer1 Load Timer0 , 183 'Timer1 soll wieder von 34286 wegzählen If I = 0 Then I = 193 'If Porta.0 = 0 Then Toggle Portb.3 'z.B. erhöhe Variable um 1 End If Return '################### HAUPTPROGRAMM ######################################### 001: Dim Ins As Single Dim Inw As Word Dim Inb As Byte Do Print Portb.2 If Pina.0 = 1 Then Set Portb.3 Else Reset Portb.3 If Pina.0 = 0 Then Print "T1" Input "Single: " , Ins 'For I = 10 To 100 Step 4 Call Savesingle(ins , 10) 'Next I Print "gespeicherter Wert: " ; Ins Ins = Loadsingle(10) Print "geladener Wert: " ; Ins End If If Pina.2 = 0 Then Print "T2" Input "Word: " , Inw Call Saveword(inw , 11) Print "gespeicherter Wert: " ; Inw Inw = Loadword(11) Print "geladener Wert: " ; Inw End If If Pina.4 = 0 Then Print "T3" Input "Byte: " , Inb Call Savebyte(inb , 12) Print "gespeicherter Wert: " ; Inb Inb = Loadbyte(12) Print "geladener Wert: " ; Inb End If Start Adc W = Getadc(5) Print W Stop Adc Ins = Loadsingle(10) Print "geladener Wert: " ; Ins Inw = Loadword(11) Print "geladener Wert: " ; Inw Inb = Loadbyte(12) Print "geladener Wert: " ; Inb Waitms 200 Loop End
Während des LOOP wird immer der EEPROM ausgelesen und ausgegeben.
Außerdem blinkt eine LED im sekundentakt.
eine Frage hätte ich aber noch:
Hab das mit der Adressorganisation noch nicht so intus...
Wenn ich in meinem Progi für single 123456789.0 eingebe steht dann 12345678.0 drinnen... dem um 1 adersse höheren Word-Werte passiert aber nix...
Wie groß sind denn in deinen Schreib-Subs die Variablen?
ich möchte den EEPROM lückenlos mit Word- und Single-Feldern füllen können...
Bis denne... Stefan







Zitieren

Lesezeichen