www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

PIC18F4585 + LCD 20x4 (KS0076B) problem pri izpisovanju

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
dha
Član
Član



Pridružen-a: Sre 03 Feb 2010 10:59
Prispevkov: 27
Aktiv.: 0.14
Kraj: Lendava

PrispevekObjavljeno: Sre Mar 17, 2010 12:13 pm    Naslov sporočila:  PIC18F4585 + LCD 20x4 (KS0076B) problem pri izpisovanju Odgovori s citatom

Imam težavo z izpisovanjem na lcd. Uporabljam knjižnice lcd.h in lcd.c za hi-techov kompajler, sicer lite verzijo v mplabu. Knjižnice so za hd44780, vendar sem prebral na internetu, da je ks0076b kompatibilen z hd44780.
Inicializacija se po moje izvede brez problemov (kurzor utripa v zgornjem levem kotu), namesto izpisanih znakov pa dela samo velike presledke.

V delay.h piše:
Koda:
Set the crystal frequency in the CPP predefined symbols list in HPDPIC, or on the PICC commmand line, e.g. picc -DXTAL_FREQ=20MHZ

To mi ni jasno kam bi naj vpisal. V programu sem zato uporabil _delay(x), kjer je x število ciklov.

Sem bolj nov v tem in nimam idej kaj bi lahko še blo narobe? prosim za pomoč...



lcd.c
 Opis:

Download
 Ime datoteke:  lcd.c
 Velikost datoteke:  2.21 KB
 Downloadano:  6 krat


lcd.h
 Opis:

Download
 Ime datoteke:  lcd.h
 Velikost datoteke:  595 Bytov
 Downloadano:  3 krat



Nazadnje urejal/a dha Čet Mar 18, 2010 8:28 am; skupaj popravljeno 1 krat
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
MarkoM
Član
Član



Pridružen-a: Tor 12 Sep 2006 15:29
Prispevkov: 2825
Aktiv.: 12.36
Kraj: Lovrenc na P.

PrispevekObjavljeno: Sre Mar 17, 2010 1:00 pm    Naslov sporočila:   Odgovori s citatom

Koda:
#ifndef _XTAL_FREQ
 // Unless specified elsewhere, 4MHz system frequency is assumed
 #define _XTAL_FREQ 4000000
#endif


Definiraj pravilno frekvenco oscilatorja.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dha
Član
Član



Pridružen-a: Sre 03 Feb 2010 10:59
Prispevkov: 27
Aktiv.: 0.14
Kraj: Lendava

PrispevekObjavljeno: Sre Mar 17, 2010 2:48 pm    Naslov sporočila:   Odgovori s citatom

ja oscilator mam 20mhz, to sem [slovenščina je zame španska vas] napisal pa ni pomagalo...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dha
Član
Član



Pridružen-a: Sre 03 Feb 2010 10:59
Prispevkov: 27
Aktiv.: 0.14
Kraj: Lendava

PrispevekObjavljeno: Pon Mar 22, 2010 9:16 am    Naslov sporočila:   Odgovori s citatom

Ok sem rešil,
Napačno sem imel nastavljen ADCON1 register. Zdaj sem ga nastavil na 0x0F, tako so vsi analogni vhodi nastavljeni kot digitalni i/o.
Naslednji problem je, da ko priklopim lcd na druge pine, se dogaja isto kot prej: inicializacija se izvede, potem pa kurzor skoči na konec zadnje vrstice.

lcd je zdaj priklopljen na naslednje pine
RS => RA3 Data4 => D0
RW => RA2 Data5 => D1
E => RA1 Data6 => D2
Data7 => D3

rad bi ga priklopil na:
RS => RB4 Data4 => B0
RW => RB5 Data5 => B1
E => RC5 Data6 => B2
Data7 => B3

Koda:
#include <htc.h>
#include "lcd.h"
#include "delay.h"

__CONFIG(1,IESOEN & FCMEN & HS);
__CONFIG(2,SWBOREN & BORV43 & WDTDIS);
__CONFIG(3,MCLREN & LPT1DIS & PBDIGITAL);
__CONFIG(4,XINSTDIS & DEBUGEN & LVPDIS & STVREN);
__CONFIG(5,UNPROTECT);
__CONFIG(6,WRTEN);
__CONFIG(7,0xffff);

void main(void)
{
   
   TRISB = 0;
   TRISC = 0;
   //TRISD = 0;
   //TRISA = 0;
   lcd_clear();
   lcd_init();
   lcd_goto(0);   // select first line
   lcd_putch('a');
   lcd_putch('2');
   lcd_putch('3');
   lcd_putch('4');
   lcd_putch('5');
   lcd_goto(0x40);   // Select second line
   lcd_puts("Hello world");

   while(1);
}


Koda:
#ifndef _XTAL_FREQ
 // Unless specified elsewhere, 4MHz system frequency is assumed
 #define _XTAL_FREQ 20000000
#endif


#include   <htc.h>
#include   "lcd.h"
#include    "delay.h"

#define   LCD_RS RB4   //RA3
#define   LCD_RW RB5   //RA2
#define LCD_EN RC5   //RA1

#define LCD_DATA   PORTB   //PORTD

#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 = ( ( c >> 4 ) & 0x0F );
   LCD_STROBE();
   LCD_DATA = ( c & 0x0F );
   LCD_STROBE();
}

/*
 *    Clear and home the LCD
 */

void
lcd_clear(void)
{
   LCD_RS = 0;
   lcd_write(0x1);
   DelayMs(2);   //__delay_ms(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;

   ADCON1 = 0x0F;   // Disable analog pins

   init_value = 0x3;
   
   LCD_RS = 0;
   LCD_EN = 0;
   LCD_RW = 0;
   
   DelayMs(15);      // 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_clear();   // Clear screen
   lcd_write(0x6); // Set entry Mode
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tibi
Član
Član



Pridružen-a: Tor 16 Dec 2003 11:08
Prispevkov: 253
Aktiv.: 1.07
Kraj: bukovje

PrispevekObjavljeno: Pon Mar 22, 2010 12:56 pm    Naslov sporočila:   Odgovori s citatom

Citiram:
lcd_write(unsigned char c)
{
DelayUs(40);
LCD_DATA = ( ( c >> 4 ) & 0x0F );
LCD_STROBE();
LCD_DATA = ( c & 0x0F );
LCD_STROBE();
}


Če se ne motim ko daš vse pine na portB z to funkcijo povoziš RS in RW in E.

L.P.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dha
Član
Član



Pridružen-a: Sre 03 Feb 2010 10:59
Prispevkov: 27
Aktiv.: 0.14
Kraj: Lendava

PrispevekObjavljeno: Pon Mar 22, 2010 2:19 pm    Naslov sporočila:   Odgovori s citatom

kak bi to popravil?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 495 dni


Powered by phpBB © 2001, 2005 phpBB Group