LCD20x4 I2C

C,C++,C#

Moderátori: psichac, Moderátori

gogo
Stály člen
Stály člen
Príspevky: 167
Dátum registrácie: 28 Sep 2009, 00:00
Bydlisko: Skalica

LCD20x4 I2C

Príspevok od používateľa gogo » 01 Feb 2018, 09:48

Zdravim všetkých C-čkarov!
Začínavam vám trochu fušovať do remesla.
Skúšam prejsť z asm do c. Robím s mcu x51. Konkrétne C8051F040.
Niečo už sa mi podarilo a teraz sa snažim rozbehať LCD displej
pripojený cez zbernicu I2C. Je to ten modul, čo používajú arduinisti.
LCD 20x4 a PCF8574.
Dva dni sa s tým hrám a nedarí sa mi to rozchodiť.
Mohli by ste sa prosím niekto pozrieť na priložený súbor a poradiť mi,
kde a čo robím zle.

Ďakujem!
Prílohy
lcd_i2c.c
(5.19 KiB) 107 stiahnutí
0

Používateľov profilový obrázok
Tribec Zacks
Pokročilý člen
Pokročilý člen
Príspevky: 709
Dátum registrácie: 26 Jún 2010, 00:00
Bydlisko: Levice / Cork IRL
Vek: 41
Kontaktovať používateľa:

Re: LCD20x4 I2C

Príspevok od používateľa Tribec Zacks » 01 Feb 2018, 12:05

zdar gogo, iba zbezne som ti na to pozrel, neviem co to mas za kompiler, ale nemali by byt tie binarne zapisy s prefixom -> 0b00000000?
btw pls, prepis ich na hexadecimalny zapis, toto je nieco strasne pozerat, ved to ide z hlavy a priamo medzi bin a hex.
0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.

gogo
Stály člen
Stály člen
Príspevky: 167
Dátum registrácie: 28 Sep 2009, 00:00
Bydlisko: Skalica

Re: LCD20x4 I2C

Príspevok od používateľa gogo » 01 Feb 2018, 13:08

ahoj,
ďakujem za odpoveď!
Momentálne som v práci, ale keď prídem domov, hneď vyskúšam.
Kompiler je súčasťou IDE od Silabsu.
To ma nenapadlo s tým prefixom, keď nehlásil chybu.
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1537
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: LCD20x4 I2C

Príspevok od používateľa jirka.jirka. » 01 Feb 2018, 15:53

Myslím si, že to vlastně chyba není. Protože jsi to zapsal v dekadickém tvaru.
0

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2562
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: LCD20x4 I2C

Príspevok od používateľa maskrtnik01 » 01 Feb 2018, 16:35

Áno. Čakal by som síce warning, že také vysoké číslo sa do jedného bajtu nevôjde. Ale syntaktická chyba to nie je, len to znamená niečo iné.
0

Používateľov profilový obrázok
boraicho
Ultimate člen
Ultimate člen
Príspevky: 12406
Dátum registrácie: 03 Feb 2007, 00:00
Bydlisko: Prešov
Vek: 35
Kontaktovať používateľa:

Re: LCD20x4 I2C

Príspevok od používateľa boraicho » 01 Feb 2018, 17:05

Tribec, frajer si ked vieš zhlavy hned prevadzať bin na hex :)
ja tiež použivam iba bin, ved konec koncov aj v DS je večšina v bin popisana.
0
"Aj nevinne vyzerajúca súčiastka, môže byť príčinou nefunkčnosti zariadenia a tou kondenzator 100% je"
3D REBEL II + PLA + PETG
CNC 1810 na DPS

Používateľov profilový obrázok
Tribec Zacks
Pokročilý člen
Pokročilý člen
Príspevky: 709
Dátum registrácie: 26 Jún 2010, 00:00
Bydlisko: Levice / Cork IRL
Vek: 41
Kontaktovať používateľa:

Re: LCD20x4 I2C

Príspevok od používateľa Tribec Zacks » 01 Feb 2018, 17:13

@Boraicho:

hadam pomoze, je to lahke a ak pises kod na mcu tak by si to mal vedet :)

Kód: Vybrať všetko

