Och du använder de fyra höga bitarna på LCD'n, inte de låga?SeniorLemuren skrev:Dubbeldubbelkollat med ohmbrygga.
Problem med flyttning av program i C *LÖST*
Re: Problem med flyttning av program i C
Re: Problem med flyttning av program i C
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.
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.
- SeniorLemuren
- Inlägg: 8407
- Blev medlem: 26 maj 2009, 12:20:37
- Ort: Kristinehamn
Re: Problem med flyttning av program i C
Här är initialiseringen som jag följt. Har lagt på ytterligare på tiderna.
- SeniorLemuren
- Inlägg: 8407
- Blev medlem: 26 maj 2009, 12:20:37
- Ort: Kristinehamn
Re: Problem med flyttning av program i C
Testa att vända på strobe-signalen, så att den vilar hög.
-
- Inlägg: 600
- Blev medlem: 26 juli 2011, 20:58:06
Re: Problem med flyttning av program i C
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
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
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
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.
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.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
- SeniorLemuren
- Inlägg: 8407
- Blev medlem: 26 maj 2009, 12:20:37
- Ort: Kristinehamn
Re: Problem med flyttning av program i C
Ä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:
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?
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))
Kod: Markera allt
LCD_STROBE();
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
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.
#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
Tror inte du har några alternativ. Det kan vara så att kompilatorn optimerar bort viktiga saker.SeniorLemuren skrev:Ändrade till 50 mS i början av strulet. 5 mS var en felskrivning.
Verifierat assemblerkoden? Nej, hoppas slippa.
Ok, det var synd.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.
Ä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.
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.Vad jag funderar på är hur det funkar med strobningen.
Den ser ut ju ut så här:och anropas:Kod: Markera allt
#define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0))
När man vill skicka data. Jag förstår inte riktigt hur det funkar?Kod: Markera allt
LCD_STROBE();
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?
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
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?
I alla andra kompilatorer, brukar man inkludera en processorheader.
Typ:
Kod: Markera allt
#include "p16f6xx.h"
Vad finns i LCD.h?
Re: Problem med flyttning av program i C
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.SeniorLemuren skrev: Den ser ut ju ut så här:och anropas:Kod: Markera allt
#define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0))
När man vill skicka data. Jag förstår inte riktigt hur det funkar?Kod: Markera allt
LCD_STROBE();
Båda dessa skrivsätt ska ge samma kod:
Kod: Markera allt
PORTA = 0, TRISA = 0;
PORTA = 0;
TRISA = 0;
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.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 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.