www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 128x64 Grafik LCD An Atmega 8/16/32


Autor: Daniel Steiner (sany)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallöchen,

Bin nun im Besitz eines Grafischen 128x64 LCDs von Pollin (TG12864B-13) 
mit einem KS0108 kompatiblen Controller.

Ich hab folgende PINS aus dem Datenblatt:

1 -> VSS
2 -> VDD
3 -> V0
4 -> D/I
5 -> R/W
6 -> E
7 -> DB0
8 -> DB1
9 -> DB2
10 -> DB3
11 -> DB4
12 -> DB5
13 -> DB6
14 -> DB7
15 -> CS1
16 -> CS2
17 -> /RST
18 -> VEE
19 -> A
20 -> K

Hab gleich mehrere Fragen bezüglich des Anschlusses an meinen Atmel,
Hab folgende Atmels zur Verfügung: AtMega8515, 2x Atmega 16 und ein 
Atmega 32

1. Welche PINS muss Ich nun an meinen Atmel Anschließen?
2. Was hat V0, D/I, CS1, CS2, RST  VEE / A und K für eine Funktion?

Ist es besser wenn ich einen Atmel für die Display Ansteuerung nutze und 
einen Atmel für mein eigentliches Programm verwende?

Kann meinem Datenblatt nicht wirklich viel diesbezüglich entnehmen.

Wo finde ich denn ein Datenblatt zum ansteuern des LCDs? Hab unter 
google zum KS0180 nichts gefunden :(

Wäre für Hilfe Dankbar :)

Sany.

Autor: Patrick Wieland (wieland)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Sany!

Eine vollständige Beschreibung findest du hier:
http://www.lcd-module.de/eng/pdf/zubehoer/ks0108b.pdf

Gruß!
Wieland

Autor: Daniel Steiner (sany)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen dank.

Hast du mir vielleicht noch eine Empfehlung welcher meiner Atmels ich 
nutzen soll und an welchen Port ich die PINs vom Display aus dran hängen 
soll?

gruß
daniel

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Hast du mir vielleicht noch eine Empfehlung welcher meiner Atmels ich
> nutzen soll und an welchen Port ich die PINs vom Display aus dran hängen
> soll?

Alle drei sind dafür geeignet (stellen eine ausreichende Anzahl von 
Ports zur Verfügung). Die Frage ist eher: wieviele Portpins benötigst Du 
noch für andere Zwecke?

Gruß,
Magnetus

Autor: Patrick Wieland (wieland)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Hast du mir vielleicht noch eine Empfehlung welcher meiner Atmels ich
> nutzen soll und an welchen Port ich die PINs vom Display aus dran hängen
> soll?

Nimm den ATmega16, der ist billiger als der ATmega32 und du hast zwei 
Stück davon, es ist also nicht ganz so schlimm, wenn dir einer 
kaputtgeht.
An welche Ports du das Display hängst ist völlig egal, aber ich würde 
die Leitungen für die Datenbits, also DB0..DB7, auf jedenfall zusammen 
an einen Port packen (z.B. PA0..PA7). Wenn du nicht beabsichtigst auch 
vom Bilschirm zu "lesen", dann kannst du (nagel mich bitte nicht darauf 
fest, sondern schau nochmal im Datenblatt nach) die R/W-Leitung auch 
dauerhaft mit GND verbinden. Die Reset-Logik des Displays würde ich mit 
der des Atmels verdrahten, dann startet das LCD auch nach dem 
Programmieren über das ISP immer ordentlich neu.

Autor: Stefan Wimmer (wswbln)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...wenn Du mehrere Fonts und Grafikelemente auf dem Display nutzen 
möchtest, wirst Du bald feststellen, dass das Flash gar nicht gross 
genug sein kann.. ;-)

Autor: Daniel Steiner (sany)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hey,

Danke für eure vielen Beiträge, hab garnicht gedacht das ich noch solche
Informationen erhalte.

Wo ich aber aktuell echt mehr Infos brauchen könnte, welche Bedeutung 
die PINs A und K vom LCD haben??

Ich bestrome mein VSS und VDD mit 5V und mein Kontrast mit 9V. nun ist 
die Frage, ob nun V0 Plus ist und VEE GND ist von meinem Kontrast...

(Datenblatt von Pollin als anlage)

Also R/W auf GND zu legen, ist wie ich in mehreren Beiträgen gelesen
habe, zwar möglich, aber auch nur wenn man die Busy Zeiten des Displays
ganz genau nimmt oder weiss..

Da ich diese ebenfalls nicht weiss und auch nicht fest anlegen möchte,
werde ich die R/W Leitung nutzen :)


Also das der Flash natürlich nieee groß genug sein kann ist mir klar,
vorallem in sachen Grafik LCD..

Aber ich hab hier noch ein hübsches Flash oder EPPROM von Atmel
rumliegen mit 256KB (AT28C256 15PC) kann ich eigentlich auch an den
Atmel dran klemmen und nutzen ?? oder würde das nciht funktionieren??

Vielen dank :)

Autor: Uwe Nagel (ulegan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit der Kontrastspannung steht doch im Datenblatt: aus Vee kommt 
eine Spannung raus, die 9V negativer ist als Vdd. Du musst also keine 9V 
anlegen. Mit einem Poti stellt man die Spannung an V0 ein. Was nicht 
drin steht ist der Wert des Poti's, ich würde mal 10kOhm versuchen.
A und K sind die Anschlüsse der LED für die Hintergrundbeleuchtung. A 
ist + und K ist -. Aber vermutlich gehört ein Vorwiderstand vor A, so 
wie es bei LED's immer sein muss. Wie gross der sein muss kann man nur 
schätzen: etwa 100mA maximal für die LED, ergibt bei 5V und blauer LED 
etwa 1,5V/100mA=15 Ohm. Ziemlich wenig... Ich würde mal 100 Ohm 
verwenden, oder mehr. Bei einem ähnlichen Display versorge ich die 
Beleuchtung aus einem Portpin über 220 Ohm, das reicht im dunkeln völlig 
aus.

Autor: Uwe Nagel (ulegan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und noch zum Prozessor:
meine erste Anwendung mit einem solchen Display hab ich mit einem mega8 
gemacht, der Zeichensatz (große Zeichen) frass den halben Speicher. Die 
andere Hälfte verbrauchte dann eine unbedacht eingesetzte 
Gleitkomma-Multiplikation... Glücklicherweise hatte ich den mega168 im 
gleichen Gehäuse mit doppeltem Speicher.
Mega16 und mega32 sind doch bis auf die Speichergröße völlig gleich, 
wenn der 16-er voll ist kannst du immer noch auf den mega32 umsteigen.
Das mit dem externen Flash geht zwar, macht das ohnehin langsame Display 
aber auch nicht gerade schneller.
Ausserdem ist doch ein 28C256 ein paralleles EEPROM, das verbraucht dir 
viele Portleitungen.

Uwe

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei den geringen Preisunterschieden (ehrlich, selbst beim Reichelt reden 
wir hier nur von ein paar Euros), nimm den Prozessor mit dem größten 
Flash und SRam, den du kriegen kannst. Also, wenn DIP40 deine bevorzugte 
Bauform ist, den 32ger, oder gleich einen 644er. Alles andere ist am 
falschen Ende gespart. Nichts ist blöder, als sich bei der Einarbeitung 
in neue Hardware von Anfang an mit Speicherlimitationen rumschlagen zu 
müssen.
Später, als "Profi", kann man immer noch abspecken.

Oliver

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bezüglich der Portauswahl würde ich den Port, welcher auch für die 
Programmierung des Atmel zuständig ist (PortB?), nicht als LCD-Port 
verwenden, wenn das LCD diese Leitungen auch schaltet (z. B. Busy-Pin). 
Bei mir gab es manchmal Programmierfehler, von denen ich vermute, dass 
sie davon gekommen sein könnten.

Was den Speicher (SRAM) angeht (wovon der ATmega32 doppelt so viel hat 
wie der ATmega16), denke ich, dass dieser nicht groß genug sein kann. 
Bei Stack-Überläufen hat es bei mir mitunter recht lange Fehlersuchen 
gegeben, weil das Programmverhalten dann ziemlich undefiniert erscheint.

Autor: Daniel Steiner (sany)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Danke Uwe, werde das gleich mal ausprobieren, hab gar nicht 
gesehen/gelesen das da eine Negativ Spannung rauskommt ;)

Also ich will mich nicht unbedingt auf die DIL40 festnageln, nur das 
sind halt die Prozessoren die ich aktuell nur zur Verfügung habe.

Meine Belegung sieht eigentlich so aus:

Hab mir zwei Ports am LCD geschaffen, der erste Port fasst alle 
Leitungen DB0 - DB7 und den schließe ich an PortA an meinem STK500 an.

Der Rest der Leitungen wie D/I, R/W und CS1/CS2 liegt an PortC an.

Autor: Daniel Steiner (sany)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab grade noch was Interessantes gefunden und zwar ein AM29F040B-90PC V

Das müsste doch eigentlich ein einsetzbarer flash sein?

Autor: Daniel Steiner (sany)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallöchen,

Jetzt muss ich meinen Beitrag nochmal nach oben holen.

Also ich krieg das mit dem GLCD und dem KS0108 Controller irgendwie 
einfach nicht gebacken.

Also, die DB0-DB7 liegen an Port A
Die Steuerleitungen wie DI, RW, EN, CS1, CS2 liegen auf Port C
RESET liegt dauerhaft auf GND.

(JTAG Deaktiviert im AtMega16)

Ich beziehe die +5V direkt vom STK500 Board.

Hab das hier im Board erhältliche GLCD Library soweit kompiliert, auch 
für den Atmega16 optimiert und alle Settings eingestellt.

Nur mein GLCD will einfach nicht rennen.

Wenn ich mein STK500 einschalte, blinkt kurz mein GLCD und geht danach 
dann an.

Dann hab ich das Problem das die linke Hälfte komplett mit Pixel 
ausgefüllt ist, die rechte jedoch bleibt ohne Pixel.

Was könnte das sein? Die Verkabelung stimmt jedoch :(

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> RESET liegt dauerhaft auf GND.

Dann KANN ja nichts funktionieren.
Das ist als ob man beim Auto dauernd den Anlasser betätigt hat.

Autor: Daniel Steiner (sany)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was hat dies mit dem RESET vom Display zu tun?

Liegt das RESET vom Display auf +5V macht das Display ein Reset, daher 
ist es wohl logisch das ich RESET auf GND lege...

Autor: Reinhard R. (reirawb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmmm..., sieht im Datenblatt gerade anders herum aus.

Gruß Reinhard

Autor: Daniel Steiner (sany)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Reinhard Richter wrote:
> Hmmm..., sieht im Datenblatt gerade anders herum aus.
>
> Gruß Reinhard

Hm, also wie gesagt, wenn ich 5V anlege an RESET wird der Display Inhalt 
gelöscht. Halte ich diese 5V wird nichts mehr angezeigt.

Lass ich nun RESET auf GND wird auch wieder meine linke Seite vom 
Display angezeigt..

Autor: Daniel Steiner (sany)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

Hab das Problem nun endlich gefunden, es war jedenfalls korrekt 
verkabelt.

Was mich aber etwas Mürrisch stimmt an der ganzen Geschichte:

Mein STK500 wird von einem eigenen Trafo 12V gespeist (17,6VA)

Ich hatte ja wie besagt das LCD mit 5V vom STK500 versorgt, das war 
soweit der Dokumentation auch i.O auch in Ordnung wenn ich einen 
passenden Elko dazwischen schalte. Hab mich für einen bereits 
vorhandenen (10V 440uF) entschieden.

Nun aus unerklärlichen Gründen, wurde der LM317M auf dem STK500 richtig 
heiß. Das Board funktionierte auch tadellos sowie auch die konstanten 5V 
stimmten.
(Die Spannung konnte ich leider nicht messen, da das STK500 bei jeder 
kleinsten Überspannung abschaltet)

Hab dann ein PC-Netzteil zu Rate gezogen, dort mein LCD Verkabelt und 
angeschlossen, nun wurde auf dem Display nichts angezeigt, aber es 
flackerte deutlich weniger...

Nun mal die CS1 und CS2 Leitungen auf low gelegt nun rannte mein Display 
los...

Autor: Stefan Wimmer (wswbln)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel Steiner wrote:
> Hallo Zusammen,
>
> ...Mein STK500 wird von einem eigenen Trafo 12V gespeist (17,6VA)...

> Nun aus unerklärlichen Gründen, wurde der LM317M auf dem STK500 richtig
> heiß.

Jo, völlig unerklärlich...   :LOL:

> Nun mal die CS1 und CS2 Leitungen auf low gelegt nun rannte mein Display
> los...

..und? Hast Du's wieder eingefangen??


SCNR,
Stefan

Autor: I_NEED_INPUT (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen ich habe ein Problem,

siehe Bild

und zwar:

hab ich mir am WE ein LCD TG12864B-13 bei Pollin best.
Anschluss hat alles funktioniert (Beleuchtung außen vor da keine lust)

Ich möchte einen Text ausgeben in zwei Zeilen

CODE hier in ASSEMBLER:
;***************************************************************
;Programm LCD.ASM
;Es wird vorausgesetzt, dass die Anzeige einen HD44780 oder
;kompatiblen Controller verwendet.
;ATmega8535 mit 8 MHz Takt
;***************************************************************

.device  ATmega8535
.include "m8535def.inc"      ;muss im selben
          ;Verzeichnis stehen
;*************************************************************** 
;Board spezifizierungen
;***************************************************************

.ifndef XTAL
.equ XTAL = 8000000      ;Quarztakt hier: 8 MHz

;***************************************************************
;Definition der Steuerleitungen
;***************************************************************

.equ    E   = PA0    ;E an Pin PA0
.equ    RW  = PA1    ;RW an Pin PA1
.equ    RS  = PA2    ;RS an Pin PA2
.equ    CS1 = PA3    ;Linke Seite des Displays
.equ    CS2 = PA4    ;Rechte Seite des Displays
.equ    BF  = PC7    ;Busy flag
.equ    LED1 = 0b00100000
.equ    LED2 = 0b01000000
.equ    LED3 = 0b01100000

;***************************************************************
;LCD Befehle
;***************************************************************

.equ    clear_LCD  = 0b00000001  ;loesche Anzeige
.equ    home_LCD   = 0b00000010  ;return home
.equ    set_LCD    = 0b00111100  ;8 bits,2 Zeilen,5x7dots
.equ    LCD_on     = 0b00001110  ;schalte LCD ein
.equ    entry_mode = 0b00000110  ;setze Cursor

;***************************************************************
;Variablendefinition
;***************************************************************

.def    zeichen  = r0    ;Zeichen aus der Tabelle
.def    buffer  = r16    ;RX/TX Daten von/zu LCD
.def    counter  = r17    ;Zaehler fuer den Text
.def    temp1  = r18
.def    temp2  = r19



.CSEG
.ORG    0x00                ; Programm beginnt bei 0
      rjmp  main    ; Starte Hauptprogramm

;***************************************************************   
; Subroutine init
; Initialisiere PORTA
;***************************************************************   

init:  

    ldi     temp1,0b11111111  
    out    DDRA,temp1    ;PORTA ist Ausgang
    out    DDRD,temp1    ;PORTD ist Ausgang
    cbi    PORTA,E      ;E initialisieren
    cbi    PORTA,RS
    cbi    PORTA,RW
    cbi    PORTA,CS1    ;Linke Seite des Displays
    cbi    PORTA,CS2    ;Rechte Seite des Displays    
    ret



;***************************************************************
; Subroutine busy_flag
; Diese Routine testet, ob die LCD-Anzeige bereit ist, einen
; neuen Befehl oder weitere Daten zu empfangen.
;***************************************************************

busy_flag:    
    
    ldi    temp1,0b00000000  ;PORTC ist Eingang
    out    DDRC,temp1
    sbi    PORTA,CS1
    sbi    PORTA,CS2
    cbi    PORTA,RS    ;Befehl wird gesendet
    rcall  delay50us
    sbi    PORTA,RW    ;setze LCD in Lesemodus
    rcall  delay50us
    sbi    PORTA,E      ;spreche LCD an      
    rcall  delay50us
    sbic   PINC,BF      ;LCD bereit?                
    rjmp   busy_flag       ;nein, wiederhole
    cbi    PORTA,E      ;disable LCD        
    ret                     ;LCD bereit


;***************************************************************
; Subroutine write_data
; Diese Routine sendet Daten zur LCD-Anzeige.
; Die Daten muessen im Register buffer uebergeben werden.
;***************************************************************

write_data:
    rcall  busy_flag    ;LCD bereit?
    ldi    temp1,0b11111111  ;PORTC ist Ausgang
    out    DDRC,temp1
    sbi    PORTA,CS1
    sbi    PORTA,CS2
    sbi    PORTA,RS    ;Daten werden gesendet
    cbi    PORTA,RW    ;LCD in Schreibmodus
    sbi    PORTA,E      ;spreche LCD an
    out    PORTC,buffer  ;sende Daten
    cbi    PORTA,E      ;disable LCD
    ret


;***************************************************************
; Subroutine write_instr
; Diese Routine sendet Befehle zur LCD-Anzeige.
; Der Befehl muss im Register buffer uebergeben werden.
;***************************************************************

write_instr:
    rcall  busy_flag      ;LCD bereit?
    ldi    temp1,0b11111111  ;RB ist Ausgang
    out    DDRC,temp1
    sbi    PORTA,CS1
    sbi    PORTA,CS2
    cbi    PORTA,RS       ;Befehl wird gesendet
    cbi    PORTA,RW       ;LCD in Schreibmodus
    sbi    PORTA,E         ;spreche LCD an
    out    PORTC,buffer     ;sende Befehl
    cbi    PORTA,E         ;disable LCD
    ret

;*************************************************************** 
; Diese Routine errechnet die Pausenzeiten 50us
; in Abhängigkeit des eingebauten Quarz
;***************************************************************

delay50us:                           ; 50us Pause
        
    ldi    temp1, ( XTAL * 50 / 3 ) / 1000000

delay50us_:
    dec    temp1
    brne  delay50us_
    ret                          ; wieder zurück
 
;***************************************************************
; Hauptprogramm
; Schreibt "ATmega8535" in die erste Zeile und "LCD-Routine"
; in die zweite Zeile des LCDs.
;***************************************************************

main:  
    ldi    temp1,LOW(RAMEND)  ;setze Stack-Pointer
    out    SPL,temp1      ;an das SRAM-Ende
    ldi   temp1,HIGH(RAMEND)       
    out   SPH,temp1

    ldi    r19, LED1      ;LED1 AN
    out    PORTD, r19

    rcall  init        ;PORTA initialisieren
    
    ldi    r19, LED2      ;LED2 AN
    out    PORTD, r19

    ldi    buffer,set_LCD    ;setze LCD Funktion
    rcall  write_instr

    ldi    buffer,LCD_on    ;schalte LCD ein
    rcall  write_instr

    ldi    buffer,clear_LCD  ;loesche Anzeige
    rcall  write_instr

    ldi    buffer,entry_mode  ;Eingabemodus
    rcall  write_instr

    ldi    r19, LED3      ;LED1 & 2 AN
    out    PORTD, r19

;***************************************************************
;Holt den Text 'ATmega8535' aus der Tabelle und schreibt diesen
;in die erste Zeile der Anzeige
;***************************************************************
    ldi    counter,10      ;Zeichenzaehler
    ldi    ZL,LOW(Tabelle1*2)  ;Low-Zeiger auf Tabellenanfang
    ldi    ZH,HIGH(Tabelle1*2)  ;High-Zeiger auf Tabellenanfang

loop_msg1:

    lpm                      ;hole Zeichen aus Tabelle
    mov    buffer,zeichen    ;Zeichen uebergeben
    rcall  write_data        ;schreibe Zeichen in LCD
    adiw   ZL,1              ;16-Bit Zeiger erhoehen
    dec    counter           ;alle Zeichen gesendet?
    brne   loop_msg1         ;Nein! Sende naechstes Zeichen

;***************************************************************
;Holt den Text 'LCD-Routine' aus der Tabelle und schreibt diesen
;in die zweite Zeile der Anzeige
;***************************************************************
    
    ldi    buffer,0b11000000  ;LCD-Startadresse 2.Zeile
    rcall  write_instr        ;sende Befehl
    ldi    counter,11         ;Zeichenzaehler
    ldi    ZL,LOW(Tabelle2*2) ;Low-Zeiger auf Tabellenanfang
    ldi    ZH,HIGH(Tabelle2*2);High-Zeiger auf Tabellenanfang

loop_msg2:  
    
    lpm                       ;hole Zeichen aus Tabelle
    mov    buffer,zeichen     ;Zeichen uebergeben
    rcall  write_data         ;schreibe Zeichen in LCD
    adiw   ZL,1               ;16-Bit Zeiger erhoehen

no_carry2:  
    
    dec    counter        ;alle Zeichen gesendet?
    brne  loop_msg2       ;Nein! Sende naechstes Zeichen



;Endlosschleife. AVR zuruecksetzen, um Programm erneut zu starten

loop:  rjmp  loop

;***************************************************************
;Tabelle 1 mit dem Text "ATmega8535", der in die 1.Zeile
;geschrieben werden soll
;***************************************************************

Tabelle1:  .DB "ATmega8535"

;***************************************************************
;Tabelle 2 mit dem Text "LCD-Routine", der in die 2.Zeile
;geschrieben werden soll
;***************************************************************

Tabelle2:  .DB "LCD-Routine"

.EXIT

Es sollte eigentlich ATmega8535 und LCD-Routine auf beiden seiten 
ausgegeben werden doch statt dessen nur undefinierbar ausgegeben..
siehe Bild / Anhang

Danke im Voraus!

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Es sollte eigentlich ATmega8535 und LCD-Routine auf beiden seiten
>ausgegeben werden doch statt dessen nur undefinierbar ausgegeben..
>siehe Bild / Anhang

Ohne Font wird da nie Text rauskommen ;)
Der KS0108 hat keinen eingebauten Font.

Autor: I_NEED_INPUT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kann man das Problem beseitigen?

Keine Ahnung da ich nur C Code gefunden habe!

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sieh bei www.icplan.de nach - da wird Dir geholfen

Gruss Otto

Autor: Spess53 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Übrigens

>   lpm                       ;hole Zeichen aus Tabelle
>   mov    buffer,zeichen     ;Zeichen uebergeben
>   rcall  write_data         ;schreibe Zeichen in LCD
>   adiw   ZL,1               ;16-Bit Zeiger erhoehen

geht einfacher:

    lpm buffer,Z+
    rcall  write_data         ;schreibe Zeichen in LCD

>Wie kann man das Problem beseitigen?

Du brauchst eine Tabelle mit .db-Anweisungen, die die Spalten deiner 
Zeichen enthalten. Hab mal schnell eine Tabelle für A..Z gemacht(Anhang)

MfG Spess

Autor: I_NEED_INPUT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi sorry aber habe keine Ahnung wie wo was und so hab ne gute lib mit 5 
verschiedenen Zeichensätzen gefunden doch das wars auch hab gedacht das 
der Standardzeichensatz auf/im Kontroller ist.

Kann mir jemand mal Anleitung geben DANKE schon mal für die 
Hilfestellung :)

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hi sorry aber habe keine Ahnung wie wo was und so hab ne gute lib mit 5
>verschiedenen Zeichensätzen gefunden doch das wars auch hab gedacht das
>der Standardzeichensatz auf/im Kontroller ist.

Ist er aber nicht. Besorg dir ein Display mit T6963 Controller.
Der kann auch Text.

>Kann mir jemand mal Anleitung geben DANKE schon mal für die
>Hilfestellung :)

Du musst jeden Buchstaben als Bitmap in deinem Speicher
ablegen und dann ausgeben. Dein Display hat übrigends zwei
Controller. Genau genommen hast du zwei Displays mit jeweils
64*64 Pixel vor dir.

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Spess53 hat Dir bereits einen Hinweis gegeben.

Das Zeichen, dass Du darstellen willst, dient als Zeiger auf eine 
Tabelle aus 5 Bitmustern, die das eigentliche Zeichen repräsentieren.

Entweder legst Du eine Tabelle an, die nicht nur alle darzustellenden 
Zeichen, sondern auch die "Ersatzzeichen" für die nicht darstellbaren 
Zeichen enthält oder Du ziehst vom Zeichen ein Offset ab.

Willst Du eine "1" darstellen ($30), so könntest Du $30 subtrahieren und 
das Ergebnis als Zeiger auf die Tabelle verwenden.

Der Tabelleneintrag "0" enthält das Bitmuster für die "0"
Der Tabelleneintrag "1" enthält das Bitmuster für die "1"
....
Der Tabelleneintrag "n" enthält das Bitmuster für ein "z"

Anschliessend lädst Du nacheinander die 5 Bitmuster und schreibst diese 
auf das Display.

Gruss Otto

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Willst Du eine "1" darstellen ($30), so könntest Du $30 subtrahieren und
> das Ergebnis als Zeiger auf die Tabelle verwenden.

sollte "0" heissen - Entschuldigung

Autor: spess53 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Wo hängt es denn genau?

Ich versuch trotzdem mal einen Erklärungsversuch.

Wenn du ein Byte zum Display schickst, representieren die 8 Bits 8 
untereinanderliegende Pixel. Ein H-Bit heisst Pixel an. Ein L-Bit Pixel 
aus.
Bei einem 5x7 Font hast du 5 Spalten mit 7 Bits. Wenn du dir die linke 
Spalte von einem 'A' (Anhang) ansiehst sind Bit0 und 1 L und Bit2..6 H. 
Das ergibt Hex $7C usw. Um Das 'A' darzusellen musst du 5 Bytes mit den 
entsprechenden Bitmustern nacheinander an das Display senden. Die 
Bitmuster legt man üblicherweise im Flash ab.
Der ASCII-Zeichensatz belegt normalerweise die Codes $20..$7F. Dafür 
müssen jeweils 5Byte in der Tabelle stehen. Um ein 'A' zum Display zu 
senden errechnest aus dem ASCII-Code (A=$41) die Stelle, an der die 
Bitmuster stehen und gibst die aus.

MfG Spess

Autor: Seppel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mh,

in der dritten Zeile deines ASM-Codes steht ja warum es nicht geht;-)
(HD44780=!KS108).
Schau Dir das hier mal an: Beitrag "GLCD Routinen ( KS0108, HD61202 )"

