Sida 1 av 3
PIc16 Hitech och 44780
Postat: 10 maj 2010, 22:59:49
av Zajber
Håller på att avsluta en kurs i styrteknik och tänkte fördjupa mig lite extra i just pic som är ganska nytt för mig då jag mest kör Atmels dito innan.
Jag hittar inte samma samlade skara glada pic-folk på nätet som t.ex. avrfreaks där man hittar precis allt man letar efter.
Just nu så letar jag efter någon drivrutin för min HD44780 lcd som är skriven i C. Helst för en pic i 16f8x serien, jag har hittat lite när jag söker runt på google men oftast så får jag så sjukt många errors att det inte är lönt att försöka fixa det.
Så om någon har nått tips på vart man kan hitta matnyttig information om detta eller rent allmänt någon uppdaterad sida med schysst c-kod för typ 16f88 vore jag superglad.
Re: PIc16 Hitech och 44780
Postat: 10 maj 2010, 23:10:58
av danielr112
MikroC och dylikt har ju libs som funkar rakt av.
Re: PIc16 Hitech och 44780
Postat: 10 maj 2010, 23:18:31
av sneaky
Har kört med denna som i alla fall fungerat för mig. Minns inte var jag fick tag i den.
lcd.c
Kod: Markera allt
/*
* LCD interface example
* Uses routines from delay.c
* This code will interface to a standard LCD controller
* like the Hitachi HD44780. It uses it in 4 bit mode, with
* the hardware connected as follows (the standard 14 pin
* LCD connector is used):
*
* PORTD bits 0-3 are connected to the LCD data bits 4-7 (high nibble)
* PORTA bit 3 is connected to the LCD RS input (register select)
* PORTA bit 1 is connected to the LCD EN bit (enable)
*
* To use these routines, set up the port I/O (TRISA, TRISD) then
* call lcd_init(), then other routines as required.
*
*/
#include "C:\Program\HI-TECH Software\PICC\LITE\9.60\include\pic.h"
#include "lcd.h"
#include "delay.h"
#define LCD_RS RA2
#define LCD_RW RA1
#define LCD_EN RA0
#define LCD_DATA PORTC
#define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0))
/* write a byte to the LCD in 4 bit mode */
void
lcd_write(unsigned char c)
{
DelayUs(40);
LCD_DATA = ((LCD_DATA & 0xF0) | (( c >> 4 ) & 0x0F));
LCD_STROBE();
LCD_DATA = ((LCD_DATA & 0xF0) | ( c & 0x0F ));
LCD_STROBE();
}
/*
* Clear and home the LCD
*/
void
lcd_clear(void)
{
LCD_RS = 0;
lcd_write(0x1);
DelayMs(2);
}
/* write a string of chars to the LCD */
void
lcd_puts(const char * s)
{
LCD_RS = 1; // write characters
while(*s)
lcd_write(*s++);
}
/* write one character to the LCD */
void
lcd_putch(char c)
{
LCD_RS = 1; // write characters
lcd_write( c );
}
/*
* Go to the specified position
*/
void
lcd_goto(unsigned char pos)
{
LCD_RS = 0;
lcd_write(0x80+pos);
}
/* initialise the LCD - put into 4 bit mode */
void
lcd_init()
{
char init_value;
init_value = 0x3;
LCD_RS = 0;
LCD_EN = 0;
LCD_RW = 0;
DelayMs(50); // wait 15mSec after power applied,
LCD_DATA = init_value;
LCD_STROBE();
DelayMs(5);
LCD_STROBE();
DelayUs(200);
LCD_STROBE();
DelayUs(200);
LCD_DATA = 2; // Four bit mode
LCD_STROBE();
lcd_write(0x28); // Set interface length
//lcd_write(0xF); // Display On, Cursor On, Cursor Blink
lcd_write(0b00001100);
lcd_clear(); // Clear screen
lcd_write(0x6); // Set entry Mode
}
lcd.h
Kod: Markera allt
/*
* LCD interface header file
* See lcd.c for more info
*/
/* write a byte to the LCD in 4 bit mode */
extern void lcd_write(unsigned char);
/* Clear and home the LCD */
extern void lcd_clear(void);
/* write a string of characters to the LCD */
extern void lcd_puts(const char * s);
/* Go to the specified position */
extern void lcd_goto(unsigned char pos);
/* intialize the LCD - call before anything else */
extern void lcd_init(void);
extern void lcd_putch(char);
/* Set the cursor position */
#define lcd_cursor(x) lcd_write(((x)&0x7F)|0x80)
Re: PIc16 Hitech och 44780
Postat: 11 maj 2010, 13:30:39
av Zajber
Nu börjar det likna något. Tack för den kodsnutten sneaky, ett lite problem bara. Vart hittar jag delay.h?
Re: PIc16 Hitech och 44780
Postat: 11 maj 2010, 13:36:04
av johano
Kod: Markera allt
...
DelayMs(50); // wait 15mSec after power applied
...
En sån kommentar borde vara straffbar
/johan
Re: PIc16 Hitech och 44780
Postat: 11 maj 2010, 14:17:25
av Zajber
När vi har programmerat innan så har vi kört med htc.h och där finns det en funktion som heter __delay_us();
Jag är rätt så ny när det gäller pic.h så jag har ingen aning.
Re: PIc16 Hitech och 44780
Postat: 11 maj 2010, 15:12:48
av sneaky
Hoppsan, den missade jag att skicka med

