Avatar billede _et Praktikant
27. marts 2006 - 21:22 Der er 51 kommentarer og
1 løsning

PIC og HD44780 LCD

Måske burde dette spm være under programmering, men.

Jeg søger noget source til en PIC 16F84 eller tilsvarende, som kan styre et LCD med HD44780 controlleren.

Jeg har prøvet at lave det selv, men det jeg kan ikke få LCD til at vise noget. Jeg vil helst have det som C kode, men ikke et krav.

Hvis koden kan skrive ud på LCD fra uart, giver jeg 100point oveni
Avatar billede inglenook Praktikant
27. marts 2006 - 23:07 #1
Avatar billede inglenook Praktikant
27. marts 2006 - 23:09 #2
ellert her : http://users.skynet.be/langewouters/clock.html
(husk, Google er din ven.....)
Avatar billede inglenook Praktikant
27. marts 2006 - 23:10 #3
Avatar billede inglenook Praktikant
27. marts 2006 - 23:11 #4
maaske endda her: http://www.cc5x.de/LCD.html
Avatar billede inglenook Praktikant
27. marts 2006 - 23:11 #5
dette var hvad jeg smed ind i Google: 16F84 hd44780
Avatar billede dunderfjert Nybegynder
27. marts 2006 - 23:52 #6
Bruger du 4 el. 8bit interface ?

Hvilken Compiler bruger du der kan lave kode til 16F84 ?

Jeg kan lave det i assembler og i C men hvis du bruger en eller toy compiler skal jeg sætte mig for meget ind i det og det gider jeg ikke.
Avatar billede _et Praktikant
27. marts 2006 - 23:55 #7
Om det er 4 eller 8 bit er lige meget.
Jeg plejer at bruge MPLAB til at skrive i, men har ikke brugt c til PIC, kun andre MCU'er.

Du kan bare sige hvilken compiler, så finder jeg den.
Avatar billede _et Praktikant
28. marts 2006 - 00:02 #8
8bit fortrukket
Avatar billede dunderfjert Nybegynder
28. marts 2006 - 00:32 #9
www.htsoft.com

Det er altså rarest med 8 bit men du har jo ikke mange pins tilbage til andet sjov.

MPLAB er ikke en C compiler, men snarere en editor kombineret med noget simulerings/brændings værktøj.
Men div. C-compilere kan anskaffes og hægtes på MPLAB så i sidste ende kommer det hele til at foregå i MPLAB.

Microchip.com laver iøvrigt ikke compilere til PIC16 serien.
Avatar billede dunderfjert Nybegynder
28. marts 2006 - 00:35 #10
Ups .. så lige du vil skrive på LCD ud fra data modtaget via UART (RS232).

Glem det .. der er ingen UART i en PIC16F84, så den skal laves manuelt med sølle 1K prog. space har du knapt plads til at håndtere displayet. Vælg noget nyere der har en hardware UART onboard.
Eller begræns det i første omgang til at lege med displayet uden data ind ude fra.
Avatar billede _et Praktikant
28. marts 2006 - 00:46 #11
OK det er fint, uden uart.
Hvis du laver sourcen, så kan jeg selv tilpasse det en større PIC, når jeg har styr på LCD kontrollen.
Hvis du kan lave nogle gode kommentarer omkring timing(XTAL, andet vigtigt) ville det bare være super.
Jeg tror det er der det går galt i mine egne forsøg.
PS. Mine PIC'er har en max på 4Mhz
Avatar billede dunderfjert Nybegynder
28. marts 2006 - 01:14 #12
OK. Men prøv lige at se om det er til at skaffe en compiler til formålet.
Den "lite" version de har eller andet er det gratis ?

Så skal jeg vide hvilke pins der går til hvad eller rettere et diagram.
Meget gerne et link til display datablad.
Hvad har du til at hælde programet i den ?
Avatar billede _et Praktikant
28. marts 2006 - 01:23 #13
MPLAB IDE - gratis - http://microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002

