Forum: Mikrocontroller und Digitale Elektronik Display ansteuern? Nichts funktioniert :(


von Alexander T. (xronin)


Lesenswert?

Hallo zusammen,

ich versuche bereits seit zwei Tagen das Display zum laufen zu bekommen, 
aber nichts funktioniert. Ich könnte noch nicht einmal sagen, ob die 
Anzeige vllt. defekt ist.

So sieht meine Verbindung aus:

ATTiny44A ---- EADOGS102N-6
===========================
PA1 - CS0
PA2 - Reset
PA3 - CD
PA4 (USCK) - SCK
PA5 (MISO) -
PA6 (MOSI) - SDA

Das Display läuft mit 3,3V und wurde mit den angegebenen 3x 1µF 
Kondensatoren
angeschlossen (http://www.lcd-module.de/deu/pdf/grafik/dogs102-6.pdf, 
Seite 4)

Hier der Code zum initialisieren:
1
#define LCD_CS      1
2
#define LCD_RST     2
3
#define LCD_CD      3
4
#define SPI_SCK     4 
5
#define SPI_MISO    5        
6
#define SPI_MOSI    6  
7
 
8
9
void SPI_Init(void) 
10
{
11
  DDRA  = (1 << LCD_RST); 
12
  DDRA  = (1 << LCD_CD);
13
  DDRA  = (1 << SPI_MOSI);
14
  DDRA  = (1 << SPI_SCK);
15
16
  PORTA &= ~(1 << SPI_MISO); 
17
  PORTA = (1 << SPI_MISO); 
18
19
  USICR = (1 << USIWM0); //Three Wire Mode DO,DI,USCK
20
  USICR = (1 << USICLK);
21
  USICR = (1 << USITC);
22
  USICR = (1 << USICS1);
23
}
24
25
void SPI_Transmit(char cData)
26
{
27
  PORTA &= ~(1<<LCD_CS);
28
  USIDR = cData;
29
  while(!(USISR & (1<<USISIF)))
30
  ;
31
  PORTA |= (1<<LCD_CS);
32
}
33
34
void DISPLAY_Init(void)
35
{
36
  SPI_Transmit(0x40);
37
  SPI_Transmit(0xA1);
38
  SPI_Transmit(0xC0);
39
  SPI_Transmit(0xA4);
40
  SPI_Transmit(0xA6);
41
  SPI_Transmit(0xA2);
42
  SPI_Transmit(0x2F);
43
  SPI_Transmit(0x27);
44
  SPI_Transmit(0x81);
45
  SPI_Transmit(0x10);
46
  SPI_Transmit(0xFA);
47
  SPI_Transmit(0x90);
48
  SPI_Transmit(0xAF);
49
}
50
51
int main(void)
52
{
53
  SPI_Init();
54
 _delay_ms(50);
55
56
  DISPLAY_Init();
57
  _delay_ms(50);
58
}

Man sieht leider überhaupt nichts. Habe ich etwas vergessen?

Danke

von g457 (Gast)


Lesenswert?

> Man sieht leider überhaupt nichts. Habe ich etwas vergessen?

∗hüstel∗ ja..

> DDRA  = (1 << LCD_RST);
        ^
> DDRA  = (1 << LCD_CD);
        ^
> DDRA  = (1 << SPI_MOSI);
        ^
..und noch viele andere mehr..

von Alexander T. (xronin)


Lesenswert?

Das war nun leider nicht der Fehler :( Keine Änderung

von g457 (Gast)


Lesenswert?

> Das war nun leider nicht der Fehler

..dann wars nicht ∗der∗ Fehler sondern ∗einer∗ (von vielen). Aber um 
nochmals darauf herumzureiten: was hast Du denn geändert an den 
markierten Stellen und wo noch überall? Oder anders gesagt: Wie sieht 
der Code jetzt aus?

von Alexander Thies (Gast)


Lesenswert?

Aus dem = habe ich ein |= gemacht. Bei allen Zuweisungen der Bits. Die 
aussage, dass dort viele Fehler sind, hilft mir leider auch nicht ;-)

von Marcus W. (marcusaw)


Lesenswert?

Die gesamte Routine kannst du in der Pfeife rauchen:
1
void SPI_Init(void) 
2
{
3
  DDRA  = (1 << LCD_RST); 
4
  DDRA  = (1 << LCD_CD);
5
  DDRA  = (1 << SPI_MOSI);
6
  DDRA  = (1 << SPI_SCK);
7
8
  PORTA &= ~(1 << SPI_MISO); 
9
  PORTA = (1 << SPI_MISO); 
10
11
  USICR = (1 << USIWM0); //Three Wire Mode DO,DI,USCK
12
  USICR = (1 << USICLK);
13
  USICR = (1 << USITC);
14
  USICR = (1 << USICS1);
15
}

Wenn hier das Timing nicht stimmt, macht dein Display garnix.

von ... (Gast)


Lesenswert?

Seit wann ist das Nichtfunktionieren sinnlosen redundanten Codes 
timingabhängig? :-O

von T.roll (Gast)


Lesenswert?

>  DDRA  = (1 << LCD_CD);
>Aus dem = habe ich ein |= gemacht.

Pin CD möchte welchen Level für Kommandos? Richtig! Low. Du schaltest 
ihn aber auf High für Daten.

von Karl H. (kbuchegg)


Lesenswert?

T.roll schrieb:
>>  DDRA  = (1 << LCD_CD);
>>Aus dem = habe ich ein |= gemacht.
>
> Pin CD möchte welchen Level für Kommandos? Richtig! Low. Du schaltest
> ihn aber auf High für Daten.

eigentlich nicht.
An dieser Stelle wird erst mal nur der Pin auf Ausgang gestellt.

Aber so unrecht hast du nicht, denn in
1
void SPI_Transmit(char cData)
2
{
3
  PORTA &= ~(1<<LCD_CS);
4
...
wird fleissig an einem Pin LCD_CS rumgeschraubt. Der allerdings ist 
wiederrum nicht auf Ausgang gestellt.

Ach das hat doch keinen Sinn.
Zeig deinen kompletten Code, so wie er jetzt ist. Das muss doch alles 
kontrolliert werden. Da steckt doch noch jede Menge anderes Zeugs 
drinnen. Immer dieses posten von Code-Fitzelchen. Und die Helfer dürfen 
sich dann aus 3 Posts und jeder Menge Phantasie die Einzelteile zusammen 
suchen, wie der Code wohl jetzt aussehen könnte. Du bist der der Hilfe 
will. Also mache es anderen leicht dir zu helfen.

: Bearbeitet durch User
von T.roll (Gast)


Lesenswert?

Karl Heinz schrieb:
> eigentlich nicht.
> An dieser Stelle wird erst mal nur der Pin auf Ausgang gestellt.

Da habe ich DDRA mit PORTA vertauscht. Es ist zu spät :)

von spess53 (Gast)


Lesenswert?

Hi

>Aus dem = habe ich ein |= gemacht. Bei allen Zuweisungen der Bits. Die
>aussage, dass dort viele Fehler sind, hilft mir leider auch nicht ;-)

