Forum: Mikrocontroller und Digitale Elektronik Mit Attiny2313A via I2C auf 24LC64 EEPROM schreiben.


von Philipp K. (numeriusnegidius)


Angehängte Dateien:

Lesenswert?

Hallo allerseits,

ich würde gerne mit einem Attiny2313A via I²C auf ein 24LC64 schreiben.

Das klappt mit Arduino auch wunderbar, nur leider kriege ich es mit dem 
Attiny nicht gebacken. Versuche ich nämlich, mit dem Arduino den Wert 
wieder auszulesen, steht da immer noch einer, den ich testweise mit dem 
Arduino geschrieben hatte.

Hier mein Code:
1
/*
2
 * I2C2313A.c
3
 *
4
 * Created: 31.05.2013 23:13:35
5
 *  Author: Philipp
6
 */ 
7
8
9
#include <avr/io.h>
10
#include "i2cmaster.h" 
11
12
#define EEPROM 0x50 //Das ist die Adresse des EEPROM
13
14
15
16
int main(void)
17
{
18
  unsigned int speicheradresse = 0; //Ich möchte in Adresse 0 speichern
19
  char test = 0x81; //Und zwar diesen Wert
20
    i2c_init(); 
21
     i2c_start_wait(EEPROM+I2C_WRITE);
22
     i2c_write((char)(speicheradresse >> 8)); //Höherwertiges Byte
23
     i2c_write((char)(speicheradresse & 0xFF)); //Niederwertiges Byte
24
     i2c_write(test); //Wert schreiben
25
     i2c_stop();
26
    
27
      
28
    while(1)
29
    {
30
      
31
    }
32
}

Diesen habe ich direkt aus meinem Arduino Buch übernommen und den byte 
cast durch ein char ersetzt. Aber auch, wenn ich, entsprechend Herrn 
Fleurys Beispiel 
(http://homepage.hispeed.ch/peterfleury/group__pfleury__ic2master.html ) 
die Adresse und den Wert direkt als Argument übergebe, führt das zum 
gleichen Ergebnis.

Der Attiny nutzt den internen Oszillator (geteilt durch 8, also 1Mhz) 
Als SDA habe ich PINB0 genommen, als SCL PINB1. Dies habe ich auch in 
der i2cmaster.S angepasst:
1
#define SDA       0    // SDA Port B, Pin 0   
2
#define SCL    1    // SCL Port B, Pin 1
3
#define SDA_PORT        PORTB           // SDA Port B
4
#define SCL_PORT        PORTB           // SCL Port B

Beide Pins sind mit einem 10k-Widerstand an +5V gelegt. 
Interessanterweise sind die beiden Pins dauerhaft "aktiv", die 
angehängte Waveform ist also immer, wenn der µC Strom hat, ablesbar und 
nicht nur (wie beim Arduino) einmal, nämlich direkt nach dem 
Einschalten.

Erbarmt sich jemand und verrät mir, wo ich hier auf dem Schlauch stehe?


Vielen Dank!

Philipp

von Stefan S. (stefan2013)


Lesenswert?

Liegt vielleicht daran, dass der Attiny2313 kein TWI hat ;)
Dort musst du mit dem USI arbeiten.

von Philipp K. (numeriusnegidius)


Lesenswert?

Au weia! Ich hatte das jetzt so verstanden, dass ich die Library sowohl 
mit Hardware TWI (dann über i2cmaster.c), als auch mit Software I²C an 
einem beliebigen PIN (mittels i2cmaster.S) benutzen könnte.

Dann les ich mich wohl mal in USI ein, danke dir.

Philipp

von Stefan S. (stefan2013)


Lesenswert?

Achso, dass mit der Software library habe ich übersehen.

von MWS (Gast)


Lesenswert?

Philipp K. schrieb:
> als auch mit Software I²C an
> einem beliebigen PIN (mittels i2cmaster.S) benutzen könnte.

Da hast Du auch richtig verstanden und damit deutlich mehr als der 
Beantworter Deiner Frage, denn hätte er sich den Link angesehen, wäre 
ihm die Überschrift aufgefallen:

