AVR-Duino/WiFi

Az oldal Demopaneljeinek _hardware_ kérdései...
Válasz küldése
Avatar
congo
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2011. augusztus 22. hétfő, 6:00

AVR-Duino/WiFi

Hozzászólás Szerző: congo »

Sziasztok,

Próbálok életet lehelni a WiFi demópanelen keresztül a 8x2-es LCD kijelzőbe, egyelőre sikertelenül.

A teszteléshez az AVR-en fut egy kis program, ami az MCP23008 IO Expander minden kimenetét egyszerre villogtatja, közben pedig próbáltam összevadászni a panel és az LCD modul dokumentációja alapján, hogy mit ronthattam el.

A panel doksija szerint a két hüvelysoron az LCD D4-D7 adatlábai vannak kivezetve, de én a D1-D4 helyén levő csatlakozókon találtam meg a "villogást". Simán lehet, hogy a sok kísérletezés után elnéztem valamit, de olyan mintha az RJ-11 aljzattól távolabb eső hüvelysor bekötése fordított lenne.

Valaki próbálta már az LCD használatát ezzel a panellel?
Avatar
szegoj
SzínkódFestő
Hozzászólások: 92
Csatlakozott: 2010. február 4. csütörtök, 7:00

Hozzászólás Szerző: szegoj »

Szia!

Nekem a következő program működött. Az LCD bekötés a szövegben...
Megjegyzés:
A program elején a setbit, clearbit definició csak próbálkozás volt, az Arduino nyelvben vannak hasonló nevű parancsok! :D

Kód: Egész kijelölése

/*----------------------------------------------------------------  
 Projekt:  AVR-DUINO/WiFiShield board
 ------------------------------------------------------------------
 MCP23008 expanderre kötött LCD kijelzőt kezeli
 ------------------------------------------------------------------

 Az LCD kijelző bekötése
 -----------------------
 DB4..DB7 -> GPIO 0-3
 RS       -> GPIO 4
 RW	  -> GPIO 5
 E        -> GPIO 7
 ----------------------------------------------------------------*/

#include <Wire.h>

#define setBit(var, bitnum)   ((var)|=(1<<(bitnum)))
#define clearBit(var, bitnum) ((var)&=~(1<<(bitnum)))

const byte LCD_CLEAR = 0b00000001;
const byte LCD_INCR = 0b00000110;
const byte LCD_DECR = 0b00000100;
const byte LCD_LSHIFT = 0b00011000;
const byte LCD_RSHIFT = 0b00011100;
const byte LCD_BLINK = 0b00001111;
const byte LCD_NOBLINK = 0b00001110;
const byte LCD_SHOWCURSOR = 0b00001110;
const byte LCD_HIDECURSOR = 0b00001100;
const byte LCD_ON = 0b00001100;
const byte LCD_OFF = 0b00001000;

const byte MCP_addr = 0x27;          // A2 - A0 = 111;
const byte LED = 9;
const byte IODIR = 0;
const byte OLAT = 10;
const byte RS = 4;
const byte E = 7;
byte c;

void MCP_write(byte address, byte value){
  Wire.beginTransmission(MCP_addr);
  Wire.send(address);
  Wire.send(value);
  Wire.endTransmission();
}

void LCD_write(byte chr) {
  setBit(chr, E);                    // E=1
  MCP_write(OLAT, chr);
  delayMicroseconds(100);
  clearBit(chr, E);                   // E=0
  MCP_write(OLAT, chr);
  delayMicroseconds(100);
}

void LCD_command(byte data) {
  c = data >> 4;
  LCD_write(c);
  c = data & 15;
  LCD_write(c);
}

void LCD_char(byte data) {
  c = data >> 4;
  setBit(c, RS);
  LCD_write(c);
  c = data & 15;
  setBit(c, RS);
  LCD_write(c);
}

void LCD_string(const char * s) {
  while(*s) LCD_char(*s++);
}

void LCD_cursor(byte x, byte y) {
  switch (y) {
  case 1:
    LCD_command(0x80 + x);
    break;
  case 2:
    LCD_command(0xC0 + x);
    break;
  }
}

void LCD_init() {
  delay(1000);
  LCD_write(3);
  delay(10);
  LCD_write(3);
  delay(1);
  LCD_write(3);                      // 8 bites interfész
  delayMicroseconds(100);
  LCD_write(2);                      // 4 bites interfész
  delayMicroseconds(100);
  LCD_command(0b00101000);           // 2 soros LCD
  LCD_command(LCD_HIDECURSOR);
  LCD_command(LCD_CLEAR);
  delay(2);
  LCD_command(LCD_INCR);
}

void setup() {
  pinMode(LED, OUTPUT);
  digitalWrite(LED, HIGH);
  Wire.begin();                     // i2c master
  MCP_write(IODIR, 0);              // kimenet konfigurálás
}

void loop() {
  LCD_init();
  while(1) {
    LCD_string("Hello");
    delay(2000);
    LCD_cursor(1, 2);
    LCD_string("World ");
    delay(2000);
    LCD_command(LCD_OFF);
    delay(1000);
    LCD_command(LCD_ON);
    delay(1000);
    LCD_command(LCD_OFF);
    delay(1000);
    LCD_command(LCD_ON);
    delay(1000);
    for (int i=0; i<5; i++) {
      LCD_command(LCD_LSHIFT);
      delay(1000);
    }
    for (int i=0; i<5; i++) {
      LCD_command(LCD_RSHIFT);
      delay(1000);
    }
    LCD_command(LCD_SHOWCURSOR);
    delay(1000);
    LCD_command(LCD_HIDECURSOR);
    delay(1000);
    LCD_command(LCD_CLEAR);
    delay(1000);
  }
}

Avatar
congo
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2011. augusztus 22. hétfő, 6:00

Hozzászólás Szerző: congo »

Szia,

Köszönöm a kódrészletet. Kipróbáltam egy az egyben (wire.send helyett wire.write volt az egyetlen módosítás), de sajnos ez sem működött.

A bekötéssel kapcsolatban az lenne a kérdésem, hogy Te az LCD csatlakoztatásakor közvetlenül a WiFi Shield hüvelysorát használtad, vagy pl. breadboardon keresztül csatlakoztattad a lábakat?
Avatar
szegoj
SzínkódFestő
Hozzászólások: 92
Csatlakozott: 2010. február 4. csütörtök, 7:00

Hozzászólás Szerző: szegoj »

A WiFi shield csatlakozójába dugtam az LCD-t, a rajz szerint kell behelyezni

Kép

A gond az, hogy a panel hüvelysorai kb. egy fél raszterrel távolabb vannak egymástól, mint az LCD lábsorai. Ráadásul az LCD-nek vékony drót lábacskái vannak, amik rosszul érintkeznek, lötyögnek a hüvelysorban. Közbülső csatlakozóként IC foglalatból ledarabolt hüvelysorokba dugtam az LCD-t, és azzal együtt csatlakoztam a shield panelre (mint zokni). :D
Válasz küldése