Forum: Mikrocontroller und Digitale Elektronik PORT PIN Problem


von Patrick (Gast)


Lesenswert?

Hallo alle zusammen,
ich sitzen gerade an einem Projekt mit einem atmega16 und einer 
selbstentwickelten Platine. Fertig geätzt und somit nicht mehr 
veränderbar.

Also mein Problem besteht darin, dass ich eine Routine zum ansteuern des 
Display aus einem Buch entnommen hab. Dort werden die Pins des PortD 
benutzt, bis auf  pin 1 und 2.
Pin2 hab ich beim Entwickeln der Platine für die Hintergrund-Beleuchtung 
benutzt, welche dann im laufenden Programm bei bedarf ein und 
ausgeschaltet wird.
Allerdings funktioniert das nicht, da die Routine scheinbar den PIN2 
immer bein Aktualisieren des Display ausschaltet.

Ich hab den Code mal angehängt. Vielleicht kann mir da ja jemand helfen, 
wie ich das ändern kann. Bin noch recht grün hinter den Ohren, was da 
Programmieren von µC angeht. Also bitte Nachsicht.

// LCD Output for  HD44780 compatible displays
// Pinning adapted to set interrupt pins free
// Target: ATMEGA8

#include "BitUtilities.h"

// LCD control cmmands
#define LCD_CLEAR    0x01  /*Clear display:     0b 0000 0001  */
#define LCD_HOME    0x02  /*Cursor home:       0b 0000 0010  */
#define LCD_ON      0x0C  /*Cursor invisible:     0b 0000 1100  */
#define LCD_OFF      0x08  /*Display off:       0b 0000 1000  */
#define POS_01      0x80  /*Line 1 - Column 0    0b 1000 0000   */
#define POS_02      0xC0  /*Line 2 - Column 0    0b 1100 0000   */
// definitions of port pins
#define  LCDPORT      PORTD
#define  LCDDDR      DDRD
#define LCD_PIN_RS    0
#define LCD_PIN_E    3
#define LCD_PIN_D4    4
#define LCD_PIN_D5    5
#define LCD_PIN_D6    6
#define LCD_PIN_D7    7

#define  COMMAND      0
#define DATA      1

void toggle_enable_pin(void)
{
  sbi(LCDPORT, LCD_PIN_E); cbi(LCDPORT, LCD_PIN_E);
}

void lcd_send(unsigned char type, unsigned char c)
{
  unsigned char sic_c;  // backup for c

  // send high nibble
  sic_c = c;                  // save original c
  sic_c &= ~0x0f;                // set bit 0-3 == 0
  if (type==DATA) sic_c |= (1<<LCD_PIN_RS);  // data: RS = 1
  LCDPORT = sic_c; toggle_enable_pin();    // send high nibble

  // send low nibble
  sic_c = c;                  // save original c
  sic_c = sic_c<<4;              // exchange nibbles
  sic_c &= ~0x0f;                // set bit 0-3 == 0
  if (type==DATA) sic_c |= (1<<LCD_PIN_RS);  // data: RS = 1
  LCDPORT = sic_c; toggle_enable_pin();    // send low nibble
  _delay_ms(5);                // Wait for LCD controller
}

// set cursor to line x and column y
void lcd_set_cursor(uint8_t line, uint8_t col)
{ uint8_t i;
  switch (line)
  { case 1: i=0x80+0x00+col; break;    // 1. line
    case 2: i=0x80+0x40+col; break;    // 2. line
    default: return;                   // invalid line
  }
  lcd_send(COMMAND, i);
}

// write string to LCD
void lcd_write(char *data)
{    while(*data) {lcd_send(DATA, *data); data++;}
}

// Initializing LCD controller - see data sheet for details
void lcd_init()
{
  /* Set Port to Output */
  LCDPORT = 0x00;  LCDDDR  = 0xFF;
  _delay_ms(50); // Wait for LCD

  /* 4-bit Modus config */
  sbi(LCDPORT, LCD_PIN_D5); cbi(LCDPORT, LCD_PIN_D4);

  /* 4-Bit Modus start */
  sbi(PORTD, LCD_PIN_E); cbi(PORTD, LCD_PIN_E); _delay_ms(5);

  /* 2 Lines, 4-Bit Mode */
  lcd_send(COMMAND, 0x28);
  lcd_send(COMMAND, LCD_OFF);  lcd_send(COMMAND, LCD_CLEAR);
  lcd_send(COMMAND, 0x06);  lcd_send(COMMAND, LCD_ON);
}

Vielen Dank schon mal im Voraus!!!

Gruß Patrick

von Karl H. (kbuchegg)


Lesenswert?

Patrick schrieb:
> Hallo alle zusammen,
> ich sitzen gerade an einem Projekt mit einem atmega16 und einer
> selbstentwickelten Platine. Fertig geätzt und somit nicht mehr
> veränderbar.

Hast du eine Ahnung was mit einem kleinen scharfen Messer und ein wenig 
Fädeldraht auf einer 'fertig geätzten Platine' alles möglich ist :-)


> Allerdings funktioniert das nicht, da die Routine scheinbar den PIN2
> immer bein Aktualisieren des Display ausschaltet.
>
> Ich hab den Code mal angehängt. Vielleicht kann mir da ja jemand helfen,
> wie ich das ändern kann. Bin noch recht grün hinter den Ohren, was da
> Programmieren von µC angeht. Also bitte Nachsicht.

Na dann musst du deinen Code durchsuchen, wo du auf den Port als ganzes 
zugreifst, wenn du eigentlich Einzelpin Zugriffe haben solltest - ohne 
Rücksicht auf Verluste.

Dazu wärs natürlich gut, wenn dein Code ein wenig vernünftig formatiert 
wäre, dann würde man sich keinen Wolf suchen. Und ich seh jetzt ehrlich 
gesagt nicht ein, warum ich da deine Arbeit machen soll. Wonach du 
Ausschau halten musst, weißt du ja jetzt. Viel Spass beim Suchen.
(Du könntest natürlich auch erst einmal hergehen und deinen Code 
vernünftig formatieren. Dann würde auch dir die Suche leichter fallen)

Und PS: so viele Stellen gibt es ja nicht, an denen auf den Port 
zugegriffen wird.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.