mikrocontroller.net

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


Autor: Franz B (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
//---------------------------------------------------------------------------
// Titel    : myAVR Beispiel "LCD Ausgabe auf einer Zeile" für den ATmega8/48/88/168
//---------------------------------------------------------------------------
// Funktion      : gibt eine Zeichenkette auf dem myAVR LCD Modul, 1 Zeile
// Schaltung    : PORTD.2 = RS, PORTD.3 = E, PORTD.4-7 = D4-7
//---------------------------------------------------------------------------
// Prozessor   :
// Takt       : 3.6864 MHz
// Sprache     : C
// Datum      : 09.11.2007
// Version     : 1.0
// Autor       : S. Hänsel
// Programmer  : ...
// Port       : ...
//----------------------------------------------------------------------
#define   F_CPU 3686400
#include  <avr\io.h>
#include  <util\delay.h>
#include <inttypes.h>
#include <avr\interrupt.h>

//----------------------------------------------------------------------
volatile int ADC_value;

ISR (ADC_vect)

{
  ADC_value=ADC;
}
//----------------------------------------------------------------------
void delay_us(unsigned int count)
{
  _delay_loop_2(count);
}
//----------------------------------------------------------------------
void initADC()
{
  ADMUX=0;
  ADCSRA=0xDD;    //0b11011101
}
//----------------------------------------------------------------------
void initPWM()
{
  DDRB=0x02;      //sbi(DDRB,1);
  TCCR1A=0x83;    //0b10000011
  TCCR1B=0x02;    //0b00000010
}
//----------------------------------------------------------------------

/////////////////////////////////////////////////////////////////////////////
// allgemeine-Funktionen
//---------------------------------------------------------------------------
//  waitMs(..) - Wartet einige Millisekunden
//  Die Dauer ist nicht kalibriert.
//  PE:  miliSec=Anzahl der zu wartenden Millisekunden
//---------------------------------------------------------------------------
void waitMs(int miliSec)
{
  _delay_loop_2( 1*(F_CPU/(1000/4)) * miliSec);  // 4 Zyklen warteschleife
}
void waitUs(int mikroSec)
{
  _delay_loop_2( 1*(F_CPU/(1000000/4)) * mikroSec);  // 4 Zyklen warteschleife
}
//////////////////////////////////////////////////////////////////////////////
//  LCD-Funktionen für myAVR-Board + myAVR-LCD
//  4-BitModus an PortD Bit 4-7
//  PortD Bit 2 = RS, high=Daten, low=Kommando
//  PortD Bit 3 = E, high-Impuls für gültige Daten
//---------------------------------------------------------------------------
//  lcdSend(..) - sendet ein Byte an LCD im 4-Bit-Modus
//  RS muss vorher richtig gesetzt sein
//  PE:  data=zu sendendes Byte
//---------------------------------------------------------------------------
void lcdSend(char data)
{
  // aktuelles RS ermitteln
  char rs=PORTD;
  rs&=4;
  // High-Teil senden
  char tmp=data;
  tmp&=0xf0;
  tmp|=rs;
  PORTD=tmp;
  // Schreibsignal
  sbi(PORTD,3);
  cbi(PORTD,3);
  // Low-Teil senden
  tmp=data;
  tmp&=0x0f;
  tmp*=16;
  tmp|=rs;
  PORTD=tmp;
  // Schreibsignal
  sbi(PORTD,3);
  cbi(PORTD,3);
  // verarbeiten lassen
  waitMs(1);
}
//---------------------------------------------------------------------------
//  lcdCmd(..) - sendet ein Kommando an LCD
//  PE:  cmd=Kommando-Byte
//---------------------------------------------------------------------------
void lcdCmd(char cmd)
{
  cbi(PORTD,2);    // RS löschen = Kommando
  lcdSend(cmd);    // senden
}
//---------------------------------------------------------------------------
//  lcdWrite(..) - sendet ein Zeichen (Daten) an LCD
//  PE:  text=Zeichen
//---------------------------------------------------------------------------
void lcdWrite(char text)
{
  sbi(PORTD,2);    // RS setzen = Daten
  lcdSend(text);    // senden
}
//---------------------------------------------------------------------------
//  lcdWrite(..) - sendet eine Zeichenkette an LCD
//  Die Zeichenkette muss mit 0x00 abgeschlossen sein
//  PE:  pText=Zeiger auf Zeichenkette
//---------------------------------------------------------------------------
void lcdWrite(char* pText)
{
  while(pText[0]!=0)
  {
    lcdWrite(pText[0]);
    pText++;
  }
}
//---------------------------------------------------------------------------
//  lcdWrite(..) - sendet eine Zeichenkette an LCD
//  PE:  pText=Zeiger auf Zeichenkette
//    count=Anzahl der zu sendenden Zeichen
//---------------------------------------------------------------------------
void lcdWrite(char* pText, int count)
{
  while(count!=0)
  {
    lcdWrite(pText[0]);
    pText++;
    count--;
  }
}
//---------------------------------------------------------------------------
//  lcdHome(..) - Cursor auf Position 1,1
//---------------------------------------------------------------------------
void lcdHome()
{
  lcdCmd(0x02);
  waitMs(2);      // warten
}
//---------------------------------------------------------------------------
//  lcdClear(..) - löscht die Anzeige im LCD
//---------------------------------------------------------------------------
void lcdClear()
{
  lcdCmd(0x01);
  waitMs(2);      // warten
}
//---------------------------------------------------------------------------
//  lcdOn(..) - schaltet das LCD an
//---------------------------------------------------------------------------
void lcdOn()
{
  lcdCmd(0x0E);
}
//---------------------------------------------------------------------------
//  lcdOff(..) - schaltet das LCD aus
//---------------------------------------------------------------------------
void lcdOff()
{
  lcdCmd(0x08);
}
//---------------------------------------------------------------------------
//  lcdGoto(..) - setzt die Cursorposition
//   PE:  row = Zeile 1..2
//    col = Spalte 1..16
//---------------------------------------------------------------------------
void lcdGoto(int row, int col)
{
  row--;        // Null-basierend
  row&=0x01;      // sicherheitshalber
  row*=0x40;      // Zeile nach Bit 6 bringen
  col--;        // Null-basierend
  col&=0x0f;      // sicherheitshalber
  char tmp=row|col;
  tmp|=0x80;      // Cursor setzen
  lcdCmd(tmp);    // senden
}
//---------------------------------------------------------------------------
//  lcdInit(..) - Schaltet die Ports und Initialisiert das LCD
//---------------------------------------------------------------------------
void lcdInit()
{
  // Port D = Ausgang
  DDRD=0xff;
  PORTD=0;
  // warten bist LCD-Controller gebootet
  waitMs(50);
  // SOFT-RESET
  PORTD = 0x30;  //0b00110000;
  sbi(PORTD,3);
  cbi(PORTD,3);
  waitMs(5);
  PORTD = 0x30;  //0b00110000;
  sbi(PORTD,3);
  cbi(PORTD,3);
  waitUs(100);
  PORTD = 0x30;  //0b00110000;
  sbi(PORTD,3);
  cbi(PORTD,3);
  waitMs(5);

  // 4-BitModus einschalten
  PORTD=0x20;
  // Schreibsignal
  sbi(PORTD,3);
  cbi(PORTD,3);
  waitMs(5);

  // ab hier im 4-Bit-Modus
  lcdCmd(0x28);    // Funktions-Set: 2 Zeilen, 5x7 Matrix, 4 Bit
  //lcdOff();
  lcdCmd(0x06);    // Entry Mode
  lcdOn();
  lcdClear();
}
//---------------------------------------------------------------------------
// Main-Funktion
//---------------------------------------------------------------------------
int main (void)
{
  waitMs(200);
  lcdInit();
  initADC();      //init ADC
  sei();        //enable INT
  while (1) {  
  sbi(ADCSRA,6);  //start ADC
  lcdGoto(2,5);
  lcdWrite(ADC_value);} // Mainloop
  return 0;
}
//es kommen nur einstellige Zeichen heraus. von $zu 9


Autor: donald (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.