DEC	 BIN    HEX
0		0000	0x0
1		0001	0x1
2		0010	0x2
3		0011	0x3
4		0100	0x4
5		0101	0x5
6		0110	0x6
7		0111	0x7
8		1000	0x8
9		1001	0x9
10		1010	0xA
11		1011	0xB
12		1100	0xC
13		1101	0xD
14		1110	0xE
15		1111	0xF


0b 0111 1010
=
0111 1010
0x7  0xA
=
0x7A

0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.

alidedko
Ultimate člen
Ultimate člen
Príspevky: 3963
Dátum registrácie: 04 Feb 2013, 22:04
Bydlisko: U alibabky v Poprade
Vek: 32

Re: LCD20x4 I2C

Príspevok od používateľa alidedko » 01 Feb 2018, 17:29

Ja to prevadzam tak, ako som si zvykol:
Sprava dolava hodnota bitov 1-2-4-8, spocitam jednotkove pozicie, do 9 je cislo, od 9 hodnota A-F.

Jednoduche, rychle. Po case to je nieco ako pozriet na hodinky, ak je velka rucicka na 12 a mala na 3, vies, ze su 3 hodiny :D
0
Motto: Nikto nie je tak velky, aby sa nevosiel do truhly.

Používateľov profilový obrázok
boraicho
Ultimate člen
Ultimate člen
Príspevky: 12406
Dátum registrácie: 03 Feb 2007, 00:00
Bydlisko: Prešov
Vek: 35
Kontaktovať používateľa:

Re: LCD20x4 I2C

Príspevok od používateľa boraicho » 01 Feb 2018, 17:34

aha takto , nee čosi učiť sa je to zbytočne u mňa, ked to je v bin tak aspon rovno vidim ktory bit je a ktory nieje zapnuty ale diky :)
v bin je to pohoda. a ja som už stary na take triky
0
"Aj nevinne vyzerajúca súčiastka, môže byť príčinou nefunkčnosti zariadenia a tou kondenzator 100% je"
3D REBEL II + PLA + PETG
CNC 1810 na DPS

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: LCD20x4 I2C

Príspevok od používateľa peterple » 01 Feb 2018, 18:02

jirka.jirka. napísal:Myslím si, že to vlastně chyba není. Protože jsi to zapsal v dekadickém tvaru.
No tak pozor. V C konštanty začínajúce nulou sú osmičkové čísla. Takže tam má pomiešané desiatkové a osmičkové konštanty. Čakať že kompiler upozorní na príliš veľkú konštantu je chyba, ani len warningu to nie je hodné. Hold programovanie v C je prechádzka mínovým poľom. A že ich tam takýchto je ako maku. Lenže veľa vecí sa ťahá aj do vyšších jazykov. Napr javascript, tam tiež 0 na začiatku znamená osmičkovú konštantu. Ale kedže ľudí čo pozná takéto historické sústavy je už málo tak v strict móde je to už error.

Klasické C prefix 0xb 0b nepozná. Videl som to na AVR a teraz to má kotlin. Napríklad Arduino to má obabrané cez textové makrá.
0
Naposledy upravil/-a peterple v 01 Feb 2018, 19:32, upravené celkom 1 krát.
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
Tribec Zacks
Pokročilý člen
Pokročilý člen
Príspevky: 709
Dátum registrácie: 26 Jún 2010, 00:00
Bydlisko: Levice / Cork IRL
Vek: 41
Kontaktovať používateľa:

Re: LCD20x4 I2C

Príspevok od používateľa Tribec Zacks » 01 Feb 2018, 18:24

@peterple,
gcc / gnu arm toolchain s tym tiez nema problem.
0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.

Používateľov profilový obrázok
boraicho
Ultimate člen
Ultimate člen
Príspevky: 12406
Dátum registrácie: 03 Feb 2007, 00:00
Bydlisko: Prešov
Vek: 35
Kontaktovať používateľa:

Re: LCD20x4 I2C

Príspevok od používateľa boraicho » 01 Feb 2018, 18:33

0xb? čo to je? ja všade zapisujem 0xFF; alebo 0b11111111; alebo 255;

osmičkove nepouživam, neviem..
0
"Aj nevinne vyzerajúca súčiastka, môže byť príčinou nefunkčnosti zariadenia a tou kondenzator 100% je"
3D REBEL II + PLA + PETG
CNC 1810 na DPS

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1537
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: LCD20x4 I2C

