I2C LCD ansteuern - Wo ist der Fehler?

Hallo, ich habe mir ein LCD-Display gekauft:
Lcd Display

Dafür gibt’s auch eine extra Library, “LiquidCrystal_I2C”.

Ich hab das Display angeschlossen, einen Beispielcode (Hello World - siehe unten) per Arduino hochgeladen - klappt.

Ich programmiere jedoch immer mit Atmel Studio, da gibts ein Plugin für Arduino.

Neuen Sketch in Atmel erstellt, den “Hello - World” Code 1:1 kopiert und hochgeladen - geht!

Mein Problem: ich mag dieses setup(); und loop(); von Arduino nicht und nutze stattdessen immer eine main(); … das klappt auch immer ganz gut.
Auch mit anderen I2C Devices, zB. der RTC DS1307.

Nur hierbei funktioniert es nicht, die Hardware wurde nicht verändert, nur der Code:

//YWROBOT
//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup()
{
  lcd.init();                      // initialize the lcd 
  lcd.init();
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(3,0);
  lcd.print("Hello, world!");
  lcd.setCursor(2,1);
  lcd.print("Ywrobot Arduino!");
   lcd.setCursor(0,2);
  lcd.print("Arduino LCM IIC 2004");
   lcd.setCursor(2,3);
  lcd.print("Power By Ec-yuan!");
}


void loop()
{
}

wurde zu:

//YWROBOT
//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

int main(){
	lcd.init();                      // initialize the lcd
	lcd.init();
	// Print a message to the LCD.
	lcd.backlight();
	lcd.setCursor(3,0);
	lcd.print("Hello, world!");
	lcd.setCursor(2,1);
	lcd.print("Ywrobot Arduino!");
	lcd.setCursor(0,2);
	lcd.print("Arduino LCM IIC 2004");
	lcd.setCursor(2,3);
	lcd.print("Power By Ec-yuan!");
	
	while(1){
		
	}
}

Übersehe ich irgend etwas?..
Das Projekt wird korrekt kompiliert und auch hochgeladen, keinerlei Fehler.

Wird der Text im ersten Fall angezeigt?
Sind am i2c-Bus Pullups installiert?
Was macht die "while-Schleife" am Ende des Sketches?
Und hier "LiquidCrystal_I2C lcd(0x27,20,4);" muss stehen "LiquidCrystal_I2C lcd(0x27,16,2);"
evtl. kann das nicht richtig kompiliert werden. In der ARDU-IDE funktioniert das aber.

HotSystems:
Was macht die "while-Schleife" am Ende des Sketches?

Das ist wie eine leeres loop()

Füge mal der main am Anfang "init();" ein. Hatte früher das Problem, dass dieses erforderlich war.

HotSystems:
Was macht die "while-Schleife" am Ende des Sketches?

Hallo,

main() ist in Atmel Studio das was setup in der Arduino IDE ist. Und das erste while(1) in Atmel Studio nach main() ist das was in der IDE unsere loop() ist. Soviel zur Frage. Das ist der klassische Codeaufbau außerhalb unserer "Verwöhn-IDE". :slight_smile: Sein Fehler sehe ich aber dennoch nicht.

sschultewolter:
Füge mal der main am Anfang "init();" ein. Hatte früher das Problem, dass dieses erforderlich war.

Ja, daran hatte ich auch schon gedacht. Das macht der Arduino automatisch in main() vor setup()

Wundert mich nur dass es sonst ohne geht, auch mit I2C.

Wie gesagt, der Code ist 1:1 vom Beispiel übernommen, also ersteres(das ohne die main-Funktion).

Wenn ich das ganze ohne Änderung mit Atmel Studio ( und dem Plug in Visual Micro) auf den Controller spiele, funktionierts einwandfrei.

Wenn ich das ganze “umverpacke” in eine main-Funktion, dann läuft es leider nicht mehr…

