PIc16 Hitech och 44780

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Zajber
Inlägg: 451
Blev medlem: 19 oktober 2009, 22:07:16
Skype: Andreas.fridh85
Ort: Rödön
Kontakt:

Re: PIc16 Hitech och 44780

Inlägg av Zajber »

Låter fint det, jag återkommer när jag har fått den nya lcd-displayen.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIc16 Hitech och 44780

Inlägg av sodjan »

> Maila en adress så skickar jag en LCD att labba med.

Jag får nog ta tillbaka det där, jag skickade två istället.
Jag såg att jag hade kvar en del av en äldre modell som i och
för sig saknar backlight, men å andra sidan har original HD44780
controllers (om det nu spelar någon roll). Dessutom kan det
vara trevligt att ha två att labba med istället för en...

Det är postat, kolla "lådan" i morgon...
Användarvisningsbild
Zajber
Inlägg: 451
Blev medlem: 19 oktober 2009, 22:07:16
Skype: Andreas.fridh85
Ort: Rödön
Kontakt:

Re: PIc16 Hitech och 44780

Inlägg av Zajber »

Men dra åt fanders..

Fick displayerna idag. kollade koden programmerade pic:en. Första försöket! DET FUNKAR!!!
Idag är det min dag, tror jag. :D

Tack Sodjan!!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIc16 Hitech och 44780

Inlägg av sodjan »

Jahaja, där ser man. Ja det gäller att ha en jäkla tur ibland !
Eller var det inte bara tur ? :-)
Användarvisningsbild
Zajber
Inlägg: 451
Blev medlem: 19 oktober 2009, 22:07:16
Skype: Andreas.fridh85
Ort: Rödön
Kontakt:

Re: PIc16 Hitech och 44780

Inlägg av Zajber »

Nu kommer det liter fler roliga frågor, nu när jag har suttit och kört lite olika saker på displayen.

Hur gör man enklast för att skicka ett heltalsvärde till displayen, jag har några heltal och vill konvertera dessa till strängar för att kunna skickas med lcd_puts?

Jag kör hightech C.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIc16 Hitech och 44780

Inlägg av sodjan »

Tja, "som vanligt" antar jag...
Vad är problemet ??
Användarvisningsbild
Zajber
Inlägg: 451
Blev medlem: 19 oktober 2009, 22:07:16
Skype: Andreas.fridh85
Ort: Rödön
Kontakt:

Re: PIc16 Hitech och 44780

Inlägg av Zajber »

Hehe. problemt är att lcd_puts inte kan formatera heltalsvärden, Så om jag skickar en char så kommer jag få ascii-tecknet som motsvarar värdet.

Jag letar således efter en itos funktion.
Användarvisningsbild
Zajber
Inlägg: 451
Blev medlem: 19 oktober 2009, 22:07:16
Skype: Andreas.fridh85
Ort: Rödön
Kontakt:

Re: PIc16 Hitech och 44780

Inlägg av Zajber »

Vi kan göra så här istället. Jag kommer med en lösning. :)

Sida 195 i Hitech C manualen.

Synopsis:

Kod: Markera allt

#include <stdlib.h>
char * itoa (char * buf, int val, int base)
Description
The function itoa converts the contents of val into a string which is stored into buf.
The conversion is performed according to the radix specified in base. buf is assumed
to reference a buffer which has sufficient space allocated to it.
Example

Kod: Markera allt

#include <stdlib.h>
#include <stdio.h>
void
main (void)
{
char buf[10];
itoa(buf, 1234, 16);
printf(" buffer holds %s\n" buf);
}
sneaky
Inlägg: 1621
Blev medlem: 22 juni 2009, 18:38:42

Re: PIc16 Hitech och 44780

Inlägg av sneaky »

edit: Bah, för långsam.

Problemet var väl ganska uppenbart? Han vet inte hur han ska gå från en integer till en sträng.

Lataste sättet (som jag brukar köra med och kommer få skit för alldeles strax) är att helt enkelt använda printf/sprintf. Det man måste göra är att skriva en liten funktion som kompletterar den inbyggda. Något i stil med:

Kod: Markera allt

