HD44780 LCD initialiseert niet met PIC 18F4550

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Anoniem: 122462

Topicstarter
Ik zit al heel het weekend te zoeken op een fout, maar ik kan deze niet vinden. Daarom heb ik even jullie hulp nodig.

Met een PIC 18F4550 probeer ik een LCD (2x16) aan te sturen met HD44780 controller. Helaas zie ik enkel een zwarte balk bovenaan, wat betekent dat de LCD niet geinitialiseerd is. Ik heb de verbindingen al meermaals gecontrolleerd, zelfs met een andere LCD verbonden dat zeker werkt, maar helaas, het probleem zal hoogstwaarschijnlijk in de software zitten.

Nogtands verloopt de initialisatie volgens mij zoals het zou moeten. Waarschijnlijk zie ik iets over het hoofd. Zou iemand eens een blik willen werpen op mijn code aub?
Misschien hou ik te weinig rekening met andere modules die op die poorten werken, ik weet het niet.

LCD is als volgt aangesloten:

- RW : PORTC1
- RS : PORTC0
- E : PORTC2

- D4 : PORTB4
- D5 : PORTB5
- D6 : PORTB6
- D7 : PORTB7

Code main.c:
http://pastebin.com/hB98apkN

lcd.h: (gebaseerd op http://www.romux.com/boot...f4550/lcd-display-circuit)
http://pastebin.com/cF3Htg7r

Acties:
  • 0 Henk 'm!

  • Mr_gadget
  • Registratie: Juni 2004
  • Laatst online: 16:23

Mr_gadget

C8H10N4O2 powered

Staat je contrast wel goed? Soms is het contrast niet goed ingesteld waardoor je de letters niet kan zien. En heb je de andere pinnen die je niet verbind aan de ground gebonden? Ben verder geen pic expert.

Acties:
  • 0 Henk 'm!

Anoniem: 122462

Topicstarter
Contrast staat goed aangezien ik zwarte balk bovenaan zie staan. Niet gebruikte pinnen van LCD hangen aan massa.

Acties:
  • 0 Henk 'm!

  • flitjes
  • Registratie: Maart 2010
  • Laatst online: 15-10-2024
Weet je zeker dat het contrast niet veel te hoog staat?

Zie je 1 of 2 zwarte balken?

Acties:
  • 0 Henk 'm!

Anoniem: 122462

Topicstarter
één zwarte balk, dat is het niet. Er staat trouwens ook een potentiometer op voor contrast, en als ik eraan draai krijg ik nooit een leeg scherm.

Acties:
  • 0 Henk 'm!

  • flitjes
  • Registratie: Maart 2010
  • Laatst online: 15-10-2024
Klopt de itoa functie wel? Zo ken ik hem namelijk niet.
[code]void UpdateLCD(void)
{
char buffer[10];

itoa(wielCounter, buffer);

while ( BusyXLCD() );
SetDDRamAddr(0x00);
while ( BusyXLCD() );
putrsXLCD(buffer);

}[\code]

http://www.cplusplus.com/reference/cstdlib/itoa/

Schrijf anders als test even een text weg "Hello World!" bijvoorbeeld.

Acties:
  • 0 Henk 'm!

Anoniem: 122462

Topicstarter
Ja, daar moet je nog niet teveel naar kijken. Eerst het lcd scherm geinitialiseerd krijgen, daarna kan ik terug verder aan de slag. Zolang ik die zwarte balk zie bovenaan is het scherm niet geinitialiseerd en zal al de rest die erachter komt ook niet werken.

De fout zal gezocht moeten worden in de initialisatiefunctie van lcd.h vermoed ik.

[ Voor 14% gewijzigd door Anoniem: 122462 op 03-03-2013 21:12 ]


Acties:
  • 0 Henk 'm!

  • flitjes
  • Registratie: Maart 2010
  • Laatst online: 15-10-2024
Dit voorbeeld werk want dit heb ik zelf draaiende gehad op een pic16f690

http://pastebin.com/i2wfskGF
http://pastebin.com/CWRAkuD5
http://pastebin.com/ds95Jb1f

Kijk zelf even naar de verschillen. Als ik tijd heb kijk ik er nog even na voor je.

Acties:
  • 0 Henk 'm!

Anoniem: 122462

Topicstarter
flitjes, duizend maal dank!! Dankzij jouw code werkt het nu.
Ik heb eerst nog mijn code zitten aanpassen, maar dat werkte om een of andere reden niet.
Daarna ben ik volledig herbegonnen met jouw code, en nu werkt het lcd.

Nu nog een methode vinden om kommagetallen op lcd te krijgen.. Blijkbaar is dat minder simpel dan ik dacht.
Niemand die mij daarbij kan helpen?

[ Voor 5% gewijzigd door Anoniem: 122462 op 05-03-2013 21:50 ]


Acties:
  • 0 Henk 'm!

  • flitjes
  • Registratie: Maart 2010
  • Laatst online: 15-10-2024
Mooi dat het werkt. Succes met de ',' :)

Acties:
  • 0 Henk 'm!

Anoniem: 122462

Topicstarter
char buffer[10];
int value = 1000;

sprintf(buffer, (const far rom char*) "%02d.%02d", (int)value, (int)((value-(int)(value))*1000));
lcd_puts(buffer);

Om een of andere reden krijg ik vreemde tekens op lcd, maar dit zou toch moeten werken?
Eigelijk zou ik een float willen tonen met fixed twee cijfers voor en twee cijfers na de komma.
Bv 3.16 wordt dan "03,16"

[ Voor 19% gewijzigd door Anoniem: 122462 op 06-03-2013 22:24 ]


Acties:
  • 0 Henk 'm!

  • flitjes
  • Registratie: Maart 2010
  • Laatst online: 15-10-2024
1. Al die casts zijn nergens voor nodig bij mijn weten.
2. ((value-value)*1000) = 0
3. %d is voor signed integers en print deze decimaal. http://www.cplusplus.com/reference/cstdio/printf/?kw=printf
4. Volgens mij probeer je met de "%02d.%02d" construtie een float te printen. Vergeet niet niet dat value een integer is. 2 integers van elkaar aftrekken levert altijd een integer op.
5. Waarom fixed cijfers? Als je floats kunt gebruiken is dit toch veel makkelijker? Vooral als je gaat rekenen met floats.


Voorbeeld voor floats
#include <stdio.h>
float test = 3.16;
char buffer[10];

void main(void){
sprintf(buffer, "%.02f", test);
printf(buffer);
}

Nu weet ik niet zeker of je floating point support hebt. Kan het zo snel niet vinden. Ik denk van wel.

Voorbeeld fixed:
#include <stdio.h>
int value0 = 3;
int value1 = 16;
char buffer[10];

void main(void){
sprintf(buffer, "%d.%d", value0,value1);
printf(buffer);
}

Nog een tip: Installeer Cygwin (Voor windows, Onder linux kun je gewoon gcc gebruiken PM me maar als je dit wil gebruiken.)
Dan kun je snel kleine C programma's testen. Zoals bijvoorbeeld het voorbeeld dat ik je geef. Dit heb ik zelf even snel getest op mijn pc.
Dus dit werkt als je floating points kunt gebruiken!

Acties:
  • 0 Henk 'm!

Anoniem: 122462

Topicstarter
Blijkbaar kan de C18 library geen floats verwerken met sprintf. Ter info, ik heb het zo opgelost:

Eerst de functie om tekst naar lcd te schrijven ontdubbeld: een voor strings die in programmacode zelf staan, en een voor strings gegenereerd at runtime:

code:
1
2
3
4
5
6
7
8
9
10
11
12
void lcd_puts(char *s)
{
    LCD_RS = 1; // write characters
    while(*s)
        lcd_write(*s++);
}
void lcd_putrs(const rom char *s)
{
    LCD_RS = 1; // write characters
    while(*s)
        lcd_write(*s++);
}


Daarna float converteren naar string op volgende manier:
code:
1
2
    float value = (float)wielCounter/(float)1180;
    sprintf(buffer, "%02d.%03d", (int)value, (int)((value-(int)(value))*1000));


En zo is mijn project nu ook afgewerkt :)
Pagina: 1