Dann sieh dir das Beispiel vom EA mal an:

http://www.lcd-module.de/fileadmin/downloads/development%20service/DOGS102_UC1701/Init_and_basic_functions_with_EA_DOGS102_MEGA168.zip

MfG Spess

von Sascha E. (baracuss)


Lesenswert?

Das Größte Problem ist das es überhaupt keine Warte zeiten zwischen den 
einzelnen schritten gibt. Das heißt das die Pins ständig geändert werden 
aber der Controller des Displays es ganricht mitbekommt.

Du musst aufjedenfall die richtigen Timmings einstellen. Und wie im 
Datenblatt des Displays steht findest du die Timmings im Dattenblatt des 
Diplay Controllers auf Seite 41.

http://www.lcd-module.de/eng/pdf/zubehoer/uc1701.pdf

Stell die Zeiten ruhig ein bisschen länger ein das ist besser als wenn 
sie zu kurtz sind.

von Alexander T. (xronin)


Lesenswert?

Erstmal danke für die vielen Antworten.

Mit einem Teil des Beispielcodes von EADOGS konnte ich das Display zum 
blinken bringen. Wenn ich allerdings den gesamten Code ausführe erhalte 
ich einen Overflow im Data Memory??? Ich habe die beiden mitgelieferten 
Fonts gelöscht und sonst auch keine variablem mit progmem 
gekennzeichnet. Woran kann das liegen?

