Forum: Mikrocontroller und Digitale Elektronik Atmega8 läuft nur mit internen Quarz, nicht aber mit externen


von Stefan P (Gast)


Lesenswert?

hey leutz,

ich hab schon das ganze forum durchforstet aber leider keine Lösung für 
mein Prob gefunden.

Ich hab auf nen Breedboard eine Schaltung mit nem Atmega8 aufgebaut, die 
Temperaturen via One Wire einlesen und auf nem (SED1520) Display 
ausgeben soll.

Mit internen Oszillator funktioniert die Schaltung zumindest so weit das 
dass Display seine Ausgaben macht.
Wenn ich jetzt einen externen Quartz anschließe (3,579 Mhz) funktioniert 
das Programm nicht mehr.

Ich kann aber dennoch die Fuses auslesen, und das Programm flashen.
Der Quarz schwingt auch, ich konnte den Sinus auf dem Oszi darstellen 
und auf die Frequenz zurückrechnen.

Ja, die Fuses sind richtig gesetzt, CKSEL 1111 SUT 11, rest hab ich 
nicht verändert.

Quarz ist gleich direkt an den Mik. Anschlüssen dran, mit 2x 22pf gegen 
masse.

Aus anderen Beiträgen hatten User noch den Tipp AVCC mit anzuschließen, 
das hatt ich dann auch nachgeholt, änderte aber nichts.

Könnte sein , dass der EL Inverter für das Display, irgenwie 
Interferenzen macht ?

Jemand eine Idee ?


Grüße

von Εrnst B. (ernst)


Lesenswert?

Du hast dein Programm schon neu kompiliert, mit F_CPU / F_OSC definiert 
auf 3579000 ?

2x 100nF vorhanden (VCC->GND und AVCC->GND)?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> funktioniert das Programm nicht mehr.
Was funktioniert nicht mehr?

Hast du schon mal das Hello-World (blinkende LED) ausprobiert?


BTW:
> Breedboard
Breadboard (mit A)
> Atmega8 läuft nur mit internen Quarz,
Der hat keinen internen Quarz

von Stefan P (Gast)


Lesenswert?

das Programm macht nur eine einfache Ausgabe z.B. "Test", ich hab schon 
alles unnötige rausgelassen.

hmm, jaja , ich meinte ja den internen oszillator.

> Hast du schon mal das Hello-World (blinkende LED) ausprobiert?
nein, ist aber auch nen Versuch wert

> Du hast dein Programm schon neu kompiliert, mit F_CPU / F_OSC definiert
auf 3579000 ?

Ja, ich hab das Makfile entsprechend angepasst. Ist aber unkritisch, 
wenn ich die 3,579 Mhz eingestellt habe und die externe Anregung 
ausschalte geht das Programm immer noch. Aber wie gesagt sobald die 
Fuses auf extern gestellt werden geht das Programm nicht mehr. Aber es 
lässt sich ohne Probleme aufspielen und die Fuses kann ich auch 
umstellen, ergo muss die externe Anregung funktionieren.

> 2x 100nF vorhanden (VCC->GND und AVCC->GND)?

nein , hab ich nicht, werde ich heut nachholen, sollte das solche 
Auswirklungen haben  ??

danke für die tipps

von Stefan P (Gast)


Lesenswert?

nur nochmal vorwerg, ich hab die 22pf schon getauscht, den Quarz auch 
des öfteren, ja sogar den Mega8....

von Gast (Gast)


Lesenswert?

Wenn der Quarz schwingt und du ihn bei eingestelltem Quarz per ISP 
schreiben und lesen kannst dann läuft der Quarz wie er soll. Also kein 
QUarzproblem, eher die restliche Hardware oder deine Software macht 
nicht das was sie soll.

von Karl H. (kbuchegg)


Lesenswert?

Stefan P schrieb:

>> Du hast dein Programm schon neu kompiliert, mit F_CPU / F_OSC definiert
> auf 3579000 ?
>
> Ja, ich hab das Makfile entsprechend angepasst. Ist aber unkritisch,
> wenn ich die 3,579 Mhz eingestellt habe und die externe Anregung
> ausschalte geht das Programm immer noch.

