Forum: Mikrocontroller und Digitale Elektronik LCD an ATmega644 (später ATmega8) mittels TWI/I2C (Anfängergerecht)


von Stefan S. (atmega644)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

mein Problem dürfte sicherlich nicht wenigen bekannt sein.
Leider blicke ich aber als "frischer" Mikrocontroller-Programmierer noch 
nicht ganz dahinter.

Zum Hintergrund:
Ich bin in einer Technikerschule und brauche für mein Abschlussprojekt 
unbedingt eure Hilfe in einem Thema, dass viele sicher in- und auswendig 
kennen. Die Zeit drückt und bekanntlich klappt nichts auf Anhieb.


Hardware:
-ATmega644 (soll nach erfolgreichem Ansteuern des LCDs über TWI durch 
ATmega8 ersetzt werden)

-folgender Umsetzer fürs LCD:
http://www.ebay.de/itm/221717504003?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT 
(PCF8574)

-folgendes LCD-Modul:
http://www.ebay.de/itm/111536130896?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT


Situation:
Derzeit realisiere ich ein L-Meter (Induktionsmessung über 
Schwingkreisverstimmung) mittels einem ATmega644 und gebe diverse Texte 
und natürlich den Messwert über ein LCD aus (direkt angeschlossen an den 
µC).


Problem:
Da ich auf einen ATmega8 umsteigen muss und mir somit natürlich Pins 
verloren gehen benötige ich eine Möglichkeit die Pins die ich für das 
LCD benötige zu verschlanken. Hier kam mir eben genau die Idee des 
TWI/I2C (besteht da überhaupt ein Unterschied?). Wie ihr seht habe ich 
noch keine Erfahrung mit diesem Bus und brauche deswegen Hilfe.


Wie realisiere ich nun die Ansteuerung des LCD über TWI? Ich weiß das 
ich für den Master als auch den Slave Adressen vergeben muss und habe 
bereits einige Threads hier im Forum gelesen. Leider muss ich sagen das 
vieles nicht gerade Anfängergerecht ist sondern schon Kenntnisse in 
dieser Materie voraussetzen (zumindest erscheint es mir so). Könnte 
jemand mir anhand meines Codes den ich beigefügt habe behilflich sein 
diese Ansteuerung zu realisieren?
Sollte ich weitere Informationen liefern müssen bitte nicht zögern mich 
das wissen zu lassen - ich bin dankbar für jede Hilfe.


Vielen Dank!


Gruß

atmega644

von Falk B. (falk)


Lesenswert?

@ Stefan S. (atmega644)

>kennen. Die Zeit drückt und bekanntlich klappt nichts auf Anhieb.

;-)

>-folgender Umsetzer fürs LCD:
>Ebay-Artikel Nr. 221717504003
>(PCF8574)

Bekannt.

>-folgendes LCD-Modul:
>>Ebay-Artikel Nr. 111536130896

Dito.

>Wie realisiere ich nun die Ansteuerung des LCD über TWI?

Man muss den parallelen Datentransfer über die IOs dann über I2C machen. 
Der Rest bleibt gleich.

>dieser Materie voraussetzen (zumindest erscheint es mir so). Könnte
>jemand mir anhand meines Codes den ich beigefügt habe behilflich sein
>diese Ansteuerung zu realisieren?

Das ist ein Aufgabe för den Schööööler!

Beitrag "Re: I2CLCD Library für HD44780 LCDs"

Lesen, Nachdenken, Verstehen.

von google (Gast)


Lesenswert?

Für die Nutzung des eBay-Artikels musst Du Deine Funktion lcdcall nicht 
nur auf i2c, sondern wichtig!! auch auf den 4-bit Modus (siehe Doku) 
umschreiben.

Infos zu dem Modul, Adressen usw gibt es u. a. hier: 
http://arduino-info.wikispaces.com/LCD-Blue-I2C (für Arduino, aber das 
ist auch irgendwie C ;-)

von c-hater (Gast)


Lesenswert?

Stefan S. schrieb:

> Die Zeit drückt und bekanntlich klappt nichts auf Anhieb.

So ist es im bösen RL praktisch immer. Gewöhn' dich schonmal d'ran.

Wirklich geeignet für's Berufsleben ist nur jemand, der trotz praktisch 
unlösbarer Situation und unter massivem Stress doch noch rechtzeitig 
eine "Lösung" findet, so dirty sie auch sein mag.

