ARDUINO > 16x2 LCD und SD Card - Pins mehrfach?

Hallo,

ich mache schon länger mit dem Ardo rum. Aber eines habe ich bis heute nicht verstanden: kann ich unterschiedliche Hardware mit (teilweiser) gleicher PIN Belegung nutzen? Beispiel: ich möchte mein 16x2 LCD anschließen. Das hat u.A. PIN 10 und 11. Eine SD Card PIN Belegung, die so aussieht http://obduino.ca/SD_logger_arduino.jpg, nutzt auch 10 und 11.

Bekomme ich das zum Laufen? Ich muss ja das LCD UND die SD Card ansteuern. Oder anders: MUSS man die Pinbelegung einhalten? Ich könnte ja die Sd2PinMap.h von SDfat

#else  // defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
// 168 and 328 Arduinos

// Two Wire (aka I2C) ports
uint8_t const SDA_PIN = 18;
uint8_t const SCL_PIN = 19;

// SPI port
uint8_t const SS_PIN = 10;
uint8_t const MOSI_PIN = 11;
uint8_t const MISO_PIN = 12;
uint8_t const SCK_PIN = 13;

static const pin_map_t digitalPinMap[] = {
  {&DDRD, &PIND, &PORTD, 0},  // D0  0
  {&DDRD, &PIND, &PORTD, 1},  // D1  1
  {&DDRD, &PIND, &PORTD, 2},  // D2  2
  {&DDRD, &PIND, &PORTD, 3},  // D3  3
  {&DDRD, &PIND, &PORTD, 4},  // D4  4
  {&DDRD, &PIND, &PORTD, 5},  // D5  5
  {&DDRD, &PIND, &PORTD, 6},  // D6  6
  {&DDRD, &PIND, &PORTD, 7},  // D7  7
  {&DDRB, &PINB, &PORTB, 0},  // B0  8
  {&DDRB, &PINB, &PORTB, 1},  // B1  9
  {&DDRB, &PINB, &PORTB, 2},  // B2 10
  {&DDRB, &PINB, &PORTB, 3},  // B3 11
  {&DDRB, &PINB, &PORTB, 4},  // B4 12
  {&DDRB, &PINB, &PORTB, 5},  // B5 13
  {&DDRC, &PINC, &PORTC, 0},  // C0 14
  {&DDRC, &PINC, &PORTC, 1},  // C1 15
  {&DDRC, &PINC, &PORTC, 2},  // C2 16
  {&DDRC, &PINC, &PORTC, 3},  // C3 17
  {&DDRC, &PINC, &PORTC, 4},  // C4 18
  {&DDRC, &PINC, &PORTC, 5}   // C5 19
};
#endif  // defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)

dahingehend ändern, dass sie andere PINS benutzt. Oder MUSS das genau an die Pins?

Hintergrund: ich möchte mir einen Templogger mit Theristor bauen. Würde auch ohne Display gehen - mit ist aber schöner :slight_smile:

An der Möglichkeit ohne SD-Shield Daten zu loggen, bin ich sehr interessiert. Verstehe ich das richtig, dass an pin 4 3,3 Volt angelegt werden müssen?

Gruß

Du mußt nicht die Pins beibehalten; Du kannst sie auch (falls andere mit den gleichen Funktionen zur Verfügung stehen) durch andere erseten.
Bei der Liquid Cristal Library gibst Du ja di Pins in der Definition an. Die möglichkeiten sind:
LiquidCrystal(rs, enable, d4, d5, d6, d7)
LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)
LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)
LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)

Pins kannst Du definitiv nicht doppeltbelegen.

Grüße Uwe

@hanspeter99: ja, Du kannst ohne Shield loggen. Einfach SD Card an Arduino ranbauen und die SDFAT Library einbinden. Dort sind genug Examples dabei was man machen kann (read, write etc.). Da die SD Card mit 3,3v betrieben werden sollte, sollte man das auch tun. Sonst kann sie wohl kaputt gehen :-? Ich habe mal eine GPL auf die Art ausgelesen:

@uwefed; ich werde mal probieren ob ich beides zum Laufen bekomme. Mein LCD benötigt auf jedenfall ditte hier:

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Oder anders gesagt: damit habe ich das bisher betrieben. D.h. also, das sich nicht unbedingt auf MOSI, MISO usw. angewiesen bin?!

Nein, nicht auf mosi ...
Du kannst die Pins ändern wie Du willst. (in SW und HW gleichzeitig :wink: )
Grüße Uwe

Hallo Uwe,

ich habe mal mein "Hallo Welt" Beispiel modifiziert.
Vorher hatte ich, wie im "Hello, world" neben den 4 Datenbits nur RS und EN auf Pin12 bzw Pin11 liegen, RW fest auf GND.

Nun habe ich die Leitung RW auf Pin11 hinzugenommen, EN auf Pin10 verschoben,
im "Hallo Welt" nun die Anweisung LiquidCrystal lcd entsprechend geändert (12, 11, 10, 5, 4, 3, 2)...
und es funktioniert!
Daraus schließe ich, dass die Auswahl der Initialisierung in "LiquidCrystal lcd()" über die Anzahl der Parameter erfolgt, stimmt das?
Hier folgen ja 7 Parameter statt der bisherigen 6....