Grüße Seppel

Autor: spess53 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ich habe dir mal nen Font, analog zum T6963 gemacht. Dazu noch eine 
Routine zum Ausgeben eines Zeichens. Ist zwar, mangels passendem Display 
nicht getestet. Müsste aber so funktionieren.

MfG Spess

Autor: I_NEED_INPUT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey danke probier ich gleich mal aus :-)

Autor: I_NEED_INPUT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie springt er in/nach char _out10, was ist register (welches)?

Grüße

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

'Register' ist das Register, mit dem du das Darenbyte an deine 
Ausgaberoutine übergibst. Da musst du auch deine Routine einsetzen.

>Wie springt er in/nach char _out10,

Mit 'brne char_out10'.

MfG Spess

Autor: I_NEED_INPUT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habs mal eingefügt ich kann jetzt ein A erkennen, jedoch sind es mehrere 
die von rechts nach links in so ner Art Laufschrift über den Bildschirm 
huschen.

Hier nochmal der Code:
main:  
    ldi    temp1, LOW(RAMEND)  ;setze Stack-Pointer
    out    SPL, temp1      ;an das SRAM-Ende
    ldi   temp1, HIGH(RAMEND)       
        out   SPH, temp1

    ldi    temp2, LED1      ;LED1 AN
    out    PORTD, temp2

    rcall  init        ;PORTA initialisieren
    
    ldi    temp2, LED2      ;LED2 AN
    out    PORTD, temp2

    ldi    buffer, set_LCD    ;setze LCD Funktion
    rcall  write_instr

    ldi    buffer, LCD_on    ;schalte LCD ein
    rcall  write_instr

    ldi    buffer, clear_LCD  ;loesche Anzeige
    rcall  write_instr

    ldi    buffer, entry_mode  ;Eingabemodus
    rcall  write_instr

    ldi    temp2, LED3      ;LED1 & 2 AN
    out    PORTD, temp2

    ldi r16,'A'
    rcall char_out

