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
Moin, Welcher Compiler frisst Word-Dateien? SCNR WK
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
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.
> 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.
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.
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
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
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).
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
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.
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.
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.
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?
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.
Eines muss ich dir lassen, der Code ist richtig lang. Es geht auch definitiv kürzer.
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.
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. ;-(
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 ;)
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.