Ich wünschte, Hilfesuchende würden sich in diesem Punkt weniger 
kryptisch ausdrücken.

Checkliste zum Abhaken
* Quarz (2,579 Mhz) ist angeschlossen, die beiden Kondensatoren (22pF) 
sind am QUarz drann
* Fueses sind auf Crystal gestellt
* Dem Programm wurde auch mitgeteilt (per #define F_CPU oder Einstellung 
im AVR-Studio), dass es jetzt mit höherer Taktfrequenz abgearbeitet wird

> Aber wie gesagt sobald die
> Fuses auf extern gestellt werden geht das Programm nicht mehr.

Lass mal bei deiner 3.579 Mhz Einstellung eine LED blinken. 1 Sekunde 
ein, 1 Sekunde aus.
Wenn dein Programm immer noch auf 1Mhz läuft, dann dauert das Blinken 3 
Sekunden statt 1. Den Unterschied sieht man auch mit freiem Auge.

> Aber es
> lässt sich ohne Probleme aufspielen und die Fuses kann ich auch
> umstellen, ergo muss die externe Anregung funktionieren.

Die Schlussfoglerung ist so nicht so schlecht. Hat nur einen Haken. Wenn 
dein µC immer noch mit internem Oszi läuft, lässt er sich auch noch 
Programmieren.

von Stefan P (Gast)


Lesenswert?

> Die Schlussfoglerung ist so nicht so schlecht. Hat nur einen Haken. Wenn
> dein µC immer noch mit internem Oszi läuft, lässt er sich auch noch
> Programmieren.

Also der läuft schon mit den externen 3,579 Mhz, denn wenn ich jetzt den 
Quarz entferne kann ich weder Fuses noch das Programm übertragen.


Mach ich den Quarz wieder ran, kann ich die Fuses wieder umstellen, 
stell ich dann auf Intern, macht das Display sofort ne Ausgabe.


> Ich wünschte, Hilfesuchende würden sich in diesem Punkt weniger
> kryptisch ausdrücken.

Nochmal, wenn ich in meine Programm die F_CPU von 1 Mhz auf 3,56 Mhz 
stelle aber trotzdem den internen Oszi von 1 Mhz verwende funktioniert 
die Ausgabe immer noch, dass meinte ich mit "unkritisch"

von Oliver (Gast)


Lesenswert?

>Ja, die Fuses sind richtig gesetzt, CKSEL 1111 SUT 11,

Wenn du die Fuses so setzen und erfolgreich mit diesen Werten wieder 
auslesen kannst, läuft der Prozessor mit dem externen Quarz.

>Könnte sein , dass der EL Inverter für das Display, irgenwie
>Interferenzen macht ?

Nichts ist unmöglich, aber zu 99% ist das ein Softwareproblem (oder der 
Aufruck auf deinem Quarz stimmt nicht)

Daher: Zeig doch mal deinen Code.

Oliver

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Daher: Zeig doch mal deinen Code.
Sowas in der Richtung wollte ich mit meiner Frage erreichen:
>>> funktioniert das Programm nicht mehr.
>> Was funktioniert nicht mehr?

von Stefan P (Gast)


Lesenswert?

im prinzip hab ich das programm auf die universal C bib von

http://en.radzio.dxp.pl/sed1520/

reduziert. Ich habs jetzt leider nicht parat , bin in der Arbeit.

Compiler ist der avr-gcc unter windows. Fuses hab ich mit avrdude oder 
alt. mit PonyProg geflasht, wobei ich mit PonyProg schlechte Erfahrungen 
gemacht hab, der hat mir den flash einfach Abgebrochen und der 
Controller war danach kaputt.

Ich werd dann heute abend den El-Inverter abklemmen und die 2 
Koppelkondestoren reinbauen. Dann geb ich Feedback.

von Stefan P (Gast)


Lesenswert?

>> Was funktioniert nicht mehr?

die Ausgabe auf dem Display geht nicht mehr! Das ist ja die einzige 
Funktion des Programmes nachdem ich alles andere rausgeschmissen habe.

Also es müsste "Test" auf dem Display stehen. Das tuts wie gesagt nur 
mit dem internen oszi

von Oliver (Gast)


Lesenswert?

>Nochmal, wenn ich in meine Programm die F_CPU von 1 Mhz auf 3,56 Mhz
>stelle aber trotzdem den internen Oszi von 1 Mhz verwende funktioniert
>die Ausgabe immer noch, dass meinte ich mit "unkritisch"

Das ist ein logischer und auch praktischer Trugschluß. Das es in die 
eine Richtung funktioniert, beweist nicht, das es auch andersrum gehen 
muß. Und ganz praktisch ist bei der Ansteuerung von LCD's ein zu 
langsames timing gar kein Problem, ein zu schnelles dagegen schon.

Oliver

von Stefan P (Gast)


Lesenswert?

anderst herum hab ichs gar net gemacht, ich hab schon immer ordentlich 
die F_CPU auf die neue Frequenz eingestellt.

von Stefan P (Gast)


Lesenswert?

also ich hab das BlinkProgramm getestet. Es läuft mit dem 3 Mhz quarz 
super, wenn ich F_CPU auf 1 Mhz stelle und die delay funktion auf 1 
Sekunde stelle, dann blinkt die LED ca. 3 mal pro Sekunde.