von Karl H. (kbuchegg)


Lesenswert?

Daran, dass du ums verrecken deinen Code nicht herzeigen willst.

Ist das wirklich so schwer zu verstehen?
Wir sind doch hier keine Hellseher!
Du hast also ein Programm geschrieben oder modifiziert. UNd das stürzt 
ab. Und wir sollen jetzt irgendwie wissen, was du da für ein Problem 
erzeugt hast.
Wie soll das gehen? Sollen wir Karten legen? Astrologen befragen? Oder 
doch vielleicht die Antwort channeln?

von Uwe (de0508)


Lesenswert?

Hallo Alexander,

gleich kommen die Antworten, alles einzustellen was da ist, Bilder, der 
aktuelle Schaltplan und der gesamte CODE.

So wird das nichts, und Karl-Heinz hätte dir sicherlich gerne bis zum 
Erfolg geholfen.

Du musst immer bedenken, wir sitzen nicht für der Hardware, noch sehen 
wir den gesamten Code oder kennen die erwarteten und unerwarteten 
Reaktionen des Programms.

Ein Helfer, kann nur ein Helfer sein, wenn er/sie alles von dir erfährt, 
auf Nachfragen musst Du dann gewissenhaft und vollständig antworten.

Sprichwort:
"So wir ein Schuh daraus!"

: Bearbeitet durch User
von Patrick (Gast)


Lesenswert?

Karl Heinz schrieb:
> Ist das wirklich so schwer zu verstehen?
> Wir sind doch hier keine Hellseher!
> Sollen wir Karten legen? Astrologen befragen? Oder
> doch vielleicht die Antwort channeln?

Ruhig Blut, Karl Heinz. Deine Antworten sind immer von herausragender 
Qualität, und - ich weiß nicht, wie Du das machst - Du schaffst es 
nahezu immer, erstaunlich lange die Ruhe zu bewahren. Lass Dich daher 
nicht ärgern - auch ich weiß, wie (sehr) frustrierend es ist, zu 
versuchen, Anfängern irgendetwas erklären zu wollen, wenn diese eine 
bestimmte, vorgefasste Meinung haben und glauben, diese sei korrekt und 
nur so ginge es... Da hilft leider nur das Konzept des "Lernens durch 
Schmerz" (ein in der Erwachsenenerziehung durchaus anerkanntes 
Instrument) - soll heißen, entweder gar nicht antworten oder die 
Qualität der Antwort an die Frage anpassen - soll heißen: Genauso 
schwammig und "mysteriös" antworten, wie die Frage formuliert ist...

Alexander Thies schrieb:
> Overflow im Data Memory
> keine variablem mit progmem

Die .data-Section liegt im RAM und nicht im FLASH, daher hilft Dir 
progmem hier wenig (sofern es das ist, was Du meinst)...

von Alexander T. (xronin)


Lesenswert?

Entschuldigt bitte! Ich freue mich ja über jede Hilfe. Der Code sieht 
jetzt nur genauso aus, wie der Beispielcode aus dem EADogs Archiv weiter 
oben. Die Einzige Ausnahme sind die Änderungen der jeweiligen Pins zur 
Anpassung an meinen Versuchsaufbau. Ich poste es aber gerne trotzdem.


main.c
===========================
1
#include "main.h"
2
3
//////////////////////////////////////////////////////////////////////////
4
///////  Sleep function
5
//////////////////////////////////////////////////////////////////////////
6
void Sleep(unsigned int ms)
7
{
8
  for(; ms>0; ms--) 
9
  {
10
    _delay_ms(1);
11
  }
12
}
13
14
//////////////////////////////////////////////////////////////////////////
15
///////  Main program routine
16
//////////////////////////////////////////////////////////////////////////
17
int main(void)
18
{
19
  spi_init() ;
20
    sei();
21
22
   lcd_init();
23
   _delay_ms(1000);
24
  
25
  lcd_string(0,5,"EA DOGS102-6!", ptr_font_6x8, INVERS); //Printing a line in big fonts, inverted
26
  lcd_string(0,5 + pgm_read_byte(ptr_font_8x16 + 5), "this is next line", ptr_font_6x8, DELETE); //Printing next line small fonts, normal
27
28
    while(1)
29
    {
30
31
    }
32
}






main.h
============
1
#ifndef _MAIN_H
2
#define _MAIN_H
3
4
#define XPIXEL 102
5
#define YPIXEL 64
6
#define XMAX XPIXEL-1
7
#define YMAX YPIXEL-1
8
9
//Meine pins
10
#define LCD_CS      1
11
#define LCD_RST     2
12
#define LCD_CD      3
13
#define SPI_SCK     4
14
#define SPI_MISO    5
15
#define SPI_MOSI    6
16
17
#include <stdint.h>
18
#include <inttypes.h>
19
#include <avr/io.h>
20
#include <avr/interrupt.h>
21
#include <avr/pgmspace.h>
22
23
#include "lcd.h"
24
#include "spi.h"
25
#include "font_6x8.h"
26
#include "font_8x16.h"
27
28
#ifndef F_CPU
29
#define F_CPU 1000000UL
30
#endif
31
32
#include <util/delay.h>
33
34
35
#endif






spi.c
============
1
#include "main.h"
2
3
void spi_init(void)
4
{
5
        volatile uint8_t IOReg;
6
7
    // set PB3(MOSI), PB5(SCK), PB2(SS) CS, PB1(CD) as output
8
        DDRA    |= (1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<LCD_CS)|(1<<LCD_CD);
9
10
    // enable SPI in Master Mode with SCK = CK/4, CPHA = 1
11
        //USICR    = (1<<SPE)|(1<<MSTR)|(1<<CPHA)|(1<<CPOL);
12
    USICR |= (1 << USIWM0); //Three Wire Mode DO,DI,USCK
13
    USICR |= (1 << USICLK);
14
    USICR |= (1 << USITC);
15
    USICR |= (1 << USICS1);
16
  
17
        IOReg   = USISR;         //clear SPIF bit in SPSR
18
        IOReg   = USIDR;      //clear receive buffer
19
    PORTB |= (1<<LCD_CD);    //SS high
20
    PORTB |= (1<<LCD_CD);    //CD high
21
}
22
23
uint8_t spi_byte (uint8_t data)
24
{
25
26
  USIDR = data; //send data
27
  while (!(USISR & (1<<USISIF)));    // wait until byte is sent and received
28
29
  return USIDR; //return received data (not used with EA DOGS102-6,
30
         //but you have to read out, because ATMega needs it
31
}






spi.h
============
1
#ifndef _SPI_H
2
#define _SPI_H
3
4
//----------------- Functions ------------
5
void spi_init(void);
6
uint8_t spi_byte (uint8_t data);
7
8
9
#endif

lcd.c (rest wie im archiv)
============
1
#include "main.h"
2
3
unsigned char lcd_buffer[XPIXEL][YPIXEL/8];  //Buffer to store display data. The buffer organization is equal to
4
                       // the one of the display
