www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Initialisierung SED1520


Autor: Marko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich versuche seit zwei Tagen ein Grafik-LCD, Typ LMC84S042C13M 
(Datenblatt: 
http://www.mark-products.com/pdf/g122x32/84_042/84...) 
anzusteuern. Leider schaffe ich nicht einmal es zu initialisieren. Das 
LCD bleibt leer. Man kann den Schatten der Pixel erkennen, die 
Takterzeugung (2kHz) und die Kontrastspannung stimmen also schon mal.

Ich poste mal meinen Code, vielleicht findet ja jemand einen Fehler:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

#define F_CPU 1000000

#include <util/delay.h>

#define DATA    PORTA
#define DATA_DDR  DDRA

#define CTRL    PORTD
#define CTRL_DDR  DDRD

#define A0    (1<<PD0)
#define CS2    (1<<PD1)
#define CS1    (1<<PD2)
#define LCD_E  (1<<PD3)
#define RESET  (1<<PD4)

#define LCD_OFF 0xAE
#define LCD_ON 0xAF
#define LCD_RESET 0xE2
#define LCD_STATIC 0xA4
#define LCD_STARTLINE 0xC0
#define LCD_COLUMNADDR 0x00
#define LCD_DUTY32 0xA9
#define LCD_ADC 0xA0
#define LCD_PAGE1 0xBB
#define LCD_RMW_END 0xEE

void timer_init(void)
{
  DDRB |= (1<<PB3);  // enable OC0 pin
  TCCR0 |= (1<<WGM01) | (1<<COM00) | (1<<CS01);  // CTC mode, toggle OC0 on compare match
                          // prescaler = 8
  OCR0 = 31;  // 2khz
}

void ports_init(void)
{
  CTRL = 0xff;
  CTRL &= ~LCD_E;
  CTRL_DDR = 0xff;
  DATA = 0xff;
  DATA_DDR = 0xff;
}

void write_ctrl(unsigned char c)
{
  DATA = c;
  CTRL &= ~A0; // A0 low -> command
  CTRL &= ~(CS1 | CS2); // send to both controllers
  
  CTRL |= LCD_E;
  _delay_us(100);
  CTRL &= ~LCD_E;

  CTRL |= (CS1 | CS2);
  CTRL |= A0;
}

void write_data(unsigned char c)
{
  DATA = c;
  CTRL &= ~(CS1 | CS2); // send to both controllers
  
  CTRL |= LCD_E;
  _delay_us(100);
  CTRL &= ~LCD_E;

  CTRL |= (CS1 | CS2);
}

void lcd_reset(void)
{
  CTRL &= ~LCD_RESET;
  _delay_us(100);
  CTRL |= LCD_RESET;
  _delay_ms(100);
}


int main(void)
{
  timer_init();
  ports_init();
  lcd_reset();

  _delay_ms(100);
  write_ctrl(LCD_OFF);
  _delay_ms(10);
  write_ctrl(LCD_STARTLINE);
  _delay_ms(10);
  write_ctrl(LCD_STATIC);
  _delay_ms(10);
  write_ctrl(LCD_COLUMNADDR);
  _delay_ms(10);
  write_ctrl(LCD_PAGE1);
  _delay_ms(10);
  write_ctrl(LCD_DUTY32);
  _delay_ms(10);
  write_ctrl(LCD_ADC);
  _delay_ms(10);
  write_ctrl(LCD_RMW_END);
  _delay_ms(10);
  write_data(0x55);
  write_data(0x55);

  for(;;);
}

Autor: Marko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso, Controller ist ein ATMega16 auf einem STK500.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Du schaltest das Display am Ende der Initialisierung nicht ein.

MfG Spess

Autor: Marko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
headdesk

Funktioniert jetzt. Danke :) Ich hatte es mal drin, aber bei irgendeiner 
Änderung ist es wohl rausgeflogen ...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.