LCD Anzeige spinnt

Gast #2347056
Lesenswert?

Hi,

Ich habe ein kleines "Problemchen" mit meiner Anzeigenausgabe

Angezeigt soll werden

1234

raus kommt

7239


Danke vom Netwurm



hier der Quelltext :
1
#include <msp430x44x.h>
2

3
/*  
4
############################################
5
## Display Treiber Alarmanlage MSP430F449 ##   
6
############################################
7

8

9
     __a__  
10
    |     |
11
    f     b
12
    |__g__|    sieben segment display
13
    |     |
14
    e     c
15
    |__d__|
16
    
17
    .db  0b11000000     ; 0: a, b, c, d, e, f
18
    .db  0b11111001     ; 1: b, c
19
    .db  0b10100100     ; 2: a, b, d, e, g     
20
    .db  0b10110000     ; 3: a, b, c, d, g
21
    .db  0b10011001     ; 4: b, c, f, g
22
    .db  0b10010010     ; 5: a, c, d, f, g
23
    .db  0b10000010     ; 6: a, c, d, e, f, g
24
    .db  0b11111000     ; 7: a, b, c
25
    .db  0b10000000     ; 8: a, b, c, d, e, f, g
26
    .db  0b10010000     ; 9: a, b, c, d, f, g 
27

28

29
Bitzahlen von rechts nach links gelesen 
30
Beispiel für Dezimalzahl 0
31
<-------
32
11000000 
33

34
     __a__      ___on___    a = 0 = on   bit O
35
    |     |    |        |   b = 0 = on   bit 1    
36
    f     b    on      on   c = 0 = on   bit 2
37
    |__g__|    |___off__|   d = 0 = on   bit 3
38
    |     |    |        |   e = 0 = on   bit 4
39
    e     c    on      on   f = 0 = on   bit 5
40
    |__d__|    |__off___|   g = 1 = off  bit 6 
41
     
42
siehe: http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige
43
*/
44

45
#define   LCD_PORT_DIR P2DIR         //  
46
#define   LCD_PORT_OUT P2OUT         //  
47
#define   LCD_1_LOW     P3OUT&=~BIT4 //  
48
#define   LCD_1_HIGH    P3OUT|=BIT4  //
49
#define   LCD_2_LOW     P3OUT&=~BIT5 //
50
#define   LCD_2_HIGH    P3OUT|=BIT5  //
51
#define   LCD_3_LOW     P3OUT&=~BIT6 //
52
#define   LCD_3_HIGH    P3OUT|=BIT6  //
53
#define   LCD_4_LOW     P3OUT&=~BIT7 //
54
#define   LCD_4_HIGH    P3OUT|=BIT7  //
55

56

57
unsigned int dez_anzeig;            // Dezimalzahl zum anzeigen 0....9999    
58
void wait(unsigned int i);          // prototypen
59