5
6
7
void lcd_init(void)
8
{
9
  DDRA |= (1<<LCD_RST); //Set display reset as output
10
11
  PORTA|=(1<<LCD_RST);  //Set display reset to high -> LCD is running now
12
13
  //Initialize bottom view 3.3V (booster on) 8Bit SPI
14
  lcd_send_command(0x40); //Startline 0
15
  lcd_send_command(0xA1); //SEG reverse
16
  lcd_send_command(0xC0); //Set COM direction (COM0-COM63)
17
  lcd_send_command(0xA4); //Set all Pixel to on
18
  lcd_send_command(0xA6); //Display inverse off
19
  lcd_send_command(0xA2); //Set bias 1/9
20
  lcd_send_command(0x2F); //Booster, regulator, follower on
21
  lcd_send_command(0x27); //Set contrast
22
  lcd_send_command(0x81); //Set contrast
23
  lcd_send_command(0x10); //Set contrast
24
  lcd_send_command(0xFA); //Temperature compensation
25
  lcd_send_command(0x90); //Temperature compensation
26
  lcd_send_command(0xAF); //Display on
27
28
  lcd_clear_all(); //Clear display and set display buffer to 0
29
30
}
31
32
33
void lcd_send(uint8_t data, uint8_t cd)
34
{
35
  PORTA&=~(1<<LCD_CS);      //Slave select (DCS to gnd)
36
  if (cd == 0)
37
    PORTA&=~(1<<LCD_CD);  //Send command (DCD to 0)
38
  else
39
    PORTA|=(1<<LCD_CD);  //Send data (DCD to 1)
40
41
  spi_byte(data);      //Send data
42
43
}






lcd.h
============
1
#ifndef _LCD_H
2
#define _LCD_H
3
4
//----------------- Definitions -----------
5
#define DELETE 0
6
#define ADD  1
7
#define INVERS 2
8
9
//-------------- Global varibales ----------
10
extern unsigned char lcd_buffer[XPIXEL][YPIXEL/8];
11
12
//--------------- Macrofuncitons ----------
13
#define lcd_send_command(data) lcd_send(data, 0)
14
#define lcd_send_data(data) lcd_send(data, 1)
15
#define lcd_clear_all() lcd_clear(0,0,XPIXEL-1,YPIXEL-1)
16
#define lcd_fill_all() lcd_fill(0,0,XPIXEL-1,YPIXEL-1)
17
18
//----------------- Functions ------------
19
void lcd_init(void);
20
void lcd_send(uint8_t data, uint8_t cd);
21
void lcd_clear(uint8_t xs, uint8_t ys, uint8_t xe, uint8_t ye);
22
void lcd_fill(uint8_t xs, uint8_t ys, uint8_t xe, uint8_t ye);
23
void lcd_line(uint8_t xs, uint8_t ys, uint8_t xe, uint8_t ye);
24
void lcd_rect(uint8_t xs, uint8_t ys, uint8_t xe, uint8_t ye);
25
void lcd_char(uint8_t x, uint8_t y, uint8_t data, uint8_t *font, uint8_t linkmode);
26
void lcd_string(uint8_t x, uint8_t y, char *data, uint8_t *font, uint8_t linkmode );
27
28
29
#endif
30
//----------------- EOF lcd.h ------------

von Uwe (de0508)


Lesenswert?

Hi,

beim schnellen durchblättern entdeckt, ich kommentiere es nicht weiter:
1
 PORTB |= (1<<LCD_CD);    //SS high
2
    PORTB |= (1<<LCD_CD);    //CD high

Noch eine Frage, gibt es dazu ein Makefile ?

Oder anders gefragt: wie werden die Dateien übersetzt und gelinkt ?

: Bearbeitet durch User
von Uwe (de0508)


Lesenswert?

Hallo,

das könnte noch interessant sein für das Zeitverhalten:

https://code.google.com/p/u8glib/issues/detail?id=201

von Alexander T. (xronin)


Lesenswert?

Schaue ich mir direkt mal an! Das Problem ist gerade immer noch die 
Fehlermeldung mit dem Memory Overflow.
1
Program Memory Usage : 7076 bytes   172,8 % Full (Memory Overflow)
2
Data Memory Usage : 848 bytes   331,3 % Full (Memory Overflow)

von Karl H. (kbuchegg)


Lesenswert?

