- SF800 Solar Speicher Tutorial         
Ergebnis 1 bis 5 von 5

Thema: STK500 ISP nicht möglich ....weil LCD Hardware an Port B Atmega32

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.713
    ... weil ich noch nicht so firm bin, wie ich per 4 Bit Modus die Daten "rüberschieben" muss ...
    Na dann schieb ich mal (im 26Buchstaben+10Ziffern-Modus) den Code rüber:

    Erstmal die includes-Belegungen-init-und-Anwendung
    Code:
    // .... Includieren
    // - - - - - - - - - - - - - - - -
    // ....
    //              ########>>>>>>>>  LCD   <<<<<<<<########
      #include <lcd_162_xta.c>      // LCD-Lib ähnlich Tr-Tester, akt. PORTB, PB0..5
    // ....
    // - - - - - - - - - - - - - - -
    // ####>>>>     Initialisierung/Anschlüsse von PORT B für LCD DEM 16x2
    //                    PORT B  LCD  Wannenstecker
    //     data bit 4        PB0  0 A  WS Pin1 | 
    //     data bit 5        PB1  1 A     Pin2 | -- Der 10-polige Wannenstecker
    //     data bit 6        PB2  2 A     Pin3 |    ist an die Belegung
    //     data bit 7   SCK, PB3  3 A     Pin4 |    des Transitortester angepasst
    //     RS line           PB4  RS      Pin5 |    es kommen noch
    //     ENABLE line MOSI, PB5  EN1     Pin6 |    Pin  9  GND und
    //     R/W (offen) MISO, PB6  R/W     Pin7 |    Pin 10  Vcc dazu
    //     NC (TasteC) SCK,  PB7  NC      Pin8 |___________________________
    //     GND                            Pin9   
    //     Vcc                            Pn10
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // ....
    // - - - - - - - - - - - - - - - -
    // ....                                
    // ============================================================================= =
    // ===  HAUPTProgramm ========================================================== =
    // ....
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     int main(void)                 //
     {                              
    // ....
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // Ports+Pins als Ein- (0) od. Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren
    //      A = Ausgang, E = Eingang ohne , EU = Eingang MIT PullUp
    // - - - - - - - - - - - - - - - -
    // ....
      DDRB  = 0b11111011;   // siehe aktuell oben
      PORTB = 0b01000000;   //
    // ....
      lcd_init();           //                                                     lib
    /// ....
      sei();                // Globalen Interrupt freigeben
    // ....
    // - - - - - - - - - - - - - - -
    //      LCD-Testroutinen
      lcd_01 ();            // LCD-Startinfo "R5M10 Archie xnn/© .....             inf
    .....
    // ============================================================
    
    // ============================================================================= =
    // ==   LCDausgabe, Folge 1
    // ============================================================================= =
      void lcd_01 (void)            // LCDausgabe "1"
     {                              //
    //LCD_SZ4 ();                   // Eigen Sonderzeichen, Satz 4 mit ©           kal
      lcd_clear();                  // Vor LCD-Ausgabe Display leeren              lcd
      lcd_string("R5M10 Archie  46");
      Line2();                      // An den Anfang der 2. Zeile springen
    //lcd_data( 5 ); lcd_data( 6 ); // © - in zwei Hälften
      lcd_string(" ---2014 08Mai");
      waitms (  500);
      Line2();                      // An den Anfang der 2. Zeile springen
      lcd_string("                ");       // Zeile löschen
      waitms (  500);
      Line1();                      // An den Anfang der 1. Zeile springen
      lcd_string("R5jM 46 ......._");
      Line2();                      // Anfang 2. Zeile
      lcd_string("    = online    ");
     }              // Ende von void lcd_01
    // ============================================================================= =
    Und die beiden Bibliotheksteile:

    Die lcd_162_xt_PB.h
    Code:
    //    LCD-Ansteuerung im 4-Bit-Modus
    //      Erweiterte Fassung mit Routine für selbst definierte Zeichen
    // Stand = Erweiterung von lcd-routines.h und lcd-routines.c
    //   vom 11. Apr. 2013          © 2013  by oberallgeier
    // Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
    //      Die folgenden Originalateien wurden beachtet oder zitiert
    // http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
    // http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
    // + http://www.mikrocontroller.net/articles/HD44780#Benutzerdefinierte_Sonderzeichen
    // + http://www.mikrocontroller.net/articles/Pseudo-Graphische_LCD-Ansteuerung
    //      vgl. auch http://www.mikrocontroller.net/topic/265717#2766442
    //
    // Die Pinbelegung ist über defines in lcd-routines.h einstellbar
    //
    //      Ansteuerung ab KoCo_x15 geändert auf RS=PB4, EN=PB5
    
    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);
      void lcd_generatechar( uint8_t code, const uint8_t *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
    
    
    // Set CG RAM Address --------- 0b01xxxxxx  (Character Generator RAM)
    #define LCD_SET_CGADR           0x40
     
    #define LCD_GC_CHAR0            0
    #define LCD_GC_CHAR1            1
    #define LCD_GC_CHAR2            2
    #define LCD_GC_CHAR3            3
    #define LCD_GC_CHAR4            4
    #define LCD_GC_CHAR5            5
    #define LCD_GC_CHAR6            6
    #define LCD_GC_CHAR7            7
    //#define LCD_GC_CHAR8          8
    //#define LCD_GC_CHAR9          9
    //#define LCD_GC_CHARA         10
    
    
    //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        PB4
    #define LCD_EN1       PB5
    ... und die lcd_162_xt_PB.c
    Code:
    //    LCD-Ansteuerung im 4-Bit-Modus
    //      Erweiterte Fassung mit Routine für selbst definierte Zeichen
    // Stand = Erweiterung von lcd-routines.h und lcd-routines.c
    //   vom 11. Apr. 2013          © 2013  by oberallgeier
    // Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
    //      Die folgenden Originalateien wurden beachtet oder zitiert
    // http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
    // http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
    // + http://www.mikrocontroller.net/articles/HD44780#Benutzerdefinierte_Sonderzeichen
    // + http://www.mikrocontroller.net/articles/Pseudo-Graphische_LCD-Ansteuerung
    //      vgl. auch http://www.mikrocontroller.net/topic/265717#2766442
    //
    // Die Pinbelegung ist über defines in lcd-routines.h einstellbar
     
    #include <avr/io.h>
    #include "lcd_162_xt_PB.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++;                     //
      }
     }              // Ende void lcd_eep_string(const
    
    
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // Schreibt ein Zeichen in den Character Generator RAM
    // Daten liegen direkt im RAM
      void lcd_generatechar(uint8_t code, const uint8_t *data)
     {                             //
      lcd_command(LCD_SET_CGADR|(code<<3)); // Startposition des Zeichens einstellen
      for (uint8_t i=0; i<8; i++)           // Bitmuster übertragen
      {                             //
        lcd_data(data[i]);          //
      }                             //
     }              // Ende void lcd_generatechar(uint8_t code,
    
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ... also ALLES für den Port B entsprechend der beschriebenen Pinbelegung. Läuft so bei mir auf praktisch allen megas.

    Viel Erfolg
    Ciao sagt der JoeamBerg

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    75
    Beiträge
    1.175
    Blog-Einträge
    1
    Danke habe alles bekommen...

    Gerhard
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

Ähnliche Themen

  1. atmega32 und STK500 - ISP geht plötzlich nicht mehr HILFE!!
    Von m@rkus33 im Forum AVR Hardwarethemen
    Antworten: 4
    Letzter Beitrag: 10.03.2007, 18:42
  2. Atmega32/STK500 -UART senden/empfangen klappt nicht
    Von Leuchtturm im Forum C - Programmierung (GCC u.a.)
    Antworten: 12
    Letzter Beitrag: 16.01.2007, 14:02
  3. Schaltung ISP + Atmega32 + LCD
    Von leon20 im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 06.01.2007, 14:40
  4. ATMega32: Port B trotz ISP nutzbar?
    Von MasterFX im Forum AVR Hardwarethemen
    Antworten: 10
    Letzter Beitrag: 13.04.2006, 18:50
  5. LCD geht an PORT B & C, aber nicht an PORT D?
    Von PeterJ im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 4
    Letzter Beitrag: 07.02.2006, 13:30

Berechtigungen

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

Labornetzteil AliExpress