60
unsigned char digit[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
61

62
void int_lcd()
63
{
64
  LCD_PORT_DIR|=0XFF;           //  
65
  P3DIR|=BIT7+BIT4+BIT5+BIT6;
66
  P3DIR|=BIT3;                  //
67
  P3OUT&=~BIT3;                 //
68
}
69

70
void wait(unsigned int i)    // delay function
71
{
72
  unsigned int j;
73
  for(j=0;j<i;j++);
74
}
75

76
void display(int num)
77
{
78
   unsigned char LCD_1,LCD_2,LCD_3,LCD_4;
79
   unsigned char w=220;  
80
   unsigned char i=0; 
81
   /* 
82
   LCD_1=num/1000;
83
   LCD_2=num%1000/100;
84
   LCD_3=num%100/10;
85
   LCD_4=num%10;
86
  */
87
  for(i = 0; num >= 1000; i++, num -= 1000);
88
  LCD_1 = i;
89
  for(i = 0; num >= 100; i++, num -= 100);
90
  LCD_2 = i;
91
  for(i = 0; num >= 10; i++, num -= 10);
92
  LCD_3= i;
93
  LCD_4 = num;
94
   
95
  LCD_PORT_OUT=digit[LCD_1];
96
  LCD_1_LOW;
97
  wait(w);
98
  LCD_1_HIGH;
99
  LCD_PORT_OUT=digit[LCD_2];
100
  LCD_2_LOW;
101
  wait(w);
102
  LCD_2_HIGH;
103
  LCD_PORT_OUT=digit[LCD_3];
104
  LCD_3_LOW;
105
  wait(w);
106
  LCD_3_HIGH;
107
  LCD_PORT_OUT=digit[LCD_4];
108
  LCD_4_LOW;
109
  wait(w);
110
  LCD_4_HIGH;
111
}
112

113
void main(void)
114
{
115
  WDTCTL = WDTPW+WDTHOLD;           // watchdog aus
116
  int_lcd();                        // Intalisierung 
117
  dez_anzeig = 1234;                // Dezimal Zahl Ausgabe
118
  
119
  while (1)
120
  {
121
  display(dez_anzeig);
122
  }
123
}
Angehängte Dateien:
#2347111
Lesenswert?

Schmeiß doch erstmal

  for(i = 0; num >= 1000; i++, num -= 1000);
  LCD_1 = i;
  for(i = 0; num >= 100; i++, num -= 100);
  LCD_2 = i;
  for(i = 0; num >= 10; i++, num -= 10);
  LCD_3= i;
  LCD_4 = num;


raus. Und weise LCD_1 - _4 explizit Werte zu. Dann siehst du erstmal ob 
deine Ausgabe funktioniert.

Das hier ist der weitaus schönere Ansatz:

   /*
   LCD_1=num/1000;
   LCD_2=num%1000/100;
   LCD_3=num%100/10;
   LCD_4=num%10;
  */
Gast #2347121
Lesenswert?

hi,

Danke!!!!!

Ja die Ausgabe funktioniert jedoch werden falsche Zahlen angezeigt ;o)

Ich habe auch schon eine Schleife (0 bis 9999) laufen lassen ... mit dem 
Ergebnis das jeweils bei den Ziffern 1 bzw 4 die Anzeige in allen 4 LCD 
7 bzw. 9 anzeigt.

als aus 1 wird 7
und aus 4 wird 9

ist schon irgendwie seltsam ;o)

Netwurm
Gast #2347158
Lesenswert?

Nochmal getestet

Die Null hat auch ein Ding weg

sieht so aus
++++
+  +
+    <- da fehlt es
++++


1
  while (1)
2
  {
3
  
4
    for(dez_anzeig = 0; dez_anzeig < 10000; dez_anzeig++)
5
     { 
6
    display(dez_anzeig);
7
    wait(5000);
8
    
9
     }
10
  dez_anzeig = 0;
11
  }
#2347199
Lesenswert?

Stell doch erst mal fest, ob diese Zuordnungstabelle überhaupt mit 
deiner Verschaltung übereinstimmt
1
Beispiel für Dezimalzahl 0
2
<-------
3
11000000 
4

5
     __a__      ___on___    a = 0 = on   bit O
6
    |     |    |        |   b = 0 = on   bit 1    
7
    f     b    on      on   c = 0 = on   bit 2
8
    |__g__|    |___off__|   d = 0 = on   bit 3
9
    |     |    |        |   e = 0 = on   bit 4
10
    e     c    on      on   f = 0 = on   bit 5
11
    |__d__|    |__off___|   g = 1 = off  bit 6 
12
     
13
siehe: http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige
14
*/
15

16
....
17

18
unsigned char digit[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};

Schmeiss dein Programm weg und gib einfach nur
   0x01
aus und sieh nach welches Segment leuchtet
Danach 0x02, 0x04, 0x08 etc.
bist du von jedem Bit weißt, zu welchem Segment es gehört.
Und dann baust du deine Tabelle erneut auf.
1
....
2

3
int main()
4
{
5
   ...
6

7
  while( 1 )
8
  {
9
    LCD_PORT_OUT = 0x01;
10
    LCD_1_LOW;
11
  }
12
}
Gast #2347234
Lesenswert?

Hi,

erstmal danke ;o)

LCD_PORT_OUT = 0x01;

leuchtet alles ...


werde ich jetzt mal versuchen

