Forum: Mikrocontroller und Digitale Elektronik KS0108_Library


von kleiner_meiner (Gast)


Lesenswert?

Hallo zusammen,

ich benutze derzeitig 
http://www.mikrocontroller.net/articles/KS0108_Library die dortige 
Library für mein LC_Display

http://www.pollin.de/shop/dt/NDc1OTc4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Displays/LCD_Modul_TG12864B_13B.html.

Ich habe wie im Beitrag die die Hardware an die Software angepasst.
1
// Ports
2
#define LCD_CMD_PORT    PORTC    // Command Output Register
3
#define LCD_CMD_DIR      DDRC    // Data Direction Register for Command Port
4
5
#define LCD_DATA_IN      PIND    // Data Input Register
6
#define LCD_DATA_OUT    PORTD    // Data Output Register
7
#define LCD_DATA_DIR    DDRD   // Data Direction Register for Data Port
8
9
// Command Port Bits
10
#define D_I          0x03    // D/I Bit Number
11
#define R_W          0x02    // R/W Bit Number
12
#define EN          0x01    // EN Bit Number
13
#define CSEL1        0x04    // CS1 Bit Number
14
#define CSEL2        0x05    // CS2 Bit Number

Zusätzlich benutze ich das angehangende Beispiel Programm um dort etwas 
angezeigt zubekommen. Leider blieb das Display leer.
1
/*
2
 * Copyright:      Fabian Maximilian Thiele  mailto:me@apetech.de
3
 * Author:         Fabian Maximilian Thiele
4
 * Remarks:        this Copyright must be included
5
 * known Problems: none
6
 * Version:        1.1
7
 * Description:    KS0108 Library Demo Program 
8
 * 
9
 */
10
11
#include <inttypes.h>
12
#include <avr/io.h>
13
#include <avr/pgmspace.h>
14
15
16
#include "ks0108.h"
17
#include "arial_bold_14.h"
18
#include "corsiva_12.h"
19
20
21
int main(void) {
22
  
23
  // Wait a little while the display starts up
24
  for(volatile uint16_t i=0; i<150000000; i++);
25
  
26
  
27
  // Initialize the LCD
28
  ks0108Init(0);
29
30
  
31
  // Select a font
32
  ks0108SelectFont(Arial_Bold_14, ks0108ReadFontData, BLACK);
33
  // Set a position
34
  ks0108GotoXY(15,10);
35
  // Print some text
36
  ks0108Puts_P(PSTR("KS0108-Treiber"));
37
  // a nice little round rect
38
  ks0108DrawRoundRect(5, 5, 117, 20, 8, BLACK);
39
40
  // Once again :)
41
  // Select a font
42
  ks0108SelectFont(Corsiva_12, ks0108ReadFontData, BLACK);
43
  // Set a position
44
  ks0108GotoXY(5,30);
45
  // Print some text
46
  ks0108Puts_P(PSTR("Hallo"));
47
48
  while(1);
49
}
Hätte da jemand noch eine Idee was ich tun bzw wie ich am besten anfange 
bin bissel ratlos.

von Sascha W. (sascha-w)


Lesenswert?

kleiner_meiner schrieb:
> Hallo zusammen,
>   for(volatile uint16_t i=0; i<150000000; i++);

Schon mal die Ausgaben (Warnungen) deines Compilers gelesen?
uint16 geht nur von 0 ... 65535, das macht deine Pause dann schon recht 
kurz.

Sascha

von kleiner_meiner (Gast)


Lesenswert?

k danke habe den Teil durch _delays ersetzt leider immer noch keine 
änderung am Bild.

von kleiner_meiner (Gast)


Angehängte Dateien:

Lesenswert?

hab einen fehler schonmal gefunden hatte den reset dauerhaft auf 0V da 
konnte dann auch nix angezeigt werden.
Jetzt wird auch am Display was angezeigt, aber leider nur willkürliche 
pixel :(.
1
#include <inttypes.h>
2
#include <avr/io.h>
3
#include <avr/pgmspace.h>
4
5
#include "ks0108.h"
6
#include "front1.h"
7
#include "front2.h"
8
9
const char pgmString[] PROGMEM = "http://www.apeTech.de\n\naffe.t@gmx.de";
10
11
int main(void) 
12
{
13
  volatile uint16_t i,j,k;
14
  struct font largeFont, smallFont;
15
  
16
  for(i=0; i<15000; i++);
17
  
18
  
19
  largeFont.width = FONT12X16_WIDTH;
20
  largeFont.height = FONT12X16_HEIGHT;
21
  largeFont.charData = Font12x16;
22
  
23
  smallFont.width = FONT6X8_WIDTH;
24
  smallFont.height = FONT6X8_HEIGHT;
25
  smallFont.charData = Font6x8;
26
  while(1)
27
  {
28
    ks0108Init();
29
    for (k = 0;k< 128;k++)
30
    {
31
      for (j = 0;j <65;j++)
32
      {
33
      ks0108ClearDot(k,j);
34
      }
35
    }
36
  }
aber ansich sollten ich doch mit meiner for schleife alle pixel löschen 
oder nicht?









}

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

kleiner_meiner schrieb:
1
  while(1)
2
  {
3
    ks0108Init();
4
    for (k = 0;k< 128;k++)
5
    {
6
      for (j = 0;j <65;j++)
7
      {
8
      ks0108ClearDot(k,j);
9
      }
10
    }
11
  }

 Wie wäre es wenn du das mal aus der Schleife rausnimmst ?
 So:
1
    ks0108Init();
2
    for (k = 0;k< 128;k++)
3
    {
4
      for (j = 0;j <65;j++)
5
      {
6
      ks0108ClearDot(k,j);
7
      }
8
    }
9
  while(1);

: Bearbeitet durch User
von kleiner_meiner (Gast)


Lesenswert?

hab ich auch schon versucht kommt exakt das gleich bei rum leider. Werds 
morgen weiter versuchen und danke für die Hilfe.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

kleiner_meiner schrieb:
> hab ich auch schon versucht kommt exakt das gleich bei rum leider. Werds
> morgen weiter versuchen und danke für die Hilfe.

 Mal angenommen, dass die Library und Verdrahtung in Ordnung ist...
 Bleibt nur deine Prozessorfrequenz. Ist die richtig eingestellt ?

: Bearbeitet durch User
von kleiner_meiner (Gast)


Lesenswert?

ich vermute am ehesten die library. Sobald ich nur den init befehl 
ausführen will habe ich schon wilkürliche pixel im display stehen.
Aber Prozessor Frequenz hab ich standart mäßig auf 1Mhz gesetzt. Benutze 
ein Atmega 1284p.

von spess53 (Gast)


Lesenswert?

Hi

>ich vermute am ehesten die library. Sobald ich nur den init befehl
>ausführen will habe ich schon wilkürliche pixel im display stehen.

Solange nicht etwas wie ein Clear durchgeführt wird ist das normal.

MfG Spess

von kleiner_meiner (Gast)


Lesenswert?

Hatte ich ja auch schon durch den Befehl init
1
void ks0108Init(void) {
2
  pos.x = 0;
3
  pos.y = 0;
4
  pos.page = 0;
5
  
6
  LCD_CMD_DIR = 0xFF;                // command port is output
7
  ks0108WriteCommand(LCD_ON, CHIP1);        // power on
8
  ks0108WriteCommand(LCD_ON, CHIP2);
9
  
10
  ks0108WriteCommand(LCD_DISP_START, CHIP1);    // display start line = 0
11
  ks0108WriteCommand(LCD_DISP_START, CHIP2);
12
  ks0108Fill(CLEAR);                // display clear
13
  ks0108GotoXY(0,0);

Dort wird ja ks0108fill aufgerufen der Clear wurde vorher als 0x00 
deklariert und so mit sollte nach der funktion alles auf 0 gesetzt sein.
1
void ks0108Fill(uint8_t mode) {
2
  uint8_t i, j;
3
  
4
  for(i=0; i<8; i++) {              // page address
5
    ks0108GotoXY(0, i*8);
6
    for(j=0; j<128; j++)            // x address
7
    ks0108WriteData(mode);          // write data

es werden aber immer nur pixel angezeigt.

von spess53 (Gast)


Lesenswert?

HI

Der KS0108 ist einer der der primitivsten Grafikkontroller den es 
überhaupt gibt. Da kann man softwaremäßig nicht viel falsch machen.

Überprüfe mal deine Hardware.

MfG Spess

von kleiner_meiner (Gast)


Angehängte Dateien:

Lesenswert?

2 mal überprüft und denke nicht das ich Hardwaretechnisch was falsch 
gemacht habe. Zumindestens denke ich das ^.^. Habe aber nochmal Zeichung 
davon gemacht wie ich es angeschlossen habe.
Vielleicht hab ich auch was übersehen wäre nett wenn mal wer drüber 
guckt.
Danke schon mal für die hilfe.

von holger (Gast)


Lesenswert?

Deaktiviere mal JTAG.

von spess53 (Gast)


Lesenswert?

Hi

>Benutze ein Atmega 1284p.

Da PortC für den Datenbus verwendetet wird stellt sich die Frage, ob das 
JTEG-Interface von PortC abgeschaltet ist.

MfG Spess

von kleiner_meiner (Gast)


Lesenswert?

Vielen dank. Jetzt bleibt auch das Display leer. Hatte bei Jtag Haken 
:/.
So nun weiter weiter. Erstmal vielen dank für die Hilfe stellungen :).

von kleiner_meiner (Gast)


Lesenswert?

ich nochmal Ansteuerung funktioniert gut. Bekomme auch am Display 
angezeigt was ich programmiere nur dauert es teilweise bis zu 30s bis er 
was anzeigt. Ist das normales verhalten oder hab ich wieder mist gebaut?
1
int main(void) 
2
{
3
int i, j;
4
  ks0108Init();
5
for (i=0;i<65;i++)
6
{
7
  for (j=0;j<129;j++)
8
  {
9
    ks0108SetDot(i,j);
10
  }
11
}
12
while(1);

soll mit quasi das Display einmal voll punkten und dann nix weiter tun. 
das Klappt auch nur die zeit zwischen jedem punkt kommt mir ziemlich 
lange vor. Oder kommt des daher das ich pro Punkt ihm den Befehl + die 
datenliefe?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

kleiner_meiner schrieb:
1
for (i=0;i<65;i++)
2
{
3
  for (j=0;j<129;j++)
4
  {
5
    ks0108SetDot(i,j);
6
  }
7
}
 Dein display ist doch 128x64, nicht 129x65, oder ?
 (0,0) ==> (127,63). Und x und y wäre vielleicht übersichtlicher ?

> angezeigt was ich programmiere nur dauert es teilweise bis zu 30s bis er
> was anzeigt. Ist das normales verhalten oder hab ich wieder mist gebaut?

 Das zweite, was hast du denn gedacht ?

: Bearbeitet durch User
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.