dann muss der Fehler irgendwo im Quelltext stecken,... hier:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#define SCREEN_WIDTH  122
4
5
#define SED1520_DATA_PORT   PORTD
6
#define SED1520_DATA_DDR   DDRD
7
#define SED1520_DATA_PIN   PIND
8
9
#define SED1520_CONTROL_PORT   PORTC
10
#define SED1520_CONTROL_DDR   DDRC
11
12
#define SED1520_A0 (1 << 0)
13
#define SED1520_E1 (1 << 2)
14
#define SED1520_E2 (1 << 1)
15
#define SED1520_RW (1 << 1)
16
#define SED1520_RES (1 << 3)
17
#define F_CPU 3579000UL
18
19
extern unsigned char lcd_x, lcd_y;
20
//-------------------------------------------------------------------------------------------------
21
//
22
//-------------------------------------------------------------------------------------------------
23
24
void GLCD_InitPorts(void)
25
{
26
SED1520_DATA_DDR = 0xFF;
27
28
SED1520_CONTROL_DDR |= (SED1520_E2 | SED1520_E1  | SED1520_A0 | SED1520_RES);
29
DDRB |= (SED1520_RW);
30
_delay_ms(10);
31
SED1520_CONTROL_PORT &= ~SED1520_RES;
32
_delay_ms(100);
33
SED1520_CONTROL_PORT |= SED1520_RES;  // Reset liegt üblicherweise auf H
34
35
36
}
37
//-------------------------------------------------------------------------------------------------
38
//
39
//-------------------------------------------------------------------------------------------------
40
void GLCD_WaitForStatus(unsigned char status, unsigned char controller)
41
{
42
char tmp;
43
SED1520_CONTROL_PORT &= ~SED1520_A0; 
44
PORTB |= SED1520_RW; 
45
SED1520_DATA_DDR = 0x00; 
46
do
47
  {
48
  if(controller == 0) 
49
    {
50
  SED1520_CONTROL_PORT |= SED1520_E1; 
51
  asm("nop");asm("nop"); 
52
  tmp = SED1520_DATA_PIN; 
53
  SED1520_CONTROL_PORT &= ~SED1520_E1; 
54
  } 
55
  else 
56
    {
57
  SED1520_CONTROL_PORT |= SED1520_E2; 
58
  asm("nop");asm("nop"); 
59
  tmp = SED1520_DATA_PIN; 
60
  SED1520_CONTROL_PORT &= ~SED1520_E2; 
61
  }
62
  }while(tmp & status);
63
SED1520_DATA_DDR = 0xFF; 
64
}
65
//-------------------------------------------------------------------------------------------------
66
// Write command
67
//-------------------------------------------------------------------------------------------------
68
void GLCD_WriteCommand(unsigned char commandToWrite,unsigned char ctrl)
69
{
70
GLCD_WaitForStatus(0x80, ctrl);
71
72
SED1520_CONTROL_PORT &= ~SED1520_A0;
73
PORTB &= ~SED1520_RW;
74
75
SED1520_DATA_PORT = commandToWrite;
76
77
if(ctrl)
78
  {
79
  SED1520_CONTROL_PORT |= SED1520_E2;
80
  asm("nop");asm("nop");
81
  SED1520_CONTROL_PORT &= ~SED1520_E2;
82
  }
83
else
84
  {
85
  SED1520_CONTROL_PORT |= SED1520_E1;
86
  asm("nop");asm("nop");
87
  SED1520_CONTROL_PORT &= ~SED1520_E1;
88
  }
89
}
90
//-------------------------------------------------------------------------------------------------
91
// Write data
92
//-------------------------------------------------------------------------------------------------
93
void GLCD_WriteData(unsigned char dataToWrite)
94
{
95
GLCD_WaitForStatus(0x80, 0);
96
GLCD_WaitForStatus(0x80, 1);
97
SED1520_CONTROL_PORT |= SED1520_A0; // A0 auf 1, weil Daten
98
PORTB &= ~SED1520_RW; // W auf 0 weil schreiben
99
SED1520_DATA_PORT = dataToWrite; 
100
if(lcd_x < 61) 
101
  {
102
  SED1520_CONTROL_PORT |= SED1520_E1;
103
  asm("nop");asm("nop");
104
  SED1520_CONTROL_PORT &= ~SED1520_E1;
105
  }
106
else
107
  {
108
  SED1520_CONTROL_PORT |= SED1520_E2;
109
  asm("nop");asm("nop");
110
  SED1520_CONTROL_PORT &= ~SED1520_E2;
111
  }
112
lcd_x++;
113
if(lcd_x >= SCREEN_WIDTH)
114
  lcd_x = 0;
115
}
116
//-------------------------------------------------------------------------------------------------
117
// Read data
118
//-------------------------------------------------------------------------------------------------
119
unsigned char GLCD_ReadData(void)
120
{
121
unsigned char tmp;
122
123
GLCD_WaitForStatus(0x80, 0); 
124
GLCD_WaitForStatus(0x80, 1); 
125
SED1520_CONTROL_PORT |= SED1520_A0; 
126
PORTB |= SED1520_RW; 
127
SED1520_DATA_DDR = 0x00; 
128
SED1520_DATA_PORT = 0xFF;
129
if(lcd_x < 61)
130
    {
131
    SED1520_CONTROL_PORT |= SED1520_E1;
132
    asm("nop");asm("nop");
133
    SED1520_CONTROL_PORT &= ~SED1520_E1;
134
  asm("nop");asm("nop");
135
  SED1520_CONTROL_PORT |= SED1520_E1; 
136
  asm("nop");asm("nop");
137
  tmp = SED1520_DATA_PIN; 
138
  SED1520_CONTROL_PORT &= ~SED1520_E1; 
139
  }
140
else 
141
    {  
142
    SED1520_CONTROL_PORT |= SED1520_E2;
143
    asm("nop");asm("nop");
144
    SED1520_CONTROL_PORT &= ~SED1520_E2;
145
  asm("nop");asm("nop");
146
  SED1520_CONTROL_PORT |= SED1520_E2;
147
  asm("nop");asm("nop");
148
  tmp = SED1520_DATA_PIN;  
149
  SED1520_CONTROL_PORT &= ~SED1520_E2; 
150
  }
151
SED1520_DATA_DDR = 0xFF; 
152
lcd_x++; 
153
if(lcd_x > 121)
154
  lcd_x = 0;
155
return tmp;
156
}

