Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Robert
Elektronbűvölő
Hozzászólások: 10213 Csatlakozott: 2005. december 9. péntek, 7:00
Hozzászólás
Szerző: Robert » 2008. november 23. vasárnap, 9:22
Az LCD-k 4 bites módban az Arduino 0012 verziójától beépítve tartalmazza a függvénykönyvtárat.
Kód: Egész kijelölése
#include <LiquidCrystal.h>
// LiquidCrystal display with:
// rs on pin 12
// rw on pin 11
// enable on pin 10
// d0, d1, d2, d3 on pins 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
void setup()
{
// Print a message to the LCD.
lcd.print("hello, world!");
}
void loop()
{
}
Beépített parancsok:
* lcd.clear() - képtörlés és 1,1 pozícióra ugrás
* lcd.home() - 1,1 pozícióra ugrás
* setCursor() - megadható pozícióra ugrás
* write() - LCD-re paraméterben megadott dolog írása (pl. serial.input())
* print() - LCD-re szöveg/szám kiírása
efop
Újonc
Hozzászólások: 1 Csatlakozott: 2009. augusztus 28. péntek, 6:00
Hozzászólás
Szerző: efop » 2009. október 28. szerda, 23:08
Mivel az elmúlt napokban volt egy kis problémám az AVR-Duino és a Ext1 shield boardon lévő LCD vezérlésével ezért leírom mi volt a probléma okulásul.
Az LCD a shopban kapható EW162G0GR modul volt, a pin kiosztása úgylátom szabványos. Az opás oka az volt hogy nem tulajdonítottam nagy jelentőséget a kontraszt beállításnak, pedig ha nincs jól beállítva egyszerűen nem jelenik meg semmi.
Gyárilag pont az LCD alatti poti szabályozza a kontrasztot ezért le kell kapni az LCD-t és valamelyik végállásba tekerni a potit, ha nem az egyik akkor a másik végállásba. És a program amivel működik:
Kód: Egész kijelölése
#include <LiquidCrystal.h>
const int numRows = 2;
const int numCols = 16;
// initialize the library with the numbers of the interface pins
// LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)
LiquidCrystal lcd(4, 5, 6, 7, 8, 9); // ext1 ben
void setup() {
// set up the LCD's number of rows and columns:
//lcd.begin(numRows, numCols);
lcd.begin(numCols, numRows);
lcd.display();
}
void loop() {
// loop from ASCII 'a' to ASCII 'z':
for (int thisLetter = 'a'; thisLetter <= 'z'; thisLetter++) {
// loop over the rows:
for (int thisRow= 0; thisRow < numRows; thisRow++) {
// loop over the columns:
for (int thisCol = 0; thisCol < numCols; thisCol++) {
// set the cursor position:
lcd.setCursor(thisCol,thisRow);
// print the letter:
lcd.print(thisLetter, BYTE);
delay(200);
}
}
}
}
zolsza
DrótVégénSzéndarab
Hozzászólások: 32 Csatlakozott: 2008. október 14. kedd, 6:00
Hozzászólás
Szerző: zolsza » 2011. november 5. szombat, 10:27
Sziasztok! Egy abszolút kezdő kérdésem lenne. Ext1 shield boardon lévő LCD háttérvilágítását szeretném bekapcsolni.
Evvel a progival próbálkoztam, de nem működik:
#include <LiquidCrystal.h>
LiquidCrystal lcd(4, 5, 6, 7, 8, 9, 16); // ext1 ben
void setup()
{
pinMode(13, OUTPUT);
lcd.print("hello, world!");
}
void loop()
{digitalWrite(13, HIGH);
}
bakter
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 » 2011. november 5. szombat, 11:46
zolsza írta: Sziasztok! Egy abszolút kezdő kérdésem lenne. Ext1 shield boardon lévő LCD háttérvilágítását szeretném bekapcsolni.
Evvel a progival próbálkoztam, de nem működik:
#include <LiquidCrystal.h>
LiquidCrystal lcd(4, 5, 6, 7, 8, 9, 16); // ext1 ben
void setup()
{
pinMode(13, OUTPUT);
lcd.print("hello, world!");
}
void loop()
{digitalWrite(13, HIGH);
}
A háttérvilágítás bekapcsolásához jó a próbálkozás, de az LCD konfigurálás nem jó. Ha hét paramétert adsz meg, a második az R/W bit.
LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)
Az EXT1 panelen az R/W kivezetés a földre van kötve, így csak 6 paramétert kell megadnod.
LiquidCrystal(rs, enable, d4, d5, d6, d7)
Még egy kérdés: nálad mi a 16? Az Arduino-nak csak 14 digitális IO kivezetése van (0-13 számozással)
zolsza
DrótVégénSzéndarab
Hozzászólások: 32 Csatlakozott: 2008. október 14. kedd, 6:00
Hozzászólás
Szerző: zolsza » 2011. november 5. szombat, 12:51
"Még egy kérdés: nálad mi a 16? Az Arduino-nak csak 14 digitális IO kivezetése van (0-13 számozással)"
Ext1 shield board felhasználói dokumentációból Az LCD ezen kivezetése van az Ardunio D13-as kivezetésére kötve
bakter
Gerifield
DrótVégénSzéndarab
Hozzászólások: 27 Csatlakozott: 2011. szeptember 19. hétfő, 6:00
Hozzászólás
Szerző: Gerifield » 2011. november 5. szombat, 13:01
Az ext1-en az lcd-hez ennyi kell:
Többször használtam!
A háttér világításhoz pedig csak a 13-as portra kell HIGH-t adni és kész.
(Elég 1* a setup-ban ezt megcsinálni!)
EDIT:
Feldobtam ide pár kódot, részben meghagytam az angol kommenteket, részben hozzáírtam kicsit:
http://dl.dropbox.com/u/3592094/avr_dui ... peldak.zip
Van benne, LCD kezelés, analóg inputok olvasása (ami a panelen van és serialra írása), illetve a hőmérő szenzor olvasása.
Moon_Walker
DrótVégénSzéndarab
Hozzászólások: 35 Csatlakozott: 2011. szeptember 29. csütörtök, 6:00
Hozzászólás
Szerző: Moon_Walker » 2011. november 8. kedd, 14:18
sziasztok,
I2C, MCP23017, LCD(HD44780)...
sajna nem jön össze még a háttérvilágítás bekapcsolása sem...
#define expander B01000000 //expander address
...
void setup()
{
Wire.begin(); // start I2C
Wire.beginTransmission(expander);
Wire.send(0x0A);
Wire.send(B00001100);
Wire.endTransmission();
Wire.beginTransmission(expander);
Wire.send(0x15); //pointer
Wire.send(B00100000); // setup for command mode
Wire.endTransmission();
delayMicroseconds(100);
Mi lehet a gond?
Robert
Elektronbűvölő
Hozzászólások: 10213 Csatlakozott: 2005. december 9. péntek, 7:00
Hozzászólás
Szerző: Robert » 2011. november 8. kedd, 19:56
Bascom alatt:
Kód: Egész kijelölése
Const Iocon = &B00001100
Const Iodirki = 0
Const Iodirbe = 255
Dim I2c_lcd_b As Byte
Const Bit_rs = 4
Const Bit_e = 7
Const Bit_bl = 6
Const I2c_lcd_bl = 1 'hattervilagitas
Prog30:
'I2CInit
Inputhex "MCP23017 - LCD address (hex):" , Temp1b
I2cinit
I2cstart 'Sends start condition
I2cwbyte Temp1b '000 cimu eszkoz (kimenet)IOCON regiszter beállítása
I2cwbyte &H0A 'A es B
I2cwbyte Iocon
I2cstop
I2cstart '000 - Kimenet B csatorna beállítás
I2cwbyte Temp1b
I2cwbyte 1
I2cwbyte Iodirki
I2cstop
'Device be
I2cstart '000 - Bemenet A csatorna beállítás
I2cwbyte Temp1b 'A
I2cwbyte 0
I2cwbyte Iodirbe
I2cstop
I2cstart '000 - Bemenet A Pull Up beállítás
I2cwbyte Temp1b 'A
I2cwbyte &H0C
I2cwbyte 255
I2cstop
I2cstart '000 - Bemenet A Invert beállítás
I2cwbyte Temp1b 'A
I2cwbyte &H02
I2cwbyte 255
I2cstop
Waitms 15
'set 8-bit mode (attention)
'toggle the E -line
I2c_lcd_b = &B10000011
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000011
Call I2c_lcd_portkiir
Waitms 4
'set 8-bit mode (attention)
I2c_lcd_b = &B10000011
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000011
Call I2c_lcd_portkiir
Waitms 1
'set 8-bit mode (attention)
I2c_lcd_b = &B10000011
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000011
Call I2c_lcd_portkiir
Waitms 4
'set 4-bit operation
I2c_lcd_b = &B10000011
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000011
Call I2c_lcd_portkiir
Waitms 1
'set 8-bit mode (attention)
I2c_lcd_b = &B10000010
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000010
Call I2c_lcd_portkiir
I2c_lcd_b = &B10001000
Call I2c_lcd_portkiir
I2c_lcd_b = &B10001000
Call I2c_lcd_portkiir
Waitms 1
I2c_lcd_b = &B10000000
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000000
Call I2c_lcd_portkiir
'Display off, cursor off, blink off
I2c_lcd_b = &B10001000
Call I2c_lcd_portkiir
I2c_lcd_b = &B00001000
Call I2c_lcd_portkiir
Waitms 1
I2c_lcd_b = &B10000000
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000000
Call I2c_lcd_portkiir
'display on, cursor off, blinking off
I2c_lcd_b = &B10001100
Call I2c_lcd_portkiir
I2c_lcd_b = &B00001100
Call I2c_lcd_portkiir
Waitms 1
I2c_lcd_b = &B10000000
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000000
Call I2c_lcd_portkiir
'clear display and send cursor to address 0
I2c_lcd_b = &B10000001
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000001
Call I2c_lcd_portkiir
Waitms 1
Return
Prog33:
'I2C_lcd_gomb
Inputhex "MCP23017 - LCD address (hex):" , Temp1b
I2cstart
I2cwbyte Temp1b
I2cwbyte &H12
I2cstop
I2cstart
Temp1b = Temp1b + 1
I2cwbyte Temp1b
I2crbyte Temp2b , Nack
I2cstop
Decr Temp1b
Waitms 10 'prell kivedese
I2cstart
I2cwbyte Temp1b
I2cwbyte &H12
I2cstop
I2cstart
I2cwbyte Temp1b
I2crbyte Temp3b , Nack
I2cstop
If Temp3b <> Temp2b Then
Temp3b = 0
Else
If Temp3b <> 0 Then Gosub Csipog1
End If
If Temp3b = 0 Then Goto Prog15
Print "Gomb : " ; Bin(temp3b) ; " : ";
If Temp3b = &B00001000 Then Print "1"
If Temp3b = &B00100000 Then Print "2"
If Temp3b = &B00000001 Then Print "3"
If Temp3b = &B00000010 Then Print "4"
If Temp3b = &B10000000 Then Print "5"
If Temp3b = &B11000000 Then Print "5M"
Wait 3
Return
Sub I2c_lcd_portkiir
I2c_lcd_b.bit_bl = I2c_lcd_bl
I2cstart
I2cwbyte Temp1b
I2cwbyte &H15
I2cwbyte I2c_lcd_b
I2cstop
End Sub
Moon_Walker
DrótVégénSzéndarab
Hozzászólások: 35 Csatlakozott: 2011. szeptember 29. csütörtök, 6:00
Hozzászólás
Szerző: Moon_Walker » 2011. november 9. szerda, 12:28
Köszi Robi!
Ez sokat segített.
Láthatólag inicializálja a kijelzőt....
Már csak valami kiírás kellene....
átírtam wiring-ba:
#include <Wire.h>
//redefine highByte and lowByte to return byte, not int
#define loByte (byte)lowByte
#define hiByte (byte)highByte
#define opcode B0100000 // address = 000; 7 bits!
#define ioconbyte B00100000 // disable sequential operation mode;
#define iocon 0x0A
#define iodira 0x00
#define gpioa 0x12
#define gppua 0x0C //pullups
#define gpintena 0x04
#define defvala 0x06
#define intcona 0x08
#define intfa 0x0E
#define intcapa 0x10
#define ipola 0x02
byte I2c_lcd_b;
void setup()
{
Serial.begin(9600);
Wire.begin();
Wire.beginTransmission(opcode);
Wire.send(iocon);
Wire.send(ioconbyte);
Wire.endTransmission();
MCPstore (0,iodira,0x0000); // all output
// MCPstore (0,gppua, 0xf000); // all pullups on
delay(15);
I2c_lcd_portkiir(0, 0x15, B10000011);
I2c_lcd_portkiir(0, 0x15, B00000011);
delay(4);
I2c_lcd_portkiir(0, 0x15, B10000011);
I2c_lcd_portkiir(0, 0x15, B00000011);
delay(1);
I2c_lcd_portkiir(0, 0x15, B10000011);
I2c_lcd_portkiir(0, 0x15, B00000011);
delay(4);
I2c_lcd_portkiir(0, 0x15, B10000011);
I2c_lcd_portkiir(0, 0x15, B00000011);
delay(1);
I2c_lcd_portkiir(0, 0x15, B10000010);
I2c_lcd_portkiir(0, 0x15, B00000010);
I2c_lcd_portkiir(0, 0x15, B10001000);
I2c_lcd_portkiir(0, 0x15, B00001000);
delay(1);
I2c_lcd_portkiir(0, 0x15, B10000000);
I2c_lcd_portkiir(0, 0x15, B00000000);
I2c_lcd_portkiir(0, 0x15, B10001000);
I2c_lcd_portkiir(0, 0x15, B00001000); //'Display off, cursor off, blink off
delay(1);
I2c_lcd_portkiir(0, 0x15, B10000000);
I2c_lcd_portkiir(0, 0x15, B00000000);
I2c_lcd_portkiir(0, 0x15, B10001100);
I2c_lcd_portkiir(0, 0x15, B00001100); //'display on, cursor off, blinking off
delay(1);
I2c_lcd_portkiir(0, 0x15, B10000000);
I2c_lcd_portkiir(0, 0x15, B00000000);
I2c_lcd_portkiir(0, 0x15, B10000001);
I2c_lcd_portkiir(0, 0x15, B00000001);
delay(1);
}
void loop()
{
// MCPstore (0,gpioa, 0x4000);
// delay(1000);
// MCPstore (0,gpioa, 0x0000);
// delay(1000);
I2c_lcd_portkiir(0, 0x15, 0x40);
delay(1000);
I2c_lcd_portkiir(0, 0x15, 0x00);
delay(1000);
}
void MCPstore (byte i2caddress, byte i2cregister, word i2cdata) // Store 16 bits in specified register of MCP23017
{
byte controlbyte = B0100000 | i2caddress; // note that bit 0 not used b/c 7-bit opcode for Wire library
Wire.beginTransmission(controlbyte);
Wire.send(i2cregister);
Wire.send(loByte(i2cdata));
Wire.send(hiByte(i2cdata));
Wire.endTransmission();
}
void I2c_lcd_portkiir(byte i2caddress, byte i2cregister, byte I2c_lcd_b)
{
byte controlbyte = B0100000 | i2caddress;
//bitWrite(I2c_lcd_b, 6, 1);
Wire.beginTransmission(controlbyte);
Wire.send(i2cregister);
Wire.send(I2c_lcd_b);
Wire.endTransmission();
}
Robert
Elektronbűvölő
Hozzászólások: 10213 Csatlakozott: 2005. december 9. péntek, 7:00
Hozzászólás
Szerző: Robert » 2011. november 9. szerda, 14:42
A kovetkezo lepes, hogy kiirsz valami kodot - az maga a karakter...
Pl. a 65-t kuldod ki, akkor egy A betu kerul a 0,0 pozicioba...
Ami tipp meg, hogy I2C portbovitore valo fuggvenykonyvtarral kinalod meg. Igy a sima LCD parancsok hasznalhatoak.
http://avr.tavir.hu/modules.php?name=Do ... oad&cid=17
EthShield LCD-vez. minta alapján....
Moon_Walker
DrótVégénSzéndarab
Hozzászólások: 35 Csatlakozott: 2011. szeptember 29. csütörtök, 6:00
Hozzászólás
Szerző: Moon_Walker » 2011. november 9. szerda, 16:23
Köszi Robi!
végülis összegereblyéztem a kiírást....
elég sokat küszködtem, és a felét sem nagyon értem, de változtatni kellett ezt-azt a libekben a Port-B használata miatt.
Ha érdekel valakit felrakhatom a libeket/progit:
cLCD+MCP23017.
Robert
Elektronbűvölő
Hozzászólások: 10213 Csatlakozott: 2005. december 9. péntek, 7:00
Hozzászólás
Szerző: Robert » 2011. november 9. szerda, 16:33
file cserebere alá, ha megoldható
Köszönöm szépen....
Moon_Walker
DrótVégénSzéndarab
Hozzászólások: 35 Csatlakozott: 2011. szeptember 29. csütörtök, 6:00
Hozzászólás
Szerző: Moon_Walker » 2011. november 10. csütörtök, 9:11
Feltöltöttem egy RC1-et ide a csere-bere szekcióba:
"wiznet_sd_1wire_rtc_lcd.rar"
Jackal
Újonc
Hozzászólások: 12 Csatlakozott: 2012. június 30. szombat, 6:00
Hozzászólás
Szerző: Jackal » 2012. július 15. vasárnap, 12:14
Sziasztok,
Egy kis segítségre lenne szükségem, Ethmax Shielden keresztül (ha jól gondolom I2C-vel) nem tudom működésre bírni a HD44780-es LCD-t.
Innen vadásztam vezérlő könyvtárt hozzá:
http://arduino.cc/playground/Code/LCDi2c
,de se 0x20 se 0x21-es porton nem hajlandó menni még egy nyavadt hello world se... :S
Az lcd maga a sima alapboardra kötve teljesen jó.
Robert
Elektronbűvölő
Hozzászólások: 10213 Csatlakozott: 2005. december 9. péntek, 7:00
Hozzászólás
Szerző: Robert » 2012. július 15. vasárnap, 13:48
Melyik EthMax? A letöltések közt nem találtad a mintát?