unsigned char digit[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 
0xF8, 0x80, 0x90};

so wie ich es bis jetzt verstanden habe ist das doch ein standard

Der Controller kann mit hex Zahlenformat umgehen und hat eine 
Zuordnungstabelle für ASCII-Darstellung

na da bin ich ja mal gespannt


Netwurm
#2347373
Lesenswert?

netwurm schrieb:

> so wie ich es bis jetzt verstanden habe ist das doch ein standard

Standard ist das, wie du die Drähte vom µC zur Anzeige gezogen hast.Und 
ich bin jetzt zu faul mir das aus deinem Schaltplan rauszulesen, wenn du 
das in einem 1/4 der Zeit durch pures ausprobieren selbst feststellen 
kannst.
Vertausch 2 Drähte und anstelle des Punktes leuchtet eben irgendein ein 
anderes Segment. Ist doch wurscht welches, solange man nur weiß welches. 
Und genau das stellst du jetzt einfach mit einem Testprogramm fest.
Gast #2347423
Lesenswert?

Hi,

Hab die ganze Sache mal getestet
scheinbar ist irgendwas kaputt ....

Die obere LED (a) bleibt immer an bzw. blink nur ganz kurz geht aber 
nicht aus

Hier nochmal der Code kann ja sein das Jemand auch so ein Problemchen 
hat



1
......
2
......
3
unsigned char segment[255] = {
4

5
/*0*/ 0x0,
6
/*1*/ 0x1,
7
/*2*/ 0x2,
8
/*3*/ 0x3,
9
/*4*/ 0x4,
10
/*5*/ 0x5,
11
/*6*/ 0x6,
12
/*7*/ 0x7,
13
/*8*/ 0x8,
14
/*9*/ 0x9,
15
/*10*/ 0xa,
16
/*11*/ 0xb,
17
/*12*/ 0xc,
18
/*13*/ 0xd,
19
/*14*/ 0xe,
20
/*15*/ 0xf,
21
/*16*/ 0x10,
22
/*17*/ 0x11,
23
/*18*/ 0x12,
24
/*19*/ 0x13,
25
/*20*/ 0x14,
26
/*21*/ 0x15,
27
/*22*/ 0x16,
28
/*23*/ 0x17,
29
/*24*/ 0x18,
30
/*25*/ 0x19,
31
/*26*/ 0x1a,
32
/*27*/ 0x1b,
33
/*28*/ 0x1c,
34
/*29*/ 0x1d,
35
/*30*/ 0x1e,
36
/*31*/ 0x1f,
37
/*32*/ 0x20,
38
/*33*/ 0x21,
39
/*34*/ 0x22,
40
/*35*/ 0x23,
41
/*36*/ 0x24,
42
/*37*/ 0x25,
43
/*38*/ 0x26,
44
/*39*/ 0x27,
45
/*40*/ 0x28,
46
/*41*/ 0x29,
47
/*42*/ 0x2a,
48
/*43*/ 0x2b,
49
/*44*/ 0x2c,
50
/*45*/ 0x2d,
51
/*46*/ 0x2e,
52
/*47*/ 0x2f,
53
/*48*/ 0x30,
54
/*49*/ 0x31,
55
/*50*/ 0x32,
56
/*51*/ 0x33,
57
/*52*/ 0x34,
58
/*53*/ 0x35,
59
/*54*/ 0x36,
60
/*55*/ 0x37,
61
/*56*/ 0x38,
62
/*57*/ 0x39,
63
/*58*/ 0x3a,
64
/*59*/ 0x3b,
65
/*60*/ 0x3c,
66
/*61*/ 0x3d,
67
/*62*/ 0x3e,
68
/*63*/ 0x3f,
69
/*64*/ 0x40,
70
/*65*/ 0x41,
71
/*66*/ 0x42,
72
/*67*/ 0x43,
73
/*68*/ 0x44,
74
/*69*/ 0x45,
75
/*70*/ 0x46,
76
/*71*/ 0x47,
77
/*72*/ 0x48,
78
/*73*/ 0x49,
79
/*74*/ 0x4a,
80
/*75*/ 0x4b,
81
/*76*/ 0x4c,
82
/*77*/ 0x4d,
83
/*78*/ 0x4e,
84
/*79*/ 0x4f,
85
/*80*/ 0x50,
86
/*81*/ 0x51,
87
/*82*/ 0x52,
88
/*83*/ 0x53,
89
/*84*/ 0x54,
90
/*85*/ 0x55,
91
/*86*/ 0x56,
92
/*87*/ 0x57,
93
/*88*/ 0x58,
94
/*89*/ 0x59,
95
/*90*/ 0x5a,
96
/*91*/ 0x5b,
97
/*92*/ 0x5c,
98
/*93*/ 0x5d,
99
/*94*/ 0x5e,
100
/*95*/ 0x5f,
101
/*96*/ 0x60,
102
/*97*/ 0x61,
103
/*98*/ 0x62,
104
/*99*/ 0x63,
105
/*100*/ 0x64,
106
/*101*/ 0x65,
107
/*102*/ 0x66,
108
/*103*/ 0x67,
109
/*104*/ 0x68,
110
/*105*/ 0x69,
111
/*106*/ 0x6a,
112
/*107*/ 0x6b,
113
/*108*/ 0x6c,
114
/*109*/ 0x6d,
115
/*110*/ 0x6e,
116
/*111*/ 0x6f,
117
/*112*/ 0x70,
118
/*113*/ 0x71,
119
/*114*/ 0x72,
120
/*115*/ 0x73,
121
/*116*/ 0x74,
122
/*117*/ 0x75,
123
/*118*/ 0x76,
124
/*119*/ 0x77,
125
/*120*/ 0x78,
126
/*121*/ 0x79,
127
/*122*/ 0x7a,
128
/*123*/ 0x7b,
129
/*124*/ 0x7c,
130
/*125*/ 0x7d,
131
/*126*/ 0x7e,
132
/*127*/ 0x7f,
133
/*128*/ 0x80,
134
/*129*/ 0x81,
135
/*130*/ 0x82,
136
/*131*/ 0x83,
137
/*132*/ 0x84,
138
/*133*/ 0x85,
139
/*134*/ 0x86,
140
/*135*/ 0x87,
141
/*136*/ 0x88,
142
/*137*/ 0x89,
143
/*138*/ 0x8a,
144
/*139*/ 0x8b,
145
/*140*/ 0x8c,
146
/*141*/ 0x8d,
147
/*142*/ 0x8e,
148
/*143*/ 0x8f,
149
/*144*/ 0x90,
150
/*145*/ 0x91,
151
/*146*/ 0x92,
152
/*147*/ 0x93,
153
/*148*/ 0x94,
154
/*149*/ 0x95,
155
/*150*/ 0x96,
156
/*151*/ 0x97,
157
/*152*/ 0x98,
158
/*153*/ 0x99,
159
/*154*/ 0x9a,
160
/*155*/ 0x9b,
161
/*156*/ 0x9c,
162
/*157*/ 0x9d,
163
/*158*/ 0x9e,
164
/*159*/ 0x9f,
165
/*160*/ 0xa0,
166
/*161*/ 0xa1,
167
/*162*/ 0xa2,
168
/*163*/ 0xa3,
169
/*164*/ 0xa4,
170
/*165*/ 0xa5,
171
/*166*/ 0xa6,
172
/*167*/ 0xa7,
173
/*168*/ 0xa8,
174
/*169*/ 0xa9,
175
/*170*/ 0xaa,
176
/*171*/ 0xab,
177
/*172*/ 0xac,
178
/*173*/ 0xad,
179
/*174*/ 0xae,
180
/*175*/ 0xaf,
181
/*176*/ 0xb0,
182
/*177*/ 0xb1,
183
/*178*/ 0xb2,
184
/*179*/ 0xb3,
185
/*180*/ 0xb4,
186
/*181*/ 0xb5,
187
/*182*/ 0xb6,
188
/*183*/ 0xb7,
189
/*184*/ 0xb8,
190
/*185*/ 0xb9,
191
/*186*/ 0xba,
192
/*187*/ 0xbb,
193
/*188*/ 0xbc,
194
/*189*/ 0xbd,
195
/*190*/ 0xbe,
196
/*191*/ 0xbf,
197
/*192*/ 0xc0,
198
/*193*/ 0xc1,
199
/*194*/ 0xc2,
200
/*195*/ 0xc3,
201
/*196*/ 0xc4,
202
/*197*/ 0xc5,
203
/*198*/ 0xc6,
204
/*199*/ 0xc7,
205
/*200*/ 0xc8,
206
/*201*/ 0xc9,
207
/*202*/ 0xca,
208
/*203*/ 0xcb,
209
/*204*/ 0xcc,
210
/*205*/ 0xcd,
211
/*206*/ 0xce,
212
/*207*/ 0xcf,
213
/*208*/ 0xd0,
214
/*209*/ 0xd1,
215
/*210*/ 0xd2,
216
/*211*/ 0xd3,
217
/*212*/ 0xd4,
218
/*213*/ 0xd5,
219
/*214*/ 0xd6,
220
/*215*/ 0xd7,
221
/*216*/ 0xd8,
222
/*217*/ 0xd9,
223
/*218*/ 0xda,
224
/*219*/ 0xdb,
225
/*220*/ 0xdc,
226
/*221*/ 0xdd,
227
/*222*/ 0xde,
228
/*223*/ 0xdf,
229
/*224*/ 0xe0,
230
/*225*/ 0xe1,
231
/*226*/ 0xe2,
232
/*227*/ 0xe3,
233
/*228*/ 0xe4,
234
/*229*/ 0xe5,
235
/*230*/ 0xe6,
236
/*231*/ 0xe7,
237
/*232*/ 0xe8,
238
/*233*/ 0xe9,
239
/*234*/ 0xea,
240
/*235*/ 0xeb,
241
/*236*/ 0xec,
242
/*237*/ 0xed,
243
/*238*/ 0xee,
244
/*239*/ 0xef,
245
/*240*/ 0xf0,
246
/*241*/ 0xf1,
247
/*242*/ 0xf2,
248
/*243*/ 0xf3,
249
/*244*/ 0xf4,
250
/*245*/ 0xf5,
251
/*246*/ 0xf6,
252
/*247*/ 0xf7,
253
/*248*/ 0xf8,
254
/*249*/ 0xf9,
255
/*250*/ 0xfa,
256
/*251*/ 0xfb,
257
/*252*/ 0xfc,
258
/*253*/ 0xfd,
259
/*254*/ 0xfe
260

261
};
262