ich hab schon die asm("nop") 3 mal kopiert und eingefügt, um die zeit zu 
verlängern, aber das Display mach immer noch keinen Mucks.

Was mich auch iritiert ist, das die Einstellung von F_CPU im Makefile 
ignoriert wurde. erst nachdem ich es als #define F_CPU im Code engefügt 
hat, hat er es übernommen.

von Jan H. (linklon)


Lesenswert?

ich denke die initialisierung des Displays könnte ein problem sein...
wie steuerst du dein Display an? 4 oder 8 bit?

Bei 4 bit arbeitest du mit vielen waits, wenn die nicht stimmen => tot
Bei den 8 bit hängt der Prozessor wenn er kein ok zurückbekommt...

Initialisiert sich dein Display korrekt?

von Benedikt K. (benedikt)


Lesenswert?

Jan Herzog schrieb:
> ich denke die initialisierung des Displays könnte ein problem sein...
> wie steuerst du dein Display an? 4 oder 8 bit?

Nicht jedes Display ist ein 44780 kompatibles Display mit 4 oder 8 bit 
Modus.

von holger (Gast)


Lesenswert?

@linklon

>ich denke die initialisierung des Displays könnte ein problem sein...
>wie steuerst du dein Display an? 4 oder 8 bit?

Es gibt auch noch andere LCD Controller als du
gerade im Kopf hattest ;)

@Stefan
#define F_CPU 3579000UL

gehört VOR

#include <util/delay.h>

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Wenn du den Takt verdreifachst solltest du testweise auch mal alle 
"nops" verdreifachen.

von Stefan P (Gast)


Lesenswert?

Stefan P:
> ich hab schon die asm("nop") 3 mal kopiert und eingefügt, um die zeit zu
> verlängern, aber das Display mach immer noch keinen Mucks.


jo die nops hab ich schon verdreifacht

> #define F_CPU 3579000UL

> gehört VOR

> #include <util/delay.h>


ok, das define hab ich jetzt vorgeschoben, aber das Display macht immer 
noch keine Ausgabe.


Ich steuer das Display mit einer 8 Bit an. Der Controller ist ein 
SED1520

von Stefan P (Gast)


Lesenswert?

so ich hatte gestern auch noch die asm("nop") komplett rausgeschmissen 
und mit _delay_ms(10) getauscht, aber es bringt auch nichts,... hmm 
schön langsam gehen mir die ideen aus....

von Klaus D. (kolisson)


Lesenswert?

das klingt ja nach einem sehr merkwürdigem problem.

wie läuft es denn, wenn du den internen takt auf 4 mhz stellst ?
wenns dann auch nicht läuft gibts vielleich ein problem mit dem layout 
oder sowas.

gruss klaus

von Stefan P (Gast)


Lesenswert?

hmm aso, ich dachte der einezige interne Takt ist der mit 1 Mhz,
blick ins Datenblatt:

CKSEL laut datenblatt für intern CKSEL = 0001 und SUT = 10  = 1 Mhz
ich stells dann mal auf  CKSEL 0100 müsste 4 Mhz sein


Gute Idee, probier ich gleich heut abend !

von Stefan P (Gast)


Lesenswert?

ups verschaut 0011  ist 4 Mhz

von Oliver (Gast)


Lesenswert?

Bau mal überall vor dem Setzten des Enable-pins noch ein delay ein, so 
wie hier:
1
SED1520_DATA_PORT = dataToWrite; 
2
_delay_ms(1); // <======================================
3
if(lcd_x < 61) 
4
  {
5
  SED1520_CONTROL_PORT |= SED1520_E1;
6
...

Oliver

von Stefan P (Gast)


Lesenswert?

wer ich dann auch heut abend probieren, ich geb dann feedback

von Stefan P (Gast)


Lesenswert?

1
void GLCD_WaitForStatus(unsigned char status, unsigned char controller)
2
{
3
char tmp;
4
SED1520_CONTROL_PORT &= ~SED1520_A0; 
5
PORTB |= SED1520_RW; 
6
SED1520_DATA_DDR = 0x00; 
7
do
8
  {
9
  if(controller == 0) 
10
    {
11
  _delay_ms(1);
12
  SED1520_CONTROL_PORT |= SED1520_E1; 
13
  asm("nop");asm("nop");
14
  asm("nop");asm("nop");
15
  asm("nop");asm("nop");
16
  tmp = SED1520_DATA_PIN; 
17
  SED1520_CONTROL_PORT &= ~SED1520_E1; 
18
  } 
19
  else 
20
    {
21
  _delay_ms(1);
22
  SED1520_CONTROL_PORT |= SED1520_E2; 
23
  asm("nop");asm("nop");
24
  asm("nop");asm("nop");
25
  asm("nop");asm("nop");
26
  tmp = SED1520_DATA_PIN; 
27
  SED1520_CONTROL_PORT &= ~SED1520_E2; 
28
  }
29
  }while(tmp & status);
30
SED1520_DATA_DDR = 0xFF; 
31
}

hey oliver, danke für den tipp, ich habs jetzt aber in der 
GLCD_WaitForStatus eingebaut. JETZT GEHTS

Ich halte fest,... Problem war: ich musste die nops verdreifachen und 
bei der GLCD_WaitForStatus funktion vor Zugriff auf E1 bzw E2 ein delay 
einbauen

Nur versteh ich jetzt nicht genau warum es nötig ist da noch ein delay 
reinzumachen !


Vielen Dank für die rege Hilfe.

gruße

von Stefan P (Gast)


Lesenswert?

hat von euch jemand nen plan , warum das ganze ohne das _delay_ms(1)
nicht funktioniert, ist zwar schön dass es jetzt geht, aber so lang ich 
des net versteh müss ich ständig grübeln,.....

von Karl H. (kbuchegg)


Lesenswert?

Versuch doch mal die 1 ms zu drücken und kürzer zu machen.

> warum das ganze ohne das _delay_ms(1)
> nicht funktioniert,

Kann nur vermuten.
Am LCD läuft ja auch ein Prozessor. Der braucht auch ein bischen Zeit um 
nach der Bearbeitung eines Kommandos wieder aufnahmefähig für das 
nächste Kommando zu sein. Deine Abfrageschleife ist ziemlich dicht, soll 
heissen: ohne den _delay_ms kommt da Abfrage auf Abfrage ohne viel Zeit 
dazwischen.

In deinem Fall würde ich auch mal so probieren:
Die erste Abfrage würde ich ohne Zeitverzögerung machen. Erst dannn, 
wenn weitere Abfragen notwendig sind, kommt da eine kleine Verzögerung 
rein.
Damit musst du nicht lange warten, wenn das Display beim Eintritt in die 
Funktion schon ready ist.

Ungefähr so
1
void GLCD_WaitForStatus(unsigned char status, unsigned char controller)
2
{
3
  char tmp;
4
5
  SED1520_CONTROL_PORT &= ~SED1520_A0; 
6
  PORTB |= SED1520_RW; 
7
  SED1520_DATA_DDR = 0x00; 
8
9
  do
10
  {
11
    SED1520_CONTROL_PORT |= ( controller == 0 ? SED1520_E1 : SED1520_E2 ); 
12
    asm("nop");asm("nop");
13
    asm("nop");asm("nop");
14
    asm("nop");asm("nop");
15
    tmp = SED1520_DATA_PIN; 
16
    SED1520_CONTROL_PORT &= ~ ( controller == 0 ? SED1520_E1 : SED1520_E2 ); 
17
18
    if( ! ( tmp & status ) )  // noch eine Runde fällig? dann ein bischen warten
19
      _delay_ms( 1 );
20
21
  } while(tmp & status);
22
23
  SED1520_DATA_DDR = 0xFF; 
24
}

von Oliver (Gast)


Lesenswert?

>hat von euch jemand nen plan ,

Der Plan heisst Datenblatt. Ich habe zwar keins vorliegen, aber 
üblicherweise haben solche Bausteine u.a. auch eine definierte 
Mindestzeit, die die Daten anliegen müssen, bevor das Taktsignal kommem 
darf.

Und ansonsten gilt bei solchen Problemen immer: Es liegt am Timing.

Oliver

von Stefan P (Gast)


Lesenswert?

> Der Plan heisst Datenblatt. Ich habe zwar keins vorliegen, aber
> üblicherweise haben solche Bausteine u.a. auch eine definierte
> Mindestzeit, die die Daten anliegen müssen, bevor das Taktsignal kommem
> darf.

Ich leg ja keine Daten an, bevor ich daten anlege ruf ich die Funktion 
GLCD_WaitForStatus auf, und frag das Busy Flag ab, also status = 0x80, 
so lange das busyflag auf 1 ist, dreht das Programm seine runden in der 
Schleife, also müsste dieses delay doch dann unnötig sein ?!?


> Versuch doch mal die 1 ms zu drücken und kürzer zu machen.

hab ich schon versucht, aber die 1 ms braucht er schon ungefähr, wenn 
ichs kürzer mach dann verwehrt mir das Display die Ausgabe

dein Code sieht auf jeden Fall gut aus, den werd ich übernehmen, schon 
weil er übersichtlicher und kürzer ist.

von Stefan P (Gast)


Lesenswert?

Ich hab im Datenblatt was gefunden S38, 39

Parameter Symbol           Signal       Min  Typ    Max    Unit
System cycle time tCYC6 *1 A0, CS       1000  —      —     ns

Wenn meine CPU mit 4 Mhz taktet kann se im Schnitt einen Befehl in 250ns 
abarbeiten.

Wenn ich die Funktion GLCD_Wait_For_Status 2mal hintereiander aufrufe um 
zB beide Controller abzufragen, dann dürfte das vom Timing her eng 
werden.
Ich werd dann den Aufruf mal abändern.
1
GLCD_WaitForStatus(0x80, 0);
2
_delay_ms(1); 
3
GLCD_WaitForStatus(0x80, 1); 
4
5
denn wenn die Funktion endet mit:
6
SED1520_CONTROL_PORT &= ~SED1520_E2;
könnte ich mir vorstellen, dass E2 noch gar nicht zurückgesetzt wird und 
dann schon wieder versucht wird E1 zu setzen, deswegen würde das delay 
hier die nötige zeit bringen.

von Stefan P (Gast)


Lesenswert?

also ich meinte die 1000 ns zwischen den zugriffen auf das CS nicht 
eingehalten werden

von Oliver (Gast)


Lesenswert?

>hab ich schon versucht, aber die 1 ms braucht er schon ungefähr,

das ist allerdings seltsam. Ich hatte die 1 ms eiggentlich nur als 
Extremwert dahingeschrieben, um zu sehen, ob es überhaupt was ausmacht. 
Üblicherweise liegen die einzuhaltenden Timings im Bereich 20 bis 500 
ns, da geht es um ein paar nops mehr oder weniger.


Hier,
http://www.lcd-module.de/eng/pdf/zubehoer/sed1520.pdf
auf Seite 36, stehen die relevanten timings. Das ist bei 3,7MHz 
Prozessortakt alles unkritisch, vorausgesetzt, dein Display hält sich 
auch an das Datenblatt.

Oliver

von Klaus D. (kolisson)


Lesenswert?

also Stefan P (Gast):

eventuell solltest du mal die portpins, die du für das display 
verwendest
mal per software durchtoggeln und mal den rüssel (ossi) daufhalten. ein 
schlechtes layout oder schlechte kabel könnten nämlich dazu führen, dass 
die signale so verschliffen werden, das nix mehr geht, es sei denn, man 
baut einen haufen waits ein.

gruss klaus

von Stefan P (Gast)


Lesenswert?

hmm, könnte sein, ich hab ja alles ein wenig wüst auf nem Breadboard 
zusammengenagelt,....

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.