andi.studi
29.09.2008, 23:24
hallo alle miteinander nachdem mein LCD in 4bit und auch die tastatur abfrage nicht zulätz durch eure hilfe einwandfrei funktioniert, hab ich mich an was neues rangetraut.
und zwar das LCD03
datenblatt: das ist alles was ich dazu hab?!
http://www.robot-electronics.co.uk/htm/Lcd03tech.htm
da ist auch ein beispiel gezeigt, aber irgendwie haut es bei mir nicht hin.
evtl hat ja jemand schon erfahrung damit und kann mir eine hilfestellung geben.
ich vermute das mein programmcode fehlerfaft ist, aber ich weis nicht wo ich noch suchen soll.
hab das prog soweit runter gekürzt das jetzt laut datenblat (und in anlehnung and das demo prog) nur noch ein blinkender courser auf dem LCD angezeigt werden sollte.
würde mich freuen wenn sich einer mal mein prog anschauen könnte und evtl noch nen tipp hätte.
//Microchip C-18 Compiler
//PIC 18F4550
#include <p18f4550.h>
#include "typedef.h"
#include <stdio.h>
#include <delays.h>
#pragma code
uint8 s[21]; // buffer used to hold text to print
/**delay for PicLSBK (16MHz Taktzyklus = 4 MHz Befehlszyklus)***************/
void delay100us(uint8 multiplikator)
{
while(multiplikator--) Delay10TCYx(40); //40*10*0,25µs = 100 µs
}
/************************************************** **************************/
void clrscn(void)
{
PIR1bits.SSPIF = 0; //
//Start-Bedingung ausgeben
SSPCON2bits.SEN = 1; // Start-Bedingung ausgeben (Start-Bit)
while(!PIR1bits.SSPIF); // warte bis fertig
Nop(); PIR1bits.SSPIF = 0; // Fertig-Anzeige löschen
//Slave_Empfangs-Adresse senden
SSPBUF = 0xc6; // LCD03 I2C address
while(!PIR1bits.SSPIF); // warte bis fertig
Nop(); PIR1bits.SSPIF = 0; // Fertig-Anzeige löschen
SSPBUF = 0; // address of register to write to
while(!PIR1bits.SSPIF); // warte bis fertig
Nop(); PIR1bits.SSPIF = 0; // Fertig-Anzeige löschen
SSPBUF = 12; // clear screen
while(!PIR1bits.SSPIF); // warte bis fertig
Nop(); PIR1bits.SSPIF = 0; // Fertig-Anzeige löschen
SSPBUF = 5; // cursor on
while(!PIR1bits.SSPIF); // warte bis fertig
Nop(); PIR1bits.SSPIF = 0; // Fertig-Anzeige löschen
//Stop-Bedingung ausgeben
SSPCON2bits.PEN = 1; // Stop-Bedingung ausgeben (Stop-Bit)
while(!PIR1bits.SSPIF); // warte bis fertig
Nop(); PIR1bits.SSPIF = 0; // Fertig-Anzeige löschen
}
void i2c_init(void)
{
// INTCON2bits.RBPU=0; // pull-up's an
delay100us(250);
TRISBbits.TRISB0 = 1; // SDA (RB0) Eingang
TRISBbits.TRISB1 = 1; // SCL (RB1) Eingang
// PORTB=0xff;
delay100us(10);
SSPCON1 = 0b00111000; // x,x,I2C ein,x,I2C Master [Takt= Fosc /(4*(SSPADD+1))]
SSPCON2 = 0; // Bestätigungsbit nach Empfang 0=an
SSPSTATbits.SMP = 1; // Anstiegskontrolle 1=aus (Flankensteilheit)
SSPSTATbits.CKE = 0; // I2C Betrieb / (SMBus gespert)
SSPADD =0x09;// Bustakt 100kHz (bei 4MHz Befehlszyklus)
delay100us(250); // wait 15ms for LCD03 to init
delay100us(250);
}
void main(void)
{
i2c_init(); // sets up the PIC16F877 I2C port
clrscn(); // clears the LCD03 disply
while(1); // just stops
}
und dann hätte ich noch eine frage:
kann ich die internen pullup widerstände des pic als pullup für den i2c bus verwenden?
aktuel hab ich 2,2kohm eingelötet.
vielen dank im voraus
mfg andi
und zwar das LCD03
datenblatt: das ist alles was ich dazu hab?!
http://www.robot-electronics.co.uk/htm/Lcd03tech.htm
da ist auch ein beispiel gezeigt, aber irgendwie haut es bei mir nicht hin.
evtl hat ja jemand schon erfahrung damit und kann mir eine hilfestellung geben.
ich vermute das mein programmcode fehlerfaft ist, aber ich weis nicht wo ich noch suchen soll.
hab das prog soweit runter gekürzt das jetzt laut datenblat (und in anlehnung and das demo prog) nur noch ein blinkender courser auf dem LCD angezeigt werden sollte.
würde mich freuen wenn sich einer mal mein prog anschauen könnte und evtl noch nen tipp hätte.
//Microchip C-18 Compiler
//PIC 18F4550
#include <p18f4550.h>
#include "typedef.h"
#include <stdio.h>
#include <delays.h>
#pragma code
uint8 s[21]; // buffer used to hold text to print
/**delay for PicLSBK (16MHz Taktzyklus = 4 MHz Befehlszyklus)***************/
void delay100us(uint8 multiplikator)
{
while(multiplikator--) Delay10TCYx(40); //40*10*0,25µs = 100 µs
}
/************************************************** **************************/
void clrscn(void)
{
PIR1bits.SSPIF = 0; //
//Start-Bedingung ausgeben
SSPCON2bits.SEN = 1; // Start-Bedingung ausgeben (Start-Bit)
while(!PIR1bits.SSPIF); // warte bis fertig
Nop(); PIR1bits.SSPIF = 0; // Fertig-Anzeige löschen
//Slave_Empfangs-Adresse senden
SSPBUF = 0xc6; // LCD03 I2C address
while(!PIR1bits.SSPIF); // warte bis fertig
Nop(); PIR1bits.SSPIF = 0; // Fertig-Anzeige löschen
SSPBUF = 0; // address of register to write to
while(!PIR1bits.SSPIF); // warte bis fertig
Nop(); PIR1bits.SSPIF = 0; // Fertig-Anzeige löschen
SSPBUF = 12; // clear screen
while(!PIR1bits.SSPIF); // warte bis fertig
Nop(); PIR1bits.SSPIF = 0; // Fertig-Anzeige löschen
SSPBUF = 5; // cursor on
while(!PIR1bits.SSPIF); // warte bis fertig
Nop(); PIR1bits.SSPIF = 0; // Fertig-Anzeige löschen
//Stop-Bedingung ausgeben
SSPCON2bits.PEN = 1; // Stop-Bedingung ausgeben (Stop-Bit)
while(!PIR1bits.SSPIF); // warte bis fertig
Nop(); PIR1bits.SSPIF = 0; // Fertig-Anzeige löschen
}
void i2c_init(void)
{
// INTCON2bits.RBPU=0; // pull-up's an
delay100us(250);
TRISBbits.TRISB0 = 1; // SDA (RB0) Eingang
TRISBbits.TRISB1 = 1; // SCL (RB1) Eingang
// PORTB=0xff;
delay100us(10);
SSPCON1 = 0b00111000; // x,x,I2C ein,x,I2C Master [Takt= Fosc /(4*(SSPADD+1))]
SSPCON2 = 0; // Bestätigungsbit nach Empfang 0=an
SSPSTATbits.SMP = 1; // Anstiegskontrolle 1=aus (Flankensteilheit)
SSPSTATbits.CKE = 0; // I2C Betrieb / (SMBus gespert)
SSPADD =0x09;// Bustakt 100kHz (bei 4MHz Befehlszyklus)
delay100us(250); // wait 15ms for LCD03 to init
delay100us(250);
}
void main(void)
{
i2c_init(); // sets up the PIC16F877 I2C port
clrscn(); // clears the LCD03 disply
while(1); // just stops
}
und dann hätte ich noch eine frage:
kann ich die internen pullup widerstände des pic als pullup für den i2c bus verwenden?
aktuel hab ich 2,2kohm eingelötet.
vielen dank im voraus
mfg andi