"Das setzt alle anderen Kontrollsignale zurück. Es muss |= heißen.
Weiter habe ich nicht geschaut."
Danke, das | vergesse ich staendig....
"Und: Macht ★Deine★ Delay_ms() wirklich das, was sie soll (find oben
weder Deklaration (ok, die kann ich mir dazudenken) noch Definition (die
ist potenziell fehleranfällig))."
Hier die Delayroutinen:
1 | //-------------------------------------------------------------------------
|
2 | //Delayfunktion --> Diese Funktion kann man verwenden, um eine genaue Ver-
|
3 | // zoegerung zu erhalten. Man uebergibt der Funktion eine
|
4 | //Zahl,welche groesser ist als 0. Diese wird danach heruntergezaehlt.
|
5 | //Fuer jedes "Herunterzaehlen" benoetigt der Mikroprozessor
|
6 | //3 Takte. Man muss also nur die eingestellte Frequenz kennen,
|
7 | //um zu berechnen, wie lange die Verzoegerung dauern wird.
|
8 | //-------------------------------------------------------------------------
|
9 | void __attribute__((naked)) Delay(unsigned int d) {
|
10 | asm(" inc %0 ; Prevent overflow (1c)\n"
|
11 | ".LDecDel: dec %0 ; Decrement var (1c)\n"
|
12 | " jnz .LDecDel ; Check if var is '0' (2c)\n"
|
13 | " ret ; Return (3c?)" :: "r"(d));
|
14 | }
|
15 | //-------------------------------------------------------------------------
|
16 | //-------------------------------------------------------------------------
|
17 | //Delayfunktion ms --> Da wir normalerweise eine Frequenz von 8MHz
|
18 | // verwenden,habe ich ein Unterprogramm geschrieben, welches die
|
19 | //Funktion Delay aufruft und ihr den Wert 2667 uebergibt.
|
20 | //Fuer jedes Herunterzaehlen benoetigt die Funktion bekannt-
|
21 | //lich 3 Takte, das heisst sie benoetigt 8000 Takte (3*2667)
|
22 | //um von 2667 auf 0 herunter zu zaehlen. Ein Takt ist bei
|
23 | //8MHz 125ns lang --> 8000 Takte * 125ns = 1ms!
|
24 | //Der neuen Funktion Delay_ms kann man also einfach einen
|
25 | //Wert entsprechend der gewuenschten Millisekundenzahl
|
26 | //uebergeben.
|
27 | //-------------------------------------------------------------------------
|
28 | void Delay_ms(unsigned long d)
|
29 | {
|
30 | unsigned long i;
|
31 | for(i=0; i<=d; i++)
|
32 | {
|
33 | Delay(2667);
|
34 | }
|
35 | }
|
Jetzt wo ich die Funktion anschaue, faellt mir ein, dass ich gar keine
definierte Frequenz eingestellt habe. Muesste ich ueberpruefen.
Die Funktion ist nebenbei nicht von mir, hab sie von einem
Arbeitskollegen bekommen.
"Wenn Du schon so schöne Makros^WDefines vergeben hast, dann nimm sie
doch auch her, das erspart viel Sucherei und verbessert die Lesbarkeit
massiv. Und bist Du sicher, dass Du den gesamten Port vom LCD_CTRL
(alles ausser LCD_EN) auf 0 setzen willst? (Hinthinthint: In lcd_data()
wird LCD_RS zwar gesetzt, aber dann in lcd_enable() wieder
weggebügelt!)"
Ja der Gedanke kam mir schon bei der Programmierung. Eigentlich könnte
ich EN immer auf 1 lassen, bis ich die Daten übergeben will.
Thx for support