char_out:             
    push r17
    push ZL
    push ZH

    subi r16,$20                       ; erstes Zeichen subtrahieren

    mov ZL,r16                         ; Wert merken
    clr ZH                             ; 0 für adc
    clr r17                            ; Highbyte für Offset
    lsl r16
    rol r17                            ; (r16:r17)=2*Wert
    add r16,ZL                         ;
    adc r17,ZH                         ; (r16:r17)=3*Wert
    lsl r16                            ;
    rol r17                            ; (r16:r17)*2 -> Wert*6
    ldi ZL,Low(FONT5x7<<1)             ; Tabellenadresse nach Z
    ldi ZH,High(FONT5x7<<1)
    add ZL,r16                         ; Zeichenoffset addieren
    adc ZH,r17

    ldi r17,6                          ; 6 Bytes ausgeben

char_out10:           
    lpm buffer,Z+                    ; Byte für Display_out
                     
    rcall write_data                  ; zum Display
    dec r17
    brne char_out10
    pop ZH
    pop ZL
    pop r17
    ret

;Endlosschleife. AVR zuruecksetzen, um Programm erneut zu starten

loop:  rjmp  loop

Der Rest vom Code (vorher) ist wie im ersten posting geblieben.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>    ldi r16,'A'
>    rcall char_out

>char_out:
>    push r17
>    push ZL
     ....
     ret

Du weisst was da passiert? Du rufst das Unterprogramm. Mit 'ret' springt 
an die Stelle nach 'rcall...' zurück und macht dort weiter (im 
Unterprogramm). Beim nächsten Erreichen von 'ret' springt dein Programm 
ins Nirvana und fängt irgendwann am Anfang wieder an.

Zum Testen:

               ldi r16,'A'
               rcall char_out

loop:          rjmp loop       ; Programm bleibt hier stehen

char_out:      push r17
               push ZL

MfG Spess

Autor: bench (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

interessiere mich fuer das Tool 'avalon', welches 'spess53' als 
Screenshot angehaengt hat.
Kennt jemand den Ursprung?

Danke.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>interessiere mich fuer das Tool 'avalon', welches 'spess53' als
>Screenshot angehaengt hat.
>Kennt jemand den Ursprung?

Ja. Selbstgeschrieben.

MfG Spess

Autor: Torsten Giese (wawibu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Finde das Tool auch sehr interessant. Stellst Du das ggf zur Verfügung?

Grüße
Torsten

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.