PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RP6Base mit PCF8574P expander Platine



polskapawel
06.11.2008, 12:00
Hi,

So hab jetzt ein eigenes I2C LCD Display realisiert. Dazu benutze ich einen PCF8574P und ein 16x2LCD. Hab den großen vorteil das ich in der arbeit Ätzen kann, somit konnte ich in Eagle ein Layout erstellen und musste nicht auf Lochraster arbeiten.

Hier ein paar Bilder meiner Arbeit. Und nun zum schwierigen Teil.
Wie bekomme ich den jetzt ne Textausgabe hin?? Hat da vllt. einer von euch mal ein Testprogramm für mich???

Dirk
06.11.2008, 18:20
@polskapawel:

Hat da vllt. einer von euch mal ein Testprogramm für mich???
Nicht für den RP6.
Aber für den Asuro gibt's da einen Wiki-Beitrag:
http://www.asurowiki.de/pmwiki/pmwiki.php/Main/LCDErweiterung
Das müßte genauso für den RP6 funktionieren.

Gruß Dirk

polskapawel
06.11.2008, 23:02
Ich seh grad im Schaltplan beim Asuro, dass 2 Pullups verwendet wurden, wie unten in meinem Schaltplann zusehen hab ich keine verwendet.
Beim Asuro wurden aber auch zwei ADC´s (Input/Output) verwendet und ich schließe direkt an SDA/SCL die Leitungen an. Ist es dann noch erforderlich zwei Pullup´s anzuschließen.

sechsrad
07.11.2008, 08:51
Aber haua, die müssen dran 4,7k bis ca 10k. Musst mal testen.

mfg

SlyD
07.11.2008, 11:48
Hallo polskapawel,

falls Du die I2C Bus Widerstände meinst (hab mir obigen Link nicht angeschaut), die sind schon auf dem RP6 Mainboard drauf.

MfG,
SlyD

polskapawel
07.11.2008, 17:19
Die Routine vom Asuro hilft mir nicht steig ich nicht ein, ich verwende das beispiel programm vom RP6: RP6Base_I2CMaster_01, hänge es auch nochmal dran. Dabei sollen 8 LEDs über einen PCF8574 angesteuert werden. Anstelle dieser 8 LEDs muss ich das programm so umkonfektionieren das ich mein 162 Displex von Displaytech ansteuern kann.

Hier das Programm,

// Uncommented Version of RP6Base_I2C_Master_01.c
// written by Dominik S. Herwald
// ------------------------------------------------------------------------------------------

#include "RP6RobotBaseLib.h"
#include "RP6I2CmasterTWI.h"

#define PCF8574_8LEDS_ADR 0x70

void I2C_requestedDataReady(uint8_t dataRequestID)
{
}

void I2C_transmissionError(uint8_t errorState)
{
writeString_P("\nI2C ERROR - TWI STATE: 0x");
writeInteger(errorState, HEX);
writeChar('\n');
}

void task_knightRider(void)
{
static uint8_t runningLight = 3;
static uint8_t dir = 0;
if(getStopwatch1() > 70) {
I2CTWI_transmitByte(PCF8574_8LEDS_ADR, (~runningLight) );
if(runningLight == 128)
{
dir = 1;
runningLight = 192;
}
else if(runningLight < 3)
{
dir = 0;
runningLight = 3;
}
else if(dir)
runningLight >>= 1;
else
runningLight <<= 1;
setStopwatch1(0);
}
}

int main(void)
{
initRobotBase();

I2CTWI_initMaster(100);
I2CTWI_setRequestedDataReadyHandler(I2C_requestedD ataReady);
I2CTWI_setTransmissionErrorHandler(I2C_transmissio nError);

setLEDs(0b101010);
mSleep(1000);
setLEDs(0b010101);

powerON();

startStopwatch1();

while(true)
{
task_knightRider();
task_I2CTWI();
task_RP6System();
}
return 0;
}

also in das unterprogramm task_knightrider muss die änderung.

Hilfe,Hilfe,Hilfe hehe.....

SlyD
07.11.2008, 17:33
Hallo,

Ne so wird das nix ;)
Du musst ja das LCD initialisieren usw.... da schau Dir doch lieber mal die RP6Control Library an (also die für das Erweiterungsmodul)

Auszug:



char lcd_tmp_buffer[17];

/**
* Sets the LCD ports without affecting the LEDs and also pulses the
* enable line of the LCD to 'inform' the LCD about the new data.
*
*/
void setLCDD(uint8_t lcdd)
{
externalPort.LCDD = lcdd;
outputExt();
PORTB |= LCD_EN;
delayCycles(50);
PORTB &= ~LCD_EN;
}

/**
* Initialize the LCD. Always call this before using the LCD!
*
*/
void initLCD(void)
{
//delayCycles(34000); No need for Power ON delay as usually the
// Bootloader should have been executed before...
setLCDD(0b0011);
delayCycles(18000);
setLCDD(0b0011);
delayCycles(5500);
setLCDD(0b0011);
delayCycles(5500);
setLCDD(0b0010);
delayCycles(5500);
writeLCDCommand(0b00101000);
delayCycles(5500);
writeLCDCommand(0b00001000);
delayCycles(5500);
writeLCDCommand(0b00000001);
delayCycles(5500);
writeLCDCommand(0b00000010);
delayCycles(5500);
writeLCDCommand(0b00001100);
delayCycles(5500);
}