Der Rest ist unbrauchbarer Menschenmüll. So jedenfalls die einhellige 
Ansicht aller Damager.

> Da ich auf einen ATmega8 umsteigen muss und mir somit natürlich Pins
> verloren gehen benötige ich eine Möglichkeit die Pins die ich für das
> LCD benötige zu verschlanken.

Das geht nur sehr beschränkt. Du kannst hier genau nur maximal vier Pins 
einsparen. Die lassen sich an anderer Stelle oft sehr viel einfacher 
einsparen.

> Sollte ich weitere Informationen liefern

Für was um aller Welt hast du all die anderen 26 Portpins des Mega644 
verquast? Bzw. die 20 Portpins des Mega8? Denn tatsächlich hat der Mega8 
wirklich nur 6 Portpins weniger als der Mega644.

von Stefan S. (atmega644)


Lesenswert?

Jetzt habe ich schon einige Informationen bekommen.
Vielen Dank dafür. Leider aber sehe ich den Wald vor lauter Bäumen 
nicht. Mir ist nicht bewusst wie ich diese Änderungen bewerkstelligen 
kann, da mich die die Quellcodes und die Infos etwas überfordern.
Könnte mir da jemand praktischer zur Seite stehen wie ich das genau 
umsetze?

Danke.

PS: Die Pins sind belegt für diverse Ausgänge (Relais) und auch eine 
eventuelle spätere CANopen-Einbindung die ich aber schon skeptisch sehe. 
Nichts desto trotz: Ein Problem nach dem anderen.

PPS: Wieso kann ich nur 4 Pins einsparen wenn ich statt den üblichen 11 
Pins nur noch 2 benötige?

: Bearbeitet durch User
von google (Gast)


Lesenswert?

Das Programm im Anhang hast Du geschrieben, da brauchst Du doch keine 
weitere Hilfe?

von Frank K. (fchk)


Lesenswert?

Stefan S. schrieb:
> Da ich auf einen ATmega8 umsteigen muss und mir somit natürlich Pins
> verloren gehen benötige ich eine Möglichkeit die Pins die ich für das
> LCD benötige zu verschlanken. Hier kam mir eben genau die Idee des
> TWI/I2C (besteht da überhaupt ein Unterschied?). Wie ihr seht habe ich
> noch keine Erfahrung mit diesem Bus und brauche deswegen Hilfe.

Wenn Du schon umsteigen musst, dann wenigstens auf einen Mega88. 
Gleiches Pinout, aber mehr Features und weniger Stromverbrauch.

Zu Deinem Display:
Hast Du noch andere I2C-Dewices? Wenn nicht, mach Dir die Sache 
einfacher.

Nimm einen 74HC595. 8 Bit Schieberegister.
Du hast:
- Die Ausgänge Qa...Qh (Pin 15,1..7). Kommen an die Datenleitungen des 
Displays.
- seriellen Dateneingang. Pin 14. Zum AVR
- Output Enable. Pin 13. Auf GND setzen
- Clear. Pin 10. Auf VCC setzen
- Schiebetakt. Pin 11. Zum AVR
- Ausgabetakt. Pin 12. Zum AVR

RW von Display auf 0 setzen (nur schreiben)

Funktion:
Schiebetakt und Ausgabetakt auf 0. E vom Display auf 0.
für jedes Datenbit:
{
| Datenbit auf Pin vom AVR ausgeben -> Serieller Dateneingang
| Schiebetakt auf 1
| Schiebetakt auf 0
}

Ausgabetakt auf 1
Ausgabetakt auf 0
RS vom Display setzen
E vom Display auf 1
E vom Display auf 0

Das wars.

Wenn Du einen Pin sparen willst, kannst Du den Schiebetakt auch für RS 
vom Display nutzen. Das funktioniert deswegen, weil der Ausgabetakt das 
Datenwort vom Schieberegister in das Ausgaberegister übernommen hat. Was 
also mit dem Schieberegister passiert, ist egal. Du kannst also 
anschließend den Pin benutzen, um RS zu setzen.

Hier machen sie es etwas anders, indem sie den 4-Bit Modus verwenden und 
RS mit aufs Schieberegister tun. Kann man auch machen, spart einen Pin, 
ist aber in der Programmierung etwas komplizierter.

http://embedded-lab.com/blog/why-pay-for-serial-lcds-when-you-can-make-your-own/

fchk

PS: und wenn Du alles mit nur einem Pin machen willst:
http://romanblack.com/shift1.htm

: Bearbeitet durch User
von Stefan S. (atmega644)


Lesenswert?

Um die Frage zu beantworten... ja ich habe das selber mir mühselig 
zusammen programmiert (natürlich auch unter Zuhilfenahme anderer 
Projekte und Beispiele sowie Artikel von hier) und nein wie man sieht 
bekomme ich diese Sache nicht alleine hin und sehe den Wald wirklich vor 
lauter Bäumen nicht.

Zum Beispiel habe ich meine LCD Funktionen ja nicht ausgegliedert als .h 
bzw. .c. Es ist Teil meiner L-Meter.c und das verwirrt mich jetzt zum 
Beispiel schon wenn es nun eine extra Datei (.c und .h) für das LCD 
gibt. Solche wahrscheinlich eher grundlegenden Sachen beherrsche ich 
noch nicht so wie ihr.
Ich bin wie gesagt erst seit kurzem beim Microcontroller-programmieren 
angelangt.

Auch habe ich jetzt viele sicher gute Ideen und Ansätze bekommen, aber 
weiß gar nicht welchen ich am besten verfolgen sollte.
Ihr seid fähig sowas "mal eben" umzusetzen da gebe ich die Hoffnung 
nicht auf das irgendjemand sich die Zeit - und vor allem wohl die Nerven 
- mir zu einer Lösung zu verhelfen.

Prinzipiell habe ich nur dieses eine LCD, aber ich würde gerne dennoch 
beim TWI bleiben (auch um für späteres ein funktionierendes Beispiel zu 
haben). Zudem habe ich ja bereits die Komponenten.
Im Prototyp den meine Gruppe dann vorstellen wird, wird der PCF8574 zwar 
auf einer eigenen Lochrasterplatine zusammen mit den anderen Komponenten 
verbaut sein, aber die Ansteuerung sollte ja die selbe bleiben.

von Falk B. (falk)


Lesenswert?

@Stefan S. (atmega644)

>Zum Beispiel habe ich meine LCD Funktionen ja nicht ausgegliedert als .h
>bzw. .c. Es ist Teil meiner L-Meter.c und das verwirrt mich jetzt zum
>Beispiel schon wenn es nun eine extra Datei (.c und .h) für das LCD
>gibt. Solche wahrscheinlich eher grundlegenden Sachen beherrsche ich
>noch nicht so wie ihr.

Ist nicht so schlimm. Das kriegt man auch in einer Datei hin. Wenn 
gleich es eine gute Übung ist, den Kram lehrbuchgerecht auf mehrere 
Dateien aufzuteilen.

>Auch habe ich jetzt viele sicher gute Ideen und Ansätze bekommen, aber
>weiß gar nicht welchen ich am besten verfolgen sollte.

Du mußt in Software-Schichten denken und arbeiten.

https://de.wikipedia.org/wiki/OSI-Modell

Der Artikel klingt erstmal sehr kompliziert und wissenschaftlich, in 
deinem Beispiel ist das alles deutlich einfacher.

Es gibt bei deiner LCD-Ansteuerung im wesentlich 3 Schichten.

Oberste Schicht.

Dein Anwenderprogramm (Osi Layer 7), das will irgendwelche Anzeigen auf 
das LCD bringen. Dazu greift es NUR auf Funktionen auf den nächsten 
Layer zu. An deinem Programm und seinen Ausgaben musst du NICHTS ändern!

Die oberen Funktionen für die LCD Steuerung (Osi Layer 3). Dazu gehören 
lcdgotoxy, lcdwrites, lcdinit und die meisten anderen LCD-Funktionen. 
Diese stellen der höheren Schicht komfortable Funktionen zur Verfügung. 
Hier musst du NICHTS ändern!

Eins weiter unten ist OSI Layer 2. Die greift direkt auf die Hardware zu 
und steuert auf unterster Ebene die Datenübertragung. Dazu gehört bei 
dir nur lcdcall. DAS musst du auf I2C ändern! Sonst nichts! Denn dort 
wird ein Kommando- oder Datenbyte an das LCD geschickt. Jetzt noch über 
viele Drähte parallel, später über I2C seriell. Das ist einfacher als es 
im Moment klingt. Das Zauberwort heißt 4 Bit Modus ;-)

Ganz unten kommt OSI Layer 1, die Bitübertragungsschicht. Im Moment sind 
das deine IO-Ports, welche direkt mit dem Mikrocontroller verbunden 
sind. Nach der Änderung ist das dann I2C. Bei der Umsetzung hilft die 
eine fertige I2C-Bibliothek, Peter Fleury ist hier das Zauberwort.

So, jetzt habe ich eigentlich schon viel zuviel verraten ;-)

P S Zeichne dir die Schichten mal wirklich auf ein Blatt Papier und 
zeichne die Verbindungen der Funktionen auf, welche Funktion ruft welche 
anderen Funktionen auf.

von Stefan S. (atmega644)


Angehängte Dateien:

Lesenswert?

Hallo nochmal,

vielen Dank für die vielen Antworten und das Ihr euch auch die Mühe 
macht mehr als bloß 3 Zeilen zu schreiben.

Ich habe vor dieses Problem in mehreren Schritten zu lösen.
Das erste wäre es den 4-Bit Modus des LCD zu verwenden.
Dazu habe ich von Peter Fleury das aktuelle LCD Programmbeschafft und 
damit experimentiert.
Vorteil: Er hat bereits den 4-Bit Modus dort aktiviert und so muss ich 
mich nicht darum kümmern.

Folgendes ist mir aufgefallen:
Wenn ich das LCD mit PORTA als Datenleitung (Pins 4-7) und PORTB 0,1,2 
als E,RS,R/W dann funktioniert es (nachdem ich die Warzezeiten etwas 
erhöht hatte, musste experimentieren, da ich kein Datenblatt vom LCD 
habe).

Mein neues Problem für diesen Teilabschnitt:
Ich würde aber viel lieber PORTD 2,3,4 verwenden für die 3 
Steuerleitungen weil ich z.B. den T1 Eingang für meinen Counter brauche.
Jedoch funktioniert dies nicht wenn ich die Pins und Ports entsprechend 
in der lcd.h Datei anpasse.
Könnte mir jemand vielleicht helfen wieso das mit diesen Pins nicht 
funktioniert? Oder geht das mit dieser Library nicht?

Im Anhang findet ihr mein Test-Programm (Atmel Studio 7).



Vielen Dank euch nochmal.

Stefan

von Stefan S. (atmega644)


Lesenswert?

Nachtrag: Innerhalb des PORTS der die Datenleitungen beinhaltet (PORTA) 
ist eine Verwendung der freien Bits als Steuerleitungen ebenfalls 
möglich. Das hilft mir zwar weiter, aber die Frage warum es mit PORTC 
oder PORTD nicht funktioniert bleibt bestehen.

Danke.

von Stefan S. (atmega644)


Angehängte Dateien:

Lesenswert?

Und der dritte Post von mir.
Mir ist es nun gelungen das LCD mit Peter Fleurys Library komplett mit 
PORTA anzusteuern - das reicht mir vorerst. Selbstverständlich 
logischerweise im 4-Bit Modus (sonst würde ja der PORTA nicht reichen).

Nun will ich das ganze endlich auf I2C/TWI hiefen.

Ich habe mir die beiden Libraries LCD und I2C von Peter Fleury 
zusammengeschmissen, jedoch scheitere ich daran dies jetzt sinnvoll zu 
vereinen. Könnte mir vielleicht jemand kurz zur Hand gehen wenn er ein 
wenig Zeit und Erbarmen hat und mir die main nur so umschreiben das ich 
über TWI (ATmega 644A , PORTC Pin 0 und 1) eine einzige Meldung aufs LCD 
schreibe und es mir dann nochmal hochladen? Ich lerne scheinbar an 
fertigen (funktionierenden) Beispielen am besten.
Die Adresse des PCF8574 habe ich wenn ich es richtig verstanden habe auf 
0x40 gelassen (keine Brücke gesetzt von A0, A1 und A2).
Ich tue mich etwas schwer... wie wäre die Adresse wenn alle geschlossen 
wären?
Die LCD-Dateien funktionieren wie gesagt so wenn ich direkt anschließe!

Es hatte hier auch schon einige Helfer auf fertige I2C/LCD Lösungen 
verwiesen. Auch die habe ich nicht ans Laufen bekommen obwohl ich die 
Pin-Belegung vom PCF8574 durchgemessen habe (diese habe ich in der lcd.h 
angepasst (RS und E vertauscht im Vergleich zu meiner urspünglichen 
Beschaltung, aber das spielt ja keine Rolle). Dennoch hatte ich keinen 
Erfolg.

Daher mein Wunsch und die Hoffnung das jemand mir helfen könnte die TWI 
mit der LCD zusammenzubringen wo ich weiß das diese im 4-Bit Modus 
funktioniert.



Bin für jede Hilfe dankbar.

Gruß

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@ Stefan S. (atmega644)

>zusammengeschmissen, jedoch scheitere ich daran dies jetzt sinnvoll zu
>vereinen. Könnte mir vielleicht jemand kurz zur Hand gehen wenn er ein
>wenig Zeit und Erbarmen hat und mir die main nur so umschreiben das ich
>über TWI (ATmega 644A , PORTC Pin 0 und 1) eine einzige Meldung aufs LCD
>schreibe und es mir dann nochmal hochladen?

Nö. Das ist ja deine Aufgabe.

> Ich lerne scheinbar an
>fertigen (funktionierenden) Beispielen am besten.

Dan schua dir das an, dort ist alles schon mal gemacht worden und es 
funktioniert.

Beitrag "Re: LCD an ATmega644 (später ATmega8) mittels TWI/I2C (Anfängergerecht)"

>Die Adresse des PCF8574 habe ich wenn ich es richtig verstanden habe auf
>0x40 gelassen (keine Brücke gesetzt von A0, A1 und A2).
>Ich tue mich etwas schwer... wie wäre die Adresse wenn alle geschlossen
>wären?

Ja was wohl? welche Bit kann man durch A0-A2 verändern?

>Beschaltung, aber das spielt ja keine Rolle). Dennoch hatte ich keinen
>Erfolg.

Dan probier es noch einmal.

>Daher mein Wunsch und die Hoffnung das jemand mir helfen könnte die TWI
>mit der LCD zusammenzubringen wo ich weiß das diese im 4-Bit Modus
>funktioniert.

Nö, dann redest du dir nur ein es verstanden zu haben. IN Wahrheit hast 
du weder was verstanden noch echt hart eine systematische 
Fehlersuche betrieben. Das gehört zum Lernprozess dazu, auch wenn es 
ein wenig schwerer als Surfen auf dem Handy ist.

von Stefan S. (atmega644)


Lesenswert?

Vielen Dank für die schnelle Antwort auf mein Anliegen.
Richtig das ist meine Aufgabe. Nach meinem Dafürhalten ist die Hilfe von 
jemandem anzunehmen der das mit geschlossenen Augen macht definitiv 
nicht falsch.
Du scheinst genau so einer zu sein denn du bist der jenige aus dem von 
dir genannten Thread.
Ich danke dir für deine Sorge ich würde nicht genug lernen beim 
Studieren funktionierender Codeschnipsel - jedoch ist meine Programm wie 
du es oben sehen kannst einzig und allein nur auf diese Art und Weise 
entstanden. Ich behaupte nicht das alles zu können, dafür müsste ich 
länger und intensiver damit beschäftigen, aber es funktioniert und ich 
kann auch später noch genau damit wieder arbeiten und es anhand meiner 
Kommentare verstehen.
Das würde mir schon wesentlich dienlicher sein als - mit Verlaub - die 
"zarten" Hinweise darauf nochmal genau das zu tun was ich bereits die 
ganze Zeit erfolglos getan habe. Irgendwann nämlich fällt mir einfach 
nichts mehr ein was ich noch tun könnte - da sind wir wieder bei dem 
Punkt das ich das eben nicht schon gemacht habe und nicht von meinen 
Kommentaren, Erinnerungen oder funktionierenden Codeschnipseln 
profitieren kann.

Zum Thema wieder zurück:
Wenn ich dich als Wissensträger fragen dürfte:

1. Stimmt meine Annahme der Adresse 0x40 denn? Ich habe nämlich sowohl 
0x40 als auch 0x20 in den Quellen gelesen und bin verwirrt.

2. Könntest du mich zumindest Schritt für Schritt zum Erfolg leiten? Wie 
würdest du bei eingehender Betrachtung meines Beispielprogramms nun 
vorgehen? Ich weiß ich muss das LCD irgendwie mit dem TWI initialisieren 
und dann irgendwie über TWI eine Zeichenausgabe am LCD erwirken. Aber 
meine Erfahrung bzw. mein Wissen über TWI ist absolut gleich 0 und der 
eingefleischte µC C Programmierer bin ich auch nicht. Ohne 
"Händchenhalten" werde ich (so fürchte ich) nicht weiter kommen. Daher 
nochmal meine Bitte an dich.

Bzw.:
Da du das Beispiel von dir präferierst und ich auch dort meine Probleme 
habe würde ich gerne von dir Wissen wo du noch einen Fehler vermuten 
würdest... was macht gerne mal Ärger was ich nicht bedacht haben könnte?


Danke vorweg.

Gruß



NACHTRAG:
Ich habe nun bei dem i2clcd-Beispiel mit der Adresse 0x4E wohl eine 
Verbindung zum LCD.
Allerdings bekomme ich immernoch keine Anzeige. Nur Schwarze Balken.
Das einzige was sich bemerkbar macht ist folgendes:
Lade ich das Programm in den µC dann geht kurz die HG-Beleuchtung an und 
wieder aus. Das Display bleibt also jetzt dunkel, und die schwarzen 
Balken bleiben ebenfalls. Durch die Tatsache das dieses kurze 
"Aufblinken" beim überspielen des Programms geschieht gehe ich davon aus 
das ich die richtige Adresse und eine Verbindung habe. Aber leider nicht 
mehr.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@ Stefan S. (atmega644)

>Richtig das ist meine Aufgabe. Nach meinem Dafürhalten ist die Hilfe von
>jemandem anzunehmen der das mit geschlossenen Augen macht definitiv
>nicht falsch.

Stimmt, aber es sollte Hilfe zu Selbsthilfe sein, kein Vorkauen.

>Das würde mir schon wesentlich dienlicher sein als - mit Verlaub - die
>"zarten" Hinweise darauf nochmal genau das zu tun was ich bereits die
>ganze Zeit erfolglos getan habe. Irgendwann nämlich fällt mir einfach
>nichts mehr ein was ich noch tun könnte

Was hast du denn bisher EXAKT gemacht?

Hast du die Verbindung zwischen AVR und PCF8574 geprüft? Wackelt immer 
das richtige Bit?

>Wenn ich dich als Wissensträger fragen dürfte:

>1. Stimmt meine Annahme der Adresse 0x40 denn? Ich habe nämlich sowohl
>0x40 als auch 0x20 in den Quellen gelesen und bin verwirrt.

Deine Verwirrung ist berechtigt, sie ist bei I2C vorprogrammiert ;-)

Beitrag "Re: Kann mir bitte wer beim USI-TWI helfen?"

Peter Fleurys Lib nutzt die 8 Bit Adressierung. D.g. Beim Aufruf von 
i2c_start() muss man selber das RW/Bit mit reinfummeln.

1
#define FCF8574ADR 0x40   // Adresse im 8 Bit Mode mit RW-Bit =0
2
3
...
4
5
i2c_start(FCF8574ADR+I2C_WRITE);   // Starte Schreibzugriff
6
i2c_start(FCF8574ADR+I2C_READ);   // Starte Lesezugriff

>2. Könntest du mich zumindest Schritt für Schritt zum Erfolg leiten?

Vielleicht.

>Wie
>würdest du bei eingehender Betrachtung meines Beispielprogramms nun
>vorgehen?

Dein Beispielprogramm ist für einen EEPROM.

> Ich weiß ich muss das LCD irgendwie mit dem TWI initialisieren
>und dann irgendwie über TWI eine Zeichenausgabe am LCD erwirken.

Ja.

> Aber
>meine Erfahrung bzw. mein Wissen über TWI ist absolut gleich 0 und der
>eingefleischte µC C Programmierer bin ich auch nicht. Ohne
>"Händchenhalten" werde ich (so fürchte ich) nicht weiter kommen.

Sieht so aus.

>Da du das Beispiel von dir präferierst und ich auch dort meine Probleme
>habe würde ich gerne von dir Wissen wo du noch einen Fehler vermuten
>würdest... was macht gerne mal Ärger was ich nicht bedacht haben könnte?

Wo ist dein Beispiel mit PCF8574? In dem Projekt hier ist nur was mit 
24LC02, ein EEPROM. Falsches Projekt erwischt?

von Stefan S. (atmega644)


Lesenswert?

Danke nochmal für deine Geduld.

Ich war mittlerweile so strubbelig im Kopf das mir nicht mal aufgefallen 
ist das du noch eine Version 0.12 von dieser i2clcd gemacht hast.
Ich hatte ursprünglich die 0.1 von den ursprünglichen Authoren verwendet 
und irgendwie miteinander vermischt.

Diese 0.12 hat mit ein wenig Wartezeiten feilen (China-LCD) etc ganz gut 
hingehauen. Kompliment übrigens das du die Bugs behoben hast (z.B. P3 
für Backlight etc.).

Danke für deine Hilfe und diese hervorragende Version.

Mein TWI Display funktioniert nun im Testprogramm.

Jetzt will ich das ganze in mein eigentliches Programm integrieren und 
danach auf den ATmega8 (oder 88 ;-)) portieren.

Vielleicht werde ich da nochmal eure Hilfe brauchen.

Danke nochmal und einen schönen Abend!


Gruß

Stefan

von Falk B. (falk)


Lesenswert?

Na das ging aber schnell mit dem "Lernen" . . . ;-)

von Stefan S. (atmega644)


Lesenswert?

Ja das stimmt :).
Vielen Dank.

Aber eine Sache habe ich noch in dem Zusammenhang:

Dort ist die Funktion lcd_gotolc() zu finden.
Wenn ich diese verwende kommt nur unsinn bei raus.


z.B.:

int main(void)
{
  //char string1[] = "Hello World!";

  i2c_init();
  lcd_init();

  lcd_command(LCD_CLEAR);

    // always set all three parameters  (ON/OFF) when using this command
  lcd_command(LCD_DISPLAYON | LCD_CURSORON | LCD_BLINKINGON);

    lcd_light(true);

  //lcd_gotolc(0,0);
  //lcd_print(string1);

  lcd_gotolc(0,0);
    lcd_print_P(PSTR("I2CLCD V0.12"));

    _delay_ms(3000);

  lcd_command(LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKINGOFF);
}


Leider funktioniert die nicht so wie gehofft.
Ich bekomme kryptische Zeichen auf dem LCD angezeigt.
Auch mit den Parametern 1,1 wird es nicht besser.

Kannst du mir sagen was ich da wieder falsch mache?


Danke

von Falk B. (falk)


Lesenswert?

lcd_gotolc(); geht bei 1,1 los, nicht 0,0. Wenn sonst die Textausgabe 
funktioniert, sollte diese Funktion auch laufen.

von Stefan S. (atmega644)


Lesenswert?

Stimmt wohl...habe wieder das komplette Beispielprogramm genommen und 
auch das macht kryptische Zeichen.
Na super... eben noch funktioniert macht es nun wieder ärger?!

Ich werde mal die Hardware weiter prüfen und mich ggf. nochmal melden.


Danke.


Gruß

von Stefan S. (atmega644)


Lesenswert?

Hallo nochmal,

mit Blick auf die Uhr stell ich fest das ich irgendwo die Zeit vergessen 
habe.
Aber es lohnte sich. Ich habe bei der Integration von i2clcd in mein 
Programm nun Fortschritte gemacht. Es funktioniert.

ABER nur wenn ich die Portdefinitionen weglasse in der main:

 DDRD  = 0b00011111;
 DDRA  = 0xff;
 DDRB  = 0xf0;
 DDRC  = 0xff;
 PORTA = 0;
 PORTD = 0;
 PORTB = 0;
 PORTC = 0;

Wenn ich diese Zeilen auskommentiere DANN funktioniert es.
Wenn ich sie aber aktiv schalte dann nicht.
Vielleicht ist es ein übler und lächerlicher Anfängerfehler aber kann 
mir jemand sagen woran das liegt?
Das TWI liegt auf PINC0 und PINC1... auch wenn ich nur die Definitionen 
für PORTC und DDRC auskommentiere klappt es nicht. Es muss alles 
auskommentiert werden.
Wieso das? Und woher weiß jetzt mein µC was Eingang und was Ausgang ist?
Ich meine...das Programm läuft...aber ich würde gerne wissen warum.


Gruß

Stefan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.