LCD20x4 I2C
Moderátori: psichac, Moderátori
-
- Stály člen
- Príspevky: 167
- Dátum registrácie: 28 Sep 2009, 00:00
- Bydlisko: Skalica
LCD20x4 I2C
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!
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
- Tribec Zacks
- 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
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.
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.
-
- Stály člen
- Príspevky: 167
- Dátum registrácie: 28 Sep 2009, 00:00
- Bydlisko: Skalica
Re: LCD20x4 I2C
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.
ď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
- jirka.jirka.
- Ultimate člen
- Príspevky: 1538
- Dátum registrácie: 17 Okt 2008, 00:00
- Bydlisko: Uherské Hradiště
- Kontaktovať používateľa:
-
- Ultimate člen
- Príspevky: 2567
- Dátum registrácie: 20 Júl 2010, 00:00
- Bydlisko: okolie KE
- Vek: 27
Re: LCD20x4 I2C
Á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
- boraicho
- Ultimate člen
- Príspevky: 12407
- Dátum registrácie: 03 Feb 2007, 00:00
- Bydlisko: Prešov
- Vek: 35
- Kontaktovať používateľa:
Re: LCD20x4 I2C
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.
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
3D REBEL II + PLA + PETG
CNC 1810 na DPS
- Tribec Zacks
- 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
@Boraicho:
hadam pomoze, je to lahke a ak pises kod na mcu tak by si to mal vedet
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.
-
- Ultimate člen
- Príspevky: 3963
- Dátum registrácie: 04 Feb 2013, 22:04
- Bydlisko: U alibabky v Poprade
- Vek: 32
Re: LCD20x4 I2C
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
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
0
Motto: Nikto nie je tak velky, aby sa nevosiel do truhly.
- boraicho
- Ultimate člen
- Príspevky: 12407
- Dátum registrácie: 03 Feb 2007, 00:00
- Bydlisko: Prešov
- Vek: 35
- Kontaktovať používateľa:
Re: LCD20x4 I2C
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
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
3D REBEL II + PLA + PETG
CNC 1810 na DPS
-
- 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
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.jirka.jirka. napísal:Myslím si, že to vlastně chyba není. Protože jsi to zapsal v dekadickém tvaru.
Klasické C prefix
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í.
- Tribec Zacks
- 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
@peterple,
gcc / gnu arm toolchain s tym tiez nema problem.
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.
- boraicho
- Ultimate člen
- Príspevky: 12407
- Dátum registrácie: 03 Feb 2007, 00:00
- Bydlisko: Prešov
- Vek: 35
- Kontaktovať používateľa:
Re: LCD20x4 I2C
0xb? čo to je? ja všade zapisujem 0xFF; alebo 0b11111111; alebo 255;
osmičkove nepouživam, neviem..
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
3D REBEL II + PLA + PETG
CNC 1810 na DPS
- jirka.jirka.
- Ultimate člen
- Príspevky: 1538
- Dátum registrácie: 17 Okt 2008, 00:00
- Bydlisko: Uherské Hradiště
- Kontaktovať používateľa:
Re: LCD20x4 I2C
Jsem na tom úplně stejně.0xb? čo to je? ja všade zapisujem 0xFF; alebo 0b11111111; alebo 255;
osmičkove nepouživam, neviem..
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ě.
0
-
- 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
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ť
Môžete na tom nechať pár hodín debugovania prečo to nefunguje do sto ale iba do 64.
Kód: Vybrať všetko
if (i<0100){
}
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
-
- Stály člen
- Príspevky: 167
- Dátum registrácie: 28 Sep 2009, 00:00
- Bydlisko: Skalica
Re: LCD20x4 I2C
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.
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
- Tribec Zacks
- 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
gogo, ta tvoja funkcia na softwarove i2c vypada trochu podozrivo:
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
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;
}
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.
-
- 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
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.
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í.
- Tribec Zacks
- 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
@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
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.
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);
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.
-
- Stály člen
- Príspevky: 167
- Dátum registrácie: 28 Sep 2009, 00:00
- Bydlisko: Skalica
Re: LCD20x4 I2C
Ď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.
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
- Tribec Zacks
- 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
bez problemu, niekedy je lahsie vidiet problem inymi ocami.
daj vediet ako ti to ide.
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.
-
- Podobné témy
- Odpovedí
- Zobrazení
- Posledný príspevok
-
- 17 Odpovedí
- 2413 Zobrazení
-
Posledný príspevok od používateľa Sani1