-         

Ergebnis 1 bis 5 von 5

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

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    67
    Beiträge
    1.118
    Blog-Einträge
    1

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

    Anzeige

    Hallo Kenner der Materie
    Nun ja bei grösseren Sachen werden die Pins schon mal knapp..So will ich am PORT B die 8-Datenleitungen eines LCD anschalten, das setzt aber meine Möglichkeit ausser Betrieb, weiter mittels ISP den ATMega32 zu Programmieren.
    Ist das ein normaler Fall, oder mache ich da was falsch ?? Ich bin ja so detailiert auch noch nicht bewandert in Sachen AVR und es fehlen noch Erfahrungen darin...

    Weiss wer einen rat für mich ?

    Danke

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

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.586
    ... am PORT B die 8-Datenleitungen eines LCD ... ISP den ATMega32 zu Programmieren ...
    Das könnte gleich sein mit der Standardschaltung der RNC ontrol. Schau Dir mal deren Schaltplan an. Ich habe das Ding seit Jahren mit nem LCD in Betrieb (im 4-Bit-Modus) und das läuft. Allerdings habe ich keine m32er drauf sondern m1284er. Das sollte aber kein Problem bereiten.

    Viel Erfolg.
    Ciao sagt der JoeamBerg

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    67
    Beiträge
    1.118
    Blog-Einträge
    1
    Danke OAG !

    Werde mir mal die Schaltung in Augenschein nehmen....

    Da ich mir die Code selbst so zusammengestellt hatte, wollte ich es ja erstmal im 8-Bit Modus machen, weil ich noch nicht so firm bin, wie ich per 4 Bit Modus die Daten "rüberschieben" muss, daher waren alle B-Pins belegt.

    Habe es jetzt mit einer "Fremdlib" und im 4-BitModus geschafft. Ich denke in der Beschreibung , wonach ich meine Lib geschrieben hatte, sind Fehler drinnen, oder ich habe die Adressierung(LCD Speicher) nicht richtig verstanden...
    Na wird schon werden....kann auch an den Pausenzeiten liegen die zwischen den einzelnen Übernahmephasen (Befehl bzw. Daten) liegen.
    Na mal sehen werde mal probieren ob ich selber es auch schaffe.
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.586
    ... 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

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    67
    Beiträge
    1.118
    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, 19: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, 15:02
  3. Schaltung ISP + Atmega32 + LCD
    Von leon20 im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 06.01.2007, 15:40
  4. ATMega32: Port B trotz ISP nutzbar?
    Von MasterFX im Forum AVR Hardwarethemen
    Antworten: 10
    Letzter Beitrag: 13.04.2006, 19: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, 14:30

Berechtigungen

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