- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 7 von 7

Thema: DOGM163 an RN-Control

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    18.02.2011
    Beiträge
    46

    DOGM163 an RN-Control

    Anzeige

    Praxistest und DIY Projekte
    Hey Leute,
    lange ist es her, dass ich mich zuletzt mit dem Thema Robotik beschäftigt habe, doch in letzter Zeit habe ich wieder Lust bekommen mich mit dem Thema zu beschäftigen.
    Nun sitze ich hier und bin am Verzweifeln. Ich hatte mich früher schon mal damit beschäftigt das Display DOGM163 zum Funktionieren zu überreden, doch damals habe ich relativ schnell aufgegeben. Heute will das alles immer noch nicht so recht funktionieren. Ich hab schon eine Lib gefunden, mit der das Display funktionieren sollte, doch bei mir tut sich nichts und verstehen tue ich das ganze auch noch nicht so richtig. Hat eventuell schon jemand Erfahrung mit dem Ding oder es schon erfolgreich in C programmiert? Oder ist jemand so hilfsbereit mir mit der Lib ein Beispiel zusammenzubasteln, an welchem ich die Funktionsweise verstehe?
    Seid bitte nicht so hart, es ist 2 Jahre her, dass ich mich zuletzt damit beschäftigt habe. Ich wäre unendlich dankbar, wenn mir jemand helfen könnte.

    PS.: Ich betreibe das Display im 4bit-Modus (5V) an einem RN-Control(16mhz)
    D4 = PB0
    D5 = PB1
    D6 = PB2
    D7 = PB3

    RS = PB4
    R/W = PB5
    E = PB6
    Angehängte Dateien Angehängte Dateien

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Irgendwie passt deine lcd.h nicht zu deiner Portbelegung. In der lcd.h hat du PortA definiert und hier schreibst du PortB.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.678
    ... bin am Verzweifeln ... Display im 4bit-Modus (5V) an einem RN-Control(16mhz) ...
    Na - an so nem schönen Sonnensonntag kann man Dich doch nicht verzweifeln lassen. Mal ein paar Schnippsel mit Initialisierungen, defines und Code (und denk an das was Hubert schreibt: wer (s)eine Bibliothekssoftware nicht mit seiner Hardware abstimmt ist schnell am Verwzeifeln) :

    Code:
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    //      LCD hat 16 Zeichen:     "1234567890123456";
      unsigned char XXX1[]  EEMEM = "__ R5J Archie __";     // Programm ID
      unsigned char XXX2[]  EEMEM = "XXX Vx06 (c)2013";     // Versions ID
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
    
    // ============================================================================== =
    // ============================================================================== =
    //      Auszug aus dem main:
    //      ....
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    //      ....
    //              ########>>>>>>>>  LCD   <<<<<<<<########
      #include <lcd-routines.h>     // LCD-Lib - ähnlich Tr-Tester
      #include <lcd-routines.c>     // LCD-Lib
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      DDRB  = 0b11111111;   // siehe aktuell oben
      PORTB = 0b00000000;   //    und Port/Pull Ups (1)  aktivieren
    //      ....
      lcd_init();           //                                                      lib
    //      ....
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    //LCDtst ();            //                                                      inf
    //###Linf01 ();         //                                                      inf
    //###LTwahl ();         // Ausgabekonfiguration: LCD/UART, ohne Taste: nur UART inf
    //      ....
    //      Ende Auszug aus dem main
    // ============================================================================== =
    // ============================================================================== =
     
    // ============================================================================== =
    // ============================================================================== =
    //### Programm 1 ms pausieren lassen  !! Der Pausenwert ist nur experimentell !
      void wms(uint16_t ms) 
      { 
        for(; ms>0; ms--) 
        { 
          uint16_t __c = 4000; 
          __asm__ volatile ( 
             "1: sbiw %0,1" "\n\t" 
             "brne 1b" 
             : "=w" (__c) 
             : "0" (__c) 
          ); 
        } 
      } 
    // ============================================================================== =
    // ============================================================================== =
    // ============================================================================== =
    //      LCD-Test-Routinen
    // ============================================================================== =
      void LCDtst (void)            // Testausgaben aufs LCD - mit Beispielen
     {                              // 
      char abc[12];           // Übersetzungsfeld für Werteausgabe
    
    // Startsequenz LCD             
      Line1();                 // 1. Zeile Startinfo
      lcd_eep_string(XXX1);         //      "__ R5J Archie __"
      Line2();                 // 2. Zeile
      lcd_eep_string(XXX2);         //      "XXX Vx06 (c)2013";
      wms ( 2000);                  // Nur so - zur Show
    
      Line2();                 // 2. Zeile
      lcd_eep_string(LEER);         // Zeile leeren (füllen mit blanks)
      SetCursor (2, 9);             // Positioniere Zeile 2 {1, 2}, Stelle 9 {0, 15}
      lcd_string(itoa(SLAVE_KoCo, abc, 10));        // Aktuellen Wert anzeigen
    
    // - - - - - - - - - - - - - - -
      return ;      
     }                              //
    // ===  Ende LCDtst (void)
    // ============================================================================== =
    
    // ============================================================================== =
    //      LCD-info01
    // ============================================================================== =
      void Linf01 (void)            // Startinfo LCD und Info Tastenwahl für UART/LCD
     {                              // 
    // Startsequenz LCD             
      Line1();                 // 1. Zeile Startinfo
      lcd_eep_string(XXX1);         //      "__ R5J Archie __"
      Line2();                 // 2. Zeile
      lcd_eep_string(XXX2);         //      "XXX Vx06 (c)2013";
      wms ( 2000);                  // Nur so - zur Show
      lcd_clear();                  //
    //Line1();                 // 1. Zeile Startinfo
      lcd_eep_string(LI01);         //      "UART-T1,  LCD-T2";
      Line2();                 // 2. Zeile
      lcd_eep_string(E9s);          //      "Ende ca.  9  sec"
    // - - - - - - - - - - - - - - -//
      return ;      
     }                              //
    // ===  Ende Linf01 (void)
    // ============================================================================== =
    und die lcd-h
    Code:
    // Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
    // http://www.mikrocontroller.net/artic...R-GCC-Tutorial
    //
    void lcd_data(unsigned char temp1);
    void lcd_command(unsigned char temp1);
    void lcd_send(unsigned char data);
    void lcd_string(char *data);
    void lcd_enable(void);
    void lcd_init(void);
    void lcd_clear(void);
    void lcd_eep_string(const unsigned char *data);
    //LCD-Befehle
    #define CMD_SetEntryMode         0x04
    #define CMD_SetDisplayAndCursor  0x08
    #define CMD_SetIFOptions         0x20
    #define CMD_SetCGRAMAddress      0x40    // für Custom-Zeichen
    #define CMD_SetDDRAMAddress      0x80    // zum Cursor setzen
    //Makros für LCD
    #define Line1() SetCursor(1,0) //An den Anfang der 1. Zeile springen
    #define Line2() SetCursor(2,0) //An den Anfang der 2. Zeile springen
    #define SetCursor(y, x) lcd_command((uint8_t)(CMD_SetDDRAMAddress + (0x40*(y-1)) + x)) //An eine bestimmte Position springen
    #define LCDLoadCustomChar() lcd_command(CMD_SetCGRAMAddress) //Custom-Zeichen laden
    //Eigene Zeichen
    #define LCD_CHAR_OMEGA  244 //Omega-Zeichen
    #define LCD_CHAR_U  228  //µ-Zeichen
    #define LCD_CHAR_DIODE  0 //Dioden-Icon; wird als Custom-Character erstellt
      
    // LCD Befehle
     
    #define CLEAR_DISPLAY 0x01
     
    // Pinbelegung für das LCD, an verwendete Pins anpassen
     
    #define LCD_PORT      PORTB
    #define LCD_DDR       DDRB
    #define LCD_RS        PB6
    #define LCD_EN1       PB4
    und noch die lcd-c dazu:
    Code:
    // Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
    // http://www.mikrocontroller.net/artic...R-GCC-Tutorial
    //
    // Die Pinbelegung ist über defines in lcd-routines.h einstellbar
     
    #include <avr/io.h>
    #include "lcd-routines.h"
    #include <util/delay.h>
    #include <avr/eeprom.h>
     
    // sendet ein Datenbyte an das LCD
     
    void lcd_data(unsigned char temp1)
    {
       LCD_PORT |= (1<<LCD_RS);        // RS auf 1 setzen
       lcd_send(temp1);
    }
     
    // sendet einen Befehl an das LCD
     
    void lcd_command(unsigned char temp1)
    {
       LCD_PORT &= ~(1<<LCD_RS);        // RS auf 0 setzen
       lcd_send(temp1);
    }
    //Eigentliche LCD-Zugriffs-Funktion; 4-Bit-Modus
    void lcd_send(unsigned char data) {
       // oberes Nibble setzen
      LCD_PORT = (LCD_PORT & 0xF0) | ((data >> 4) & 0x0F);
      _delay_us(5);
      lcd_enable();
       // unteres Nibble setzen
      LCD_PORT = (LCD_PORT & 0xF0) | (data & 0x0F);
      _delay_us(5);
      lcd_enable();
      _delay_us(60);  
      LCD_PORT &= 0xF0;
    }
    // erzeugt den Enable-Puls
    void lcd_enable(void)
    {
     LCD_PORT |= (1<<LCD_EN1);
        _delay_us(10);                   // kurze Pause
       // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers verlängern
       // http://www.mikrocontroller.net/topic/80900
       LCD_PORT &= ~(1<<LCD_EN1);
    }
     
    // Initialisierung: 
    // Muss ganz am Anfang des Programms aufgerufen werden.
     
    void lcd_init(void)
    {
     LCD_DDR = LCD_DDR | 0x0F | (1<<LCD_RS) | (1<<LCD_EN1);   // Port auf Ausgang schalten
     // muss 3mal hintereinander gesendet werden zur Initialisierung
     _delay_ms(30);
     LCD_PORT = (LCD_PORT & 0xF0 & ~(1<<LCD_RS)) | 0x03;
     lcd_enable();
     _delay_ms(5);
     lcd_enable();
     _delay_ms(1);
     lcd_enable();
     _delay_ms(1);
     LCD_PORT = (LCD_PORT & 0xF0 & ~(1<<LCD_RS)) | 0x02;
     _delay_ms(1);
     lcd_enable();
     _delay_ms(1);
     // 4Bit / 2 Zeilen / 5x7
     lcd_command(CMD_SetIFOptions | 0x08);
     // Display ein / Cursor aus / kein Blinken
     lcd_command(CMD_SetDisplayAndCursor | 0x04);
     // inkrement / kein Scrollen    
     lcd_command(CMD_SetEntryMode | 0x02); 
     lcd_clear();
    }
     
    // Sendet den Befehl zur Löschung des Displays
     
    void lcd_clear(void)
    {
       lcd_command(CLEAR_DISPLAY);
       _delay_ms(5);
    }
     
     
    // Schreibt einen String auf das LCD
     
    void lcd_string(char *data)
    {
        while(*data) {
            lcd_data(*data);
            data++;
        }
    }
    //String aus EEPROM laden und an LCD senden
    void lcd_eep_string(const unsigned char *data)
    { 
     unsigned char c;
        while(1) {
      c = eeprom_read_byte(data);
      if(c==0) return;
            lcd_data(c);
            data++;
        }
    }

    Vielleicht hilfts Dir? Läuft bei mir auf nem mega1284/20MHz/eigenePlatine, aber auch mit demselben Controller in der RNControl. Ich denkeglaubehoffe nicht, dass es zum Deinem Controller nen Unterschied gibt. Und die Bibliothek ist auf den "LCD-Stecker" der RNControl - siehe die dortige Dokumentation - abgestimmt

    Schönen Sonntag.
    Geändert von oberallgeier (05.03.2013 um 23:55 Uhr) Grund: Kommentar geändert
    Ciao sagt der JoeamBerg

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    18.02.2011
    Beiträge
    46
    Danke für die schnelle hilfe.
    Nur gibt es noch ein paar Problem. Da steht, dass z.b der RS Pin auf PB3 soll bzw. Pin 3 auf dem RN-Control Stecker, was auf dem RN-Control Stecker allerdings PB2 ist. Also meine Frage PB2 oder PB3? Oder habe ich was falsch verstanden?
    Geändert von homer3345 (04.03.2013 um 20:09 Uhr)

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.678
    Zitat Zitat von homer3345 Beitrag anzeigen
    ... Nur gibt es noch ein paar Problem ... meine Frage PB2 oder PB3? ... falsch verstanden ...
    Falsch verstanden? Um es mal deutlich zu sagen: Du hast nicht richtig aufgepasst, nicht richtig gelesen. Der Wannenstecker auf der RNControl hat die Pinne 1 bis 10, siehe auch RNWissen (siehe die Pinnummerung hier - klick), der Port B auf dem Controller hat die Pinne PORT B 0 bis PORT B 7.

    Verstanden? Schau mal auf doch mal Deine Betriebsanleitung (hast Du die denn überhaupt?) für die RNControl an, oder lies hier (klick) den Abschnitt auf dem LINKS "PORT B" steht bzw. die Überschrift "Digitale I/O Port B (PB0 bis PB 7)". Und wenn Du das dann noch nicht verstehst, schau in den Schaltplan und geh mal vom Controler PB2 zum Wannenstecker und schau nach, wie der Pin am andern Ende der Leitung heisst.

    ... lange ist es her, dass ich mich zuletzt mit dem Thema Robotik beschäftigt habe ...
    Stimmt, sehr lange.
    Ciao sagt der JoeamBerg

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    18.02.2011
    Beiträge
    46
    Genau so war mir das auch klar, deswegen habe ich mich ja über die Benennung der Pins gewundert. Da steht nämlich, dass Pin 1 auf dem RN-Stecker PB1 auf dem Controller entspricht, was ja nicht der Fall ist. Oder lese ich das falsch?
    LCD 24x2, pin for RS line 1 B3 = B3
    LCD 24x2, pin for RW line 2 B2 = B2
    LCD 24x2, pin for ENABLE line 3 B1 = B1
    GND 4 B9
    VCC 6 B10
    LCD 24x2, pin for 4bit data bit 4 8 B4 = B4
    LCD 24x2, pin for 4bit data bit 5 9 B5 = B5
    LCD 24x2, pin for 4bit data bit 6 10 B6 = B6
    LCD 24x2, pin for 4bit data bit 7 11 B7 = B7

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.678
    Ok, Du hast Recht, da stiftet mein Kommentar nur Verwirrung. Schließ das Display einfach nach den Gegebenheiten Deines Displays und dessen Stecker ans RNControl.
    Ciao sagt der JoeamBerg

Ähnliche Themen

  1. DogM163 mit PCA9555 im 4-bit-Modus
    Von andy75 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 03.08.2011, 21:25
  2. [gelöst]DOGM163 mit PCF klappt nicht
    Von ASUR0 im Forum Asuro
    Antworten: 4
    Letzter Beitrag: 05.01.2011, 14:22
  3. C-Control Mega128 über das Programm "C-Control Pro"
    Von Hagen_tb im Forum Bauanleitungen, Schaltungen & Software nach RoboterNetz-Standard
    Antworten: 1
    Letzter Beitrag: 11.10.2009, 10:09
  4. C-Control Main Unit & C-Control M-Unit verbinden?
    Von Speed im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 1
    Letzter Beitrag: 18.06.2005, 10:05
  5. Discovery Bot oder RN-Control 1.4 vs. C-Control
    Von Xtreme im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 14
    Letzter Beitrag: 06.06.2005, 19:15

Stichworte

Berechtigungen

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

Solar Speicher und Akkus Tests