Jeg tegner lige et diagram imorgen.
Datablad har jeg på papir, tager foto af det væsentlige og kaster link imorgen

Jeg har en programmer med eget software, som bare downloader den .hex som MPLAB generer.

er det ok?
Avatar billede _et Praktikant
28. marts 2006 - 01:25 #14
Hov. overså lige det med compileren. jeg undersøger lige.
Avatar billede _et Praktikant
28. marts 2006 - 01:40 #15
http://anyc.sourceforge.net/ måske?

Denne lader til at være den bedste.
http://www.ccsinfo.com/downloads.php

Jeg håber at have forstået dig rigtigt når jeg selv skal finde det fornødne
Avatar billede dunderfjert Nybegynder
28. marts 2006 - 02:06 #16
Kan vi ikke godt vælge denne her: http://www.htsoft.com/products/PICClite.php
Jeg forstår det sådan at den er gratis og har ubegrænset kapacitet for din 16F84.

Den er tilmed som jeg læser det ANSI compliant, mere eller mindre da, det tror jeg du vil takke dig selv for senere hen.

Ellers ok med mig.

CCS er sikkert fin nok men de gør meget ud af IKKE at være ANSI tro og det måske nok godt bide sig selv lidt i måsen på længere sigt.
ANSI har lavet en standard for bla. C compilere, det kan der siges meget om for og imod men vænner du dig først til en compiler der er ANSI compliant kan du altid gå direkte til enhver C compilere der er ANSI compliant.
Lige meget hvilken controller du måtte stå overfor.
Avatar billede _et Praktikant
28. marts 2006 - 02:17 #17
den vælger vi.
Avatar billede _et Praktikant
28. marts 2006 - 16:12 #18
Hvad ville du sige til at vælge en større PIC? en 18F4320.

Den har nemlig uart, så kan jeg udvikle direkte vidre på den kode du laver.
Hvis du ikke er interaseret i at skifte fra 16f84, så beholder vi bare den.
Avatar billede dunderfjert Nybegynder
28. marts 2006 - 19:13 #19
Meget bedre.
16f84 er totalt outdated jeg fatter ikke hvorfor den sådan hænger fast i folks bevisthed.
18F har også en gratis compiler direkte fra Microchip.

Men har du noget der kan hælde program i den ?
Avatar billede _et Praktikant
28. marts 2006 - 19:17 #20
jeps. Jeg har en udemærket programmer, og en stor flok sample chips, så jeg testede lige hvilke der var understøttet. og det er den, så der skulle ikke være nogle problemer.
Avatar billede _et Praktikant
28. marts 2006 - 19:18 #21
grunden til at jeg valgte f84, var at jeg tænkte at der var større chance for at nogen ville hjælpe
Avatar billede dunderfjert Nybegynder
28. marts 2006 - 19:45 #22
OK. men jeg tænkte nu også sådan generelt.

Lav et diagram over hvor du have LCD til at sidde etc. pas nu på ikke at optage UART pin's rx og tx til det.
Lav det sådan at display data pins går direkte D0-portben0 og D7-portben7, kontrol signaler til en anden port der helst ikke er portB den er nemlig unik til taster som du nok gerne vil have på engang.
Avatar billede _et Praktikant
28. marts 2006 - 20:00 #23
er det ok at LCD data billederne fylder 40mb?

LCD D0-D7 --> PIC RB0-RB7(pin 33-40)
LCD E1    --> PIC RA0(pin 2)
LCD E2    --> PIC RA1(pin 3)
LCD R/W  --> PIC RA2(pin 4)
LCD RS    --> PIC RA3(pin 5)

( Hvis du gider - dette er kun optional for at tænde lys i LCD)
LCD Lys  --> PIC RA4(pin 6) (High = Lys)
Avatar billede _et Praktikant
28. marts 2006 - 20:20 #24
Avatar billede dunderfjert Nybegynder
28. marts 2006 - 20:28 #25
Jamen nu har du jo netop brugt (hele) portB.