I2C (TWI) Master Software Library

Verdächtig ist das hier:
> wenn der µC Strom hat, ablesbar und nicht nur (wie beim Arduino) einmal,
> nämlich direkt nach dem Einschalten

Deutet beim gezeigten Code auf laufende Controller-Neustarts hin, der 
müsste in der while(1) bleiben.

von Philipp K. (numeriusnegidius)


Lesenswert?

MWS schrieb:
> Deutet beim gezeigten Code auf laufende Controller-Neustarts hin, der
> müsste in der while(1) bleiben.

Hm, ich habe mal den Attiny ausgetauscht, aber auch beim neuen Chip 
zeigt sich dieses Verhalten.

Sieht denn für den Profi grundsätzlich alles okay aus, oder stecken da 
im Code für euch große "No-Gos"?


Viele Grüße

Philipp

von MWS (Gast)


Lesenswert?

Ein Neustart lässt sich leicht prüfen, indem man in die main zu Anfang 
ein Delay reinsetzt und einen Pin wackelt, z.B. um eine LED blinken zu 
lassen. Neustarts werden dadurch sichtbar.
Das Problem könnte daraus resultieren, dass Du irgendwo etwas geändert 
oder falsch konfiguriert hast, was natürlich hier nicht zu sehen ist.
Irgendwie sollte da auch eigentlich noch ein Restart im I2C rein, das 
hätte aber nur zur Folge, dass die Verbindung nicht klappt, ein Neustart 
dürfte damit nicht ausgelöst werden.
Ist die HW in Ordnung, Abblockkondensatoren sind vorhanden wie 
vorgeschrieben?

von Philipp K. (numeriusnegidius)


Lesenswert?

MWS schrieb:
> Ein Neustart lässt sich leicht prüfen, indem man in die main zu Anfang
> ein Delay reinsetzt und einen Pin wackelt, z.B. um eine LED blinken zu
> lassen. Neustarts werden dadurch sichtbar.

Dass ich auf sowas nicht komme... Resultat: Kein Neustart! Die LED geht 
nur einmal an und dann wieder aus, wenn ich das an den Anfang von Main 
schreibe.

MWS schrieb:
> Das Problem könnte daraus resultieren, dass Du irgendwo etwas geändert
> oder falsch konfiguriert hast, was natürlich hier nicht zu sehen ist.

Ich werd mich wohl morgen mal auf Fehlersuche begeben müssen. Hab aber 
keine Idee, was das sein könnte :(

MWS schrieb:
> Ist die HW in Ordnung, Abblockkondensatoren sind vorhanden wie
> vorgeschrieben?

Ja, 100 nF an VCC.

von MWS (Gast)


Lesenswert?

Hab' mir die i2cmaster.S angesehen, dort die start_wait. Diese Routine 
nutzt acknowledge polling, d.h. sie sendet solange die Adresse, bis der 
Slave antwortet.

Diese Adresse ist das sich wiederholende Signal, das Du auf dem Oszi 
siehst, was wiederum bedeutet, dass Sein Slave nicht antwortet, weil zum 
Beispiel die Adresse nicht stimmt. Die sieht mir mit 0x50 ein wenig zu 
klein aus.

Es gibt zwei Möglichkeiten der Definition, einmal als 7 Bit Adresse, 
welche dann mit dem RW-Bit zu 8 Bit ergänzt wird, oder bereits die 
Adresse in 8 Bit. Die Fleury-Lib scheint mir letztere zu benötigen, also 
schreib mal die EEPROM Basisadresse als 0xA0

von Philipp K. (numeriusnegidius)


Lesenswert?

Vielen, vielen Dank für deine Mühe, das Problem ist gelöst! Ich war mir 
zwar bewusst, dass der 7 Bit Adresse noch das 8 Bit fehlt, habe aber 
völlig verplant, dass das +I2C_WRITE nur eine 1 dazuaddiert, jedoch 
keine anhängt...

Toll, dass du dir die Mühe gemacht hast!


Philipp

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.