- Labornetzteil AliExpress         
Ergebnis 1 bis 7 von 7

Thema: DOGM163 an RN-Control

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694
    ... 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 22:55 Uhr) Grund: Kommentar geändert
    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, 20:25
  2. [gelöst]DOGM163 mit PCF klappt nicht
    Von ASUR0 im Forum Asuro
    Antworten: 4
    Letzter Beitrag: 05.01.2011, 13: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, 09: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, 09: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, 18:15

Stichworte

Berechtigungen

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

12V Akku bauen