PIc16 Hitech och 44780

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Zajber
Inlägg: 451
Blev medlem: 19 oktober 2009, 22:07:16
Skype: Andreas.fridh85
Ort: Rödön
Kontakt:

PIc16 Hitech och 44780

Inlägg 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.
danielr112
Inlägg: 8092
Blev medlem: 18 januari 2009, 00:48:24
Ort: Alvesta, Småland

Re: PIc16 Hitech och 44780

Inlägg av danielr112 »

MikroC och dylikt har ju libs som funkar rakt av.
sneaky
Inlägg: 1621
Blev medlem: 22 juni 2009, 18:38:42

Re: PIc16 Hitech och 44780

Inlägg 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)
Användarvisningsbild
Zajber
Inlägg: 451
Blev medlem: 19 oktober 2009, 22:07:16
Skype: Andreas.fridh85
Ort: Rödön
Kontakt:

Re: PIc16 Hitech och 44780

Inlägg av Zajber »

Nu börjar det likna något. Tack för den kodsnutten sneaky, ett lite problem bara. Vart hittar jag delay.h?
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: PIc16 Hitech och 44780

Inlägg av johano »

Kod: Markera allt

  ...
  DelayMs(50);   // wait 15mSec after power applied
  ...
En sån kommentar borde vara straffbar :-)

/johan
Användarvisningsbild
Zajber
Inlägg: 451
Blev medlem: 19 oktober 2009, 22:07:16
Skype: Andreas.fridh85
Ort: Rödön
Kontakt:

Re: PIc16 Hitech och 44780

Inlägg av Zajber »

Kod: Markera allt

 DelayUs(40);
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.
sneaky
Inlägg: 1621
Blev medlem: 22 juni 2009, 18:38:42

Re: PIc16 Hitech och 44780

Inlägg 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!
Användarvisningsbild
Zajber
Inlägg: 451
Blev medlem: 19 oktober 2009, 22:07:16
Skype: Andreas.fridh85
Ort: Rödön
Kontakt:

Re: PIc16 Hitech och 44780

Inlägg 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?
Användarvisningsbild
Zajber
Inlägg: 451
Blev medlem: 19 oktober 2009, 22:07:16
Skype: Andreas.fridh85
Ort: Rödön
Kontakt:

Re: PIc16 Hitech och 44780

Inlägg 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.
JustNeed
Inlägg: 799
Blev medlem: 7 november 2007, 22:07:01
Ort: 08

Re: PIc16 Hitech och 44780

Inlägg 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?
Användarvisningsbild
Zajber
Inlägg: 451
Blev medlem: 19 oktober 2009, 22:07:16
Skype: Andreas.fridh85
Ort: Rödön
Kontakt:

Re: PIc16 Hitech och 44780

Inlägg 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.
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Re: PIc16 Hitech och 44780

Inlägg 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...).
Användarvisningsbild
Zajber
Inlägg: 451
Blev medlem: 19 oktober 2009, 22:07:16
Skype: Andreas.fridh85
Ort: Rödön
Kontakt:

Re: PIc16 Hitech och 44780

Inlägg 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.
slft
Inlägg: 493
Blev medlem: 9 oktober 2009, 10:45:21
Skype: sm6xwe
Ort: Tibro

Re: PIc16 Hitech och 44780

Inlägg 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
Fearsome
Inlägg: 22
Blev medlem: 1 februari 2007, 21:25:04
Ort: Malmö

Re: PIc16 Hitech och 44780

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

Kod: Markera allt

lcd_write(0x6); // Set entry Mode
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.
Skriv svar