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????
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.
und dann hätte ich noch eine frage: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 }
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
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????
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.
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
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.
klappt leider nicht
der verkäufer schrieb mir folgendes:
klappt aber leider auch nicht so langsam verzweifle ich.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
hat jemenad einen tipp????
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?
Hallo the_Ghost666
ja er arbeitet mit dem C-18 Compiler von MPLAB. Bin der Meinung mit V3.02 bzw. V3.15 (bei mir).
\/
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
Na dann, ist ja gut!
Resend beinhaltet die Repeated Start geschichte, Send nur n einfachen Start?
Lesezeichen