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—
.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
...
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
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 verlassenund 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 1geht 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
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.
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
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_WAber was ist das? Da steht das muss in
TWDRund 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_Wrein. 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_Wmit 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_Wals Makro oder Define ist nicht weit her geholt, weil
DATAkann nur das sein. Dann schreibe ich das und kann dann ein Byte senden
Das hat mit dem
HD44780selbst 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, $2beim 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
DATAist 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
;; 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_ACKtrotz 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_Wdie Addresse ist und
DATA,
DATAist 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
ACKBit. 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-BitEntweder 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
ACKBit senden, deswegen, sie kriegen scheinbar auch bei den Daten das wort
Was dieses
ACKbetrifft, 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,
ACKbit 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
F8dann ist das
11111000dann 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, 0xf8und das SL impliziert dass das vom Slave abhängig ist.
Nein, das stimmte nicht! Sie hatten recht
In
TWSRsteht der Status Code
gut zu wissen
UDR - UART DATA REGISTER UBRR - UART BAUD RATE REGISTER UCSRA - UART CONTROL REGISTER A TWDR - TW DATA REGISTERund was ist
TWSR - TW STATUS REGISTERIm gegensatz zur addresse
SLA_Wund
DATA,
SLA_Wist bei mir aber
0x10 $10oder 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 notedich 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
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 0sie 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, $30Interrupts 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 transmittedStatus 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 transmUnd 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
0x18und
0x28, das sind die status Codes ganz einfach. Also die adrresse
0x10, die status codes
0x18und
0x28und 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, r16so 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 ERRORund die baudrate ist nicht gesetzt, also nach der formel
...
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, $30Interrupts 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