PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] STK500 ISP nicht möglich ....weil LCD Hardware an Port B Atmega32



oderlachs
25.05.2014, 16:39
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

oberallgeier
25.05.2014, 16:48
... 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 (http://www.rn-wissen.de/images/c/c6/Rncontrol1.4schaltplan.gif). 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.

oderlachs
25.05.2014, 18:11
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.

oberallgeier
26.05.2014, 12:11
... 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
// .... 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

// 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

// 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

oderlachs
27.05.2014, 07:57
Danke habe alles bekommen...

Gerhard