Problem med flyttning av program i C *LÖST*

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46933
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Problem med flyttning av program i C

Inlägg av TomasL »

SeniorLemuren skrev:Dubbeldubbelkollat med ohmbrygga. :humm:
Och du använder de fyra höga bitarna på LCD'n, inte de låga?
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Problem med flyttning av program i C

Inlägg 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.
Användarvisningsbild
SeniorLemuren
Inlägg: 8407
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Problem med flyttning av program i C

Inlägg av SeniorLemuren »

Här är initialiseringen som jag följt. Har lagt på ytterligare på tiderna.
Användarvisningsbild
SeniorLemuren
Inlägg: 8407
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Problem med flyttning av program i C

Inlägg av SeniorLemuren »

Ingen skillnad, endast 8 rutor.
bearing
Inlägg: 11675
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Problem med flyttning av program i C

Inlägg av bearing »

Testa att vända på strobe-signalen, så att den vilar hög.
ElectricNooB
Inlägg: 600
Blev medlem: 26 juli 2011, 20:58:06

Re: Problem med flyttning av program i C

Inlägg av ElectricNooB »

Hur är timingen med E pinnen jämfört med datan?
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Problem med flyttning av program i C

Inlägg 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
  }
bearing
Inlägg: 11675
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Problem med flyttning av program i C

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Problem med flyttning av program i C

Inlägg av Icecap »

Jahopp... Jag skulle tydligen ha lagt mig tidigare! Dock måste varje pinnes funktion verifieras i detta läge!
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46933
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Problem med flyttning av program i C

Inlägg 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.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
SeniorLemuren
Inlägg: 8407
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Problem med flyttning av program i C

Inlägg 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:

Kod: Markera allt

LCD_STROBE();
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?
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Problem med flyttning av program i C

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46933
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Problem med flyttning av program i C

Inlägg 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:

Kod: Markera allt

LCD_STROBE();
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"
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46933
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Problem med flyttning av program i C

Inlägg av TomasL »

Nu vet jag iofs inte hur Hitec-C funkar.
I alla andra kompilatorer, brukar man inkludera en processorheader.
Typ:

Kod: Markera allt

#include "p16f6xx.h"
Eller något liknande.

Vad finns i LCD.h?
bearing
Inlägg: 11675
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Problem med flyttning av program i C

Inlägg 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:

Kod: Markera allt

LCD_STROBE();
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.
Skriv svar