Príspevok od používateľa jirka.jirka. » 01 Feb 2018, 18:59

0xb? čo to je? ja všade zapisujem 0xFF; alebo 0b11111111; alebo 255;

osmičkove nepouživam, neviem..
Jsem na tom úplně stejně. :D
Používám pouze: binární, desítková, šectnácková a zatím vždy stačilo.

Jinak zápis v binárním kódu jsem používal hodně u 8-bit, ale nyní u 32-bit už jsem musel jít do HEXa, protože těch 1 a 0 už bylo hodně. :D
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: LCD20x4 I2C

Príspevok od používateľa peterple » 01 Feb 2018, 19:25

0xb je hlúposť. Malo to byť 0b. No a s tou osmičkovou to nie je také isté že ju nepoužívate. Stačí napísať

Kód: Vybrať všetko

if (i<0100){
}
Môžete na tom nechať pár hodín debugovania prečo to nefunguje do sto ale iba do 64.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

gogo
Stály člen
Stály člen
Príspevky: 167
Dátum registrácie: 28 Sep 2009, 00:00
Bydlisko: Skalica

Re: LCD20x4 I2C

Príspevok od používateľa gogo » 01 Feb 2018, 20:00

zdavim,
skúsil som zadať prefix 0b, ale hlásilo chybu. Tento kompiler
binárne čísla nepozná. Ako ste písali, čísla začínajúce 0 = 8-ková sústava.
Prepísal som do hexa a niečo sa pohlo.
Inicializácia prebehla, ale len po časť príkaz 0x02 4-bitová komunikácia.
Nasledujúca sekvencia príkazov pomocou funkcie lcdcmd nejde a ani
data nejdú zapisovať pomocou funkicie lcdchar.
0

Používateľov profilový obrázok
Tribec Zacks
Pokročilý člen
Pokročilý člen
Príspevky: 709
Dátum registrácie: 26 Jún 2010, 00:00
Bydlisko: Levice / Cork IRL
Vek: 41
Kontaktovať používateľa:

Re: LCD20x4 I2C

Príspevok od používateľa Tribec Zacks » 01 Feb 2018, 21:16

gogo, ta tvoja funkcia na softwarove i2c vypada trochu podozrivo:

Kód: Vybrať všetko

unsigned char send(unsigned char d)
{
	unsigned char i, m=0x80, ack;
	scl=0;
	delay_us(5);

	for (i=0;i<8;i++)
		{
		sda=d&m;                      <----------- sda mas definovany ako single bit (0) na porte 4, 'd' a 'm' tu mas ako 8bit premenne
		m=m>>1;                       <----------- tu shiftujes m, predpokladam ze chces kontrolovat stav kazdeho bitu a ten priradit na port
		delay_us(12);                                 takto je to nespravne.
		scl=1;
		delay_us(12);
		scl=0;
		delay_us(12);
		}
	sda=1;
	delay_us(12);
	scl=1;
	delay_us(12);
	ack=sda;
	scl=0;
	delay_us(25);

	return ack;
}
tu som ti nasiel link na softwarove i2c, mozes mu tam urobit kratke delaye aby to vychadzalo na zakladnych 100khz +/-.
predpokladam ale ze niesi na nejakych extra rychlych frekvenciach, tak to mozno aj mozes nechat tak ako je a iba to preportuj na svoj kompiler, define <-> sbit a podobne.. ak mas logicky analyzer, tak sa ho neboj pouzit :)
ak si stym nebudes vedet dat rady tak pis. najskor ale rozbehaj samotne I2C aby si si bol isty ze funguje ako ma, potom pripoj lcd a pokracuj dalej
0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: LCD20x4 I2C

Príspevok od používateľa peterple » 01 Feb 2018, 22:05

single bit je zase mimo C štandart. Lenže 8051 má niečo také ako pole jednobitových premenných, ktoré sú premapované do niektorých IO adries. Inak povedané má 8051 inštrukcie ktoré dokážu manipulovať s jediným bitom a dokonca má aj taký register ktorý zastáva funkciu jednobitového akumulátora (Carry flag). Celé to tvorí taký bitový procesor a je to veľmi šikovné. Assemblerista to určite pozná.
Druhá vec je ako to ten kompiler má naimplementované. Môže to byť cez tú C boolovskú logiku že 0 je false a čokoľvek iné je true. V takomto prípade by tá Gogova konštrukcia fungovala. Ale na druhej strane to kludne môže byť aj tak ako to zobral Zacks. Teda zobere sa nultý bit toho výsledku logického súčinu.
Toto si treba vyskúšať trebárs aj na LEDke ak nemáš logický analyzátor aby bolo jasno ako to kompilátor berie.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
Tribec Zacks
Pokročilý člen
Pokročilý člen
Príspevky: 709
Dátum registrácie: 26 Jún 2010, 00:00
Bydlisko: Levice / Cork IRL
Vek: 41
Kontaktovať používateľa:

Re: LCD20x4 I2C

Príspevok od používateľa Tribec Zacks » 01 Feb 2018, 23:10

@peterple, ja si 8051 pamatam len velmi zbezne este zo skolskych zaciatkov, moj prvy mcu encounter :) viem ze vie single bit manipulaciu nativne v hardwari, aj rovno zapis na port a citanie z toho isteho registra... ale prisiel mi ten zapis v kode trochu podozrivy, skor by som cakal nieco na styl sda = (d&m) ? 1 :0; alebo cez if... ...treba poznat svoj kompiler co robi veru :)

kazdopadne pis, radi ti tu na to kukneme, btw dalsi moj postreh z kodu, funkcia lcdcmd(unsigned char char)...
zoberme si 'clear' lcd command 0x01

Kód: Vybrať všetko

lcddata=cmd;
// lcddata = 0x01

lcddata=lcddata & 0xF0;
// lcddata = 0x00

lcddata=lcddata | 0xFC;	// e=1, rs=0
// lcddata = 0xFC

sendbytei2c(0xFC);

delay_us(50);
lcddata=lcddata & 0xF8;	// e=0
// lcddata = 0xF8

sendbytei2c(0xF8);
delay_us(1000);

lcddata=cmd;
// lcddata = 0x01

lcddata=lcddata << 4;		// posun o 4 bity do prava
// lcddata = 0x10

lcddata=lcddata & 0xF0;
// lcddata = 0x10

lcddata=lcddata | 0xFC;	// e=1, rs=0
// lcddata = 0xFC

sendbytei2c(0xFC);

delay_us(50);
lcddata=lcddata & 0xF8;	// e=0
// lcddata = 0xFC

sendbytei2c(0xFC);
delay_ms(20);
niesom si isty ci to vypada spravne (v kombinacii s tou podozrivou send funkciou)....
ak mi unika chovanie tvojho toolchainu tak sa ospravedlnujem, ja by som mozno volil trochu iny pristup. kazdopadne pis ako ide progress. ako pisal peterple, tak to spomal aj na par hz delayami a vystacis si aj s ledkou okukat ci to shiftuje data a clk, tak ako ma.
0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.

gogo
Stály člen
Stály člen
Príspevky: 167
Dátum registrácie: 28 Sep 2009, 00:00
Bydlisko: Skalica

Re: LCD20x4 I2C

Príspevok od používateľa gogo » 02 Feb 2018, 08:11

Ďakujem chlapi za rady!
Tribec, máš pravdu. Je tam chyba.

lcddata=lcddata & 11110000;
lcddata=lcddata | 1111 1100; // e=1, rs=0
sendbytei2c(lcddata);

kde sú tie 4 podčiarknuté jednotky, tak tam musia byť nuly,
lebo to posiela horný pol byt a ten je 0 a ja tam mám F.
0

Používateľov profilový obrázok
Tribec Zacks
Pokročilý člen
Pokročilý člen
Príspevky: 709
Dátum registrácie: 26 Jún 2010, 00:00
Bydlisko: Levice / Cork IRL
Vek: 41
Kontaktovať používateľa:

Re: LCD20x4 I2C

Príspevok od používateľa Tribec Zacks » 02 Feb 2018, 14:29

bez problemu, niekedy je lahsie vidiet problem inymi ocami.
daj vediet ako ti to ide.
0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok