-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: LCD03 am PIC 18F4550 per I2C

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Ort
    Herford
    Alter
    33
    Beiträge
    52

    LCD03 am PIC 18F4550 per I2C

    Anzeige

    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.

    Code:
    //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

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Ort
    Herford
    Alter
    33
    Beiträge
    52
    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????

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065
    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.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Ort
    Herford
    Alter
    33
    Beiträge
    52
    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 , 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 .

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

    mfg andi

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065
    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.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Ort
    Herford
    Alter
    33
    Beiträge
    52
    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????

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065
    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?

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    15.08.2008
    Alter
    40
    Beiträge
    19
    Hallo the_Ghost666

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

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Ort
    Herford
    Alter
    33
    Beiträge
    52
    \/
    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

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065
    Na dann, ist ja gut!
    Resend beinhaltet die Repeated Start geschichte, Send nur n einfachen Start?

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •