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
intmain(void)
17
{
18
unsignedintspeicheradresse=0;//Ich möchte in Adresse 0 speichern
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
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
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.
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
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?
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.
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
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