Hvor meget strøm bruger det lys ? ..jeg kunne godt mistænke det er noget over hvad den kan trække på en pin.
Avatar billede _et Praktikant
29. marts 2006 - 00:10 #26
Det er ok at bruge hele portB til de 8 LCDdata linjer.
LCDkontrol linjerne optager det meste af portA
Uart ligger på pin 25 og 26 på portC

Jeg regner kun at bruge denne opstilling til at styre dette LCD fra anden MCU via uart eller I2C.

Jeg regner med at benytte den interne osilator.
Lyset styrer jeg igennem en transister.
Avatar billede _et Praktikant
29. marts 2006 - 00:38 #27
Hvis du har ider, eller nemmere løsninger så lad mig høre.
Avatar billede dunderfjert Nybegynder
29. marts 2006 - 01:35 #28
Nej jeg laver det bare sådan at du kan skifte port som du lyster.
Du skal lige have fat i C18 det bliver vel "student version" jeg regner ikke med du vil gi 4.000kr for full version lige nu.

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en010014&part=SW006011

Jeg kender ikke "student version", vi har kun full men jeg mener den eneste begrænsning er lidt mindre effektiv kode når preprocessoren bliver disabled efter 30dage.
INternal oscillator har jeg aldrig brugt men det kan der ikke være noget hokus pokus i.
Husk at hente databladet til controlleren det er helt basalt vigtigt.
Avatar billede _et Praktikant
29. marts 2006 - 22:24 #29
Er vi UpToDate med det hele.
Avatar billede dunderfjert Nybegynder
29. marts 2006 - 23:59 #30
Jah det var egentlig også det jeg ville spørge dig om.
Har du fået MPLAB og C18 installeret ?

Vi skal lige have sikret at oscillatoren kører og hvor hurtigt (ca.).
Der for har jeg lavet et lille prog. der blinker en LED. Det er kun for at sikrer at den faktisk kører, programmet faktisk kommer rigtigt ind i den og at LED'en blinker i et tempo vi nogenlunde forventede.
Jeg sender det lige til morgen tidlig for det ligger på min notebook på arbejde.
Avatar billede _et Praktikant
30. marts 2006 - 00:06 #31
Jeg har installeret det hele, men har et lille problem med programmer.

Programmet til den siger at Fuses ikke er ok i HEX filen.
Jeg er ved at undersøge problemet flere steder, for chippen er understøttet.

Jeg prøver lige at opdater programmeren på skolen imorgen.
Avatar billede dunderfjert Nybegynder
30. marts 2006 - 00:18 #32
Prøv finde frem til hvilket hex format den kan bruge.
MPLAB kan genere flere typer det er ikke givet det lige er en din programmer kan lide.
"Fuses" er et gammelt udtryk for konfigurations bit.
Avatar billede _et Praktikant
30. marts 2006 - 00:25 #33
Har du nogen ide om hvordan jeg skifte mellem typerne, Jeg syntes ikke at kunde finde det nogen stedder
Avatar billede _et Praktikant
30. marts 2006 - 00:44 #34
Kan det måske være det skal gøres via parameterer til compileren?
Avatar billede _et Praktikant
30. marts 2006 - 11:16 #35
Jeg har fundet ud af det med hex filen. Det er under Export i filemenu
Og har opdateret brænderen, så nu skulle vi være oppe og køre.
Avatar billede dunderfjert Nybegynder
30. marts 2006 - 14:46 #36
Ok. Vi prøver lige at se om der er liv i den:

************
#include <p18cxxx.h>

#pragma config WDT = OFF
#pragma config OSC = INTIO2
#pragma config PWRT = ON
#pragma config BOR = ON
#pragma config PBAD = DIG
#pragma config BORV = 42



#define LCDdataPort  PORTB                //Vælg den port hvor Display data hænger på.
#define LCDdataTris  TRISB                //Ligeså her.

#define LEDpin        LATCbits.LATC2        //Her er valgt portC pin 2
#define LEDpinTris  TRISCbits.TRISC2    //Der blot at ændre den her til den pin LED'en faktisk er koblet på.


void  main(void);                //<- Prototyper.
void InterruptHandleren(void);

unsigned char  TimerReg;


void  main(void)
{
    LCDdataTris = 0x00;    //Port som udgang.
    LEDpinTris = 0;        //LED pin som udgang.
   
   
    TMR0H = 0;                 //Nulstil timeren.
    TMR0L = 0;    
    INTCONbits.TMR0IE = 1;    //Enable TMR0 intr..
    T0CON = 0b10000001;        //Timer0 opsætning.
   
    INTCONbits.GIE = 1;    //Enable intr.
   
    while (1)
    {
       
    if (!TimerReg)
    {LEDpin = !LEDpin;        //Tænd/sluk (toggle) LED ved hvert timer udløb.
    TimerReg = 200;        // Timer Reload værdi (max: 255).
        }       
       
       
        }
    INTCONbits.TMR0IF = 0;      //Slet intr. flaget.   
    }    //Main slut
   
   
   
   
#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh (void)
{
  _asm
    goto InterruptHandleren  //Gå til den egentlige ISR
  _endasm
}

#pragma code


#pragma interrupt InterruptHandleren

void InterruptHandleren(void)
{

    if (TimerReg) --TimerReg;    //Decrement TimerReg hvis forskellig fra 0.

}
*******
Hmm .. Vi må nok hellere finde en anden metode til at udveksle filer.
Avatar billede oz3tl Nybegynder
03. april 2006 - 09:13 #37
Lytter lidt med. da det er noget jeg selv skal til i nærmeste fremtid.

M.V.H.
TLV
Avatar billede _et Praktikant
03. april 2006 - 20:44 #38
Jeg har problemer med at få den til at køre.
Avatar billede dunderfjert Nybegynder
03. april 2006 - 22:31 #39
Hvordan så'rn 'problemer' ?
Kan du ikke loade program eller sker der ikke noget efter at den øjensynligt får programmet korrekt ?
Avatar billede _et Praktikant
06. april 2006 - 20:31 #40
Jeg har ikke problemer med at flashe programmet. Men når jeg sætter power på og prøver med et scope så sker der ikke det forventede.

Men jeg har ikke haft så meget overskud, for der er skoldkopper i familien, men nu er det ovre, så nu prøver jeg lige igen.
Avatar billede _et Praktikant
06. april 2006 - 23:12 #41
Så kører osc.

Kan jeg lige få en kommentar:
#pragma config WDT = OFF    //watchdog
#pragma config OSC = INTIO2 //osc type
#pragma config PWRT = ON    // ?? Power on Timer
#pragma config BOR = ON    // ??
#pragma config PBAD = DIG  // ??
#pragma config BORV = 42    // ??

Desuden er der det problem at LEDPin (RC2) ikke oscilerer - Det syntes jeg da den burde, den bliver holdt høj.

Jeg har valgt oscilator typen til at være den hvor RA6 er osc out, og har et scope på, så jeg kan se den kører.
Avatar billede _et Praktikant
07. april 2006 - 01:56 #42
Den kører fint nu, men der er ingen blink på RC2 - Det er lidt tilfældigt om den går høj eller ej. Jeg har fundet ud af ovenstående spm's.

Ang. fil overførsel, kan du sende mig en mail på et@roskvist.net så sender jeg dig detaljerne, hvis det er ok.

For lige at teste at intet var galt med PIC, har jeg lavet dette test prog, som virker fint.
#include "p18f4320.h"
#define tal 105

void main()
{
unsigned int i = 0;
TRISB = 0x00;
PORTB = 0x00;
    while(1)
    {
        PORTB = 1;
        for ( i = 0 ; i<tal ; i++ ){};
        PORTB = 2;
        for ( i = 0 ; i<tal ; i++ ){};
        PORTB = 4;
        for ( i = 0 ; i<tal ; i++ ){};
        PORTB = 8;
        for ( i = 0 ; i<tal ; i++ ){};
        PORTB = 16;
        for ( i = 0 ; i<tal ; i++ ){};
        PORTB = 32;
        for ( i = 0 ; i<tal ; i++ ){};
        PORTB = 64;
        for ( i = 0 ; i<tal ; i++ ){};
        PORTB = 128;
        for ( i = 0 ; i<tal ; i++ ){};
        PORTB = 0x00;
        for ( i = 0 ; i<tal ; i++ ){};
    };
}
Avatar billede dunderfjert Nybegynder
07. april 2006 - 19:00 #43
Njrahhh jeg har også lavet en fejl..
Intr. flaget bliver aldrig slettet.

Prøv lige at flytte:
    INTCONbits.TMR0IF = 0;      //Slet intr. flaget.   

Ind i ISR dvs.
Lige før eller efter denne:
    if (TimerReg) --TimerReg;    //Decrement TimerReg hvis forskellig fra 0.
Avatar billede _et Praktikant
09. april 2006 - 02:48 #44
Den kører :-)
Avatar billede dunderfjert Nybegynder
09. april 2006 - 11:39 #45
Hvad kører ?
Det jeg postede eller noget du selv har sat op ?
Avatar billede _et Praktikant
09. april 2006 - 12:06 #46
din kode, med din rettelse at int flag kører.

Jeg har prøvet både på sim og realtime
Avatar billede dunderfjert Nybegynder
09. april 2006 - 19:41 #47
OK. Jeg kommer med noget display stuff når jeg lige får lidt ro til det en sen nat el.lign.
Prøv at hægte displayet på og læg grundigt mærke til hvor du hænger RS, R_W, og enable på uC'en.
Baggrund lyset er ligegyldigt, displayet virker uden lyset er tilkoblet.
Avatar billede dunderfjert Nybegynder
14. april 2006 - 09:43 #48
#include <p18cxxx.h>

#pragma config WDT = OFF
#pragma config OSC = INTIO2
#pragma config PWRT = ON
#pragma config BOR = ON
#pragma config PBAD = DIG
#pragma config BORV = 42





// Display ting
#define DispDataPort PORTB            //Vælg porten du har Displayet hængende på.
#define DispDataTris TRISB            // også her.
#define DispEnable  PORTDbits.RD0    //De 3 styre signaler:
#define DispR_W     PORTDbits.RD1
#define DispRS        PORTDbits.RD2

#define DoEnableDisp    DispEnable = 1;        //Dette er kun til for at gøre koden mere læsbar.
#define DoDisableDisp  DispEnable = 0;
#define SelectDispReg  DispRS = 1;
#define DeSelectDispReg DispRS = 0;
#define ReadDisp        DispR_W = 1;
#define WriteDisp      DispR_W = 0;



//Testings:
#define LEDpin        LATCbits.LATC2        //Her er valgt portC pin 2
#define LEDpinTris  TRISCbits.TRISC2    //Der blot at ændre den her til den pin LED'en faktisk er koblet på.





void  main(void);                //<- Prototyper.
void InterruptHandleren(void);
void InitDisp(void);
void PutDispData (char Value);
void SendDispData(unsigned char Value);


//Variable:
unsigned char  TimerReg;
volatile unsigned char DispTimer;    //Timeren bruges til at give delay så Display kan følge med.



void  main(void)
{
    DispDataTris = 0x00;    //Port som udgang.
    LEDpinTris = 0;        //LED pin som udgang.
   
   
    TMR0H = 0;                 //Nulstil timeren.
    TMR0L = 0;    
    INTCONbits.TMR0IE = 1;    //Enable TMR0 intr..
    T0CON = 0b10000001;        //Timer0 opsætning.
   
    INTCONbits.GIE = 1;    //Enable intr.
   
    while (1)
    {
       
    if (!TimerReg)
    {LEDpin = !LEDpin;        //Tænd/sluk (toggle) LED ved hvert timer udløb.
    TimerReg = 200;        // Timer Reload værdi (max: 255).
   
    SendDispData('H');
    SendDispData('e');
    SendDispData('j');
    SendDispData(' ');
    SendDispData('d');   
    SendDispData('u');   
   
        }       
       
       
        }
   
    }    //Main slut
   
   
   
   
#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh (void)
{
  _asm
    goto InterruptHandleren  //Gå til den egentlige ISR
  _endasm
}

#pragma code


#pragma interrupt InterruptHandleren

void InterruptHandleren(void)
{

    if (DispTimer)  DispTimer--;

    if (TimerReg) --TimerReg;    //Decrement TimerReg hvis forskellig fra 0.
    INTCONbits.TMR0IF = 0;      //Slet intr. flaget.
}




//Display functions:

void  InitDisp(void)    //Opstarts ritualet iforhold til display manual.
  {
    DispTimer = 200;

    while(DispTimer){ };  //Startup


    DeSelectDispReg;
    WriteDisp;   
    PutDispData (0b00110000);  //Init1
   
    DispTimer = 50;
    while(DispTimer){ };
           
    PutDispData (0b00110000);  //Init2
    PutDispData (0b00110000);  //Init3
    PutDispData (0b00111000);  //Function Set
    PutDispData (0b00001000);  //Disp. Off
    PutDispData (0b00001100);  //Disp. On/Off
    PutDispData (0b00000001);  //Clear Display
      PutDispData (0b00000110);  //Entry mode set
   
      }



void  PutDispData (char Value)    //Bruges kun til InitDisp altså initalisering.
{
    DoEnableDisp;
    Nop();                    //Nop'erne giver et lille delay.
    Nop();
    Nop();
    Nop();
    DispDataPort = Value;
    Nop();
    Nop();
    Nop();
    Nop();
    DoDisableDisp;
    DispTimer = 5;
    while(DispTimer){ };   
   
    }




void SendDispData(unsigned char Value)    //Sender en karakter til disp.
{    
   
    while (DispTimer) {};
   
    DispDataTris = 0;
    Nop();
    DoDisableDisp;
    Nop();
    WriteDisp;
    Nop();
    SelectDispReg;
    Nop();
    DoEnableDisp;
    Nop();   
    DispDataPort = Value;
    Nop();
    DoDisableDisp;
    Nop();
    DeSelectDispReg;   
    DispTimer = 5;        //<- Værdien er svær at kende nu den afhænger af din intr. timing.
   
    }
Avatar billede dunderfjert Nybegynder
14. april 2006 - 09:47 #49
Prøv dette her. Jeg kan ikke afprøve det på noget Hardware men det burde virke eller i det mindste sætte dig på sporet.
Vær opmæksom på timingen det er jo ISR der styrer det du skal nok have det trimmet sådan at du har et intr. ikke oftere end hver 5mS. Det kan sagtens være langsommere men bliver displayet bare så sløvt.
Avatar billede dunderfjert Nybegynder
14. april 2006 - 10:31 #50
Har allerede opdaget første fejl.
Du skal selvfølgelig have kald InitDisp(); i initialiserings delen.

Indsæt:
InitDisp();

Lige efter:
  INTCONbits.GIE = 1;    //Enable intr.
Avatar billede _et Praktikant
13. juli 2006 - 22:35 #51
Jeg må desværre fortælle at min brænder er brændt af, og jeg kan ikke finde fejlen, så projektet kan godt få lange udsigter. men svar, så kigger jeg på det når jeg får en ny.
Avatar billede _et Praktikant
26. december 2007 - 13:56 #52
Tak for hjælpen. Projektet er lukket.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester