Sida 2 av 4
Re: Problem med flyttning av program i C
Postat: 17 september 2012, 17:15:13
av TomasL
SeniorLemuren skrev:Dubbeldubbelkollat med ohmbrygga.

Och du använder de fyra höga bitarna på LCD'n, inte de låga?
Re: Problem med flyttning av program i C
Postat: 17 september 2012, 17:53:05
av Icecap
Vissa 1x16 LCD är egentligen kopplat som 2x16 fast de visas som första delen av rad 1 och sista delen av rad 2. Detta ger problem vid initieringen och utskriften. Men det är bara vissa! Andra 1x16 ska initieras som 1-radiga.
Men hur man än gör blir kontrasten skaplig korrekt när väl initieringen är väl genomförd och då detta helt klart inte initieras varken rätt eller fel är det antingen så att det inte är en HD44780-krets eller att initieringsdatan är fel.
Sedan är displayernas arbetsfrekvens ställd med en RC-oscillator, detta betyder att man måste sänka initieringshastigheten en del för att vara säker på att allt rullar på.
Själv hade jag lödd ett annat display på med lite trådar, ett display jag VET fungerar. Jag har liggande om det behövs. Sedan kunde man enkelt avgöra vilken del som inte vill: display eller µC.
Re: Problem med flyttning av program i C
Postat: 17 september 2012, 18:25:27
av SeniorLemuren
Här är
initialiseringen som jag följt. Har lagt på ytterligare på tiderna.
Re: Problem med flyttning av program i C
Postat: 17 september 2012, 18:30:55
av SeniorLemuren
Ingen skillnad, endast 8 rutor.
Re: Problem med flyttning av program i C
Postat: 17 september 2012, 18:51:21
av bearing
Testa att vända på strobe-signalen, så att den vilar hög.
Re: Problem med flyttning av program i C
Postat: 17 september 2012, 21:49:28
av ElectricNooB
Hur är timingen med E pinnen jämfört med datan?
Re: Problem med flyttning av program i C
Postat: 17 september 2012, 21:59:06
av Icecap
Som sagt: initieringen skiter sig - och jag tror att jag har hittat anledningen!
Kod: Markera allt
/* initialise the LCD - put into 4 bit mode */
void lcd_init()
{
char init_value;
TRISB = 0b00000000;
CMCON = 0b00000111; //Comparators Off
TRISA = 0b00000000;
LCD_RS = 0;
LCD_EN = 0;
init_value = 0x30; // ****** 2 lägsta bitarna i höga nibbles <<= Måste ändras till 0x03, se nedan
__delay_ms(50); // wait 15mSec after power applied,
LCD_DATA = init_value; // <<= Effekten blir att 0x30 skrivs till LCD-modulen - men det ser bara 0x00 då den bara använder de lägsta 4 bit.
LCD_STROBE();
__delay_ms(5);
LCD_STROBE();
__delay_us(200);
LCD_STROBE();
__delay_us(200);
LCD_DATA = 0x20; // Four bit mode <<= Fel här med, ska vara 0x02
LCD_STROBE();
lcd_write(0x28); // Set interface length
lcd_write(0x0F); // Display On, Cursor On, Cursor Blink
lcd_clear(); // Clear screen
lcd_write(0x06); // Set entry Mode
}
Re: Problem med flyttning av program i C
Postat: 17 september 2012, 22:07:14
av bearing
Nej nu har du vänt på det. Han har ju anslutit de höga bitarna i PORTB, det är därför han har ändrat 0x03 till 0x30 vid initieringen.
Re: Problem med flyttning av program i C
Postat: 17 september 2012, 22:27:28
av Icecap
Jahopp... Jag skulle tydligen ha lagt mig tidigare! Dock måste varje pinnes funktion verifieras i detta läge!
Re: Problem med flyttning av program i C
Postat: 17 september 2012, 22:48:27
av TomasL
Jag skulle testa med att förlänga den första 5ms fördröjningen till det dubbla.
Har du gått igenom assemblerkoden för att verifiera att du verkligen fått det du vill ha.
Du kan singelstega genom koden, displayen skall kunna initieras även då.
Dessutom initierar du displayen till 4 bitar 2 rader 5x7
btw har du kollat kontrastpinnen så den är rätt kopplad och har rätt spänning.
Här är ett bra datablad från Seiko.
Re: Problem med flyttning av program i C
Postat: 18 september 2012, 05:05:08
av SeniorLemuren
Ändrade till 50 mS i början av strulet. 5 mS var en felskrivning.
Verifierat assemblerkoden? Nej, hoppas slippa.
Kan inte köra debugg på LCD-kortet, inga anslutningar till Pickit2. Visste inte att det gick.
Initierar du displayen till 4 bitar 2 rader 5x7. Skall tydligen vara så. (En 16 teckens rad är delad i två 8 bitars rader)
Kontrastpinnen har rätt spänning/pol och har funktion när man ändrar poten.
Vad jag funderar på är hur det funkar med strobningen.
Den ser ut ju ut så här:
Kod: Markera allt
#define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0))
och anropas:
När man vill skicka data. Jag förstår inte riktigt hur det funkar?
I dom utmärkta documenten som TomasL länkade så anges "Enable cycle time" rill 500 nS och "Enable pulse width high levet" till 230 nS. Blir den det om man gör som ovanstående?
Re: Problem med flyttning av program i C
Postat: 18 september 2012, 05:58:29
av Icecap
Rent faktisk känns det fel!
#define LCD_STROBE() {LCD_EN = 1; LCD_EN = 0;}
är rätt.
Det blir en sorts inline direktiv men en NOP mellan de två skulle nog inte skada - men har det fungerat förut lär det fungera igen.
Re: Problem med flyttning av program i C
Postat: 18 september 2012, 07:36:54
av TomasL
SeniorLemuren skrev:Ändrade till 50 mS i början av strulet. 5 mS var en felskrivning.
Verifierat assemblerkoden? Nej, hoppas slippa.
Tror inte du har några alternativ. Det kan vara så att kompilatorn optimerar bort viktiga saker.
Kan inte köra debugg på LCD-kortet, inga anslutningar till Pickit2. Visste inte att det gick.
Initierar du displayen till 4 bitar 2 rader 5x7. Skall tydligen vara så. (En 16 teckens rad är delad i två 8 bitars rader)
Kontrastpinnen har rätt spänning/pol och har funktion när man ändrar poten.
Ok, det var synd.
Är du hundra säker på att den skall delas i två 8-teckens rader, verkar lite ovanligt, att större displayer är delade är vanligt, men inte denna lilla.
Vad jag funderar på är hur det funkar med strobningen.
Den ser ut ju ut så här:
Kod: Markera allt
#define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0))
och anropas:
När man vill skicka data. Jag förstår inte riktigt hur det funkar?
I dom utmärkta documenten som TomasL länkade så anges "Enable cycle time" rill 500 nS och "Enable pulse width high levet" till 230 nS. Blir den det om man gör som ovanstående?
Om jag fattat dig rätt kör du med 4 MHz, vilket innebär 1us instruktionshastighet, så ditt strobe-makro har totalt 2us cykeltid.
Dock att använda kodmakron är att be om problem, expandera makrot till riktiga kodrader i stället.
Tänk på att de tider som anges i databladen är "absolute minimum"
Re: Problem med flyttning av program i C
Postat: 18 september 2012, 08:01:35
av TomasL
Nu vet jag iofs inte hur Hitec-C funkar.
I alla andra kompilatorer, brukar man inkludera en processorheader.
Typ:
Eller något liknande.
Vad finns i LCD.h?
Re: Problem med flyttning av program i C
Postat: 18 september 2012, 09:39:49
av bearing
SeniorLemuren skrev:
Den ser ut ju ut så här:
Kod: Markera allt
#define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0))
och anropas:
När man vill skicka data. Jag förstår inte riktigt hur det funkar?
Visst ser det lite skumt ut, jag reagerade också på det makrot först. Men det är korrekt C. Jag föredrar helt klart att skriva som i Icecap's förslag.
Båda dessa skrivsätt ska ge samma kod:
Kod: Markera allt
PORTA = 0, TRISA = 0;
PORTA = 0;
TRISA = 0;
SeniorLemuren skrev:
I dom utmärkta documenten som TomasL länkade så anges "Enable cycle time" rill 500 nS och "Enable pulse width high levet" till 230 nS. Blir den det om man gör som ovanstående?
Om f_OSC = 4MHz tar ju varje instruktion 1000ns. Anledningen till att jag föreslog att du skulle låta Enable vila hög är att jag en gång löste problem med en HD44780 på det viset. Med tanke på att signalen heter "Enable" tycker jag att det "känns bättre" om den är aktiv/"enabled" så mycket som möjligt.
Om jag minns rätt skyfflas datan in på nedåtgående flank. Ifall EN-pinnen innehåller ett internt RC-filter eller liknande, kanske signalen genererad av ditt program inte hinner gå tillräckligt hög innan den sedan dras låg, för att lyckas trigga den flanktriggade vippan. Tiderna 500ns/230ns gäller väl en annan krets, om jag förstått rätt. Du har inte databladet för din egen krets, så det är kanske klokt att lägga in en nop() (eller nop2()) mellan LCD_EN = 0 och LCD_EN = 1.