263
void main(void)
264
{
265
  WDTCTL = WDTPW+WDTHOLD;           // watchdog aus
266
  int_lcd();                        // Intalisierung 
267
  dez_anzeig = 0;                // Dezimal Zahl Ausgabe
268
   unsigned char LCD_1,LCD_2,LCD_3,LCD_4;
269
   unsigned char w=220;  
270
   unsigned int j;
271
   while (1)
272
  {
273
    for(dez_anzeig = 0; dez_anzeig < 256; dez_anzeig++)
274
     { 
275
         LCD_2=dez_anzeig%1000/100;
276
         LCD_3=dez_anzeig%100/10;
277
         LCD_4=dez_anzeig%10;     
278
         for(j=0;j<10;j++)
279
         {
280
            LCD_PORT_OUT = segment[dez_anzeig];
281
            LCD_1_LOW;
282
            wait(w);
283
            LCD_1_HIGH;
284
            LCD_PORT_OUT=digit[LCD_2];
285
            LCD_2_LOW;
286
            wait(w);
287
            LCD_2_HIGH;
288
            LCD_PORT_OUT=digit[LCD_3];
289
            LCD_3_LOW;
290
            wait(w);
291
            LCD_3_HIGH;
292
            LCD_PORT_OUT=digit[LCD_4];
293
            LCD_4_LOW;
294
            wait(w);
295
            LCD_4_HIGH;        
296
            wait(5000);      
297
         }   
298
      }
299
  }
300
}
Gast #2347464
Lesenswert?

hast du das array von hand getippt? ^^

neee,

Ich habe heute die erste .exe gemacht ;o)
fange mit c an sorry

1
int i=0;
2

3
char hex[256];
4

5
for(i = 0; i < 256; i++)
6
{
7
sprintf(hex, "%x", i);
8
printf("/*%d*/ 0x%s,\n", i,hex);
9
}      
10

11

12
system("PAUSE");
#2347592
Lesenswert?

netwurm schrieb:
>
1
> LCD_PORT_OUT = ~0x01;
2
> LCD_1_LOW;
3
>
>
> es leuchtet Segment a darf es das ???

Ist es das einzige Segment, welches leuchtet?
Wenn ja, dann darf es das.

Also


     ++++++
    +      +
    +      +
     ++++++
    +      +
    +      +
     ++++++

welches Segment leuchtet? (Tausch die + gegen eine 0 aus)

(Jetzt gehen wir beide das ganze mal systematisch an. Das hat doch 
keinen Sinn, wenn du da ohne System an die Sache rangehst. Wenn du 
hardwaremässig keinen Kurzschluss hast, dann ist das eine Sache auf 10 
Minuten und du hast deine Zahlen dann korrekt auf der Anzeige. Und nein, 
es ist mir völlig wurscht, welchen Buchstaben das Segment da weiter oben 
hat. Wir brauchen eine zusammenstellung, welches Segment mit welchem Bit 
gesteuert wird. Und am besten diese Zusammenstellung in graphischer 
Form. Denn dann muss man nicht um die Ecke denken, sondern hat alles 
direkt vor Augen)

Wenn du das hast, dann probierst du
  LCD_PORT_OUT = ~0x02;
und tauscht wieder die entsprechenden + für das Segment diesmal gegen 
eine 1 aus.

Danach
 LCD_PORT_OUT = ~0x04;
+ austauschen gegen 2

 LCD_PORT_OUT = ~0x08;       // austauschen gegen 3

 LCD_PORT_OUT = ~0x10;       //                   4

 LCD_PORT_OUT = ~0x20;       //                   5

 LCD_PORT_OUT = ~0x40;       //                   6

 LCD_PORT_OUT = ~0x80;       //                   7


Hast du die alle einzeln durchpobiert, dann musst du eine Zeichnung 
haben, in der für jedes Segment der 8 das Segment gegen die jeweilige 
Bitnummer ersetzt ist.
Und wenn du das hast, dann gehts weiter.
Gast #2348046
Lesenswert?

Hi,

Es ist ein Hardwarefehler der Platine. Ich konnte den Fehler etwas 
eingrenzen. Offenbar ist irgendwas nicht richtig abgeschirmt sobald ich 
über den LCD Treiber mit meiner Hand gehe (ohne Berührung!) fangen die 
defekten Segmente (a) an zu flackern... die anderen sind jedoch stabil!

Ist schon ärgerlich...Aber für mein Verständnis des MSP430 (bin ja noch 
blutiger Anfänger)ist es gut ;o) habe mich mit dem LCD richtig 
auseinandergesetzt. Werde heute noch Deinen Vorschlag (Isolierung der 
einzelnen Segmente) durchtesten.

Danke Dir ;o)

Netwurm
Gast #2348409
Lesenswert?

Hi,

Jetzt gehts!!! Das Bord hatte Pins für die P20 - P37

Habe diese ersetzt durch andere ... da muss man erstmal drauf kommen ;o)
Jetzt ist die Anzeige stabil. Habe noch ein wenig rumprobiert

~0x01 = 1
~0x02 = 2
~0x04 = 4
~0x08 = 8
~0x10 = 16
~0x20 = 32
~0x40 = 64
~0x80 = 128
~0x00 = off

Buchstaben
P[.] wie Programm
P = ~(0x01+0x20+0x02+0x40+0x10) + 0x80
A[.] wie Arlarm
A = ~(0x01+0x20+0x02+0x40+0x10+0x04) + 0x80

    ++~0x01++
    +       +
  ~0x20    ~0x02
    +       +
    ++~0x40++
    +       +
  ~0x10  ~0x04
    +       +
    ++~0x08++  [+] ~0x80 = Punkt


Danke nochmal an Alle

Netwurm

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren