Forum: Mikrocontroller und Digitale Elektronik ADC-Wert auf lcd darstellen mit myavr-board


von Franz B (Gast)


Lesenswert?

Hallo,
ich habe ein myavr-board. jetzt möchte ich die Werte des ADC auslesen 
und auf dem LCD darstellen. Die ADC-werte ändere ich durch eines der 
vorhandenen Poti's.
Ich habe einen Code geschrieben (teils kopiert und abgeändert).
Leider wird bei meinem code nur eine ziffer dargestellt. beim drehen des 
potis ändern sich auch die Werte. das porblem ist das ich aber nur 
seltsame Zeichen darstellen. vom fragezeichen bis zur Zahl.
wie muss ich meinen code umändern?
1
//---------------------------------------------------------------------------
2
// Titel    : myAVR Beispiel "LCD Ausgabe auf einer Zeile" für den ATmega8/48/88/168
3
//---------------------------------------------------------------------------
4
// Funktion      : gibt eine Zeichenkette auf dem myAVR LCD Modul, 1 Zeile
5
// Schaltung    : PORTD.2 = RS, PORTD.3 = E, PORTD.4-7 = D4-7
6
//---------------------------------------------------------------------------
7
// Prozessor   :
8
// Takt       : 3.6864 MHz
9
// Sprache     : C
10
// Datum      : 09.11.2007
11
// Version     : 1.0
12
// Autor       : S. Hänsel
13
// Programmer  : ...
14
// Port       : ...
15
//----------------------------------------------------------------------
16
#define   F_CPU 3686400
17
#include  <avr\io.h>
18
#include  <util\delay.h>
19
#include <inttypes.h>
20
#include <avr\interrupt.h>
21
22
//----------------------------------------------------------------------
23
volatile int ADC_value;
24
25
ISR (ADC_vect)
26
27
{
28
  ADC_value=ADC;
29
}
30
//----------------------------------------------------------------------
31
void delay_us(unsigned int count)
32
{
33
  _delay_loop_2(count);
34
}
35
//----------------------------------------------------------------------
36
void initADC()
37
{
38
  ADMUX=0;
39
  ADCSRA=0xDD;    //0b11011101
40
}
41
//----------------------------------------------------------------------
42
void initPWM()
43
{
44
  DDRB=0x02;      //sbi(DDRB,1);
45
  TCCR1A=0x83;    //0b10000011
46
  TCCR1B=0x02;    //0b00000010
47
}
48
//----------------------------------------------------------------------
49
50
/////////////////////////////////////////////////////////////////////////////
51
// allgemeine-Funktionen
52
//---------------------------------------------------------------------------
53
//  waitMs(..) - Wartet einige Millisekunden
54
//  Die Dauer ist nicht kalibriert.
55
//  PE:  miliSec=Anzahl der zu wartenden Millisekunden
56
//---------------------------------------------------------------------------
57
void waitMs(int miliSec)
58
{
59
  _delay_loop_2( 1*(F_CPU/(1000/4)) * miliSec);  // 4 Zyklen warteschleife
60
}
61
void waitUs(int mikroSec)
62
{
63
  _delay_loop_2( 1*(F_CPU/(1000000/4)) * mikroSec);  // 4 Zyklen warteschleife
64
}
65
//////////////////////////////////////////////////////////////////////////////
66
//  LCD-Funktionen für myAVR-Board + myAVR-LCD
67
//  4-BitModus an PortD Bit 4-7
68
//  PortD Bit 2 = RS, high=Daten, low=Kommando
69
//  PortD Bit 3 = E, high-Impuls für gültige Daten
70
//---------------------------------------------------------------------------
71
//  lcdSend(..) - sendet ein Byte an LCD im 4-Bit-Modus
72
//  RS muss vorher richtig gesetzt sein
73
//  PE:  data=zu sendendes Byte
74
//---------------------------------------------------------------------------
75
void lcdSend(char data)
76
{
77
  // aktuelles RS ermitteln
78
  char rs=PORTD;
79
  rs&=4;
80
  // High-Teil senden
81
  char tmp=data;
82
  tmp&=0xf0;
83
  tmp|=rs;
84
  PORTD=tmp;
85
  // Schreibsignal
86
  sbi(PORTD,3);
87
  cbi(PORTD,3);
88
  // Low-Teil senden
89
  tmp=data;
90
  tmp&=0x0f;
91
  tmp*=16;
92
  tmp|=rs;
93
  PORTD=tmp;
94
  // Schreibsignal
95
  sbi(PORTD,3);
96
  cbi(PORTD,3);
97
  // verarbeiten lassen
98
  waitMs(1);
99
}
100
//---------------------------------------------------------------------------
101
//  lcdCmd(..) - sendet ein Kommando an LCD
102
//  PE:  cmd=Kommando-Byte
103
//---------------------------------------------------------------------------
104
void lcdCmd(char cmd)
105
{
106
  cbi(PORTD,2);    // RS löschen = Kommando
107
  lcdSend(cmd);    // senden
108
}
109
//---------------------------------------------------------------------------
110
//  lcdWrite(..) - sendet ein Zeichen (Daten) an LCD
111
//  PE:  text=Zeichen
112
//---------------------------------------------------------------------------
113
void lcdWrite(char text)
114
{
115
  sbi(PORTD,2);    // RS setzen = Daten
116
  lcdSend(text);    // senden
117
}
118
//---------------------------------------------------------------------------
119
//  lcdWrite(..) - sendet eine Zeichenkette an LCD
120
//  Die Zeichenkette muss mit 0x00 abgeschlossen sein
121
//  PE:  pText=Zeiger auf Zeichenkette
122
//---------------------------------------------------------------------------
123
void lcdWrite(char* pText)
124
{
125
  while(pText[0]!=0)
126
  {
127
    lcdWrite(pText[0]);
128
    pText++;
129
  }
130
}
131
//---------------------------------------------------------------------------
132
//  lcdWrite(..) - sendet eine Zeichenkette an LCD
133
//  PE:  pText=Zeiger auf Zeichenkette
134
//    count=Anzahl der zu sendenden Zeichen
135
//---------------------------------------------------------------------------
136
void lcdWrite(char* pText, int count)
137
{
138
  while(count!=0)
139
  {
140
    lcdWrite(pText[0]);
141
    pText++;
142
    count--;
143
  }
144
}
145
//---------------------------------------------------------------------------
146
//  lcdHome(..) - Cursor auf Position 1,1
147
//---------------------------------------------------------------------------
148
void lcdHome()
149
{
150
  lcdCmd(0x02);
151
  waitMs(2);      // warten
152
}
153
//---------------------------------------------------------------------------
154
//  lcdClear(..) - löscht die Anzeige im LCD
155
//---------------------------------------------------------------------------
156
void lcdClear()
157
{
158
  lcdCmd(0x01);
159
  waitMs(2);      // warten
160
}
161
//---------------------------------------------------------------------------
162
//  lcdOn(..) - schaltet das LCD an
163
//---------------------------------------------------------------------------
164
void lcdOn()
165
{
166
  lcdCmd(0x0E);
167
}
168
//---------------------------------------------------------------------------
169
//  lcdOff(..) - schaltet das LCD aus
170
//---------------------------------------------------------------------------
171
void lcdOff()
172
{
173
  lcdCmd(0x08);
174
}
175
//---------------------------------------------------------------------------
176
//  lcdGoto(..) - setzt die Cursorposition
177
//   PE:  row = Zeile 1..2
178
//    col = Spalte 1..16
179
//---------------------------------------------------------------------------
180
void lcdGoto(int row, int col)
181
{
182
  row--;        // Null-basierend
183
  row&=0x01;      // sicherheitshalber
184
  row*=0x40;      // Zeile nach Bit 6 bringen
185
  col--;        // Null-basierend
186
  col&=0x0f;      // sicherheitshalber
187
  char tmp=row|col;
188
  tmp|=0x80;      // Cursor setzen
189
  lcdCmd(tmp);    // senden
190
}
191
//---------------------------------------------------------------------------
192
//  lcdInit(..) - Schaltet die Ports und Initialisiert das LCD
193
//---------------------------------------------------------------------------
194
void lcdInit()
195
{
196
  // Port D = Ausgang
197
  DDRD=0xff;
198
  PORTD=0;
199
  // warten bist LCD-Controller gebootet
200
  waitMs(50);
201
  // SOFT-RESET
202
  PORTD = 0x30;  //0b00110000;
203
  sbi(PORTD,3);
204
  cbi(PORTD,3);
205
  waitMs(5);
206
  PORTD = 0x30;  //0b00110000;
207
  sbi(PORTD,3);
208
  cbi(PORTD,3);
209
  waitUs(100);
210
  PORTD = 0x30;  //0b00110000;
211
  sbi(PORTD,3);
212
  cbi(PORTD,3);
213
  waitMs(5);
214
215
  // 4-BitModus einschalten
216
  PORTD=0x20;
217
  // Schreibsignal
218
  sbi(PORTD,3);
219
  cbi(PORTD,3);
220
  waitMs(5);
221
222
  // ab hier im 4-Bit-Modus
223
  lcdCmd(0x28);    // Funktions-Set: 2 Zeilen, 5x7 Matrix, 4 Bit
224
  //lcdOff();
225
  lcdCmd(0x06);    // Entry Mode
226
  lcdOn();
227
  lcdClear();
228
}
229
//---------------------------------------------------------------------------
230
// Main-Funktion
231
//---------------------------------------------------------------------------
232
int main (void)
233
{
234
  waitMs(200);
235
  lcdInit();
236
  initADC();      //init ADC
237
  sei();        //enable INT
238
  while (1) {  
239
  sbi(ADCSRA,6);  //start ADC
240
  lcdGoto(2,5);
241
  lcdWrite(ADC_value);} // Mainloop
242
  return 0;
243
}
244
//es kommen nur einstellige Zeichen heraus. von $zu 9

von donald (Gast)


Lesenswert?

der Befehl "lcdWrite(ADC_value);" macht eigentlich genau das, was er 
soll.
Das Problem ist, dass ein 8bit AD Wandler die Zahlen 0-255 an die LCD 
schickt.

Sieht man in eine Ascii Tabelle, dann erkennt man, warum nur "komische" 
Zeichen auf dem Display erscheinen.

Der ADC Wert muß erst in eine Zahl und diese dann in einen String 
gewandelt werden, dann sollte es klappen

von Karl H. (kbuchegg)


Lesenswert?


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.