Forum: Mikrocontroller und Digitale Elektronik 2 AVRs über I2C verbinden?


von meHli (Gast)


Lesenswert?

Hallo Zusammen.

Ich habe folgendes Problem: würde gern 2 µC über I2C verbinden da ich
diesen Bus schon nutze um einen anderen Schaltkreis zu Steuern. 2 µC
möchte ich nutzen da einer als ADC, I/O Port etc. dienen soll der
andere als Anzeige- (LCD-Display) und Eingabeeinheit (4Tasten)
verwendung finden soll ... also so ne Art Kabelferbeding bei der beide
Schalkreise als Transceiver fungieren sollen.
Beschränken möchte ich mich hierbei auf Atmel-ICs (90s4433 bzw.
Atmega163) die Programmierung soll in Bascom stattfinden.
Ich habe schon einiges versucht nur leider konnte ich keine vom µC
gesendeten daten mit dem anderen µC empfangen. - Ist das überhaupt ohne
weiteres in Bascom möglich?
Über eine kleine Demo wäre ich sehr dankbar.

mfg meHli

von Mark de Jong (Gast)


Lesenswert?

Hallo,

Ich kenne denn AVRs noch nicht so gut, aber wenn er keine I2C hardware
hat kannst Du es vergessen.

I2C slave in software ist sehr schwierig.

I2C Master ist einfach!

Grüße Mark.

von Michael (Gast)


Angehängte Dateien:

Lesenswert?

I2C Slave Software gibts von ATMEL in Assembler.

funktioniert einwandfrei.

von crazy horse (Gast)


Lesenswert?

hm, noch nichts in der Art gemacht - aber was soll so schwierig sein?
Kann ich mir im Moment nicht vorstellen.

von günter (Gast)


Angehängte Dateien:

Lesenswert?

Hallo


1.
zum dem von Michael geposteten Programm gibt es eine
Appl.Note AN302 auf der Atmel-Seite

2.
das genannte Programm AVR302.ASM ist für einen 1200er geschrieben;
ich habe es in ein BASCOM-Programm für einen 2313
(als Ass-Code) eingebunden - funktioniert einwandfrei
(Programm als Anhang anbei)

Falls hierzu Fragen auftauchen, kannst Du Dich ja noch einmal
melden

3.
Wenn Du nicht mit dem Ass-Programm arbeiten möchtest, gibt es
auf der BASCOM-Seite eine (kostenpflichte Software für I2C-Slave-
Routine - ca 5,-- EUR ?)

Also nicht gleich die Flinte ins Korn werfen ...

Wenn alles nicht 'fruchtet' kannst Du immer noch einen AVR
mit I2C-Hardware einsetzen...

Viel Erfolg

von meHli (Gast)


Lesenswert?

Hey Danke - das geht ja schnell,

die Site mit dem Programm für 4,95Euro hab ich schon gefunden - ich
dachte nur es geht möglicherweise "einfacher".
Ein µC als I2C-Master ist problemlos.
Ich werde jetzt nochmal etwas probieren (bzgl. Beiträge) ...


Danke nochmal

mfg meHli

von thkais (Gast)


Lesenswert?

@Mark de Jong: Was bitte soll an einem I²C-Slave schwierig sein?
Interessant wirds erst bei Multi-Master (Arbitrierung). Ich habe das
ohne Probleme mit einem 2313 realisiert. Allerdings kann ich nichts in
Basic bieten.

von günter (Gast)


Lesenswert?

meHli

Die Routine von BASCOM für 4,95 ist übrigens eine
Version des AVR302.asm - Codes versteckt in einer BASCOM-lib!

Nach Angaben der BASCOM-Leute sind jedoch einige bug's bereinigt
worden;

Ich hab's soeben ausprobiert (für einen PCF8574):
M162 als Master mit den bekannten BASCOM-Statements I2CSTART,
I2CWRBYTE, etc.
2313 als Slave mit den zusätzlichen I2C-Routinen von BASCOM

Es funktioniert ...

Die EUR 4,95 lohnen sich m.E. sofern man mit BASCOM eine Anwendung
realisieren möchte.

gruß

Günter

von Edgar (Gast)


Lesenswert?

Hallo Allerseits,
hat jemand von Euch besagte AppNote (AN302)? Bei Atmel gibt's die
nämlich nicht mehr (oder bin ich zu blöd???) ;-).
Danke,
Edgar

von günter (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

I2C heißt bei Atmel TWI ...

AN als Anhang anbei

Günter

von Edgar (Gast)


Lesenswert?

wow,
das ging ja flott!

Danke,
Edgar

von Stefan (Gast)


Lesenswert?

Hi Günter,

kannst du mal ein Beispiel das mit der I2C-Slave Lib geschrieben wurde
posten?

von guenter (Gast)


Lesenswert?

Hallo Stefan

Die Programme für die I2C-Slave-Routinen
sind linzenz- und kostenpflichtig. Ich kann Sie Dir deshalb
leider nicht weitergeben.

Bezugsquelle:
http://www.mcselec.com/bascom-avr.htm


EUR 4,95 sollten doch erschwinglich sein ... :-) ???

Gruß
Günter

von Peter D. (peda)


Lesenswert?

I2C-Slave in Software ist sehr Ressourcen fressend, davon würde ich
dringend abraten.

Ich hab mir mal die AN302 angesehen.

1.
Es dürfen keine anderen Interrupts aufgerufen werden, sonst verpaßt Du
das Startbit.

2.
Gibt es irgendeinen Fehler auf dem I2C-Bus, hängst Du für immer in dem
Interrupt fest, d.h Dein Hauptprogramm steht.

3.
Der Interrupt wird solange nicht verlassen, bis der I2C-Transver
komplett beendet ist, d.h. Dein Hauptprogramm steht für diese Zeit.


Daher kann auch die Bibliothek nicht ihre 4,95€ wert sein.

Als I2C-Slave reicht doch schon ein ATTiny26 aus.


Peter

von Stefan (Gast)


Lesenswert?

Welche Alternative gibt es denn dann? Eigentlich wollte ich den 2313 als
Slave programmieren. Kann von mir aus auch der Mega8 oder ATTiny26
sein. Aber wie mache ich es da?
Ich bräuchte mal etwas stabilen Code den ich unter Bascom auch nutzen
kann. Von ASM hab ich wenig Ahnung.

von Mark Hämmerling (Gast)


Lesenswert?

Salut,

@meHli: ohne Dir irgendwie den Spaß an der I²C-Sache (hoppla, ich meine
natürlich TWI) verderben zu wollen, aber ein extra AVR nur als I/O
interface läßt sich leicht einsparen, indem Du für den in- bzw. output
simple Shiftregister verwendest. 8bit kosten ca. 30 Cent. Die lassen
sich rasant ansteuern. Also schnell genug, um auf einem HD44780 LCD
hunderte Frames pro Sekunde darzustellen, Taster inkl. Prellung
abzufragen, etc.
Wenn Dein Haupt-AVR Hardware-SPI unterstützt, ist das überhaupt kein
Problem. Andernfalls ist SPI denkbar einfach selbst implementierbar.
Die Register lassen sich zu quasi unendlich langen Ketten verlängern.
Ich hab hier ein LCD (HD44780) dran. Dazukommen sollen noch >10 Taster
und ein Rotary Encoder. Insgesamt kostet der Spaß 4 I/O-Leitungen
(MOSI, MISO, SCK, /SS).

Viele Grüße,
Mark

von Stefan (Gast)


Lesenswert?

Also ich nehme mal an das er den I/o Baustein nur als Demo programmiert
hat - da ein solches Demo unter Bascom beschrieben wird.

Es geht mir schon um andere Aufgaben. Wäre schön wenn jemand mal ein
I2C Slave Beispiel hätte.

von Matthias (Gast)


Lesenswert?

Hi

/**
  TWI-Schnittstelle initialisieren<br>
  Adresse der ASR ist 0x04<br>
  Slave Transmitter Mode
*/
void i2c_init()
{
  TWAR = ASR_ADRESS;
  TWCR = (1<<TWEN)|(1<<TWEA)|(1<<TWIE);
}

/**
  Behandelt die INT's des TWI
*/
SIGNAL(SIG_2WIRE_SERIAL)
{
  if(TWSR==0xA8)
  {
    TWDR=i2c_pwmf;
    TWCR=(1<<TWEN)|(1<<TWINT)|(1<<TWEA)|(1<<TWIE);
  }
  else if((TWSR==0xB8)||(TWSR==0xB0))
  {
    TWDR=i2c_speed;
    TWCR=(1<<TWEN)|(1<<TWINT)|(1<<TWIE);
  }
  else if(TWSR==0xC0)
  {
    TWCR=(1<<TWEN)|(1<<TWINT)|(1<<TWEA)|(1<<TWIE);
  }
}

sehr einfacher I2C-Slave in C zur Übertragung von 2 Byte. Controller
muß dazu TWI unterstützen. Die Statusbytes des TWI wollte ich schon
lang mal benamsen. Aber wie das halt so ist: Tut -> erledigt :-(

Matthias

von Stefan (Gast)


Lesenswert?

Was zum Himmel ist TWI?

von thkais (Gast)


Lesenswert?

aus Lizenzrechtilichen Gründen heißt I²C bei Atmel TWI.

von leo9 (Gast)


Lesenswert?

Ich möcht mich Mark anschließen, wozu willst du unbedingt zwei
Controller einsetzen. So komplex können deine Verarbeitungsroutinen ja
fast nicht sein. Wenn du nicht grad Videosignale ausliest idelt der up
doch eh fast dauernd. Ich programmier gerade einen Mega 8 zum Auslesen
von Datenzeile, VPS und WSS Signalisierung, dazu ein paar Tasten, LCD,
8bit OC Ausgänge, ein paar Leds als grobe Signalisierung und
Statusausgabe via RS232. Lediglich der Programmspeicher ist etwas eng,
mit der up-Auslastung habe ich keine Probleme.

grüsse leo9

von Newbie (Gast)


Lesenswert?

Aber wie progtrammiert man einen Atmel mit Hardware I2C in Bascom als
Slave? Kann mir das auch jemand sagen?

von Christian (Gast)


Lesenswert?

Würde mich auch interessieren

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.