Stop dem Suff - alle 7 Jahre, statt dessen erster schüchterner Versuch - i2C - 2024-10-28

Image IMG_4246

Image IMG_4247

Image IMG_4248

Image IMG_4249

Image IMG_4250

ich bin immer noch bei I2C bus. und jetzt warten sie mal, ich habe doch ein reines Text Display - i2c das Problem ist, gucken Sie mal meine beiden Lötgruppen. Ich hab mir grad wieder ne Riesen Sache bei reichelt.de bestellt des wissen Sie und ich hab gerade kein Geld meine LCD sind ja teilweise an gelötet. Bei dem einen hatte ich Kabel verwendet. Das würde ich gern durch Draht ersetzen auf der Streifen Raster Platine aber meine Lötkolben sind beide gerade beide nicht brauchbar. Bei dem einen ist dieses ich weiß nicht wie d.h. was man da draufschraubt, dass die Spitze nicht ausfällt diese Kappe oder was auch immer und bei dem andern ist die Spitze diesmal runtergefallen die war verbogen da hab ich gelötet und inzwischen ist die mehr oder weniger in der Mitte durch geschmolzen dann muss ich ne neue kaufen hab ich Kauf mir wahrscheinlich gleich neuen Lötkolben. Es gibt den gleichen noch mal nur neuer und besser für 30 € und ich kann grad nix löten. Ich würde aber gern das LCD mit dem i2c anschließen und das Gute an der Sache ist, dass er dieses I2C wie sie auf dem Foto sehen. Nicht so ist wie das übliche zum einlösen, sondern dass es mal wieder ein Bus ist und ja natürlich Steckgrundakte und da kann ich ja jetzt ganz einfach ohne irgendwas irgendwas zu löten und das ist sowieso besser weil dann bleibt es LCD auf ewig heil, weil es an löten nein bei mir. Ich mach's immer richtig bei den letzten LCD war auch nicht Pfostensteckleiste dabei die war gleich mit dabei konnte man das nicht falsch einlösen und da wird auch nichts kaputt gehen. Noch besser ist natürlich man lässt es im Urzustand wie man's gekauft hat und hier an diesen Kontakten. Wie man sieht muss man einfach nur diese Ich guck kurz auf reichelt.de, wie diese Kabel heißen, muss man eigentlich auch alles auswendig lernen und ja, wie gesagt, ich bin mit i2c noch nicht soweit ebenso wenig. Ich mein ich kann jetzt mit dem interrupt umgehen auch mit dem Timer interrupt aber ich hab's nicht auswendig gelernt. Und wissen wir nicht auswendig lerne ich gerade hinaus und funktioniert so nicht immer 100 pro deswegen auch machen aber jetzt mache ich's wohl hinaus diesen I2c Bus hier verwenden auf gut Deutsch und ich probier's einfach mal und ich müsste den eigentlich nur anschließen. Ich müsste diesen Bus verwenden der nicht so der eigentlich ganz einfach zu verwenden ist aber auch doch nicht ganz so 100 pro einfach dann müsste ich rein theoretisch die selben Daten rübersenden, wie ich bei den 16 Bit LCD halt rübersenden, das probiere ich heut mal aus, ohne was auswendig gelernt zu haben Steckbrückenkabel heißen die

Mit dem Saufen ist dann jetzt erst mal Schluss. Sie wissen, dass es der der Ablenkung des Feindes dient, und ich lern jetzt mal meine Sachen weiter. Dazu gehören auch die Smartcard und die AVR und ab morgen lerne ich wieder ganz ganz normal auswendig.

https://www.hackster.io/patrick-fitzgerald2/program-attiny13-with-avra-assembler-on-linux-df8ade

Das muss man wissen, weil man muss wissen, das include File für den attiny13 bei dem avra assembler heisst

tn13def.inc

so, dann schreibe ich gleich mal ein programm, ein anderes als da, oder ähnlich, es sieht so aus, als hätte der attiny13. einen PORTB Port. Ausprobieren. Danach gehe ich auf mikrocontroller.net und suche nach einem Beitrag zum Programmieren des I2C Busses

Das hat funktioniert, aber was hier steht

https://www.modellbahn-anlage.de/2013/04/06/programmierung-des-avr-attiny13-mit-stk500/

ATTINY13 – Verbinde PORTE/RST mit PORTB/PB5 und PORTE/XT1 mit PORTB/PB3

Das habe ich auch gemacht. ... Photo ... ist natürlich unpraktisch

und bei avrdude nicht vergessen, attiny13 und nicht atmega8 nehmen

root@work:/home/david# avrdude -c stk500 -p attiny13 -U flash:w:attiny13_20241028.hex -P /dev/ttyS3

Image IMG_4251

Image IMG_4252

Image IMG_4253

Image IMG_4254

Image IMG_4255

Image IMG_4256

Image IMG_4257

Image IMG_4258

.include "tn13def.inc"

ldi r16, 0xff
out DDRB, r16

ldi r16, 0b01010101
out PORTB, r16

end: rjmp end

.include "tn13def.inc"

ldi r16, 0xff
out DDRB, r16

ldi r16, 0b0101010
out PORTB, r16

end: rjmp end

Jetzt geht die LED ein Mal an und ein mal aus, je nachdem welchen Code ich verwende und - auf dem STK 500 sind die LED invertiert.

Wenn sie denken, die Haut arbeitet, das LCD leistet dann lenken Sie sich mal von den lustigen Farben auf dem LCD ab. Die sehen zwar lustig nach Farben aus, aber ich sag mal, wo sie kaufen ja sowieso fertige Bauteile, Sie kaufen auch fertige and Gatter 7408 und da haben sie auch einfach irgendwelche pins, die müssen sie anschließen nur weil das LCD leuchtet und lustige Farben gibt. Sie müssen wissen, dass es am AVR Controller zwei ist, ja Bildschirm letztenendes auch nur an ihrem PC mit. Amd64 trotzdem sie machen den AVR Prozessor, ja, so dass er das richtig anspricht. Und wenn das Bauteil auch noch so schön leuchtet das LCD dann ist halt doch nur ein Bauteil. Ich meinte sie machen ja auch nicht ihre eigenen 7432 und deswegen ich meins macht keinen Unterschied. Das wird halt dann so hergestellt, dass es leuchtet ein Halbleiter und sie machen nicht ihre eigenen Halbleiter. Oder vielleicht einige und ihnen werden es tun, ihre eigenen Halter machen ja

https://github.com/wagiminator/ATtiny13-TinyOLEDdemo

Hier ist sogar sehe ich gerade doch mal ein beispiel eben für attiny und i2c bus wie man das graphische Display OLED mit attiny ansteuert. Sonst steht es ja nur für arduino geschrieben.