Alexander Thies schrieb:
> Schaue ich mir direkt mal an! Das Problem ist gerade immer noch die
> Fehlermeldung mit dem Memory Overflow.
>
>
1
> Program Memory Usage : 7076 bytes   172,8 % Full (Memory Overflow)
2
> Data Memory Usage : 848 bytes   331,3 % Full (Memory Overflow)
3
>


Das Teil ist schlicht und ergreifend zu groß für einen Tiny44.
4K Flash - damit kann man schon was anfangen.
Aber 256 Bytes SRAM íst nun mal nicht viel.

von Karl H. (kbuchegg)


Lesenswert?

1
#include "font_6x8.h"
2
#include "font_8x16.h"

beide Fonts im Flash.
Die verbrauchen schon jede Menge Platz im Flash.

Die könnte man noch leswerden.
Kritischer sind aber die 256 Byte SRAM.
Da heisst es sparsam mit globalen Variablen umgehen, bzw. alle Strings 
ins Flash verbannen (nachdem es von einem Font leergeräumt wurde)

von Karl H. (kbuchegg)


Lesenswert?

Und da, in lcd.h
1
unsigned char lcd_buffer[XPIXEL][YPIXEL/8];
ist der andere Speicherfresser.
Den wirst du aber so leicht nicht los.

von Alexander T. (xronin)


Lesenswert?

Wenn ich die Fonts weglasse sieht es wie folgt aus:
1
Program Memory Usage : 608 bytes   14,8 % Full
2
Data Memory Usage : 816 bytes   318,8 % Full  (Memory Overflow)

Es scheint als wäre der Display Buffer zu groß
1
unsigned char lcd_buffer[XPIXEL][YPIXEL/8];

