-         

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

Thema: RP6Base mit PCF8574P expander Platine

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    30.09.2008
    Beiträge
    8

    RP6Base mit PCF8574P expander Platine

    Anzeige

    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???
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken sdascl.jpg   platine_unten_210.jpg   platine_oben_737.jpg  

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    @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/pmwik...LCDErweiterung
    Das müßte genauso für den RP6 funktionieren.

    Gruß Dirk

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    30.09.2008
    Beiträge
    8

    Fehler?

    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.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken schaltplan_138.jpg  

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.01.2008
    Beiträge
    164
    Aber haua, die müssen dran 4,7k bis ca 10k. Musst mal testen.

    mfg

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    33
    Beiträge
    1.514
    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

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    30.09.2008
    Beiträge
    8

    Asuro

    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 == 12
    {
    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.....

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    33
    Beiträge
    1.514
    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:
    Code:
    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

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    30.09.2008
    Beiträge
    8

    Danke erstmal

    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

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.01.2008
    Ort
    Schrobenhausen, München
    Alter
    24
    Beiträge
    583
    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

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.01.2008
    Beiträge
    164
    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.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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