Gruß
Manfred

Bei der Liquid Cristal Library gibst Du ja di Pins in der Definition an. Die möglichkeiten sind:
LiquidCrystal(rs, enable, d4, d5, d6, d7)
LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)
LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)
LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)

die Möglichkeiten sind:

  • 4 oder 8 Datenbit
  • 2 oder 3 Steuerbits (Enable, Read/Write und Selects Registers.
    RW (Read/Write) kann auch nicht verwendet werden und fix auf Write gestellt werden. So kann das Busy Bit nicht kontrolliert werden und es muß lange genug gewartet werden; zB die Initialitation braucht einige mSec.
    Enable sagt wann die Daten auf den Datenleitungen gültig sind.
    RS Selects Registers. Zeigt ob die werte auf den Datenleitungen Daten oder Befehle sind.

Zusammenfassen das Interface funktioniert mit 6, 7, 10 oder 11 Bits.

Grüße Uwe

Hi Leute,

das was Uwe sagt ist richtig ;D Ich habe alles nach PIN 13 bis PIN 8 verschoben. Und.....es rennt :slight_smile: Danke Uwe. Stand meines Miniprojekts ist deshalb

Jetzt muss ich noch die SD card ranbauen und fini. In der Demo liogge ich alle 10 Sekunden mit (second % 10)==0. Soll noch auf alle 10 Minuten hoch. Die Temperatur habe ich nocht nicht mit einem R calibriert.
Egal. Prinzipiell rennt es. :slight_smile:

Ich versuch ja ständig nicht das falsche zu sagen. :wink:
Danke.
Für das Zeitintervall versuchs mal mit metro Biblithek.
http://www.arduino.cc/playground/Code/Metro

Grüße Uwe

Hi Uwe,

danke für die Info. Im Moment gehe ich aber davon aus, dass ich nur [i](minute % 10)==0[/i] benötige um alle 10 Minuten einen Wert zu nehmen. Oder soetwas wie [i]if ((minute % 10)==0 && second==0)[/i].

Hallo nochmal.

ich betreibe ja LCD, SD Card und RTC am Arduino Uno. Leider schaltet sich das Diplay aus oder garnicht erst an sobald ich
* *if (!card.init(SPI_HALF_SPEED)) error("card.init failed");* *
gebe. Das scheint sich irgendetwas zu beharken...

Das sind die LIBS, die ich einband:

[i]#include <Wire.h>
#include <LiquidCrystal.h> 
#include <SdFat.h>
#include <SdFatUtil.h>
[/i]

Sobald ich den Eintrag
* *if (!card.init(SPI_HALF_SPEED)) error("card.init failed");* *
(und ff) herausne
hme zeigt das Display wieder an :-?

Ich habe in LiquidCrystal.h gesehen. Ich wüsste jetzt nicht wo sich LiquidCrystal.h und SdFat.h &&|| SdFatUtil.h harken....

Anbei meine Verkabelung:

Und der Code:

http://pastie.org/1476668

Vergesst, was ich oben schrieb. Ich sollte mir den Code auch mal ansehen. Wenn ich serial Monitor aufmache steht dort

error: card.init failed
SD error: 1,FF

In der Errorbehandlung gibt es ein while(1);:

// store error strings in flash to save RAM
#define error(s) error_P(PSTR(s))

void error_P(const char* str) {
PgmPrint("error: ");
SerialPrintln_P(str);
if (card.errorCode()) {
PgmPrint("SD error: ");
Serial.print(card.errorCode(), HEX);
Serial.print(',');
Serial.println(card.errorData(), HEX);
}
while(1);
}

Somit kann das LCD ja nichts anzeigen, da es auf der loop nicht hinauskommt... Sorry Leute für den "Spam". Ich muss nun prüfen warum die SD card nicht initialisiert werden kann.

l8er

Tja,

es ist wie immer. Macht man es richtig funktioniert es. Log auf SD klappt nun. Mit RTC und mit LCD.

110119;145900;Tempwert
110119;150000;Tempwert
110119;150100;Tempwert
110119;150200;Tempwert
110119;150300;Tempwert
110119;150400;Tempwert
110119;150500;Tempwert

Tempwert ist noch Fake, das andere stimmt schon.

Grund war..... war.... öhm.... war.... ein vertauschtes Kabel an der SD Card :smiley:

Sollte Iih dann mit den Ratschlägen so anfangen:
Sind alle Kabel da und richtig angeschlossen??? :wink: :wink: :wink: :wink:
Grüße Uwe

;D Ja Uwe, so wär 's recht :slight_smile:

Ich habe meinen ehemaligen Kollegen immer gefragt, wenn sein C++ Code nicht lief, "haste ein Semikolon vergessen"? :stuck_out_tongue:

Kann ja mal passieren, näch ::slight_smile: Aber so lernt man seinen Code und die Hardware auch mal kennen :smiley: