PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD03 am PIC 18F4550 per I2C



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

andi.studi
01.10.2008, 23:39
fehler erkannt und behoben ;)

jetzt stehe ich vor der nächsten Hürde, das auslesen des FIFO buffer und der tastatur.


kennt eigentlich jemand hier dieses LCD????

the_Ghost666
02.10.2008, 10:14
Moin,
naja, das LCD ist ja nichts besonderes, lediglich der I2C Konverter dahinter, der das alles an den Bus bringt. Nette Idee, gibts ja auch vom Roboternetz, nur mit nem Atmel drauf. Hast du das aus England bestellt?

PS:
Zu den Internen Pullups, die haben im Schnitt werte zwischen 10k und 50kOhm, wenn ich mich nicht täusche. An deiner Stelle würde ich mit den externen 2,2k arbeiten, damit bist du auf der sicheren Seite, auch bei mehr Teilnehmern oder längeren Leitungen. Ich selber verbaue immer 4,7k.

andi.studi
02.10.2008, 14:27
hi, ich hab es in deutschland bei roboter-teile.de bestellt. wusste nicht das es von roboter netz was änliches gibt ](*,) .

aber ich habs endlich zum laufen beckommen.
hatte 2 entscheidene fehler drin

1. bei 16Mhz Systemtakt ergibt SSPADD =0x09; einen Bustakt von 400kHz da das ding nur mit 100 kHz arbeitet muss es SSPADD =0x27 sein.

2. Betriebsspannung mit 4,5 Volt läst sich dieses LCD oder besser schlecht ansteuern. mein bord sollte aber 5 volt haben 8-[, nach 2 std suche stellte ich dann verwundert fest das meine feinsicherung einen widersatand von 19 ohm hat, was einen spannungsabfal zur folge hatte ](*,) sowas sah ich zu ersten mal.

mittlerweile hab ich auch 4,7 kohm pullups drin, hät aber bestimmt auch mit 2,2 funktioniert.

also das schreiben funktioniert nu einwandfrei.

dennoch stellen sich mir noch fragen, und zwar wie daten ausgelesen werden?
z.b. der scancode der Tastatur, oder das fifo register.
da ist miener meinung nach das datenblatt sehr schweigsam :-k .

wenn es jemand weis, oder eine idee hat, bitte posten, bin um jede hilfe dankbar.

mfg andi

the_Ghost666
02.10.2008, 14:46
Da hast du recht, wenn das oben aus dem Link die komplette Doku ist, ist es sehr schwammig.
Ok, versuch mal folgendes:
Du hast ja bei I2C Write und Read Adressen. Wenn du also mit 0xC6 das Display ansprichst, dann ist das niedrigste Bit =0 was einem Schreibzugriff entspricht. Gelesen wird, indem du eine 1 ans niedrigste Bit schreibst, also 0xC7 als Adresse. Danach sendest du die Registernummer, also 0, 1, 2 oder 3, wie in der Tabelle bei "Display Control Commands". Danach sollte dann der Controller vom Display anfangen die Daten zu senden. Am besten kannst du das wohl mit Register 3, der Versionsnummer testen. Wie die Keypads abgefragt werden, ist mir schleiferhaft, eigentlich reicht doch ein Byte, warum die das in Higher und Lower Byte getrennt haben, weiß ich nicht.
Ah da weiter unten stehts ja, die haben für jede Taste ein Flag spendiert.. soso.

andi.studi
03.10.2008, 17:54
klappt leider nicht ](*,) ](*,)

der verkäufer schrieb mir folgendes:

Um jetzt die Tastatur auszulesen muss man auf Register 1 und 2 lesend zugreifen.
Der Ablauf auf dem I2C dazu ist folgender:
- Startbedingung
- Schreiben Deviceadresse (0xC6)
- Schreiben 1 (Register Keypad Highbyte)
- Repeated Start
- Schreiben Deviceadresse + 1 (0xC7)
- Lesen 1 Byte -> Keypad Highbyte
- Schreiben ACK-Bit (High)
- Lesen 1 Byte -> Keypad Lowbyte
- Schreiben ACK-Bit (Low)
- Stopbedingung

klappt aber leider auch nicht so langsam verzweifle ich.
hat jemenad einen tipp????

the_Ghost666
03.10.2008, 19:11
und du bist sicher, dass deine Funktionen auch das machen, was dort steht? Ich denke man kann dem Händler schon glauben, nur dass eben keiner das Teil zu haben scheint, um dir das beantworten zu können. Magst du mal deinen Code reinstellen? Vielleicht ist es ja doch ein kleiner Fehler in deinem Programm. Du arbeitest wie oben im Beispiel mit dem C18?

Matzenerich
03.10.2008, 20:25
Hallo the_Ghost666

ja er arbeitet mit dem C-18 Compiler von MPLAB. Bin der Meinung mit V3.02 bzw. V3.15 (bei mir).

andi.studi
03.10.2008, 21:15
\:D/
es klappt.

mir war nicht klar, dass resend nicht gleich send ist.

jetzt komme ich weiter danke.
wenn ich vertig bin poste ich mal meinen code

the_Ghost666
03.10.2008, 21:23
Na dann, ist ja gut!
Resend beinhaltet die Repeated Start geschichte, Send nur n einfachen Start?

andi.studi
07.10.2008, 21:08