Go Down

Topic: ARDUINO > 16x2 LCD und SD Card - Pins mehrfach? (Read 4333 times) previous topic - next topic

DE8MSH

Jan 18, 2011, 12:15 pm Last Edit: Jan 18, 2011, 12:18 pm by DE8MSH Reason: 1
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

Code: [Select]
#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 :)
Look at
http://de8msh.blogspot.com/
and
http://www.youtube.com/user/de8msharduino

hanspeter99

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ß


uwefed

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)
http://arduino.cc/en/Reference/LiquidCrystalConstructor

Pins kannst Du definitiv nicht doppeltbelegen.

Grüße Uwe

DE8MSH

#3
Jan 18, 2011, 01:00 pm Last Edit: Jan 18, 2011, 01:03 pm by DE8MSH Reason: 1
@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:

http://www.youtube.com/watch?v=n6_MonnOJWY

@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?!
Look at
http://de8msh.blogspot.com/
and
http://www.youtube.com/user/de8msharduino

uwefed

#4
Jan 18, 2011, 01:22 pm Last Edit: Jan 18, 2011, 01:23 pm by uwefed Reason: 1
Nein, nicht auf mosi ...
Du kannst die Pins ändern wie Du willst. (in SW und HW gleichzeitig  ;)  )
Grüße Uwe

ManfredH

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

uwefed

#6
Jan 18, 2011, 09:07 pm Last Edit: Jan 18, 2011, 09:09 pm by uwefed Reason: 1
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)
http://arduino.cc/en/Reference/LiquidCrystalConstructor

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

DE8MSH

#7
Jan 18, 2011, 10:44 pm Last Edit: Jan 18, 2011, 10:44 pm by DE8MSH Reason: 1
Hi Leute,

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

http://www.youtube.com/watch?v=ZubgKjqGRV8

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.  :)
Look at
http://de8msh.blogspot.com/
and
http://www.youtube.com/user/de8msharduino

uwefed

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

Grüße Uwe

DE8MSH

#9
Jan 19, 2011, 07:18 am Last Edit: Jan 19, 2011, 07:19 am by DE8MSH Reason: 1
Hi Uwe,

danke für die Info. Im Moment gehe ich aber davon aus, dass ich nur (minute % 10)==0 benötige um alle 10 Minuten einen Wert zu nehmen. Oder soetwas wie if ((minute % 10)==0 && second==0).
Look at
http://de8msh.blogspot.com/
and
http://www.youtube.com/user/de8msharduino

DE8MSH

#10
Jan 19, 2011, 09:29 am Last Edit: Jan 19, 2011, 10:55 am by DE8MSH Reason: 1
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:

#include <Wire.h>
#include <LiquidCrystal.h>
#include <SdFat.h>
#include <SdFatUtil.h>


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:

http://img31.imageshack.us/i/sdrtc.jpg/

Und der Code:

http://pastie.org/1476668
Look at
http://de8msh.blogspot.com/
and
http://www.youtube.com/user/de8msharduino

DE8MSH

#11
Jan 19, 2011, 12:43 pm Last Edit: Jan 19, 2011, 12:44 pm by DE8MSH Reason: 1
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
Look at
http://de8msh.blogspot.com/
and
http://www.youtube.com/user/de8msharduino

DE8MSH

Tja,

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

Code: [Select]
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  :D
Look at
http://de8msh.blogspot.com/
and
http://www.youtube.com/user/de8msharduino

uwefed

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

DE8MSH

#14
Jan 19, 2011, 08:41 pm Last Edit: Jan 19, 2011, 08:42 pm by DE8MSH Reason: 1
;D Ja Uwe, so wär 's recht :)

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

Kann ja mal passieren, näch   ::) Aber so lernt man seinen Code und die Hardware auch mal kennen  :D
Look at
http://de8msh.blogspot.com/
and
http://www.youtube.com/user/de8msharduino

Go Up