Aber jetzt begnügen wir uns mit Text. Ausserdem will ich Assembler, kein C - Vorteil, hier sehe ich welche Pins nutzen. https://raw.githubusercontent.com/wagiminator/ATtiny13-TinyOLEDdemo/main/documentation/TinyOLEDdemo_wiring.png

...

Since the I2C implementation for ATtiny10/13A is software-based, you can of course use any other I/O pins instead.

ich wusste nicht dass der Attiny13 PB0 bis PB5 hat, hätte man ja im Datenblatt nachgucken können, aber dafür war ich eben zu faul.

Sie müssen wissen, was ihre Smartcards betrifft, darum geht es mir gerade nicht, sondern um das LCD mitsamt, I2C Bus besonders und attiny13. Sie haben, VCC und GND, das ist hier auch. Dann haben sie zwei Pins oft Reserverd oder N/C. Und einen für I2C. Das sind schon mal 6. Bleiben 2, eine Karte hat 8 pins. Nun gut, bei diesen AVR sind ja gewissen Pins mit vielen belegungen gleichzeitig, sie tun auch seriell, gleichzeitig an den Selben Pins übertragen, RS232, I2C was auch immer, das hängt ja von den Registern im Prozessor ab

Gut, aber die Pins haben doppelbelegung. Ich habe ausserhalb des STK500, nie einen AVR Programmiert, mit Schaltung kommt noch. Das lerne ich später. Ein Pin den sie sonst anders benutzen, wird dann etwas wie VPP sein und sie können ja einen externen Takt nutzen, dann CLK

Ohne Programmiergerät programmieren, lerne ich später, kommt noch

Was sie nicht können, sie können nicht die Karte nehmen und mit APDU ansprechen und programmieren. APDU ist wie SMTP mehr oder weniger ein Protokoll, über das sie mit der Karte mit dem vorhandenen Betriebssystem da drauf kommunizieren. Dabei gibt ADPU nicht daten preis. Sie können die gespeicherten daten nur solange erreichen, solange sie APDU verwenden, indem sie die richtigen Daten senden

Aber was sie können, vielleicht, die komplette Karte überschreiben und wie eine sonst übliche CPU verwenden. Bedeutet allerdings, die führt ihr Programm aus, Betriebssystem weg und an die Daten kommen sie nicht mehr

das mache ich aber jetzt nicht, sondern ich schliesse mal SCK des Displays an PB2 des Prozessors an und SDA des Displays an PB0 der CPU, sowie VCC und GND des Displays

https://www.mikrocontroller.net/articles/AVR_TWI

...

Image IMG_4259

Image IMG_4260

Image IMG_4261

Image IMG_4262

Image IMG_4263

Jetzt sieht man das normale stimmt schon mal und muss noch mal mal gucken wie der I2C Bus programmieren ist und dann halt wie üblich halt dreimal Dollar drei übertragen und halt dann Daten übertragen ja

Also ich versteh das jetzt vom Prinzip. Also nächste Mal jetzt vom ein Master System ausgibt geht hat nun einen Master 127 Slaves. Jetzt hat man generell erst mal ein Master und bei 127 Slaves hat man 127 Adressen. Ich vermute mal ein Bauteil hat dann ist die erste Adresse eben null 7 Bit kann ich 127 oder 128 Adressen darstellen dazu das muss ich selber nicht wissen weil ich damit nichts zu tun hab. Das wird über den Bus automatisch übertragen, gibt es einen ack Bit und noch eins, wenn die Adressen übertragen wird. Generell werden immer 9 Bitblöcke übertragen und es funktioniert jetzt so.

Zunächst mal ist das ganze passiert aber ich muss die interrupts wohl nicht benutzen . Es geht auch, ohne dass es dann praktisch, wenn ich erwarte, dass das Slave mir viele Daten sendet. Das ist wohl beim LCD eher unwahrscheinlich. Ich muss halt ne Routine schreiben, die mir jeweils ein Byte, so wie sonst auch. Gut wenn ich das hab dann ist es so, dass ich ersten START sende, dann kommt sozusagen die Datenpakete und inzwischen kommt aber noch etwas ein SLA R/W das ist aber wohl jetzt nicht so wichtig, dass du nicht das START dann kommt Datenpakete, und dann kommt ein STOP. So, ich muss mich jetzt aber gar nicht da drum kümmern, dass das irgendwas besonderes ist. Dieses START und STOP weil die bei RS232 gibt es am AVR ein Datenregister da muss ich halt einerseits die Daten reinschreiben aber auch die Adresse zunächst. Ich muss dann wohl immer erst die Adresse senden und dann die Daten und es gibt eben dann dann auch wieder in Baud Rate Register das gibt es ja also bei dem RS 232 ist es ja UBRR einfach für UART Baud rate Register. Nette Form sein, um rein eben irgendwas also rate durch System Takt also durch 16 dieses Mal das eine ja das muss ich jetzt machen und jetzt muss ich diese Unterbrechungen nicht unbedingt verwenden aber das ist kein Problem  ich halte jetzt, hier steht da Code in C. Aber das macht keinen Unterschied, weil ich hab halt die Register, die heißen wie üblich TWCR  solche Sachen da muss ich halt die entsprechenden Witz setzen. Sie steht hier in C aber das ist ja in dem Simmler hier dann auch nicht viel anders. Dann halt mit ldi und sowas anstatt = aber dann ist es ganz einfach bei zu sehen und dann kann ich ja das Fass bei dem LCD überhaupt ist halt immer Datenpaket sind kann ich dir ja genauso machen

;; jetzt ist das Problem, das hier hat er "ubersetzt

.include "m8def.inc"

ldi r16, TWINT | TWSTA | TWEN
out TWCR, r16

Aber das kann der attiny nicht, selbst mit richtigen Include File, also:

das ergab die Übersetzung beim Atmega8

Assembly complete with no errors.
Segment usage:
   Code      :         2 words (4 bytes)
   Data      :         0 bytes
   EEPROM    :         0 bytes
david@work:~$
und beim attiny:
.include "tn13def.inc"

ldi r16, TWINT | TWSTA | TWEN
out TWCR, r16

Übersetzung

i2clcd20241028.asm(3) : Error   : Found no label/variable/constant named TWINT
i2clcd20241028.asm(4) : Error   : Found no label/variable/constant named TWCR
done


Assembly aborted with 2 errors and 0 warnings.
david@work:~$
Gut, dann mache ich den Atmega8 wieder rein

ich würde mal sagen so, wie gesagt, das ist nur ein versuch, auswendig lernen, tue ich es später, dann weiss ich alles 100 pro, wie auch schon vorher, einige Details, sind mir jetzt noch nicht klar

.include "m8def.inc"

ldi r16, TWINT | TWSTA | TWEN
out TWCR, r16

loop1:
ldi r16, (1 << TWINT)
in r17, TWCR
and r16, r17
cpi r16, 0x00
breq loop1

https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/mein-i2c-display-adapter-geht-nicht

Frage, was ist unsere addresse. Ich hätte, wo ich i2c noch nicht kenne gesagt, die addressen gehen bei 0 los und enden bei 127. Hier steht eine etwas erlösende Antwort. Im Quelltext muss ich die nämlich gleich ändern:

In unserem eBook wird als Adresse 0x27 verwendet. Einige Platinen verwenden jedoch die Adresse 0x3F.

Na ja, sagen wir mal so, somit wird jedes LCD zunächst, wenn ich nicht zwei oder mehrere nehme, 0x27 oder 0x3F verwenden

Das ist beruhigend. die muss ich nämlich gleich senden. Wenn es nur zwei Addressen sind, die aus zu probieren sind und ich kenne sie, und vorausgesetzt, der restliche quelltext stimmt, dann wird es maximal einen misserfolg geben, anstatt 127, und das am besten bei wechselnden addressen

https://www.mikrocontroller.net/topic/397974

Hier steht was anderes.

Hier steht was

BA0 - BA2 - Br"ucken auf offen - alle Pins auf H - Adresse ist $DE
BA0 - BA2 - alle Br"ucken geschlossen - alle Pins auf L - Adresse ist $40

Ah ja, das ergibt irgendwie einen Sinn. Es handelt sich ja mal wieder um einen Controller. Das LCD hat einen Controller HD44780 und der I2C Bus auch. Den kenne ich noch nicht, das lerne ich ja gerade. Gut, je nach Baustein vielleicht ein anderer I2C Controller?

Jedenfalls, BA0 bis BA2 - alle offen Pins auf H, das ist DE?

Was bedeutet das? Mit dem display verbunden, wir werden sehen.

datenblatt? Bei reichelt, aber ich sehe auch was

A0, A1, A2 und ein Ding zum drehen, aber in dem Bericht vorher, kann man damit ja die Helligkeit einstellen, ist aber am I2C adapter! Moment! Machen sie ein Ding zum Drehen für die Helligkeit an einen i2C adapter, der am LCD zwar dran ist, aber zum Adapter gehört?

https://cdn-reichelt.de/documents/datenblatt/A300/SBC-LCD20X4-ANLEITUNG2.pdf

Ja, das sagt alles, addresse:

An der Stelle ADDRESS=0x27 m"ussen Sie nun die 27 auf die
Speicheradresse anpassen, den die I2C-Pr"ufung bei Ihnen angezeigt hat.
Danach k"onnen Sie den Editor mit der gewohnten Kombination verlassen
und jetzt passen sie auf - das ist verkorkst, jetzt dachte ich - so einfach wird es nicht gehen, ich könnte die verwenden, jetzt brauche ich eine prüfung, ich dachte erst ich könne die vom PC ausführen
sudo i2cdetect -y 1
geht aber nicht, display nicht am PC. Und jetzt?

Jetzt kann ich gucken die addressen von vorher oder in dem Quellltext, weil die benutzen ja jetzt fertige Bibliotheken für Arduione. Wenn man mikrocontroller.net folgt, ist i2c auch ohne die nicht komplex, vom AVR her, wenn es denn tut aber ich weiss die addresse nicht. Also,

vielleicht hier

https://github.com/wagiminator/ATtiny13-TinyOLEDdemo

ich finde auch das gut http://modelleisenbahn-steuern.de/controller/atmega8/16-6-1-twbr-atmega8.htm

wenn man sich das hier anschaut

http://modelleisenbahn-steuern.de/controller/bilder/mc/beispielcode-twi-atmega8.jpg

habe ich meine übersetzung von C nach Assembler ja schon mal richtig gemacht, das ist ja das gleiche

ich habe die Baudrate nicht gesetzt

ich weiss was ich brauche, so dumm war die idee mit linux nicht, ich brauche einen USB-2-I2C Adapter

https://www.google.com/search?client=firefox-b-e&q=i2c+an+den+pc+anschliessen

Jetzt muss ich mal wieder was kaufen. Das dauert wieder Tage. So dumm war die nicht, mit dem i2cdetect unter linux. Ich dachte nur, weil das auf dem Arduino - ich habe keinen - ausgeführt wird, es würde eben unter dem seinem Linux ausgeführt, stattdessen am PC

Blos, jetzt muss ich das kaufen.

das thema ist nicht besonders langsam gelernt, stimmt schon, macht fun https://www.mikrocontroller.net/attachment/127565/84123_usb_i2c_km-2.pdf

aber ganz so simpel ist eben doch nicht, simpel, aber nicht so trivial.

Scheint aber, ausserhalb interessante anwendungen zu haben, was ich da lass. Zum Beispiel scheinen Nokia Handys so etwas zu benutzen, das wäre ja toll. Dann könnte ich die Displays alter Handys benutzen, immerhin das OLCD verwendet auch i2C. Also das graphische. Dann könnte ich ja die alter Handys benutzen. ...

so, zu sagen, der selbstgebaute photoapparat rückt näher, aber der ist mir nicht so wichtig, eine kamera haben sie ja neulich schon angepriesen. der ist mir nicht wichtig, ich will jetzt hier weiter machen. Und studieren geht über probieren, also schreibe ich mir mal wieder alle daten raus und lerne sie auswendig. Nebenbei bestelle ich mir lötkolben und i2c-2-usb Adapter

Ach so, warten wir mal wenn sie das hier anschauen nicht so schnell diese LCDs und ihre Adapter das sind ja noch mal i2c Adapter fürs LCD die sind noch mal anders die haben nur einen bestimmten Adressbereich. Der stand ja auch überall in den Beschreibungen, dass die meist irgendwie 0X 40 oder 0X 30 irgendwas sind und hier steht ja geschrieben. Das Bild ist von all diesen Adaptern von diesen LCD. Also das sind die i2c Adapter für das lcd und hier steht ja das Bild ist ja eindeutig, dass die eine bestimmte Adresse haben. Also, dass man die hier einstellen kann und ich vermute, dass es dieses Drehrädchen

Image 13900640272336759739

Dieses Bild ja angucken also sie müssen unterscheiden hier kommen ständig die Adressen vor in der Rede

0x20 das scheint der Standard bei diesem LCD i2c Adapter zu sein, aber das scheint auch bei Nokia Handys und so zu sein wenn die ein Adapter haben beim LCD und dann steht hier 0x2e und in der Beschreibung vom Datenblatt steht 0x27 also irgendwie sowas und da steht ja die oberen Pins oder die unteren sind frei d.h. also die LCD I2C Adapter, die sind dann alle irgendwie so und jetzt vermute ich mal jetzt muss ich mal zählen. Wie viele Einstellung gibt es an diesem Rädchen und wenn es da entsprechend viele Einstellung gibt, dass das entsprechend acht sind weil wir haben ja jetzt hier drei Bits ba2, ba1, ba0 dann erscheint es ja logisch, wenn es acht Einstellung sind, dass das entsprechend die Bit sind, gesetzt oder nicht gesetzt und jetzt ist da noch was jetzt ist unter diesem Rädchen und spricht dafür drei Pins, die gelassen sich jetzt nicht voll löten, die sind frei sind nicht gut verletzbar aber das sieht man drei Kontakte da unten das sieht man auf dem Foto a0 a1 a2 und wenn man jetzt genau hinschaut, dann wird es diesen BA zwei und so weiter entsprechen und das die sind ja genau unter dem Rädchen. Also ich würde sagen, wenn es acht Einstellungen sind, dann ist das Problem jetzt gelöst.

Image IMG_4264

Wenn man das eingerandete anguckt, dann das automatisch die Adresse das ergibt auch das gelästert auf dem Beitrag von Mikrocontroller nicht weil da lästern die eine die ganze Zeit über den anderen. Guck mal du hast es da oben und du hast es da unten da lästern die über den, dass du so Fragen stellen und es erklärt das allesweil je nachdem wie das da oben eingestellt ist jetzt geben acht die drei Pins zwar weniger Adressen ab, aber bei diesen L CDs bei dem I2C für diese LCD ist der untere Teil oder jedem als der Oberteil nicht der Unterteil fest in der Adresse jedenfalls bei den LCD jedenfalls bei dem Adapter das ist ja der Adapter und der obere wird eingestellt aber es gibt halt 8 Bit das sind ja aber mehr halt irgendwie nur bestimmte Adressen. Man sieht ja hier 0100 und dann 0111 und dann 1011

Image IMG_4265

Image 13900640272336759739

Image IMG_4266

Image IMG_4267

Jetzt ist es verrückt sie müssen mal ganz genau hinschauen das Rädchen ist analog d.h. das dreht sich nicht ein rast send pro Position. Jetzt können wir mal sagen das ist ja ein Beschiss und jetzt zählen Sie mal die Einkehr die da drauf sind. Das sind etwa zehn und nicht acht oder sogar elf. Aber warten Sie ich hab ne Überraschung für Sie parat.

Gucken Sie mal, gucken Sie mal außerdem Rädchen mit dem also mit dieser Kreuzfahrt, damit sie da den Schraubenzieher rein stopfen können, sehen Sie die Markierung auf dem blauen die Einkehr und sie sehen aber noch ein Punkt auf dem Drehknopf, selber diesen kleine Einkehr und da und das ist der Zeiger Und wenn sie jetzt den Zeiger ganz nach links drehen, also auf die erste Position jetzt passiert nämlich das mit den acht das sind ja elf Eintragungen dann sehen Sie der Zeiger der lässt sich nämlich jetzt nicht weiter das letzte Bild also sie müssen das vierte Bild angucken Sie müssen das vierte Bild angucken der lässt sich nicht weiter als bis zur zweiten Position würde ich mal sagen drehen und er lässt sich auch nicht ganz zum Schluss drehen also eine Position bleibt offen und das erklärt alles und ich würde erst sagen dass das bedeutet, das genau des unseren Positionen entspricht weil er lässt sich nicht ganz zu Ende drehen und er lässt sich vor allem nicht zum Anfang drehen und da ist dieser einkerbung,. Sie müssen genau genau hingucken und ich würde sagen jetzt ist er auf Position null also haben wir unsere Adresse dann kann ich jetzt weiter programmieren. Ich probier es mit. Dieser Adresse ist nicht besonders kompliziert mit dem Quelltext. Der Quelltext ist nicht kompliziert. Ich probier's mit dieser Adresse.

SLA_W
Aber was ist das? Da steht das muss in
TWDR
und das ist wie bei RS232,
UDR
- UART Data Register, das Datenregiter von TWI, TWI ist I2C, Two Wire Interface, ist I2C, aber ursprünglich Philips I2C und jetzt TWI, aber -
TWDR
- demnach wie
UDR
- halt beim AVR, das Datenregister

Da muss die Addresse rein, wie die Daten, die wird ja wie Daten übertragen. Aber da kommt jetzt

SLA_W
rein. Nur was ist das? Ein Define?

ich wusste es:

i2clcd20241028b.asm(13) : Error   : Found no label/variable/constant named SLA_W
done

Assembly aborted with 1 errors and 0 warnings.
david@work:~$
Es ist ein define
.include "m8def.inc"

ldi r16, TWINT | TWSTA | TWEN
out TWCR, r16

loop1:
ldi r16, (1 << TWINT)
in r17, TWCR
and r16, r17
cpi r16, 0x00
breq loop1

ldi r16, SLA_W

Ergebnis:

i2clcd20241028b.asm(13) : Error   : Found no label/variable/constant named SLA_W
done


Assembly aborted with 1 errors and 0 warnings.
david@work:~$
Es ist ein define

Das heisst, damit definieren wir mit

SLA_W
mit define unsere Addresse und da muss ich die nehmen, nämlich in meinem Falle
$10

jetzt mein Quelltext stimmte so weit, jetzt nehme ich deren, einfach deren und da sehe ich auch

DATA
- man sieht die Idee mit dem
SLA_W
als Makro oder Define ist nicht weit her geholt, weil
DATA
kann nur das sein. Dann schreibe ich das und kann dann ein Byte senden

Das hat mit dem

HD44780
selbst nichts zu tun. Das hat trotz der 16 Bit nichts anderes, als die üblichen Befehle, trotz dem I2C Adapter, kommt ja das gleiche an. Und das heisst, ich muss das senden, was bisher

Und der Witz: Der Quelltext, ich meine ich kann den fast auswendig zur ansteuerung des LCD

HD 44780
, vom mikrocontroller.net mit
$3, $3, $3, $2
beim einschalten, der benutzt für Befehle und für Daten ja jeweils eine Routine zur Übertragung eines Bytes. nichts anders

Und dann zu

DATA
. Das
DATA
ist ja jetzt ein Define und dazu konstant. Hier muss ich wo ein Byte sonst an das LCD übertragen wird, einfach ein Register nehmen, was die Routine für das LCD nimmt, um das Byte zu übertragen

Nur die baudrate ist noch nicht eingestellt, aber die ist sicher ähnlich ein zu stellen, wie in

UBRR

Uart Baud Rate Register

TWBRR?

Falsch,

TWBR

Image beispielcode-twi-atmega8

;; das war zum Beispiel falsch, wie man sich h"atte denken k"onnen, so sieht es immer aus

ldi r16, (1 << TWINT) | (1<<TWSTA) | (1<<TWEN)
https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-9223-Automotive-Microcontrollers-ATmega48PA-ATmega88PA-ATmega168PA_Datasheet.pdf Hier sieht man kann sich das abitippen ersparen und erklärt, warum das ein Bild ist, das stammt vom Datenblatt des Atmega8. Da kann man es besser raus nehmen

Das erklärt warum das ein Bild ist, sie haben das PDF genommen, das data sheet und von pdf in ein jpeg verwandelt

ich vermute, das hier ist die addresse von dem Slave

MT_SLA_ACK

vermute ich, also, vermute ich, doppelte definition.Die frage stellen viele im Netz, übrigens der Code steht im datenblatt - datasheet vom Atmega8, von Atmel, den hat kein anderer geschrieben.

Und ich vermute, dass

MT_SLA_ACK
, genauso wie
MT_DATA_ACK
trotz des Acknowledge die Addresse des Slaves ist, deswegen definition und eine doppeldefinition, also ist ist alles das gleiche

SLA_W
... zur Übersichtlichkeit wohl mehrere Namen und - da stehen Kommentare, wer die Definitionen so genannt hat, da müssen bei den Definitionen nachgucken. Das ist unsinn

Das steht für die addresse und die ist nicht fest. Sonst machen addressen keinen Sinn. Anderes Beispiel DATA. Das kann nicht fest sein, sonst würden sie, immer dasselbe senden. Dann macht das einen sinn.

https://www.mikrocontroller.net/topic/419303

stimmt wohl an der Stelle nicht, dass das die addresse ist, stimmt nicht. dass

SLA_W
die Addresse ist und
DATA
,
DATA
ist klar

Wie gesagt, ich muss das I2C auch erst auswendig lernen, ich kann das nicht auswendig. Ich kann es nicht auswendig. Das wissen sie, ich muss erst auswendig lernen

Sie senden ja, wenn man es gelernt hätte ein

ACK
Bit. Und so weit ich weiss steht da ja -

Irgendetwas so etwas

    SLA +R --> Adresspaket mit einer Slave-Adresse und einem Lese-Bit
    SLA +W --> Adresspaket mit einer Slave-Adresse und einem Schreib-Bit
Entweder sie können das Bit einstellen, was übertragung genutzt wird, positive negative Logik

Oder sie übertragen 9 bit, dann ist es doch die addresse, das ist wahrscheinlich gar nicht falsch. Nebenbei wenn man nachdenkt hat man ja viele Slaves, und es könnte ja einer, der nicht gemeint ist, ein

ACK
Bit senden, deswegen, sie kriegen scheinbar auch bei den Daten das wort

Was dieses

ACK
betrifft, deswegen kein festes Bit. Verstehen sie

Selbst, wenn hier für

DATA
, eine Definition genommen ist, könntensie für 0 und 1 eine nehmen

Aber, es ist wohl doch die Addresse, ich habe mich wohl nicht geirrt. Weil sie übertragen ja, das ist ja wichtig,

 ACK
bit zusammen mit Addresse, das kommt ja raus das ist extrem wichtig

Ich meine für 0 und 1 machen sie keine Definition. Wohl für die Addresse die hier eine Definition ist.

Ich vermute, ich hatte recht es ist die Adresse plus dem ack in nak Bit, das macht sonst keinen Sinn für die Definition oder Marco. Warum kommt die Adresse nicht in Register rein? Ja darum geht's ja die ganze Zeit also Data in der Definition zu machen. Das ist albern. Senden Sie mir das gleiche gut aber sie machen die Adresse deswegen in der Definition also jetzt vom Beispiel her, weil das ist ja bei diesem atmega8 funktionieren acht funktionierendes Beispiel in dem in dem Datenblatt, aber sie haben jetzt hier nicht gleichen Beispiel mit 127 Adressen und selbst das ist unwahrscheinlich weil sie werden wahrscheinlich immer nur einen einzigen Baustein ansprechen, wenn sie mal so von der Seite her sehen wenn sie sie es jetzt mal normal praktisch sehen, denn es widerspricht ja nichts, die Adresse in Definition rein zu packen und das andere ist es wohl zu diesem acknowlege eben die Adresse dazugehört

wenn man das anguckt

F8
dann ist das
11111000
dann vermute ich, ist das der obere Teil der Addresse oder so, geht ja nicht anders. Und ein Bit es nicht, sonst machen sie ja nicht
andi r16, 0xf8
und das SL impliziert dass das vom Slave abhängig ist.

Nein, das stimmte nicht! Sie hatten recht

In

 TWSR
steht der Status Code

gut zu wissen

UDR - UART DATA REGISTER
UBRR - UART BAUD RATE REGISTER
UCSRA - UART CONTROL REGISTER A
TWDR - TW DATA REGISTER
und was ist
TWSR - TW STATUS REGISTER
Im gegensatz zur addresse

SLA_W
und
DATA
,
SLA_W
ist bei mir aber
0x10 $10
oder wie auch immer, darauf schwöre, ich schwöre meine Addresse ist
0x10
, ist das - ein Status Code, den ich hier irgendwo finden muss, der tatsächlich definiert ist.

steht im Datenblatt, deswegen 5 Bit

• Bits 7..3 – TWS: TWI Status
These 5 bits reflect the status of the TWI logic and the Two-wire Serial Bus. The different status
codes are described later in this section. Note that the value read from TWSR contains both the
5-bit status value and the 2-bit prescaler value. The application designer should mask the pres-
caler bits to zero when checking the Status bits. This makes status checking independent of
prescaler setting. This approach is used in this datasheet, unless otherwise noted
ich habe es
Status Code
(TWSR)
Prescaler Bits
are 0
Status of the Two-wire Serial
Bus and Two-wire Serial Inter-
face Hardware
Application Software Response
Next Action Taken by TWI Hardware
To/from TWDR To TWCR
STA STO TWINT TWEA
0x08 A START condition has been
transmitted
Load SLA+W 0 0 1 X SLA+W will be transmitted;
ACK or NOT ACK will be received
0x10 A repeated START condition
has been transmitted
Load SLA+W or
Load SLA+R
0
0
0
0
1
1
X
X
SLA+W will be transmitted;
ACK or NOT ACK will be received
SLA+R will be transmitted;
Logic will switch to Master Receiver mode
0x18 SLA+W has been transmitted;
ACK has been received
Load data byte or
No TWDR action or
No TWDR action or
No TWDR action
0
1
0
1
0
0
1
1
1
1
1
1
X
X
X
X
Data byte will be transmitted and ACK or NOT ACK will
be received
Repeated START will be transmitted
STOP condition will be transmitted and
TWSTO Flag will be reset
STOP condition followed by a START condition will be
transmitted and TWSTO Flag will be reset
0x20 SLA+W has been transmitted;
NOT ACK has been received
Load data byte or
No TWDR action or
No TWDR action or
No TWDR action
0
1
0
1
0
0
1
1
1
1
1
1
X
X
X
X
Data byte will be transmitted and ACK or NOT ACK will
be received
Repeated START will be transmitted
STOP condition will be transmitted and
TWSTO Flag will be reset
STOP condition followed by a START condition will be
transmitted and TWSTO Flag will be reset
0x28 Data byte has been transmitted;
ACK has been received
Load data byte or
No TWDR action or
No TWDR action or
No TWDR action
0
1
0
1
0
0
1
1
1
1
1
1
X
X
X
X
Data byte will be transmitted and ACK or NOT ACK will
be received
Repeated START will be transmitted
STOP condition will be transmitted and
TWSTO Flag will be reset
STOP condition followed by a START condition will be
transmitted and TWSTO Flag will be reset
0x30 Data byte has been transmitted;
NOT ACK has been received
Load data byte or
No TWDR action or
No TWDR action or
No TWDR action
0
1
0
1
0
0
1
1
1
1
1
1
X
X
X
X
Data byte will be transmitted and ACK or NOT ACK will
be received
Repeated START will be transmitted
STOP condition will be transmitted and
TWSTO Flag will be reset
STOP condition followed by a START condition will be
transmitted and TWSTO Flag will be reset
0x38 Arbitration lost in SLA+W or data
bytes
No TWDR action or
No TWDR action
0
1
0
0
1
1
X
X
Two-wire Serial Bus will be released and not addressed
Slave mode entered
A START co
Image ATMEGA8xxx.pdf-174

Image Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_datasheet-173

ich habe es

Status Code
(TWSR)
Prescaler Bits
are 0
Status of the Two-wire Serial
Bus and Two-wire Serial Inter-
face Hardware
Application Software Response
Next Action Taken by TWI Hardware
To/from TWDR To TWCR
STA STO TWINT TWEA
0x08 A START condition has been
transmitted
Load SLA+W 0 0 1 X SLA+W will be transmitted;
ACK or NOT ACK will be received
0x10 A repeated START condition
has been transmitted
Load SLA+W or
Load SLA+R
0
0
0
0
1
1
X
X
SLA+W will be transmitted;
ACK or NOT ACK will be received
SLA+R will be transmitted;
Logic will switch to Master Receiver mode
0x18 SLA+W has been transmitted;
ACK has been received
Load data byte or
No TWDR action or
No TWDR action or
No TWDR action
0
1
0
1
0
0
1
1
1
1
1
1
X
X
X
X
Data byte will be transmitted and ACK or NOT ACK will
be received
Repeated START will be transmitted
STOP condition will be transmitted and
TWSTO Flag will be reset
STOP condition followed by a START condition will be
transmitted and TWSTO Flag will be reset
0x20 SLA+W has been transmitted;
NOT ACK has been received
Load data byte or
No TWDR action or
No TWDR action or
No TWDR action
0
1
0
1
0
0
1
1
1
1
1
1
X
X
X
X
Data byte will be transmitted and ACK or NOT ACK will
be received
Repeated START will be transmitted
STOP condition will be transmitted and
TWSTO Flag will be reset
STOP condition followed by a START condition will be
transmitted and TWSTO Flag will be reset
0x28 Data byte has been transmitted;
ACK has been received
Load data byte or
No TWDR action or
No TWDR action or
No TWDR action
0
1
0
1
0
0
1
1
1
1
1
1
X
X
X
X
Data byte will be transmitted and ACK or NOT ACK will
be received
Repeated START will be transmitted
STOP condition will be transmitted and
TWSTO Flag will be reset
STOP condition followed by a START condition will be
transmitted and TWSTO Flag will be reset
0x30 Data byte has been transmitted;
NOT ACK has been received
Load data byte or
No TWDR action or
No TWDR action or
No TWDR action
0
1
0
sie werden sehen, wenn ich das richtig auswendig lerne und - wenn ich 2 Atmega8 miteinander kommunizieren lasse, geht es bald. Aber das Ziel - ich möchte es halt ernsthaft wissen und nicht etwas schreiben. Und zwar alles. Ich tue das jetzt auf meine Homepage

ich muss mehr bisheriges auf meine Homepage (1.) dann muss ich üben Interrupts - RS232/UART - Timer - LCD

Das sind die standard Sources Codes zum üben. Bei mir aktuell. aber sie wissen, ich lege wert auf übung. Und indem man etwas übt, was neu ist und meint etwas zu wissen verdrängt man gerne altes

Wo waren wir stehen geblieben - ich schreibe trotz allem meine Standardprogramme - dazu gehören

LED's Blinken lassen - ein Mal zählen, mit Zählschleife LED's blinken lassen, ein mal wandern Das alles mit Zählschleife auf dem LCD etwas ausgeben - ist auch eine gute Idee für eine Übung, ich kenne ja -

$3, $3, $3, $30
Interrupts RS-232/UART Timer

Sie wissen, ich mache jeden Tag meine Bash Übungen. dabei könnte einer sagen, die sind allerdings schon ein bisschen alt. Aber sie wissen, erstens waren gerade Chaos Tage und ich fange wieder so an zu üben und auswendig zu lernen, wie zuvor. Ich lerne heute wieder auswendig

Und ich mache jeden tag die Übungen - und sie kenne meine Bash Programme - und ich übe sie noch immer. Sie waren mal anfänger. Na ja ich sage so - irgendwann wird alles alt

Aber sehen sie, ich bin nicht irgendein Schreiber, dem es gelungen ist, ein LCD an zu steuern, das ist mir seit langem sehr gut gelungen.

Ich war auf dem technischem Gymnasium - 3 Jahre, Informationstechnik und - ich habe Computersysteme I/II bestanden, impertive Programmierung - sie fragen wie? Na ja, an der Uni ist das so - wem was gelungen ist, der hat die Uni noch nicht. Sie müssen das halt üben, das ist der Unterschied

Und wenn sie meinen, das sei alt.

Ich fange gleich an, jeden tag dieselbe übung

1
0
0
1
1
1
1
1
1
X
X
X
X
Data byte will be transmitted and ACK or NOT ACK will
be received
Repeated START will be transmitted
STOP condition will be transmitted and
TWSTO Flag will be reset
STOP condition followed by a START condition will be
transmitted and TWSTO Flag will be reset
0x38 Arbitration lost in SLA+W or data
bytes
No TWDR action or
No TWDR action
0
1
0
0
1
1
X
X
Two-wire Serial Bus will be released and not addressed
Slave mode entered
A START co

Da steht beim ersten

Wait for TWINT Flag set. This
 indicates that the SLA+W has been
transmitted, and ACK/NACK has

Und im Status ist das

0x10
 A repeated START condition
 Load SLA+W or
 0
 0
 1
has been transmitted
Status Code 10 ganz einfach

Beim zweiten steht

 Check value of TWI Status
andi r16, 0xF8
 MT_DATA_ACK)
 Register. Mask prescaler bits. If
ERROR();
 status different from
cpi
 r16, MT_DATA_ACK
MT_DATA_ACK go to ERROR
brne ERROR

Wait for TWINT Flag set. This
in
 r16,TWCR
 ;
 indicates that the DATA has been
transmitted, and ACK/NACK has
sbrs r16,TWINT
been received.

0x28
0x30
0x38
SLA+W has been transmitted;
ACK has been received
Load data byte or
No TWDR action or
No TWDR action or
No TWDR action
SLA+W has been transmitted;
NOT ACK has been received
Load data byte or
No TWDR action or
No TWDR action or
No TWDR action
Data byte has been transm
Und das ist Code

Entschuldigen Sie mal, die haben da reingeschrieben in den Definition steht, wird der Auto irgendwas gesagt haben und benutzen nicht mal den Code vom assembler aus dem Datenplatz, sondern benutzen irgendwelche komischen Funktionen. Das ist Punkt Nummer eins und Punkt Nummer zwei, die gute Dame da unten kann ihren Mund halten. Ich glaub bei der tickt irgendwas anderes nicht ganz richtig. also, die status codes sind ein mal

0x18
und
0x28
, das sind die status Codes ganz einfach. Also die adrresse
0x10
, die status codes
0x18
und
0x28
und entsprechend daten nicht 10 sondern, sondern 18, weil das ist nicht start condition sondern
SLA+W...
;; so muss der Code gehen, und jetzt muss ich nur noch mit dem LCD verbinden

.include "m8def.inc"

.equ MT_SLA_ACK = 0x18
.equ MT_DATA_ACK = 0x28
.equ SLA_W = 0x10

ldi r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
out TWCR, r16

wait1:
in r16,TWCR
sbrs r16,TWINT
rjmp wait1

in r16,TWSR
andi r16, 0xF8
cpi r16, START
brne ERROR

ldi r16, SLA_W
out TWDR, r16
ldi r16, (1<<TWINT) |(1<<TWEN)
out TWCR, r16

wait2:
in r16,TWCR
sbrs r16,TWINT
rjmp wait2

in r16,TWSR
andi r16, 0xF8
cpi r16, MT_SLA_ACK
brne ERROR

ldi r16, DATA
out TWDR, r16
ldi r16, (1<<TWINT) | (1<<TWEN)
out TWCR, r16

wait3:
in r16,TWCR
sbrs r16,TWINT
rjmp wait3

in r16,TWSR
andi r16, 0xF8
cpi r16, MT_DATA_ACK
brne ERROR

ldi r16,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
out TWCR, r16
so sieht jetzt mein code aus, es tut noch nicht, wie zu erwarten war und ich vermute besonders eines. Die Enable Leitung muss ein Mal auf 1 gesetzt werden, dann zwar mindestens 3 Takte warten, aber ich vermute hier entsteht schon ein Fehler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                 LCD-Routinen                ;;
;;                 ============                ;;
;;              (c)andreas-s@web.de            ;;
;;                                             ;;
;; 4bit-Interface                              ;;
;; DB4-DB7:       PD0-PD3                      ;;
;; RS:            PD4                          ;;
;; E:             PD5                          ;;
;;                                             ;;
;; Takt:          4 MHz                        ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 ;sendet ein Datenbyte an das LCD
lcd_data:
           mov temp2, temp1             ; "Sicherungskopie" f"ur
                                        ; die "Ubertragung des 2. Nibbles
           swap temp1                   ; Vertauschen
           andi temp1, 0b00001111       ; oberes Nibble auf Null setzen
           sbr temp1, 1<<4              ; entspricht 0b00010000 (Anm. 1)
           push temp1
           rcall i2cout             ; ausgeben
           rcall lcd_enable             ; Enable-Routine aufrufen
                                        ; 2. Nibble, kein swap, da es schon
                                        ; an der richtigen Stelle ist
           andi temp2, 0b00001111       ; obere H"alfte auf Null setzen
           sbr temp2, 1<<4              ; entspricht 0b00010000
           push temp2
           rcall i2cout             ; ausgeben
           rcall lcd_enable             ; Enable-Routine aufrufen
           rcall delay50us              ; Delay-Routine aufrufen
           ret                          ; zur"uck zum Hauptprogramm

 ; sendet einen Befehl an das LCD
lcd_command:                            ; wie lcd_data, nur RS=0
           mov temp2, temp1
           swap temp1
           andi temp1, 0b00001111
           push temp1
           rcall i2cout
           rcall lcd_enable
           andi temp2, 0b00001111
           push temp2
           rcall i2cout
           rcall lcd_enable
           rcall delay50us
           ret

 ; erzeugt den Enable-Puls
 ;
 ; Bei h"oherem Takt (>= 8 MHz) kann es notwendig sein,
 ; vor dem Enable High 1-2 Wartetakte (nop) einzuf"ugen.
 ; Siehe dazu https://www.mikrocontroller.net/topic/81974#685882
lcd_enable:
           ldi r16, 0b00010000
           push r16
           rcall i2cout
           ldi r16, 0b00000000
           push r16
           rcall i2cout
           ret                          ; Und wieder zur"uck

 ; Pause nach jeder "Ubertragung
delay50us:                              ; 50µs Pause (bei 4 MHz)
           ldi  temp1, $42
delay50us_:dec  temp1
           brne delay50us_
           ret                          ; wieder zur"uck

 ; L"angere Pause f"ur manche Befehle
delay5ms:                               ; 5ms Pause (bei 4 MHz)
           ldi  temp1, $21
WGLOOP0:   ldi  temp2, $C9
WGLOOP1:   dec  temp2
           brne WGLOOP1
           dec  temp1
           brne WGLOOP0
           ret                          ; wieder zur"uck

 ; Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
lcd_init:
           ldi  temp3,50
powerupwait:
           rcall  delay5ms
           dec  temp3
           brne powerupwait
           ldi temp1, 0b00000011        ; muss 3mal hintereinander gesendet
           push temp1
           rcall i2cout
           rcall lcd_enable             ; 1
           rcall delay5ms
           rcall lcd_enable             ; 2
           rcall delay5ms
           rcall lcd_enable             ; und 3!
           rcall delay5ms
           ldi temp1, 0b00000010        ; 4bit-Modus einstellen
           push temp1
           rcall i2cout
           rcall lcd_enable
           rcall delay5ms
           ldi temp1, 0b00101111        ; 4Bit / 2 Zeilen / 5x8
           rcall lcd_command
           ldi temp1, 0b00001101        ; Display ein / Cursor aus / kein Blinken
           rcall lcd_command
           ldi temp1, 0b00000110        ; Cursor inkrementieren / kein Scrollen
           rcall lcd_command
           ret

 ; Sendet den Befehl zur L"oschung des Displays
lcd_clear:
           ldi temp1, 0b00000001   ; Display l"oschen
           rcall lcd_command
           rcall delay5ms
           ret

 ; Sendet den Befehl: Cursor Home
lcd_home:
           ldi temp1, 0b00000010   ; Cursor Home
           rcall lcd_command
           rcall delay5ms
           ret

i2cout:
pop r19
push temp1
push temp2
push temp3
.equ MT_SLA_ACK = 0x18
.equ MT_DATA_ACK = 0x28
.equ SLA_W = 0x10
.equ START = 0x08

ldi r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
out TWCR, r16

wait1:
in r16,TWCR
sbrs r16,TWINT
rjmp wait1

in r16,TWSR
andi r16, 0xF8
cpi r16, START
brne ERROR

ldi r16, SLA_W
out TWDR, r16
ldi r16, (1<<TWINT) |(1<<TWEN)
out TWCR, r16

wait2:
in r16,TWCR
sbrs r16,TWINT
rjmp wait2

in r16,TWSR
andi r16, 0xF8
cpi r16, MT_SLA_ACK
brne ERROR

mov r16, r19
out TWDR, r16
ldi r16, (1<<TWINT) | (1<<TWEN)
out TWCR, r16

wait3:
in r16,TWCR
sbrs r16,TWINT
rjmp wait3

in r16,TWSR
andi r16, 0xF8
cpi r16, MT_DATA_ACK
brne ERROR

ldi r16,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
out TWCR, r16
pop temp3
pop temp2
pop temp1
ret

ERROR: rjmp ERROR
und die baudrate ist nicht gesetzt, also nach der formel

https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ApplicationNotes/ApplicationNotes/doc1981.pdf

...

also, ich habe es mit c mit quellen von github probiert, da ging auch nichts

#include "i2c_master.h"
#include "liquid_crystal_i2c.h"

int main (void) {
LiquidCrystalDevice_t device = lq_init(0xD7, 20, 4, LCD_5x8DOTS); // intialize 4-lines display

lq_turnOnBacklight(&device); // simply turning on the backlight

lq_print(&device, "Hello world!");
lq_setCursor(&device, 1, 0); // moving cursor to the next line
lq_print(&device, "How are you?");
}

david@work:~/liquid_crystal_i2c_avr-master2$ avr-gcc -mmcu=atmega8 -Wall -Os -o lcd01_i2c_20241029.elf lcd01_i2c_20241029.c i2c_master.c liquid_crystal_i2c.c
david@work:~/liquid_crystal_i2c_avr-master2$ avr-objcopy -O ihex -R .eeprom lcd01_i2c_20241029.elf lcd01_i2c_20241029.hex
david@work:~/liquid_crystal_i2c_avr-master2$
übersetzen liess sich der code, mit einem auskommentieren, das ist das gute

befriedigend ist die antwort so oder so nicht, weil das sind die C Routinen, auch, wenn man was beim Studium für Assembler davon lernen kann, aber ich sage: Unabhängig davon, ob das jetzt tut oder nicht, ich lerne lieber alles, auch, wenn es nicht tut, weil, ich lege wert darauf es nicht nur richtig verstanden zu haben, sondern korrekt

ich meine so akut ist es bei mir mit der Notwendigkeit der sofortigen Antwort von i2c noch nicht

rs232 tut schon mal, das ist befriedigend, ... ansonsten hilft mir i2c so oder so nichts, wenn ich es nicht 100 Auf der anderen seite, bevor ich i2c gleich mit dem lcd kommunizieren lasse, es wäre sinnvoll, auch, was die addressen betrifft, vielleicht kann man einen Atmega8 ja zum Slave machen, dann wäre es sinnvoll zwei atmega8 über i2c kommunizieren zu lassen, ohne LCD - und das korrekte Ergebnis über LED's ab zu fragen, damit man sieht, die verwendung von i2c in Assembler alleine funktioniert korrekt

sie werden sehen, wenn ich das richtig auswendig lerne und - wenn ich 2 Atmega8 miteinander kommunizieren lasse, geht es bald. Aber das Ziel - ich möchte es halt ernsthaft wissen und nicht etwas schreiben. Und zwar alles. Ich tue das jetzt auf meine Homepage

ich muss mehr bisheriges auf meine Homepage (1.) dann muss ich üben Interrupts - RS232/UART - Timer - LCD

Das sind die standard Sources Codes zum üben. Bei mir aktuell. aber sie wissen, ich lege wert auf übung. Und indem man etwas übt, was neu ist und meint etwas zu wissen verdrängt man gerne altes

Wo waren wir stehen geblieben - ich schreibe trotz allem meine Standardprogramme - dazu gehören

LED's Blinken lassen - ein Mal zählen, mit Zählschleife LED's blinken lassen, ein mal wandern Das alles mit Zählschleife auf dem LCD etwas ausgeben - ist auch eine gute Idee für eine Übung, ich kenne ja -

$3, $3, $3, $30
Interrupts RS-232/UART Timer

Sie wissen, ich mache jeden Tag meine Bash Übungen. dabei könnte einer sagen, die sind allerdings schon ein bisschen alt. Aber sie wissen, erstens waren gerade Chaos Tage und ich fange wieder so an zu üben und auswendig zu lernen, wie zuvor. Ich lerne heute wieder auswendig

Und ich mache jeden tag die Übungen - und sie kenne meine Bash Programme - und ich übe sie noch immer. Sie waren mal anfänger. Na ja ich sage so - irgendwann wird alles alt

Aber sehen sie, ich bin nicht irgendein Schreiber, dem es gelungen ist, ein LCD an zu steuern, das ist mir seit langem sehr gut gelungen.

Ich war auf dem technischem Gymnasium - 3 Jahre, Informationstechnik und - ich habe Computersysteme I/II bestanden, impertive Programmierung - sie fragen wie? Na ja, an der Uni ist das so - wem was gelungen ist, der hat die Uni noch nicht. Sie müssen das halt üben, das ist der Unterschied

Und wenn sie meinen, das sei alt.

Ich fange gleich an, jeden tag dieselbe übung