Men du kan istället köra med de inbyggda som du nämnde:
__delay_us(); och
__delay_ms();
Hittade orginalet. Det finns (på min burk) här:
C:\Program Files (x86)\HI-TECH Software\PICC\9.70\samples
Där finns även lite annat matnyttigt som kan vara värt att kika på.
johano: Hehe, där är jag nog tyvärr skyldig till viss del. Kommentaren var korrekt från start men jag höll på och ändrade lite saker och glömde att även ändra kommentaren DOH!
Re: PIc16 Hitech och 44780
Postat: 11 maj 2010, 15:32:07
av Zajber
Efter en stund nu så hittade jag ett demo-projekt för LCD i Hi-Tech mappen som jag nästan får att funka.
Jag får en "cursor" (svenska namnet?) som blinkar efter att koden
Kod: Markera allt
lcd_write(0x28); // Set interface length
lcd_write(0xF); // Display On, Cursor On, Cursor Blink
lcd_clear(); // Clear screen
lcd_write(0x6); // Set entry Mode
Där lcd_write ser ut så här:
Kod: Markera allt
void
lcd_write(unsigned char c)
{
__delay_us(40);
LCD_DATA = ( ( c >> 4 ) & 0x0F );
LCD_STROBE();
LCD_DATA = ( c & 0x0F );
LCD_STROBE();
}
Men jag kan inte skriva någon text till den.
Demo-filen var skriven för en större pic då PORTD var satt som data, så jag ändrade den till PORTB och TRISB till 0x00.
Dessutom så hoppar den blinkade saken (cursor) till fel sida av displayen efter en stund..
Vad mer är bra att veta?
Re: PIc16 Hitech och 44780
Postat: 11 maj 2010, 15:38:27
av Zajber
För övrigt så har jag inget oscilloskop hemma och försöker jag mäta med en hyfsad multimeter så är alla pinnarna helt stilla.
Hur känsliga är pic:arna? Jag vet att vi har fått många märkliga fel på skolan efter ett par programmeringar, pinnar som slutar funka och liknande.
Re: PIc16 Hitech och 44780
Postat: 11 maj 2010, 16:36:42
av JustNeed
De brukar inte vara så känsliga.
Dock ska man se upp med två saker: Öppna ingångar och externa oscillatorer.
Det är t.ex. rätt vanligt att nybörjare lämnar MCLR öppen och utan pullup.
Allt sånt påverkar vid drift, men jag skulle tro att det är relativt svårt att permanent förstöra en pic. Jag har i alla fall aldrig sabbat någon än och jag har varit allt annat än försiktig.
Jag tror inte på att försöka se kommunikationen m.h.a multimeter eftersom alltihopa går mycket snabbt.
Har du prövat att köra ett program som bara blinkar alla pinnar på porten i synlig takt?
Re: PIc16 Hitech och 44780
Postat: 11 maj 2010, 16:56:12
av Zajber
Jag har avaktiverat MCLR och testat portarna och det ska funka.
Hmm, det låter oroväckande att våra pic:ar har gått sönder så mycket då, eller åtminstone slutat funka på några pinnar.
Men jag utgår ifrån att denna funkar iaf.
Re: PIc16 Hitech och 44780
Postat: 11 maj 2010, 22:03:45
av PHermansson
Oförstörbara är dom ju inte... har lyckats förstöra både hela kretsar och enskilda pinnar. Men då genom rena hjärnsläpp (nu har jag nog äntligen lärt mig att plus och jord på en F675 är motsatt mot vad man är van vid från många andra kretsar. Har också testat hur en Pic reagerar på att matas direkt från en bilbatteri, inge bra...).
Re: PIc16 Hitech och 44780
Postat: 11 maj 2010, 22:07:08
av Zajber
Nu får jag skräpet att rita ut streck fortare än allt.
Så fort jag använda lcd_puts(); så börjar den att skriva ut massor med streck. Tar jag bort den så står markören kvar och blinkar.
Re: PIc16 Hitech och 44780
Postat: 12 maj 2010, 08:16:48
av slft
har haft problem med uppstart av display
kunde få cursorn att blinka men det gick inte att skriva text
felet var at r/s signalen var kortsluten mot jord
kan vara värt att kolla innan för många hårtestar ryckes bort
//Ola
Re: PIc16 Hitech och 44780
Postat: 12 maj 2010, 12:22:17
av Fearsome
Har precis pillat på just den implementation av lcd-rutinerna som visats här. Tänk på att jorda RW eftersom den inte används. Ansluter du den inte till något så dras den hög internt och då funkar ingenting.
För att få igång Hi-Techs implementation så fick jag öka upp den första fördröjningen i lcd_write till 80 us. Funkar kanske med mindre men jag hårdoptimerade inte.
Jag vet inte oscillatorfrekvens du kör PIC:en på men eventuellt måste du lägga in en fördröjning i STROBE macrot. För säkerhets skull kör jag med 2 us, så här:
Kod: Markera allt
#define LCD_STROBE() ((LCD_EN = 1),(__delay_us(2)),(LCD_EN=0))
Dessutom fick jag lägga till en fördröjning i init_lcd för att det skulle lira. Efter
har jag 20 ms fördröjning. Funkade inte utan detta. Vet ej varför. Efter denna fördröjning har jag lagt in:
Kod: Markera allt
lcd_write(0x0C); //Display On, Cursor Off, No Cursor Blink
Eftersom det är så jag kör displayen hela tiden.