/**
* Write a 8bit-byte in two nibbles of 4bit to the LCD.
*/
void write4BitLCDData(uint8_t data)
{
setLCDD(data >> 4);
setLCDD(data);
delayCycles(150);
}

/**
* Write a command to the LCD.
*/
void writeLCDCommand(uint8_t cmd)
{
PORTB &= ~LCD_RS;
write4BitLCDData(cmd);
delayCycles(150);
}

/**
* Clears the whole LCD!
*/
void clearLCD(void)
{
writeLCDCommand(0b00000001);
delayCycles(5500);
}


/**
* Write a single character to the LCD.
*
* Example:
*
* writeCharLCD('R');
* writeCharLCD('P');
* writeCharLCD('6');
* writeCharLCD(' ');
* writeCharLCD('0');
* writeCharLCD(48); // 48 is ASCII code for '0'
* writeCharLCD(49); // '1'
* writeCharLCD(50); // '2'
* writeCharLCD(51); // '3'
* //...
*
* would output:
* RP6 00123
* at the current cursor position!
* use setCursorPos function to move the cursor to a
* different location!
*/
void writeCharLCD(uint8_t ch)
{
PORTB |= LCD_RS;
write4BitLCDData(ch);
delayCycles(50);
}


Es gibt da noch mehr Funktionen und Makros für das LCD (s. Erweiterungsmodul Anleitung und Quellcode) - um besser Text ausgeben zu können usw... ich poste das nur hier damit Du weisst welche Funktionen ich generell meine.

Diese Funktionen musst Du komplett so wie sie sind übernehmen - ABER - Du musst natürlich die Ausgabe auf das LCD über den I2C Bus umleiten.
Du musst dazu im Prinzip nur die Funktion setLCDD() abändern und da auch zusätzlich noch das setzen der RS Leitung vom LCD einbauen - also damit das LCD weiss ob es gerade ein Kommando oder Daten erhält...
(das sind die beiden Zeilen PORTB &= ~LCD_RS; und PORTB |= LCD_RS;)
Am besten in einer LCD Port Variable die Du Dir anlegst ein Bit dafür verwenden... das kann genauso gesetzt und gelöscht werden wie die Port Bits...

Lösungen werde ich hier aber nicht präsentieren - etwas präzisere Fragen wenn etwas nicht klar ist würde ich aber schon beantworten ^^

MfG,
SlyD

polskapawel
07.11.2008, 21:24
Hi, ne komplett lösung wäre nicht schlecht fange nämlich grad erst an mit der C programmierung. Aber Aufjedenfall danke, werde probieren das beste aus deiner Hilfe zu machen und spaß macht das reindenken ja auch....
Melde mich bei entstehenden problemen

Pr0gm4n
08.11.2008, 10:08
Hi,

ist es absicht, dass deine Platine für die Verwendungszwecke etwas groß ist/aussieht?

also wenn es darum geht, die auf dem RP6 verwendeten Größen herzunehmen, dann schön und gut, aber mir als nochnichtplatinenselberätzer tut es immer weh, wenn ich platinen sehe, die eine relativ große freifläche haben...

also ich versuche immer jeden platz auszureizen, wenn ich welche bestelle, aber ich denke das ist beim selberätzen wohl eher nicht so angesagt(?) weils nicht so viel kostet(?)

naja, bei sowas kämen bei mir immer noch n paar taster und leds mit drauf oder weiss der geier was, aber irgendwas käme halt drauf^^

LG Pr0gm4n

sechsrad
08.11.2008, 16:48
also wenn es darum geht, die auf dem RP6 verwendeten Größen herzunehmen, dann schön und gut, aber mir als nochnichtplatinenselberätzer tut es immer weh, wenn ich platinen sehe, die eine relativ große freifläche haben...


Also ich finde, das es in der Entwicklungsphase angebracht ist, Platinen geräumiger zu bauen.
Den Microsche.i.s.s, wo man nachher kein Fehler findet ist nichts für die Entwicklung und Versuchsanstalt.

Pr0gm4n
08.11.2008, 17:22
Hi,

das sehe ich auch so, aber gut (bin ja wie gesagt ein nochnichtplatinenselberätzer), wenn ich richtige platinen bestelle, dann gehen da schon getestete lochraster-schaltungen voraus^^

und ich würde ja auch keinen Microsche.i.s.s bauen, ich würde lediglich ausnutzen, dass ich diesen Platz zur Verfügung habe^^

ich will deswegen ja nicht alles auf ein paar millimeter verkleinern, alles braucht seinen platz, aber ich denke auf gut 1/2 bis 2/3 der größe könnte man das leicht verkleinern ohne an der Übersicht etwas zu ändern

naja, ich denke ich bin da nur n bissl verklemmt weil für mich vorgefertigte/halt geätzte platinen sowas aussergewöhnliches sind^^

naja, mal schaun was die zukunft noch so bringt^^

LG Pr0gm4n