Forum: Mikrocontroller und Digitale Elektronik I2C Beispielcode - 1xAVR Master / 1xAVR Slave


von Philipp L. (viech)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

Aufgabe:
Datenübermittlung von AVR1 zu AVR2 mittels I2C
Master:Atmega8
Slave: Atmega16

in einem vorherigen Thread ging es bereits um die Frage, welche 
Schnittstelle wohl am besten geeignet ist.
Egal welche Schnittstelle es später wird, möchte ich dies gern zum 
Anlass nehmen, einmal eine I2C Kommunikation aufzubauen.

Dazu habe ich in diversen Quellen gelesen:
- C-Buch (Hier ist leider nur ein AVR Master beschrieben)
- Forenbeiträge
- Beispielprogramme "http://www.jtronics.de/category/avr-tutorial/";

Aktuell kann ich zwar die Programme (siehe Anhang) compilieren, aber es 
scheinen keine Daten übermittelt zu werden.
Dazu habe ich ein bestehendes Programm (LCD Anzeige) genommen und möchte 
eine angezeigte Variable mit den Daten aus I2C füttern.
Diese bleibt aber bei 0...

Frage1:
Hat jemand eine Art Minimalprogramm(e), welche Befehle notwendig sind um 
ein Byte vom Master zum Slave zu senden?
Die Beispielprogramme sind für einen Anfänger "immer" so aufgepustet.

Frage2:
Habe ich folgenden Ablauf richtig verstanden

Master: Programm (Basis=C-Buch) siehe Anhang
- I2C Initialisieren (eigentlich nur Bitrate im TWBR)
- I2C Starbefehl / TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN)
- I2C Adressbyte senden
- I2C Datenbyte Senden
- i2C Stoppbefehl

Slave: Programm (Basis=jtronics mit Unterprg TWISLAVE) siehe Anhang
- I2C Initialisieren (Adresse im TWAR und -> ?? in TWCR)
Danach sollte bereits ein "ISR (TWI_vect)" nach Datenempfang vom Master 
geschehen?

Das Programm vom Master aus dem Buch scheint mir noch logisch.
Das Slave-Programm mit der verschachtelten ISR-sende/empfangsoption und 
rx/txbuffer ist mir aktuell noch zu komplex.


Danke!!

Philipp

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Welcher Compiler frisst Word-Dateien?

SCNR
WK

von Philipp L. (viech)


Angehängte Dateien:

Lesenswert?

Ich dachte es wäre hilfreich nur die entsprechenden Zeilen zu posten.
Anbei die beiden main.c (umbenannt in Master.c und Slave.c)

In Master ist noch eine DCC-Protokollauswertung dabei
Bei Slave wird ein Display angesteuert.


Die Variable "Variable" aus dem Musterprogramm vom Slave bleibt immer 0.
Dabei sende ich kontinuierlich 0b00001111 vom Master...

Was mir soeben in den Sinn gekommen ist:
Was ist eigentlich mit der Definition von Eingang/Ausgang?
Dieses Thema habe ich bisher noch in keinem Beispiel bewusst gesehen.
Ich muss doch erstmal SCL  beim Master=DO und Slave=DI konfigurieren, 
oder?
Was ist denn mit SCL, dies kann ich zwar als Test fix vergeben, aber bei 
BIDI muss SCL ständig zwischen DO/DI getauscht werden, richtig?

: Bearbeitet durch User
von M. K. (sylaina)


Lesenswert?

Philipp L. schrieb:
> Was ist eigentlich mit der Definition von Eingang/Ausgang?
> Dieses Thema habe ich bisher noch in keinem Beispiel bewusst gesehen.
> Ich muss doch erstmal SCL  beim Master=DO und Slave=DI konfigurieren,
> oder?

Das ist ja das Tolle an den Hardware-Modulen: Um den Quatsch brauchst du 
dich nicht kümmern.

Bei deinen Tests würde ich an deiner Stelle den ganzen Quatsch mit DCC 
und Co erstmal weg lassen und es wirklich so simpel wie möglich halten 
einfach um die potentiellen Fehlerquellen gering zu halten. Dein 
Beispiel erscheint mir nämlich immer noch zu komplex.

Beim Master z.B. käme also bei mir nur sowas in der Art:

TWI_START(uint8_t i2cAdress){...};
TWI_SEND_BYTE(uint8_t byte){...};
TWI_STOP();

Und mehr würde im Test der Master auch nicht machen: Immer nur z.B. eine 
42 senden. Und beim Slave würde ich dann schauen, was emfpängt der.

Wichtig ist hier IMO auch ein Oszi um zu sehen ob auch wirklich ein 
Datenstrom auf der Leitung ist.

von Philipp L. (viech)


Angehängte Dateien:

Lesenswert?

> Und mehr würde im Test der Master auch nicht machen: Immer nur z.B. eine
> 42 senden.

Ja, deshalb ja meine Frage nach einem möglichst einfachen Beispielcode.
Was ist der Minimalcode um ein Byte zu senden und zu empfangen?

> Wichtig ist hier IMO auch ein Oszi um zu sehen ob auch wirklich ein
> Datenstrom auf der Leitung ist.

Oszi hab ich grad drangehangen.
Datenstrom ist vorhanden, jedoch bin ich über die kurzen Impulse etwas 
verwundert (siehe Anhang).
Sieht das für euch richtig aus?

Ich sende erst die Adresse (0x50), dann die Daten 0XFF.
Mehr macht das Master-Programm grad nicht mehr.
while (1)
{
TWI_START();
TWI_MT_SLA_ACK();  // Adresse: 0X50
TWI_MT_DATA_ACK(); // Daten:   0XFF
TWI_STOP();
_delay_ms(500);
}
}
Ist das die richtige/vollständige Reihenfolge?


>Und beim Slave würde ich dann schauen, was emfpängt der.
Das ist ja das Problem, er empfängt (mit dem Beispielprogramm) wohl nix.
Ich schiebe die empfangene Variable auf das Display.
Die Displayroutine funktioniert, zeigt aber der Variable immer 0.

von M. K. (sylaina)


Lesenswert?

Hm, ein Beispielcode für den Master könnte bei mir so aussehen
1
#include "i2c.h"
2
3
#define myI2CAdress 0x32
4
5
int main(void){
6
  i2c_init();
7
  uint8_t myValue = 42;
8
  for(;;){
9
    i2c_start(myI2CAdress);
10
    i2c_byte(myValue);
11
    i2c_stop();
12
  }
13
  return 0;
14
}

Die i2c-Library wäre von hier (meiner OLED-Library): 
https://github.com/Sylaina/oled-display

Das wird den Mikrocontroller dazu veranlassen, ständig die 42 über I2C 
zu schicken.

von Stefan F. (Gast)


Lesenswert?

Philipp L. schrieb:
> Sieht das für euch richtig aus?

Nein

Normalerweise sieht das so aus: 
https://www.mikrocontroller.net/attachment/393868/Bildschirmfoto_von_2019-02-27_19-47-54.png

von Philipp L. (viech)


Angehängte Dateien:

Lesenswert?

Hallo,

ich glaube der Logic-Analysor macht murks (Hoffentlich..).
Anbei nochmals mit normalen Tastköpfen und einer eingebauten Pause von 
100us zwischen Adresse&Daten.
- Ist eine Pause erlaubt?
- Ich habe das TWBR=100 gesetzt (bei 8Mhz) ist das zum Test okay ?
- Muss ich dem Slave die Taktzeiten eigentlich nicht mitteilen?
- Welche Taktzeiten kann ein Atmega16 als Slave verwalten (Pkt.2)

Wie man in den Screenshots sieht, sendet der Master erst die Adresse 
0x50 (0b01010000) und danach die Daten 0XFF (und zum Vergleich 0X0F).

Der Master scheint also das zu machen, was er soll.
Der Code stammt aus meinem Buch und ist ohne Lib.
Leider behandelt dies aber keinen Slave...

Slave:
Was ist der Minimalcode (ohne Lib) um die Adresse zu setzen und das 
empfangene Byte zu lesen?
-Ich sende auf 0x50 (siehe Anhang)
-Im Datenblatt steht unter TWAR, dass die Adr. in den oberen 7 Bit 
stehen muss.
Muss ich also auf TWAR=A0 empfangen = Adr.0x50<<1 ?

: Bearbeitet durch User
von M. K. (sylaina)


Lesenswert?

Philipp L. schrieb:
> Was ist der Minimalcode (ohne Lib) um die Adresse zu setzen und das
> empfangene Byte zu lesen?

Schau dir mal die App-Notes von Microchip/Atmel zum TWI an, ich glaub 
eine davon heißt AVR310 (schwirrt mir grad bei TWI und Atmel so durch 
den Kopf).

von Wolfgang (Gast)


Lesenswert?

M. K. schrieb:
> Wichtig ist hier IMO auch ein Oszi um zu sehen ob auch wirklich ein
> Datenstrom auf der Leitung ist.

Ein Oszi brauchst man für soetwas nur, wenn man den Signalpegeln nicht 
traut.

Philipp L. schrieb:
> ich glaube der Logic-Analysor macht murks (Hoffentlich..).

Für solche elementaren Aufgaben sind Spezialgeräte oft die einfachere 
Lösung. Ein dafür ausreichender Logikanalysator kostet aus Shenzhen 
weniger als 0.5% von deinem Oszi.
z.B. https://www.ebay.de/itm/253841718379

von M. K. (sylaina)


Lesenswert?

Wolfgang schrieb:
> Ein Oszi brauchst man für soetwas nur, wenn man den Signalpegeln nicht
> traut.

Naja, es sollte schon ein Rechteck sein und kein Haifischzahn-Signal. 
Und ein Oszi ist ja nicht nur für sowas gut, gehört IMO in jeden 
Elektronik-Bastelkeller. Und wenns nur so nen Handheld-Teil ist wie das 
DSO201 und Co.

von Wolfgang (Gast)


Lesenswert?

M. K. schrieb:
> Naja, es sollte schon ein Rechteck sein und kein Haifischzahn-Signal.

Weder an SDA noch an SCL wird normalerweise irgendjemand einen 
Kondensator hängen, der dazu Anlass gibt.
(Bei Experimenten mit extravaganten Kabellängen sähe das natürlich 
anders aus.)

M. K. schrieb:
> Und ein Oszi ist ja nicht nur für sowas gut, gehört IMO in jeden
> Elektronik-Bastelkeller.

Ich formuliere es mal anders rum: Statt eines "2000€"-Oszis mit allem 
möglichen Schnickschnack für den Bastelkeller kann man lieber etwas 
einfacheres nehmen, ein paarhundert Euro sparen und sich einen kleinen 
LA für 6€ zusätzlich kaufen. Umgehen können muss man mit beiden.

von M. K. (sylaina)


Lesenswert?

Wolfgang schrieb:
> Ich formuliere es mal anders rum: Statt eines "2000€"-Oszis mit allem
> möglichen Schnickschnack für den Bastelkeller kann man lieber etwas
> einfacheres nehmen, ein paarhundert Euro sparen und sich einen kleinen
> LA für 6€ zusätzlich kaufen. Umgehen können muss man mit beiden.

Muss ja auch kein 2000€ Oszi sein, es reicht ja ein <200€ Oszi in der 
Regel.

Ein LA für 6 Euro würde ich aber nicht allzuviel zutrauen wenn ich ihn 
nicht selbst gebaut hätte. Auch hier gibts etwas besseres in der 
<100€-Klasse.

Wolfgang schrieb:
> Weder an SDA noch an SCL wird normalerweise irgendjemand einen
> Kondensator hängen, der dazu Anlass gibt.

Parasitäre Effekte reichen ja schon. Ist ja nicht so, dass wir hier 
nicht schon Themen gehabt hätten bei denen sich dann rausstellte, dass 
das Problem schlicht nur die Signalqualität war.

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

M. K. schrieb:
> Ein LA für 6 Euro würde ich aber nicht allzuviel zutrauen wenn ich ihn
> nicht selbst gebaut hätte. Auch hier gibts etwas besseres in der
> <100€-Klasse.

Da du es gerade ansprichst, auch wenns etwas offtopic wird, ich bin 
gerade auf der Suche nach nem einfachen USB LA weil ich keinen Bock hab 
immer für alles in die Werkstatt an meinen großen LA zu gehen, hab aber 
auch wenig vertrauen in die 6 Euro Klasse. Was ist denn in der <100€ 
Klasse empfehlenswert?

von Wolfgang (Gast)


Lesenswert?

M. K. schrieb:
> Ein LA für 6 Euro würde ich aber nicht allzuviel zutrauen

Der LA, den ich verlinkt hatte, ist strohdoof. Der kann von sich aus gar 
nichts. Seine einzige Aufgabe ist es, die 8 parallel abgetasteten Kanäle 
als Byte zum PC zu streamen. Der macht die Arbeit.

Tim T. schrieb:
> ... hab aber auch wenig vertrauen in die 6 Euro Klasse.

Dann hol dir einen und probiere ihn aus. Viel kannst du für den Preis 
nicht falsch machen. Das Α&Ω ist die Software auf dem PC.

von Kleiner Mass (Gast)


Lesenswert?

Eines muss ich dir lassen, der Code ist richtig lang. Es geht auch 
definitiv kürzer.

von M. K. (sylaina)


Lesenswert?

Tim T. schrieb:
> Da du es gerade ansprichst, auch wenns etwas offtopic wird, ich bin
> gerade auf der Suche nach nem einfachen USB LA weil ich keinen Bock hab
> immer für alles in die Werkstatt an meinen großen LA zu gehen, hab aber
> auch wenig vertrauen in die 6 Euro Klasse. Was ist denn in der <100€
> Klasse empfehlenswert?

Schau dir doch mal den LA104 an, ich mein der hatte 100 MHz Bandbreite.

Wolfgang schrieb:
> Der LA, den ich verlinkt hatte, ist strohdoof. Der kann von sich aus gar
> nichts. Seine einzige Aufgabe ist es, die 8 parallel abgetasteten Kanäle
> als Byte zum PC zu streamen. Der macht die Arbeit.

Ich glaub nicht, dass der PC die ganze Arbeit macht. Der dient wohl eher 
nur zur Aufbereitung der Messwerte. Aber auch ganz OK wenn er für die 
eigenen Anwendungen passt. Mir persönlich aber wäre 24 MHz Bandbreite 
für 8 Kanäle zu wenig. Aber das kommt halt immer drauf an was man macht.

von Wolfgang (Gast)


Lesenswert?

M. K. schrieb:
> Mir persönlich aber wäre 24 MHz Bandbreite
> für 8 Kanäle zu wenig. Aber das kommt halt immer drauf an was man macht.

Für 400kHz I2C wird's gerad' noch reichen - und darum geht es hier. ;-(

von M. K. (sylaina)


Lesenswert?

Wolfgang schrieb:
> M. K. schrieb:
>> Mir persönlich aber wäre 24 MHz Bandbreite
>> für 8 Kanäle zu wenig. Aber das kommt halt immer drauf an was man macht.
>
> Für 400kHz I2C wird's gerad' noch reichen - und darum geht es hier. ;-(
 Und wenn der Kollege morgen auf die Idee kommt mal SPI sich anzuschaun 
wirds recht zügig knapp wenn man dem SPI nicht grad nen Klotz ans Bein 
hängt. Wir waren ja dabei was so generell sinnvoll ist für die 
Bastlerwerkstatt, nur für I2C empfehle ich auch nicht sich nen Oszi 
anzuschaffen. Das wäre ja dann die Sache mit den Kanonen und Spatzen ;)

von Stefan F. (Gast)


Lesenswert?

Philipp L. schrieb:
> Ist eine Pause erlaubt?

Ja

> Muss ich dem Slave die Taktzeiten eigentlich nicht mitteilen?

Nein, der Master darf nur nicht schneller sein, als der Slave mit kommt. 
Dazu gibt es das optionale Feature "Clock Stretching", dass manche 
Slaves unterstützen. Sie ziehen dann SCL auf Low, solange sie mehr Zeit 
brauchen.

> Welche Taktzeiten kann ein Atmega16 als Slave verwalten (Pkt.2)

Das sollte im Datenblat stehen, weiß ich nicht auswendig. Maximal 400 
kHz sind spezifiziert, die schaft der AVR auf jeden Fall locker flockig 
mit den üblichen Taktfrequenzen (>= 8MHz)

>> Naja, es sollte schon ein Rechteck sein und kein Haifischzahn-Signal.
Wolfgang schrieb:
> Weder an SDA noch an SCL wird normalerweise irgendjemand einen
> Kondensator hängen, der dazu Anlass gibt.

Bei den oft verwendeten 10kΩ Pull-Up Widerständen kommt man da auch mit 
kurzen Leitungen ganz schnell hin. Deswegen empfehle ich 1,5-2,7kΩ bei 
3,3V und maximal 2,2k-4,7kΩ bei 5V.

M. K. schrieb:
> Ein LA für 6 Euro würde ich aber nicht allzuviel zutrauen wenn ich ihn
> nicht selbst gebaut hätte.

Ich habe mir einen für 10€ gekauft (vermutlich das gleiche Modell) und 
empfinde es als eine hilfreiche Bereicherung für meine Bastelecke. Hätte 
ich mir schon viel früher kaufen sollen.

> Was ist denn in der <100€ Klasse empfehlenswert?

Die handelsüblichen Saleae kompatiblen Geräte um 10€ - gibt es mit 
unterschiedlichen Gehäusen aber es steckt immer das gleiche drin.
https://www.amazon.de/AZDelivery-⭐⭐⭐⭐⭐-Logic-Analyzer-gratis/dp/B01MUFRHQ2
Sie funktionieren mit der Software von Saleae und mit PulseView.

Der einzige haken der mir aufgefallen ist: Diese Geräte haben fast 
keinen Pufferspeicher, hängen daher von einer pausenlosen Übertragung 
über das USB Kabel ab. Bei Abtastraten oberhalb von 2 MHz kommt es 
gelegentlich zu Ausfällen (Saleae bricht dann mit Fehlermeldung ab, 
PulseView zeigt fehlerhaftes Mess-Ergebnis an).

> Ich glaub nicht, dass der PC die ganze Arbeit macht.

Dass stimmt aber. Der Logic Analyser tastet die 8 Kanäle einfach in 
regelmäßigen Intervallen ab und streamt sie zum PC. Ganz ähnlich, wie es 
auch Soundkarten tun - nur eben digital statt analog. Wobei es auch 
teurere Modelle mit analogen Eingängen gibt.

> Und wenn der Kollege morgen auf die Idee kommt mal SPI sich
> anzuschaun wirds recht zügig knapp

Wenn das Wörtchen wenn nicht wäre. Soll er auf einen Logic Analyzer 
verzichten, weil dieser eventuell irgendwann mal unzureichend sein 
könnte? Nach der gleichen Logik müsstest du auf dein Auto verzichten.

von M. K. (sylaina)


Lesenswert?

Stefanus F. schrieb:
> M. K. schrieb:
>> Ein LA für 6 Euro würde ich aber nicht allzuviel zutrauen wenn ich ihn
>> nicht selbst gebaut hätte.
>
> Ich habe mir einen für 10€ gekauft (vermutlich das gleiche Modell) und
> empfinde es als eine hilfreiche Bereicherung für meine Bastelecke. Hätte
> ich mir schon viel früher kaufen sollen.

Oh, ich will auch nicht damit sagen, dass das generell Unsinn sei, sich 
so ein Teil zu holen. Man sollte sich nur überlegen, wofür man sich so 
ein Teil holt und hier würde ich schon zu einem Teil greifen, mit dem 
ich mir auch SPI und Co bei Bedarf anschaun kann. Mit 24 MHz Bandbreite 
finde ich das Gerät aber als zu knapp bemessen. Aber wie schon gesagt, 
kommt drauf an wofür man es holt, wofür man es einsetzen will.

von Stefan F. (Gast)


Lesenswert?

Die 24 MHz kann ich nur mit Glück nutzen. Bei 9 von 10 Versuchen bricht 
der Vorgang ab, weil vermutlich der USB Bus hakelt. Wenn ich einen ADUM 
Isolator dazwischen stecke, wird es noch schwieriger.

8 MHz Abtastrate gehen zuverlässig. Für normales SPI ist das tatsächlich 
zu wenig. Wenn ich da etwas analysieren müsste, würde ich die Bitrate 
temporär herabsetzen.

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.