Das sind genau die 816 Byte :(

von Uwe (de0508)


Lesenswert?

Hallo Alexander,

wie so "scheint" das nur so ?

Dass kannst Du doch ausrechnen !

von Alexander T. (xronin)


Lesenswert?

Uwe S. schrieb:
> Hallo Alexander,
>
> wie so "scheint" das nur so ?
>
> Dass kannst Du doch ausrechnen !

Hab ich doch. Es sind 816 Byte.

von Karl H. (kbuchegg)


Lesenswert?

An alle die dieses LCD kennen.
Seh ich das richtig, dass laut Datenblatt
http://www.lcd-module.de/deu/pdf/grafik/dogs102-6.pdf
es kein "Read Data Byte" Kommando gibt?


Denn sorry, Alexander.
In diesem Fall ist dieses LCD im Zusammenhang mit deinem Tiny44 
gestorben.
Wenn es ein derartiges Kommando gäbe, dann könnte man auf Kosten der 
Laufzeit noch etwas retten. Aber ohne dieses Kommandos bleibt dir nun 
mal nichts anderes übrig, als im Speicher eine binäre Repräsentierung 
der Pixel vorzuhalten, um korrekt zeichnen zu können.
Wer Grafik mit einem unintelligentem DIsplay machen will, braucht nun 
mal in erster Linie eines: Speicher, Speicher, Speicher.
Und genau den hat dein Tiny44 nicht.

von Alexander T. (xronin)


Lesenswert?

Ok das ist natürlich scheiße...
Also heißt das für mich...anderer Controller oder besser anderes 
Display?

von Karl H. (kbuchegg)


Lesenswert?

In dem Fall würde ich erst mal auf anderen Controller plädieren.

Nichts gegen den Tiny44. Aber mit 256 Bytes SRAM gewinnt man nun mal 
keinen Blumentopf.
Diese Speichermenge reicht, wenn man ein fertiges Projekt hat, welches 
diese Menge oder weniger benötigt und man sich fragt, welchen µC man 
jetzt in der Massenproduktion einsetzt. Dann ist der Tiny44 ein 
Kandidat.

Aber als allgemeines Entwicklungssystem ist das nun mal zu wenig. Ein 
bisschen 'rühren' muss man sich schon können, ohne gleich an allen Ecken 
und Enden an die Limits zu stossen.

: Bearbeitet durch User
von Alexander T. (xronin)


Lesenswert?

Als würde ein ATMega für meine Zwecke besser sein? Welchen würdet ihr 
dann empfehlen. 1024Byte EEPROM sind für dieses Display dann wohl zu 
schmal bemessen...

von Karl H. (kbuchegg)


Lesenswert?

Alexander Thies schrieb:
> Als würde ein ATMega für meine Zwecke besser sein? Welchen würdet ihr
> dann empfehlen. 1024Byte EEPROM sind für dieses Display dann wohl zu
> schmal bemessen...

SRAM, guter Mann.
Du brauchst SRAM

Such dir einen aus. Aber einen von den moderneren. Nicht gerade die alte 
Gurke Mega8, auch wenn die überall in den Tutorien vorkommt.

von MWS (Gast)


Lesenswert?

Karl Heinz schrieb:
> In diesem Fall ist dieses LCD im Zusammenhang mit deinem Tiny44
> gestorben.

Warum? Das größere SRam benötigt er nur, wenn er Pixel einzeln setzen 
und löschen will. Für schlichte (überschreibende) Grafikausgaben oder 
Text würd' der Tiny44 noch reichen.

Vielleicht sollte man hier mit dem Vorhandenen erstmal ein 
Erfolgserlebnis produzieren, statt wegen anderer Gründe die Flinte ins's 
Korn zu werfen.

Ansteuerbar ist das Display (mit eingeschränkten Features), lediglich 
baut der TE zu viele Fehler, wozu auch die Verwendung nicht vorhandenem 
SRams gehört. Deswegen geht's nicht. Fehler wird er jedoch auf einem 
XMega genauso bauen.

Soll er sich 'nen anderen Code irgendwoher kopieren, denn selbst 
geschrieben ist das wohl nicht. Wer das selbst geschrieben und somit 
verstanden hätte, wäre frühzeitig zum Schluss gekommen, dass 816 Bytes 
nicht in 256 Bytes rein passen. Und auch dass EEProm zwar zur 
Bereithaltung von Bitmaps verwendbar ist, aber nicht als Bildspeicher 
zur Pixeladressierung taugt.

Da mangelt's einfach an den Grundlagen, ein größerer µC macht lediglich 
bestimmten copy/paste Code direkt verwendbar, verstehen wird er deswegen 
auch nicht mehr.

von Uwe (de0508)


Lesenswert?

Hallo Alexander,

So ein ATmega644 hat 4kByte SRAM:
http://www.atmel.com/devices/atmega644.aspx?tab=parameters

ein ATmega328 kann mit 2kByte SRAM dienen:
http://www.atmel.com/devices/atmega328.aspx?tab=parameters

Daneben gibt es die verschiedensten Atmel AVR µC.

Interessant kann auch der atmega32u4 sein:
https://www.ehajo.de/themes/kategorie/detail.php?artikelid=152

von Alexander T. (xronin)


Angehängte Dateien:

Lesenswert?

Danke für eure Hilfe! Leider läuft das Display immer noch nicht.
Ich habe jetzt schon diverse Szenarien durchprobiert und folgendes 
notiert.
Im Anhang sind noch ein paar Bilder.

Display mit 3,23V (über Spannungsteiler):

                 Nach Start              Nach Knopfdruck (Erreichen BP)
========================================================================
Debug Modus:     Erst 3 schwarze Streifen,| Wieder weiß mit 3 Streifen
                 dann langsam komplett      dann langsam wieder schwarz
                 schwarz

Normaler Start:  Weißer Bildschirm          Weißer Bildschirm






Display mit 3,35V (über Spannungswandler):

                 Nach Start              Nach Knopfdruck (Erreichen BP)
========================================================================
Debug Modus:     Erst schwarz dann langsam,| Erst weiß, dann wieder wie
                 verblassend                 links

Normaler Start:  Weißer Bildschirm          Weißer Bildschirm


Hier einmal die Anschlüsse des Displays:

15 VLCD: über 1µF Elko an GND
16 VB1- über 1µF Elko an VB1+
17 VB0- über 1µF Elko an VB0+
18 VB0+ s.o.
19 VB1+ s.o.
20 VSS an 3,3V
21 VSS an 3,3V
22 VDD2/3 GND
23 VDD1 GND
24 SDA/MOSI an PA5/DO
25 SCK an PA4/USCK
26 CD an PA3
27 RST an PA2
28 CS0 an PA1

von spess53 (Gast)


Lesenswert?

Hi

>15 VLCD: über 1µF Elko an GND
>16 VB1- über 1µF Elko an VB1+
>17 VB0- über 1µF Elko an VB0+

Die Elkos solltest du durch Keramikkondensatoren ersetzen.

Welche Spannung misst du an VLCD?

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

>        IOReg   = USISR;         //clear SPIF bit in SPSR

Das löscht kein Interruptflag. Dazu müsste ein

          USISR = IOReg;

folgen.

MfG Spess

von Martin H. (marrtn)


Lesenswert?

Alexander Thies schrieb:
> Display mit 3,23V (über Spannungsteiler):

Woher stammen die 3,23 V? Ausgerechnet oder gemessen (mit oder ohne 
Display)?
Ein Spannungsteiler alleine taugt nur zur Stromversorgung, wenn man 
wirklich weiß, was man tut. Wenn Dein Display keine konstante 
Stromaufnahme hat, wackeln Deine 3,23V lustig umher...

von Alexander T. (xronin)


Lesenswert?

> Welche Spannung misst du an VLCD?
>
> MfG Spess

0V messe ich, aber das ist ja auch nicht verwunderlich. Der Elko hängt 
doch in Reihe hinter VLCD an GND.



> Woher stammen die 3,23 V? Ausgerechnet oder gemessen (mit oder ohne
> Display)?
> Ein Spannungsteiler alleine taugt nur zur Stromversorgung, wenn man
> wirklich weiß, was man tut. Wenn Dein Display keine konstante
> Stromaufnahme hat, wackeln Deine 3,23V lustig umher...

Wenn ich den Spannungswandler benutze liegen über dem Display die 3,3V 
an.

Wenn ich es an den Spannungsteiler (3,23V) anschließe, kann ich über dem 
Display noch 1,04V an. Der Spannungsteiler war nur zum Experimentieren 
da. Ich hatte die Vermutung, dass vllt. der DCDC Spannungswandler defekt 
ist. Das scheint aber nicht der Fall zu sein.

von spess53 (Gast)


Lesenswert?

Hi

>0V messe ich, aber das ist ja auch nicht verwunderlich. Der Elko hängt
>doch in Reihe hinter VLCD an GND.

Selbstverständlich ist das verwunderlich. VLCD ist der Ausgang für die 
LCD-Spannung (>VCC). Der Kondensator dort dient der Glättung. Bei einem 
ordentlich initialisiertem Display sollten dort 5..10V anliegen.

MfG Spess

von Alexander T. (xronin)


Lesenswert?

Ich habe gerade nochmal nachgemessen. Zwischen Vlcd und gnd sind es 
jetzt 1,4V?? Die Initialisierung des Displays habe ich wie im Handbuch 
beschrieben gemacht.

von spess53 (Gast)


Lesenswert?

Hi

>Ich habe gerade nochmal nachgemessen. Zwischen Vlcd und gnd sind es
>jetzt 1,4V??

Bei meinem USB-Testboard liegen bei einen funktionierenden DOGS102 9,3V 
an VLCD.

Entweder klappt deine Initialisierung nicht oder es liegt an deinen 
Kondensatoren. Ich setze generell Keramik-Cs ein und hatte bisher nie 
Probleme. Ist auch eine Empfehlung von EA.

MfG Spess

von Alexander T. (xronin)


Lesenswert?

Aber kann das wirklich an den falschen Kondensatoren liegen, ist es 
nicht egal ob 1uF mit Elko oder Kerko? Ich werde mir die kerkos dann 
bestellen und hoffe, dass es besser 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.