void putch(char c)
{
putch_lcd(c);
} 
Om man vill undvika monstret printf kan kanske detta vara ett alternativ (har dock ej testat själv såvitt jag kan komma ihåg):
http://forum.htsoft.com/all/showflat.ph ... n/0/page/0
Användarvisningsbild
Zajber
Inlägg: 451
Blev medlem: 19 oktober 2009, 22:07:16
Skype: Andreas.fridh85
Ort: Rödön
Kontakt:

Re: PIc16 Hitech och 44780

Inlägg av Zajber »

Ah! Så genom att ändra putch() till sin egen så kommer printf och sprintf att använda den egna enheten istället om jag har förstått detta rätt?

Om detta resonemang stämmer så låter det ganska smart, förutom att printf är onödigt stor i detta sammanhang.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIc16 Hitech och 44780

Inlägg av sodjan »

> Så om jag skickar en char så kommer jag få ascii-tecknet som motsvarar värdet.

Ja visst. Hur ska den veta vad *du* tycker att din char innehåller ? :-)
LCD rutinen utgår alltid från att du skickar ASCII tecken.

> ...Han vet inte hur han ska gå från en integer till en sträng...

Och det var det jag svarade "som vanligt" på. Men det var inte
tydligt om det hela var en C-fråga, LCD-fråga eller något annat.

Hur som helst, det är ju strängifiering av ganska små integers (max 3 tecken)
som det handlar om. Beroende på hur man vill optimera mellan lathet och
effektiv/kompakt kod så kan man använda lite olika metoder, spritf(), itoa(),
en optimerad C-rutin för just det eller en optimerad inline-ASM snutt t.ex.
sneaky
Inlägg: 1621
Blev medlem: 22 juni 2009, 18:38:42

Re: PIc16 Hitech och 44780

Inlägg av sneaky »

Zajber: Det stämmer. Med andra ord så kan du till exempel även göra något i stil med:

Kod: Markera allt

void 
putch(unsigned char byte) 
{
	/* output one byte */
	while(!TXIF)	/* set when register is empty */
		continue;
	TXREG = byte;
}
För att spotta ut texten till com-porten. Smidigt :)

sodjan: Ok, jag tyckte dock att med tanke på de saker han nämnde "heltal till sträng", "Hightech C" osv så var det inte så svårt att räkna ut vad han var ute efter. Men men, skit samma, jag ska inte kladda ner tråden mer med onödigt tjaffs.
bos
Inlägg: 2311
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: PIc16 Hitech och 44780

Inlägg av bos »

Mitt tips är att undvika stdio.h så långt det bara går. (s)printf och deras vänner äter upp hur mycket kod som helst, även om de ger en bekväm lösning.

Om jag förstått problemet rätt är det om TS har en variabel, typ kalle = 7;, och försöker göra lcd_send(kalle), förvänta sig siffran "7" på displayen men istället se skräp. Lösningen är att istället göra lcd_send('0' + kalle); så kommer siffra upp.

Detta enkla knep funkar bara för ental. Har man exempelvis talet 163 måste man först dela upp det i hundratal, tiotal och ental, för att sen skriva ut dem en och en (med '0' adderat).

Det finns många olika sätt att splitta tal. Här är ett:

Kod: Markera allt

int hundreds, tens, ones;
int num;

hundreds = tens = ones = 0;
num = 163;

while (num >= 100) {
  hundreds++;
  num -= 100;
}

while (num >= 10) {
  tens++;
  num -= 10;
}

ones = num;

lcd_send('0' + hundreds);
lcd_send('0' + tens);
lcd_send('0' + ones);
Lite mer skitgöra än att använda printf() men man sparar runt 2kb programminne.
Användarvisningsbild
Zajber
Inlägg: 451
Blev medlem: 19 oktober 2009, 22:07:16
Skype: Andreas.fridh85
Ort: Rödön
Kontakt:

Re: PIc16 Hitech och 44780

Inlägg av Zajber »

Det var något liknande jag funderade på först.
Men sen hittade jag itoa(); som gör om heltal till strängar.
Verkar inte ta så mycket minne heller faktiskt, så jag nöjer mig med det.
Skriv svar