Das init(); direkt nach int main(){ hat geholfen! Tausend Dank!

Ich bin z.Z. halt dabei mich von der “Verwöhn-IDE” zu trennen, um halt Hardware näher programmieren zu lernen…z.B. direkt die Register für Ports usw. setzen.

Edit: Das init() hats bewirkt, hab ich bisher noch nicht gesehen…init für INITialisieren nehme ich an - was genau wird da aufgerufen/begonnen?

Hab z.Z. auch Microcontroller-Programmierung im Studium, auch da ist mir das noch nicht unter gekommen.

1000 Dank - Jonas

Serenifly:
Das ist wie eine leeres loop()

Ja, bisher habe ich mit dem Atmel-Studio noch nichts gemacht, liegt aber schon auf dem Rechner.

Danke, man lernt nie aus.

Das ist nichts Arduino-spezifisches

Kommando zurück, wars leider doch nicht - keine Ahnung, hab jetzt Verwirrung pur.
Ich probier mal weiter und melde mich später noch einmal.

Edit: Habe eben nochmal dabei geschaut, es funktioniert doch.
War gestern wohl ein bissl viel :slight_smile:

Hallo,

um das jetzt nochmal klarzustellen. Das init(); hat nur was mit dem Display zu tun? Oder?
Hab auch schon diverse Dinge in AS klassisch C programmiert und noch nie init(); benötigt. Schon seltsam.

Oder liegst doch nur an der falschen Initialisierung, wie schon oben erwähnt wurde. Laut Code Kommentar und Link ist das ein 16 Zeichen 2 Zeilen Display. Wird aber als 20 Zeichen 4 Zeilen initialisiert.

Die falsche Initialisierung mit 20 Buchstaben und 4 Zeilen ist es definitiv nicht, es funktioniert auch so. Wenn ich zb. In die 3. Zeile "schreibe", dann schreibts in Wirklichkeit in die erste..Denk das hängt mit dem Binärcode zusammen..
0 binär 0000000[0] -> Zeile 1
1 binär 0000000[1] -> Zeile 2
2 binär 0000001[0] -> Zeile 1
3 binär 0000001[1] -> Zeile 2

Das 2. Bit von rechts wird also anscheinend abgeschnitten etc.

Mit dem init funktionieren sowohl richtiger als auch "falscher" aufruf

Ich bin z.Z. halt dabei mich von der "Verwöhn-IDE" zu trennen, um halt Hardware näher programmieren zu lernen..z.B. direkt die Register für Ports usw. setzen.

Auch mit der Arduino-IDE kannst Du auf Register des Controllers zurückgreifen und Assembler-Teile einbetten.

Grüße Uwe

Hallo,

gewöhne dir solchen Mist mit absichtlichen falschen Aufrufen zum initialisieren erst gar nicht an. Nach dem Motto, ging schon, muß gehen, wird immer so funktionieren. Irgendwann kommt der Tag wo Dein Code unvorhersehbare Fehler macht und du weist nicht woher. Weil ging so, muß auch heute so funktionieren, kann nicht sein usw.

unzufrieden:
...zB. der RTC DS1307.

Diese RTC würde ich gerne nutzen, bekomme sie aber nicht zum Laufen. Kannst Du einen Sketch dafür zeigen?

Vielen Dank vorweg!

Gregor

Hallo,

das du solche Dinge fragst der andere gerne von oben herab belehrt wundert mich.
Zum Thema. Hast Du es schon einmal mit der Lib für die RTC probiert?
Das wäre die einfachste Lösung für den Anfang.
Oder guckst mal in den umfangreichen Thread: http://forum.arduino.cc/index.php?topic=313047.0

Doc_Arduino:
Hallo,

um das jetzt nochmal klarzustellen. Das init(); hat nur was mit dem Display zu tun? Oder?
Hab auch schon diverse Dinge in AS klassisch C programmiert und noch nie init(); benötigt. Schon seltsam.

Das init() hat nichts mit dem Display selber zu tun. Das muss irgendwo in den Arduino Libs auftauchen. Hab damals die Lösung irgendwo nach langem suchen gefunden.

Arduino und AVR GCC sollte man wenn möglich trennen, man baut viele Sachen ein, die später keiner mehr entziffern kann. Wenn du Arduino Libs verwendest, nehm setup und loop.

Gegen direkte Bitmanipulation der Ports spricht hingegen nichts.

alles klar :slight_smile:

gregorss:
... RTC ...

Hat sich erledigt. Sorry für die Störung.

Gregor