mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AD-Werte auf LCd ausgeben


Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin es mal wieder.
Ich habe mir ein Display besorgt und das ansteuern klappt auch ganz gut, 
habe das Tutorial benutzt.
jetzt würde ich gerne AD Werte auf dem Display ausgeben.
Ich habe dann mal hier im Forum gesucht und auch folgendes gefunden:
Beitrag "zweiter ADC-Wert auf LCD ausgeben"

Das was Thorsten machen will, will ich eigentlich auch, ich will beide 
Werte auf dem LCd ausgeben.
Jetzt habe ich mir seinen Code besorgt, die letzte VErsion, weis nicht 
ob die richtig funktioniert.
Dann habe ich mir die lcd.h/lcd.c von Peter Fleury gezogen. Weis aber 
nicht so richtig, wie ich diese in AVR Studio einbinde.
Habe die lcd.h schon eingebunden, aber es funktioniert nicht.
Das sind die Fehlermeldungen:
C:\Dokumente und Einstellungen\...\Eigene 
Dateien\AD_WERTE_LCD\default/../AD_WERTE_LCD.c:34: undefined reference 
to `lcd_init'
C:\Dokumente und Einstellungen\...A\Eigene 
Dateien\AD_WERTE_LCD\default/../AD_WERTE_LCD.c:63: undefined reference 
to `lcd_gotoxy'
C:\Dokumente und Einstellungen\...A\Eigene 
Dateien\AD_WERTE_LCD\default/../AD_WERTE_LCD.c:64: undefined reference 
to `lcd_puts'
C:\Dokumente und Einstellungen\...\Eigene 
Dateien\AD_WERTE_LCD\default/../AD_WERTE_LCD.c:81: undefined reference 
to `lcd_gotoxy'
C:\Dokumente und Einstellungen\...\Eigene 
Dateien\AD_WERTE_LCD\default/../AD_WERTE_LCD.c:82: undefined reference 
to `lcd_puts'


kann mir da einer helfen.
In der zip Datei sind diese Files drin:
test_lcd.c
doxygen.css
doxygen.png
lcd.h
lcd.c
makefile

Brauche ich alle Dateien?


DANKE

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

Bewertung
0 lesenswert
nicht lesenswert
Du musst noch das lcd.c zu deinem AVR-Studio Projekt mit hinzufügen

http://www.mikrocontroller.net/articles/FAQ#Ich_ha...

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ok, danke Karl heinz.
Dann habe ich unter Source Files zwei Dateien?
Ich habe ja da noch die Datei, die meine AD Wandlung anstösst.
Oder schriebe ich das in lcd.c?


LG

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:
> Hallo,
>
> ok, danke Karl heinz.
> Dann habe ich unter Source Files zwei Dateien?
> Ich habe ja da noch die Datei, die meine AD Wandlung anstösst.
> Oder schriebe ich das in lcd.c?


Die lcd.c lässt du in Ruhe!

Die muss nur mitcompiliert und mitgelinkt werden.
Die bringt die lcd-Basisroutinen in das Projekt mit ein.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mitcompilieren? Muss ich die Datei dafür extra anklicken, oder reicht es 
wenn ich die andere Datei im Ordner Source Code anklicke und dann F7 
drücke?
Wie mache ich das mit dem rüberschicken auf den mC?
Die ganze Zeit habe ich nur einen hex Datei gehabt, jett habe ich aber 
zwei .c Dateien?

LG

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:
> Hallo,
>
> mitcompilieren? Muss ich die Datei dafür extra anklicken, oder reicht es
> wenn ich die andere Datei im Ordner Source Code anklicke und dann F7
> drücke?
> Wie mache ich das mit dem rüberschicken auf den mC?
> Die ganze Zeit habe ich nur einen hex Datei gehabt, jett habe ich aber
> zwei .c Dateien?

Füge einfach nur das lcd.c zum Projekt hinzu.
Mehr musst du nicht tun! Ist doch nicht so schwer.

Um den Rest kümmert sich AVR-Studio.

(Hast du den Link in die FAQ gelesen. Da ist in kurzen Worten 
beschrieben, was beim compilieren und linken abgeht und warum das lcd.c 
mit in das Projekt muss.
Ein C-Projekt kann durchaus aus mehreren *.c Dateien bestehen. Sie alle 
zusammen ergeben das fertige Programm)

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

nein, das ist nicht so schwer, ja habe ich gelesen.
Das nächste Problem, mein Display zeigt nur in der ersten Zeile schwarze 
Balken an.
/*****************************************************************
*Programm zur Ansteuerung der ADC-PORTS PA0-PA7 ?ber einen Poti. *
*Analogwert soll in einen Digitalwert gewandelt. Die Ausgabe des *
*Wertes erfolgt ?ber ein LCD-Display.          *  
*LCD Lib wird von Peter Fleury verwendet       *  
*****************************************************************/

#include <stdlib.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "lcd.h"


/*****************************************************************
           Definitionen
*****************************************************************/

#define ADC0 0
#define ADC1 1
#define ADC2 2
#define ADC3 3
#define ADC4 4
#define ADC5 5
#define ADC6 6
#define ADC7 7

/*****************************************************************
      Hauptrogramm                   
*****************************************************************/


int main(void)
{
    lcd_init(LCD_DISP_ON);            /*Display einschalten*/
  int result0, result1;                    
  char buffer0[6], buffer1[6];
  
  
  ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS1) | _BV(ADPS2);   /*AD-Wandler initialisieren 
                  mit "|" -> "oder-Operator" um die einzelnen 
                  Bits zu setzen - die _BV() ist irgendwo 
                  als Funktion deffiniert*/            
  
    for (;;) 
    {  
      


      ADMUX=ADC0;          /*AD-Wandler Multiplexregister initialisieren
                    Ausgabe ADC0-Wert*/      

      ADCSRA |= _BV(ADSC);           /*AD-Wandler neu "ansto?em*/            
      
      while (ADCSRA & _BV(ADSC) )       /*warten bis die AD-Wandlung fertig ist*/
      {
      }//end while     
    
      
      
      result0 = ADC;          /*AD-Wandlungsergebnis aus dem ADC-Register
                    abholen*/  
      itoa(result0,buffer0,10);      /*10Bit anpassung des ADC Wertes als Integer Wert*/
      lcd_gotoxy(0,0);        /*Cursor auf Display 1. Zeile*/
      lcd_puts(buffer0);        /*Wert ausgeben*/

      

      

      ADMUX=ADC1;          /*Multiplexer auf ADC1 setzen*/

      ADCSRA |= _BV(ADSC);        /*ADC neu ansto?en*/
      
      while (ADCSRA & _BV(ADSC) )              
      {
      }//end while  

      result1=ADC;          /*AD-Wandlungsergebnis aus ADC-Register 
                    abholen*/  
      itoa(result1,buffer1,10);      /*10Bit Anpassung des ADC Wertes als Integer Wert*/    
      lcd_gotoxy(0,1);        /*Cursor auf Display zweite Temp.*/      
      lcd_puts(buffer1);        /*Wert ausgeben*/


    }//end for(;;)

      
}//end main
wie gesagt, habe den Code hier aus dem Forum.

LG

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:
> Hallo,
>
> nein, das ist nicht so schwer, ja habe ich gelesen.
> Das nächste Problem, mein Display zeigt nur in der ersten Zeile schwarze
> Balken an.

Dann wurde es nicht korrekt initialisiert.
Hast du die Taktfrequenz des Prozessors bzw. die Pinzuordnung wie das 
LCD angeschlossen ist, korrekt in lcd.h eingetragen?

> wie gesagt, habe den Code hier aus dem Forum.

Der ist momentan noch uninteressant.
Nach dem Aufruf von
   lcd_init(LCD_DISP_ON);
muss der schwarze Balken am Display verschwinden und das Display leer 
sein. Daran erkennst du, dass das LCD korrekt initialisiert wurde.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ja da hängt es. Die lcd.c ist nicht für den ATmega32.
Gibt es die irgendwo für den ATmega32?
Habbe jatzt den LCD Port mal von A auf D geändert. Muss ich sonst noch 
auf irgendwas achten?


LG

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:
> Hallo,
>
> ja da hängt es. Die lcd.c ist nicht für den ATmega32.
> Gibt es die irgendwo für den ATmega32?

Das ist quatsch.
Die lcd.c geht für jeden AVR-Prozessor, solange er nur genug Pins hat.

> Habbe jatzt den LCD Port mal von A auf D geändert. Muss ich sonst noch
> auf irgendwas achten?

Stell deine Konfiguration ein.
Quarzfrequenz und an welchen Pins dein LCD wie angeschlossen ist.

Ach ja. Die Fleury Lib erwartet ein vollständig angeschlossenes LCD. 
Also:
4 Datenpins
R/W Leitung
R/S Leitung
E Leitung

Ohne R/W funktioniert sie nicht.

Du musst anpassen

Hier
#define XTAL 4000000              /**< clock frequency in Hz, used to calculate delay timer */

hier
#define LCD_LINES           2     /**< number of visible lines of the display */
#define LCD_DISP_LENGTH    16     /**< visibles characters per line of the display */
#define LCD_LINE_LENGTH  0x40     /**< internal line length of the display    */
#define LCD_START_LINE1  0x00     /**< DDRAM address of first char of line 1 */
#define LCD_START_LINE2  0x40     /**< DDRAM address of first char of line 2 */
#define LCD_START_LINE3  0x14     /**< DDRAM address of first char of line 3 */
#define LCD_START_LINE4  0x54     /**< DDRAM address of first char of line 4 */
#define LCD_WRAP_LINES      0     /**< 0: no wrap, 1: wrap at end of visibile line */

(wobei da das meiste von Haus aus stimmen wird. Wenn dein LCD 4 Zeilen 
hat, dann ändere LCD_LINES. Wenn dein LCD mehr als 16 Zeichen pro Zeile 
anzeigen kann, dann schreib die Zahl bei LCD_DISP_LENGTH hin. Der Rest 
wird ziemlich sicher passen)

und hier
#define LCD_PORT         PORTA        /**< port for the LCD lines   */
#define LCD_DATA0_PORT   LCD_PORT     /**< port for 4bit data bit 0 */
#define LCD_DATA1_PORT   LCD_PORT     /**< port for 4bit data bit 1 */
#define LCD_DATA2_PORT   LCD_PORT     /**< port for 4bit data bit 2 */
#define LCD_DATA3_PORT   LCD_PORT     /**< port for 4bit data bit 3 */
#define LCD_DATA0_PIN    0            /**< pin for 4bit data bit 0  */
#define LCD_DATA1_PIN    1            /**< pin for 4bit data bit 1  */
#define LCD_DATA2_PIN    2            /**< pin for 4bit data bit 2  */
#define LCD_DATA3_PIN    3            /**< pin for 4bit data bit 3  */
#define LCD_RS_PORT      LCD_PORT     /**< port for RS line         */
#define LCD_RS_PIN       4            /**< pin  for RS line         */
#define LCD_RW_PORT      LCD_PORT     /**< port for RW line         */
#define LCD_RW_PIN       5            /**< pin  for RW line         */
#define LCD_E_PORT       LCD_PORT     /**< port for Enable line     */
#define LCD_E_PIN        6            /**< pin  for Enable line     */
hier gibst du deine Verdrahtung bekannt

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das habe ich alles soweit geändert.
E swar nur PORT A falsch, die Belegung war i.O.
Habe es angeschlossen, wie es im Tutorium beschrieben ist.
Aber die 1. Zeile ist noch schwarz und das geht nicht weg.

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:
> Das habe ich alles soweit geändert.
> E swar nur PORT A falsch, die Belegung war i.O.
> Habe es angeschlossen, wie es im Tutorium beschrieben ist.

In welchem?
Hier von der dieser Site?

Da wird R/W doch gar nicht benutzt.
Aber die Fleury Lib braucht R/W.

Hab ich doch alles schon geschrieben! Ein wenig besser aufpassen musst 
du schon!

Also nimm Pin 5 vom LCD wieder weg von GND und hänge es an deinem Mega32 
an. Den Pin an dem du das tust trägst du noch in lcd.h ein (und 
kontrollierst nochmal die anderen beiden R/S und E. Speziell E! E ist im 
Tutorium am AVR-Pin portD-5. In der Standardvorgabe der lcd.h ist es 
aber portA-6. Wenn du also nur portA auf portD änderst und sonst nichts, 
dann hast du die lcd.h falsch konfiguriert.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
#define LCD_PORT         PORTD        /**< port for the LCD lines   */
#define LCD_DATA0_PORT   LCD_PORT     /**< port for 4bit data bit 0 */
#define LCD_DATA1_PORT   LCD_PORT     /**< port for 4bit data bit 1 */
#define LCD_DATA2_PORT   LCD_PORT     /**< port for 4bit data bit 2 */
#define LCD_DATA3_PORT   LCD_PORT     /**< port for 4bit data bit 3 */
#define LCD_DATA0_PIN    0            /**< pin for 4bit data bit 0  */
#define LCD_DATA1_PIN    1            /**< pin for 4bit data bit 1  */
#define LCD_DATA2_PIN    2            /**< pin for 4bit data bit 2  */
#define LCD_DATA3_PIN    3            /**< pin for 4bit data bit 3  */
#define LCD_RS_PORT      LCD_PORT     /**< port for RS line         */
#define LCD_RS_PIN       4            /**< pin  for RS line         */
#define LCD_RW_PORT      LCD_PORT     /**< port for RW line         */
#define LCD_RW_PIN       5            /**< pin  for RW line         */
#define LCD_E_PORT       LCD_PORT     /**< port for Enable line     */
#define LCD_E_PIN        6            /**< pin  for Enable line     */
Habe PORTD geändert.

RS ist an PD4
R/W ist an PD5
EE ist an PD6

Die Datenleitungen sind PD0 bis PD3

Aber ich habe immernoch den schwarzen Balken.

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

Bewertung
0 lesenswert
nicht lesenswert
XTAL hast du angepasst?


(verpasse dem LCD ruhig auch etwas Verschnaufpause nach dem Anlegen der 
Versorgungsspannung

#include <util/delay.h>

int main()
{
  ...

  delay_ms( 200 );

  lcd_init( LCD_DISP_ON );

  ...
}

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,


habe an XTAl nichts angeschlossen.
Die FUSE Bits stehen auf 1MHz, das habe ich angepasst. XTAl = 1000000
Aber das Display bleibt weiter schwarz.

Um noch mal auf den Link zurückzukommen, ich habe die lcd.c Datei nur in 
den Source Ordner von AVR reingezogen. Da habe ich jetzt zwei Dateien 
drin, und die lcd,h habe ich unter Header reingezogen. In dem Link 
steht, wenn man fertige .c Dateien reinzieht, dann macht AVR den Rest.
Ich habe jetzt nirgends lcd.c aufgerufen, oder verlinkt.
Kann es daran liegen?
Hier noch mal der Code
/*****************************************************************
*Programm zur Ansteuerung der ADC-PORTS PA0-PA7 ?ber einen Poti. *
*Analogwert soll in einen Digitalwert gewandelt. Die Ausgabe des *
*Wertes erfolgt ?ber ein LCD-Display.          *  
*LCD Lib wird von Peter Fleury verwendet       *  
*****************************************************************/

#include <stdlib.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "lcd.h"




/*****************************************************************
           Definitionen
*****************************************************************/

#define ADC0 0
#define ADC1 1
#define ADC2 2
#define ADC3 3
#define ADC4 4
#define ADC5 5
#define ADC6 6
#define ADC7 7

/*****************************************************************
      Hauptrogramm                   
*****************************************************************/


int main(void)
{
    

  lcd_init(LCD_DISP_ON);            /*Display einschalten*/
  int result0, result1;                    
  char buffer0[6], buffer1[6];
  
  
  ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS1) | _BV(ADPS2);   /*AD-Wandler initialisieren 
                  mit "|" -> "oder-Operator" um die einzelnen 
                  Bits zu setzen - die _BV() ist irgendwo 
                  als Funktion deffiniert*/            
  
    for (;;) 
    {  
      


      ADMUX=ADC0;          /*AD-Wandler Multiplexregister initialisieren
                    Ausgabe ADC0-Wert*/      

      ADCSRA |= _BV(ADSC);           /*AD-Wandler neu "ansto?em*/            
      
      while (ADCSRA & _BV(ADSC) )       /*warten bis die AD-Wandlung fertig ist*/
      {
      }//end while     
    
      
      
      result0 = ADC;          /*AD-Wandlungsergebnis aus dem ADC-Register
                    abholen*/  
      itoa(result0,buffer0,10);      /*10Bit anpassung des ADC Wertes als Integer Wert*/
      lcd_gotoxy(0,0);        /*Cursor auf Display 1. Zeile*/
      lcd_puts(buffer0);        /*Wert ausgeben*/

      

      

      ADMUX=ADC1;          /*Multiplexer auf ADC1 setzen*/

      ADCSRA |= _BV(ADSC);        /*ADC neu ansto?en*/
      
      while (ADCSRA & _BV(ADSC) )              
      {
      }//end while  

      result1=ADC;          /*AD-Wandlungsergebnis aus ADC-Register 
                    abholen*/  
      itoa(result1,buffer1,10);      /*10Bit Anpassung des ADC Wertes als Integer Wert*/    
      lcd_gotoxy(0,1);        /*Cursor auf Display zweite Temp.*/      
      lcd_puts(buffer1);        /*Wert ausgeben*/


    }//end for(;;)

      
}//end main


Danke

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:
> Hallo,
>
>
> habe an XTAl nichts angeschlossen.

Darum gehst nicht.
Die lcd.c muss ein paar Warteschleifen am Anfang abwarten. Und um die zu 
dimensionieren muss die init Funktion die Taktfrequenz kennen.

> Die FUSE Bits stehen auf 1MHz, das habe ich angepasst. XTAl = 1000000

Gut.

> Aber das Display bleibt weiter schwarz.

Schlecht.

Sagtest du nicht, dass die Tutoriumsfunktionen schon funktioniert 
hätten?

> Um noch mal auf den Link zurückzukommen, ich habe die lcd.c Datei nur in
> den Source Ordner von AVR reingezogen.

Gut.

> Da habe ich jetzt zwei Dateien
> drin, und die lcd,h habe ich unter Header reingezogen. In dem Link
> steht, wenn man fertige .c Dateien reinzieht, dann macht AVR den Rest.
> Ich habe jetzt nirgends lcd.c aufgerufen

Doch, hast du.
Du hast die Funktion lcd_init aufgerufen.
Und die steckt in lcd.c


Was du meinst: Du hast sie nicht compiliert.
Doch hast du
Wenn lcd.c in den Projekt Sourcen im Projekt Baum vom AVR-Studio mit 
drinnen ist, dann sorgt AVR Studio dafür, dass sie compiliert wird.
Achte doch mal auf die Ausgabemeldungen im Output Fenster. Da wirst du 
sehen, dass lcd.c durch den Compiler geschickt wird (zur Not musst du 
dafür sorgen, dass AVR Studio denkt, die lcd.c wäre verändert worden. 
Also lcd.c aufmachen, ein Leerzeichen rein und gleich wieder 
rauslöschen. Effektiv hat sich nichts geändert, aber AVR-Studio weiß das 
nicht und lässt sie neu compilieren)

> oder verlinkt.

AUch dafür sorgt AVR Studio.
Wieder. Wenn du dir beim Build den Output, speziell die Command Line für 
den Linker, genau ansiehst, dann wirst du dort lcd.o entdecken. Und die 
lcd.o wird erzeugt, indem lcd.c compiliert wird.

> Kann es daran liegen?

Nein.
Entweder stimmen deine Zeiten nicht, oder deine Pin-Konfiguration ist 
anders. Wenn das Display mit dem Code hier aus dem Tutorium funktioniert 
hat, funktioniert es auch mit der Fleury Lib (wenn R/W tatsächlich 
verbunden wurde und die restlichen Pins richtig verdrahtet/in die 
Konfiguration eingetragen wurden)

> Hier noch mal der Code

Der ist im Moment zu 95% uninteressant.
Es geht um das LCD und dessen Initialisierung.

Im Grunde könntest du auch diesen Code zum Testen der Initialisierung 
benutzen
#include <stdlib.h>
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"

int main(void)
{
  _delay_ms( 200 );

  lcd_init( LCD_DISP_ON );
  lcd_puts( "Hallo" );

  while( 1 )
    ;
}

Zum jetzigen Zeitpunkt ist alles was nach dem lcd_init kommt unwichtig. 
Es interessiert kein ADC, es interessiert keine Auswertung.
Jetzt ist nur wichtig, dass lcd_init aufgerufen wird, druchläuft und 
danach das LCD initialisiert ist (sprich die Balken verschwunden sind). 
Im Grunde ist auch der lcd_puts nicht wirklich wichtig. Aber es ist 
natürlich netter, wenn nach erfolgter Initialisierung etwas am LCD 
steht.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

so es funktioniert immer noch nicht.
Hier mal ein Teil von der lcd.h
#define LCD_PORT         PORTD        /**< port for the LCD lines   */
#define LCD_DATA0_PORT   LCD_PORT     /**< port for 4bit data bit 0 */
#define LCD_DATA1_PORT   LCD_PORT     /**< port for 4bit data bit 1 */
#define LCD_DATA2_PORT   LCD_PORT     /**< port for 4bit data bit 2 */
#define LCD_DATA3_PORT   LCD_PORT     /**< port for 4bit data bit 3 */
#define LCD_DATA0_PIN    11            /**< pin for 4bit data bit 0  */
#define LCD_DATA1_PIN    12            /**< pin for 4bit data bit 1  */
#define LCD_DATA2_PIN    13            /**< pin for 4bit data bit 2  */
#define LCD_DATA3_PIN    14            /**< pin for 4bit data bit 3  */
#define LCD_RS_PORT      LCD_PORT     /**< port for RS line         */
#define LCD_RS_PIN       4            /**< pin  for RS line         */
#define LCD_RW_PORT      LCD_PORT     /**< port for RW line         */
#define LCD_RW_PIN       5            /**< pin  for RW line         */
#define LCD_E_PORT       LCD_PORT     /**< port for Enable line     */
#define LCD_E_PIN        6            /**< pin  for Enable line     */
Ich verwende wie im Tutorial
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...
Die pins 11 - 14, das habe ich mal so geändert, aber es funktioniert 
nicht.
Kann noch mal einer drüberschauen?


LG und Danke

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,


habe jetzt schon alles versucht, aber die Balken gehen einfach nicht 
weg.
Ich habe mal gemessen, am RS und am R/W Pin habe ich 5V anliegen.
Habe zuerst die Leitungen DB4-DB7 also PIN 11-14 vom LCD genommen.
Habe das aber auch wieder geändert, auf DB0-DB3 PIN 7-10 am LCD.
Aber leider ohne Erfolg.Vss und Vee habe ich auf GND, Vdd auf 5V.
Den Rest habe ich so angeschlossen wie im Quelltext.

LG

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>#define LCD_DATA0_PIN    11            /**< pin for 4bit data bit 0  */
>#define LCD_DATA1_PIN    12            /**< pin for 4bit data bit 1  */
>#define LCD_DATA2_PIN    13            /**< pin for 4bit data bit 2  */
>#define LCD_DATA3_PIN    14            /**< pin for 4bit data bit 3  */

Das kann unmöglich stimmen.
Es ist nicht die Pin-Nummer des Gehäuses gemeint (Wie kommt man auf so 
eine Idee ?), sondern das Bit des Ports.

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..und die PIN-Nummern des LCD's sind dem Code auch schnurz.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

also ich verwende wie im Tutorial DB4-DB7, das sind dei Anschlüsse 11-14 
vom LCD.
Ich schließe Sie so an:
DB4 an PD0
DB5 an PD1
DB6 an PD2
DB7 an PD3

an PD4 hängt RS
an PD5 R/W
und PD6 ist an E angeschlossen

Aber was trge ich jetzt unten ein?

[c]
#define LCD_PORT         PORTD        /**< port for the LCD lines   */
#define LCD_DATA0_PORT   LCD_PORT     /**< port for 4bit data bit 0 */
#define LCD_DATA1_PORT   LCD_PORT     /**< port for 4bit data bit 1 */
#define LCD_DATA2_PORT   LCD_PORT     /**< port for 4bit data bit 2 */
#define LCD_DATA3_PORT   LCD_PORT     /**< port for 4bit data bit 3 */
#define LCD_DATA0_PIN    ?            /**< pin for 4bit data bit 0  */
#define LCD_DATA1_PIN    ?            /**< pin for 4bit data bit 1  */
#define LCD_DATA2_PIN    ?            /**< pin for 4bit data bit 2  */
#define LCD_DATA3_PIN    ?            /**< pin for 4bit data bit 3  */
#define LCD_RS_PORT      LCD_PORT     /**< port for RS line         */
#define LCD_RS_PIN       4            /**< pin  for RS line         */
#define LCD_RW_PORT      LCD_PORT     /**< port for RW line         */
#define LCD_RW_PIN       5            /**< pin  for RW line         */
#define LCD_E_PORT       LCD_PORT     /**< port for Enable line     */
#define LCD_E_PIN        6            /**< pin  for Enable line     */

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

Bewertung
0 lesenswert
nicht lesenswert
> DB4 an PD0
> DB5 an PD1
> DB6 an PD2
> DB7 an PD3


--->

#define LCD_DATA0_PIN    0            /**< pin for 4bit data bit 0  */
#define LCD_DATA1_PIN    1            /**< pin for 4bit data bit 1  */
#define LCD_DATA2_PIN    2            /**< pin for 4bit data bit 2  */
#define LCD_DATA3_PIN    3            /**< pin for 4bit data bit 3  */


Im C Programm wird alles aus Sicht der Prozessors gesehen.
Der gibt an PD0 aus, wenn er den LCD Datenpin DB4 manipulieren will. Wie 
das dann durch den Draht geht um letztendlich am LCD Pin 11 zu landen, 
interessiert den Prozessor nicht.


Hast du den vorgeschlagenen delay schon probiert?

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define LCD_DATA0_PIN    0            /**< pin for 4bit data bit 0  */
#define LCD_DATA1_PIN    1            /**< pin for 4bit data bit 1  */
#define LCD_DATA2_PIN    2            /**< pin for 4bit data bit 2  */
#define LCD_DATA3_PIN    3            /**< pin for 4bit data bit 3  */

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für die Antworten, ich habe jetzt mal alles abgeklemmt und nur das 
Display angeschlossen, aber ich bekomme nur den schwarzen Balken in der 
ersten Zeile.
Aber die Zeile heißt doch

#define LCD_DATA0_PIN    0            /**< pin for 4bit data bit 0  */

ich verwende aber doch nicht DB0, sondern DB4, muss ich es da nicht 
ändern.
Sorry, aber ich blicke da nicht durch.
Sorry zu spät gelesen.
Habe noch was, und zwar:
#define LCD_LINES           2     /**< number of visible lines of the display */
#define LCD_DISP_LENGTH    20     /**< visibles characters per line of the display */
#define LCD_LINE_LENGTH  0x40     /**< internal line length of the display    */
#define LCD_START_LINE1  0x00     /**< DDRAM address of first char of line 1 */
#define LCD_START_LINE2  0x40     /**< DDRAM address of first char of line 2 */
#define LCD_START_LINE3  0x14     /**< DDRAM address of first char of line 3 */
#define LCD_START_LINE4  0x54     /**< DDRAM address of first char of line 4 */
#define LCD_WRAP_LINES      0     /**< 0: no wrap, 1: wrap at end of visibile line */
Ich habe aber 2 Zeilen, das habe ich ja auch eingetragen, aber es sind 
ja 4 Zeilen definiert.
Kann ich die einfach löschen, oder macht das nichts?

Ich verwende nur deinne Programmcode, kein AD und nix.
Habe jetzt auch nur das LCD und die Stromversorgung am mC angeschlossen, 
mehr nicht. Habe auch mal ein Poti angeschlossen, um den Kontrast zu 
verstellen, aber das war es auch nicht.
Ich bekomme aber noch eine Warnung:
c:/winavr-20090313/lib/gcc/../../avr/include/util/delay.h:85:3: warning: 
#warning "F_CPU not defined for <util/delay.h>"



LG

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ich verwende aber doch nicht DB0, sondern DB4, muss ich es da nicht
ändern.

Nein, der Prozessor kennt deine Verdrahtung sowieso nicht - es ist hier 
der Port des uc gemeint.

>Ich habe aber 2 Zeilen, das habe ich ja auch eingetragen, aber es sind
>ja 4 Zeilen definiert.
>Kann ich die einfach löschen, oder macht das nichts?

Das kannst du so lassen wie es ist (Wenn die Spaltenanzahl passt)

Dein Display ist also ein 2x20 ?
Schreib doch mal bitte die genaue Bezeichnung, oder noch besser ein Link 
zum Datenblatt.

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>#warning "F_CPU not defined for <util/delay.h>"

Was benutzt du für ein Makefile  ?

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mein Display ist von Pollin.
Es ist ein Datavision DV-20208.
Datenblatt:
http://www.pollin.de/shop/dt/MDg0OTc4OTk-/Baueleme...
unter Download

Ich habe es schonmal getestet, aber ohne die Library von Peter Fleury, 
da hat es funktioniert.
Habe da alles so gemacht wie im Tutorium.
Es war ein makefile in der rar Datei von der Library dabei, aber wo 
binde ich das ein, habe noch nie sowas eingebunden.

LG

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:
> Hallo,
>
> mein Display ist von Pollin.
> Es ist ein Datavision DV-20208.
> Datenblatt:
> 
http://www.pollin.de/shop/dt/MDg0OTc4OTk-/Baueleme...
> unter Download
>
> Ich habe es schonmal getestet, aber ohne die Library von Peter Fleury,
> da hat es funktioniert.
> Habe da alles so gemacht wie im Tutorium.
> Es war ein makefile in der rar Datei von der Library dabei, aber wo
> binde ich das ein, habe noch nie sowas eingebunden.

Wenn du AVR-Studio benutzt, brauchst du das makefile auch nicht. 
AVR-Studio macht sich selber eines.

Einfach die lcd.c und die lcd.h zu deinem Projekt hinzufügen. In der 
lcd.h die beschriebenen Dinge anpassen und gut ists.

> Ich bekomme aber noch eine Warnung:
> c:/winavr-20090313/lib/gcc/../../avr/include/util/
> delay.h:85:3: warning: #warning "F_CPU not defined for <util/delay.h>"

Hast du jetzt endlich im AVR-Studio in den Project Configurations die 
Taktfrequenz eingetragen?

Mach doch mal ein Photo von deinem Aufbau.
Aber bitte eines, auf dem man auch was erkennen kann und Kabelverläufe 
nachvollziehen kann.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe den Code von Karl heinz genommen und eine .c Datei daraus gemacht.
Dann die lcd.c von Peter Fleury eingefügt unter Source Files, danach die 
lcd.h unter Header Files eingefügt.
Die Änderungen die ich gepostet habe vorgenommen, aber es funktioniert 
einfach nicht.
Ich habe mir hier aus dem Forum den Programmcode für das auslesen der 
AD-Eingänge genommen. Da werde dann die Werte direkt auf dem LCd 
ausgegeben. Der Autor verwendet aber die Library von peter, deshalb habe 
ich diese auch genommen.

LG

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:

> Die Änderungen die ich gepostet habe vorgenommen, aber es funktioniert
> einfach nicht.

Mach mal ein Photo vom Aufbau
Mitlerweile bin ich soweit, dass ich die Verkabelung gerne überprüfen 
würde.

Die Fleury Lib hat bei mir eigentlich noch immer auf Anhieb 
funktioniert. Wenn sie es nicht tat, dann war das immer ein 
Verdrahtungsfehler.

Autor: Hans Peter (gableguy2000)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist das Foto.
Gehe am LCd von PIN 11 (DB4) an den PD0 Pin des mC
so mache ich das mit den anderen drei auch.

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

Bewertung
0 lesenswert
nicht lesenswert
Und wo sehe ich da das LCD.

Ich will die Verdrahtung sehen!
Welcher Pin vom LCD ist mit welchem Pin vom Mega verbunden

Autor: Hans Peter (gableguy2000)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das habe ich doch schon geschrieben.
Pin 1 vom LCd mit GND
Pin 2 vom lcd mit +5V
Pin3 mit GND (Vee)
Pin 4 (RS) mit PD4 vom mC
Pin 5 (R/W) mit PD5 vom mC
Pin 6 (E) mit PD6 des mC

dann die Datenleitungen:
Pin 11 vom LCd mit PD0
Pin 12 mit PD1
Pin 13 mit PD2
Pin 14 mit PD3

habe PD0-PD7 komplett belegt.

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:
> Hallo,
>
> das habe ich doch schon geschrieben.

Weiß ich.
Ich würde es trotzdem gerne sehen.

Ich war mir auch 2 Stunden lang sicher, dass ich ein LCD völlig korrekt 
angeschlossen habe und meine Freundin hat dann jedes Kabel einzeln 
duchgesehen und in 10 Sekunden den Fehler gefunden :-)


> habe PD0-PD7 komplett belegt.

PD0 bis PD6

Du machst soviele Tippfehler und widersprüchliche Aussagen, dass ich 
nichts mehr einfach so glaube ehe es nicht 3 mal kontrolliert wurde.

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

Bewertung
0 lesenswert
nicht lesenswert
Noch was.

Kannst du mal an einem Port (B - Pin 0) eine Led anschliessen?

 Portpin - 100 Ohm (in der Größenordnung) - Led - Masse

Ich würde gerne was kontrollieren.

#define F_CPU 1000000

#include <stdlib.h>
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"

int main(void)
{
  DDRB = 0xFF;

  _delay_ms( 200 );

  lcd_init( LCD_DISP_ON );
  lcd_puts( "Hallo" );

  while( 1 ) {
    PORTB = 0xFF;
    _delay_ms( 500 );
    PORTB = 0x00;
    _delay_ms( 500 );
  }
}

Die Led muss blinken.

Autor: Hans Peter (gableguy2000)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, du hast recht.
Hier mal das Bild vom Display.
links ist Pin 1 und ganz rechts Nummer 20.
Die Kabel links von dem roten, sind Pin 1 - Pin6.
Ich habe die ersten 6 verwendet, wie geschrieben, und dann die Kabel ab 
Pin 11 bis Pin 14.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Halllo,

es blinkt nix.
Habe den Code reinkopiert, und die LED mit Widerstand an PB0 
angeschlossen.

Ist der mC defekt?

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Evtl will der avr nur einen Quarz...

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..und bevor Karl Heinz an dir verzweifelt, stell doch bitte noch ein 
Bild rein wo Display und uc ZUSAMMEN , also zusammen auf einem Bild zu 
sehen sind.
Samt allen Kabeln natürlich.

Autor: Hans Peter (gableguy2000)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich verzweifel auch gleich.
Hier ist das Foto, aber es ist nicht so gut, habe ein ziemlich langes 
Kabel genommen (Flachband) und das ist ein großes Durcheinander. Hoffe 
ihr könnt doch was erkennen.
Ich habe einen 16 MHz Quarz hier.

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann schliess mal den Querz an. Und stell dein Projekt auf 16Mhz um.
Und zusätzlich machst du einen Kondensator (ca. 100nf) zwischen plus und 
minus.

Ist die Leuchtdiode richtig herum angeschlossen ?

Auf dem Foto erkennt man leider immer noch  nicht, ob die Kabel richtig 
ansgeschlossen sind.

Warum sind am LCD eigentlich alle Adern angelötet ?

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:
> Halllo,
>
> es blinkt nix.
> Habe den Code reinkopiert, und die LED mit Widerstand an PB0
> angeschlossen.
>
> Ist der mC defekt?

Nein.
Die Fleury Lib wartet die ganze Zeit auf Rückmeldung vom LCD

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

Bewertung
0 lesenswert
nicht lesenswert
doc schrieb:

> Auf dem Foto erkennt man leider immer noch  nicht, ob die Kabel richtig
> ansgeschlossen sind.

Schluchz, huh, huh, huh, schluchz

Es kann doch nicht so schwer sein, ein Photo zu produzieren, auf dem man 
am LCD Pin anfängt, mit dem Finger dem Kabel nachfährt und nachsieht wo 
man am µC landet.

Schluchz, huh, huh, huh, wein, heul

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ja die LED ist richtig drin, ist das schlimm mit den ganzen kabeln am 
LCD?
Was ist mit den 22pF Kondensatoren, brauche ich die auch?
Ist es egal wie herum der Quarz angeschlossen wird?
Kondensator zwischen Plus und Minus, also püarallel zum Quarz, oder wie?

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

Bewertung
0 lesenswert
nicht lesenswert
> Ist die Leuchtdiode richtig herum angeschlossen ?

Wäre eine Möglichkeit.
Gegentest. alles so lassen wie es ist (auch die Diode nicht umdrehen), 
aber anstelle von GND geht man nach Vcc

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:
> Hallo,
> ja die LED ist richtig drin, ist das schlimm mit den ganzen kabeln am
> LCD?
> Was ist mit den 22pF Kondensatoren, brauche ich die auch?
> Ist es egal wie herum der Quarz angeschlossen wird?
> Kondensator zwischen Plus und Minus, also püarallel zum Quarz, oder wie?

Machs jetzt nicht noch komplizierter.
Dein µC arbeitet genau genug mit 1Mhz.
Zur Not schreib überall 8Mhz rein.
Also in den Projekt-Configurations Options und beim XTAL in lcd.h

Dann lügen wir die Software zwar an, aber wir lügen auf der guten Seite. 
Alle Zeiten sind dann viel zu lang, aber das ist bei einem LCD 
unkritisch. Das Gegenteil ist kritischer. Zu langsam ist kein Problem, 
zu schnell aber schon.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Kabel ist super lang, es ist fast unmöglich, ein Bild hinzubekommen, 
auf dem man das Display und das Kabel in seiner vollen Länge sieht, um 
mit dem Finger nachzufahren.
Nach der LED nicht auf GND sondern auf VCC?
Quraz jetzt rein oder nicht?

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:

> Nach der LED nicht auf GND sondern auf VCC?

Nur um sicherzugehen, dass du die Led nicht verpolt hast.
Aber ehe du was umsteckst:
#define F_CPU 1000000

#include <stdlib.h>
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"

int main(void)
{
  DDRB = 0xFF;

  _delay_ms( 200 );

//  lcd_init( LCD_DISP_ON );
//  lcd_puts( "Hallo" );

  while( 1 ) {
    PORTB = 0xFF;
    _delay_ms( 500 );
    PORTB = 0x00;
    _delay_ms( 500 );
  }
}

(LCD Behandlung auskommentiert).
Jetzt muss sie blinken.
(Damit wissen wir dann, dass die LED richtig rum drinnen ist)

Ich bin auch dämlich.
Du hast ja ein STeckbrett. Wenn sie nicht blinkt, dreh die LED einfach 
um. In einer Stellung muss sie blinken, und so belässt du es dann.

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, Hauptsache, er hat nichts an den Fuses gedreht.
Darum der Quarz.

Ok, ich klink mich aus. Viele Köche verderben den Brei.

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

Bewertung
0 lesenswert
nicht lesenswert
doc schrieb:

> Ok, ich klink mich aus. Viele Köche verderben den Brei.

Wobei ich schön langsam mit meinem Latein am Ende bin.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, blinkt.

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das es jetzt blinkt ist ja schonmal gut.

Sorry, noch ne kleine Zwischenfrage:

Was hast du denn mit den anderen Adern des Flachbandkabels die zum LCD 
gehen gemacht ?

Wenn die in der Luft hängen -> schlecht.
Mach die doch mal sicherheitshalber an Masse. Wäre ein potentielle 
Fehlerquelle weniger.

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

Bewertung
0 lesenswert
nicht lesenswert
Gut.

Damit ist sichergestellt, dass der Testnachweis auf jeden Fall 
funktioniert.


Wenn du die LCD Funktionen wieder einkommentierst, dann wartet die 
Fleury Lib auf Rückmeldung vom LCD. Wenns hängt, dann ist das ein Indiz 
dafür, dass

* die allererste Initialisirung nicht geklappt hat
* die Initialisierung zwar soweit durch ist, aber die Verbindung
  R/W nicht korrekt hergestellt wurde.

Ich kann dir nicht helfen.
Du musst dir 100% absolut sicher sein, dass die 3 Kabeln

Pin 4 (RS) mit PD4 vom mC
Pin 5 (R/W) mit PD5 vom mC
Pin 6 (E) mit PD6 des mC

tatsächlich so verbunden sind, dass es nirgens einen Wackelkontakt gibt 
(am besten mit einem Ohmmeter direkt vom LCD Pin zum µC-Pin messen, da 
muss überall 0Ohm rauskommen)

Ich hätte mich von dieser Verkabelung gerne selbst überzeugt. Bei so 
vielen Kabeln kann man schon mal durcheinander kommen.
Aber wenns auf einem Photo nicht geht, gehts eben nicht.

Autor: Hans Peter (gableguy2000)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Habe mir jetzt nochmal die lcd_routine vom tutorial angeschaut und die 
Schaltung so aufgebaut, und da klappt alles wunderbar.
Ich bekomme das auf dem Display ausgegeben was ich will.
Bei deiser Routine muss aber R/W gegen GND.

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

Bewertung
0 lesenswert
nicht lesenswert
Genau darum verblüfft es mich, dass die Fleury Lib nicht gehen soll

Na ja, benutzt du halt die Tutoriumsfunktionen. Ist so schlimm auch 
wieder nicht.
Aber interessieren würde es mich doch, was da los ist.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mich auch, da der Programmcode den ich hier aus dem Forum haeb die AD 
Werte einließt und direkt auf dem Display mit der Fleury Lib ausgibt, 
deshalb bin ich ja den Weg gegangen, um mir unötig arbeit zu ersparen. 
Aber das kann ch ja jetzt vergessen.

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:
> Mich auch, da der Programmcode den ich hier aus dem Forum haeb die AD
> Werte einließt und direkt auf dem Display mit der Fleury Lib ausgibt,

Ach komm.
Das ist das wenigste Problem.

Die eine Lib kann Strings ausgeben, die andere Lib kann Strings 
ausgeben. Lediglich die Funktionen heißen anders und die Fleury Lib 
kümmert sich auf Wunsch noch um einen Zeilenumbruch. Letztes Feature ist 
zwar nett, aber so wichtig dann auch wieder nicht.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe es aber schonmal versucht und da hat es natürlich (wie sollte 
es auch anders sein) nicht geklappt.
Ich hatte schonmal den ADC programmiert, so das er direkt Ausgänge 
schaltet.
Das Prog kann ich ja einfach wieder hernehmen und die da abgespeicherten 
Werte auf dem Display ausgeben lassen.
Aber ich muss die doch noch umwandeln, oder? Und itoa hat bei mir nicht 
funktioniert.


LG

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:

> Aber ich muss die doch noch umwandeln, oder? Und itoa hat bei mir nicht
> funktioniert.

Dann hast du einen Fehler gemacht.
itoa funktioniert schon

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach einfach nur Copy&Paste aus dem LCD-Tutorial.
       char Buffer[20]; 
       itoa( variable, Buffer, 10 ); 

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für die Antwort, aber so richtig bekomme ich es nicht hin. Ich 
habe mit dem Tutorial schon AD Werte eingelesen, und auch Daten wie z.B. 
"Hallo Welt!" auf dem LCd ausgegeben. Jetzt will ich es ja miteinander 
verbinden und das klappt nicht.
Ich habe die lcd-routines.h und die lcd-routines.c schon an die 
richtigen Stellen eingefügt.
Jetzt habe ich noch eine andere Source Datei, in der ich die AD Werte 
einlese. In der main, von der Datei rufe will ich alles aufrufen, das 
wandeln und die Display Ausgabe.
Aber ich bekomme schon einen Fehler:
../LDR_vergleichen.c:4:26: error: lcd-routines.h: No such file or 
directory
Habe die Datei so included:
#include "lcd-routines.h" in meiner anderen .c Datei
Hier mal der Ausschnitt der main
int main(void)
{
  int16_t adcval0;
  
  UCSRB |= (1<<TXEN);                            // UART TX einschalten
  UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1 ;
  DDRB = (1 << DDB0) | (1 << DDB1); 
  
  while(1)
  {
  adcval0 = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
  //adcval1 = ReadChannel(1); /* MUX-Bits auf 0b0010 -> Channel 1 */
  
  lcd_init();
  char Buffer[20]; 
       itoa( adcval0, Buffer, 10 ); 

  
    set_cursor(0,1);
 
    lcd_string(Buffer);
 
    while(1)
    {
    }
 
    return 0;
}
}
Wie gesagt, habe mir aus den zwei Programmen, die auch gelaufen sind, 
die Teile die ich brauche rauskopiert.

LG

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:

> Aber ich bekomme schon einen Fehler:
> ../LDR_vergleichen.c:4:26: error: lcd-routines.h: No such file or
> directory

Na ja.
Was heißt denn das auf Deutsch?

"Es gibt keine derartige Datei / Verzeichnis"

Den Fall Verzeichnis können wir wohl ausschliessen. Also lautet die 
Fehlermeldung in normalem Deutsch:
Hey Programmierer! Die Datei die du angegeben hast, existiert nicht bzw. 
ich finde sie nicht auf den Verzeichnissen auf denen ich suche. Sieh 
bitte nach, ob du nicht einen Tippfehler im Dateinamen gemacht hast oder 
ob du mir nicht auch noch eine Pfadangabe machen musst, damit ich sie 
finden kann.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
O.K., die Datei war nicht im gleichen Verzeichnis.
Ist der Code sonst so O.K., oder mache ich was grundlegendes falsch?

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

Bewertung
0 lesenswert
nicht lesenswert
Rück das ganze mal vernünftig und richtig ein
int main(void)
{
  int16_t adcval0;
  
  UCSRB |= (1<<TXEN);                            // UART TX einschalten
  UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1 ;
  DDRB = (1 << DDB0) | (1 << DDB1); 
  
  while(1)
  {
    adcval0 = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
    //adcval1 = ReadChannel(1); /* MUX-Bits auf 0b0010 -> Channel 1 */
  
    lcd_init();
    char Buffer[20]; 
    itoa( adcval0, Buffer, 10 ); 

    set_cursor(0,1);
 
    lcd_string(Buffer);
 
    while(1)
    {
    }
 
    return 0;
  }
}

und jetzt gehst du mit dem Finger dein Programm durch, von oben nach 
unten und siehst dir an was passiert. Und denk daran, dass dein µC 
sauschnell ist.

Besonders interessant ist in diesem Zusammenhang, was eigentlich 
passieren soll, nachdem die Messung das erste mal auf das Display 
ausgegeben wurde. Oder willst du deinen µC laufend neu starten, nur 
damit der 1 Messung macht?

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

er liest doch in einer Endlosschleife den ADC0 Kanal ein.
Initialisiert das lcd, wandelt mit itoa die variable um und gibt diese 
aus.
Würde mir später gerne von zwei ADC Eingängen, die Werte (Digitalen 
Werte) auf dem Display anzeigen lassen. Aber ich wollte es zuerst mal 
mit einem versuchen.
Ich glaube das geht alles so schnell, das ich es nicht mitbekomme, oder?
Muss ich da noch ein delay reinbringen?
Bekomme nämlich 5 Warnungen beim compilieren. Eine davon ist:
c:/winavr-20090313/lib/gcc/../../avr/include/util/delay.h:85:3: warning: 
#warning "F_CPU not defined for <util/delay.h>"

LG

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:
> Hallo,
>
> er liest doch in einer Endlosschleife den ADC0 Kanal ein.

Geh mit dem Finger durch und spiele µC!

Du lässt dich im Moment davon leiten, das das was du denkst das 
passieren soll auch passiert.
Aber ein µC hat keinen DWIM (Do what I mean) Modus. Der µC hält sich an 
das was dort steht! Und bei dir steht nicht das dort, was du denkst.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int main(void)
{
  int16_t adcval0;
  
  UCSRB |= (1<<TXEN);                            // UART TX einschalten
  UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1 ;
  DDRB = (1 << DDB0) | (1 << DDB1); 
  
  while(1)
  {
    adcval0 = ReadChannel(0); //speichert Wert von ADC0 in adcval0
    
  
    lcd_init(); //initialisiert lcd
    char Buffer[20]; //legt Variable an 
    itoa( adcval0, Buffer, 10 ); //wandelt um

    set_cursor(0,1); //setzt den Cursor
 
    lcd_string(Buffer); //gibt den Wert aus
 
    while(1) //Endlosscheleife
    {
    }
 
    return 0;
  }
}
habe mal dahinter geschrieben, was ich denke was der Code macht. Aber 
die Endlosschelife über return 0, da geht er ja eigentlich nicht mehr 
raus.
Da bleibt er hängen und gibt nix aus, kann das sein?

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

Bewertung
0 lesenswert
nicht lesenswert
> c:/winavr-20090313/lib/gcc/../../avr/include/util/delay.h:85:3: warning:
> #warning "F_CPU not defined for <util/delay.h>"

Geh im AVR Studio in die Projekt Einstellungen
und trage dort die Taktfrequenz ein

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:

> habe mal dahinter geschrieben, was ich denke was der Code macht. Aber
> die Endlosschelife über return 0, da geht er ja eigentlich nicht mehr
> raus.

Bingo!

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha,

O.K. das ist schlecht.
int16_t adcval0;
  
  UCSRB |= (1<<TXEN);                            // UART TX einschalten
  UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1 ;
  DDRB = (1 << DDB0) | (1 << DDB1); 
  //int result0, result1;                    
  char buffer0[6], buffer1[6];

  for (;;) 
    {  
      
      lcd_init();
      ADCSRA |= _BV(ADSC);         /*ADC-Wandler neu "ansto?em*/            
      
      while (ADCSRA & _BV(ADSC) )     /*warten bis die AD-Wandlung fertig ist*/
      {
      }//end while     
    
      ADMUX=ADC0;        /*AD-Wandler Multiplexregister initialisieren
                                  Ausgabe ADC0-Wert*/      
      
      adcval0 = ADC;        /*AD-Wandlungsergebnis aus dem ADC-Register
                                  abholen*/  
      itoa(adcval0,buffer0,10);    /*10Bit anpassung des ADC Wertes als Integer Wert*/
      set_cursor(0,1);
      lcd_string (buffer0);
      set_cursor(0,2);
      lcd_string("Hallo!");
    
 
    }//end for(;;)

}
Wie ist diese Lösung, ist die eleganter, oder soll ich leiber bei miener 
bleiben?

Autor: Michael W. (retikulum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lcd_init raus aus der Endlosschleife. Die brauchst du nur einmal.

Michael

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
O.K., habe es selbst gemerkt, das Display hat nur geflackert.
Aber trotzdem bekomme ich nur die schwarzen Balken angezeigt.
Finde es aber seltsam, da ich heute morgen noch mit der lcd-routines.c 
und der lcd-routines.h noch Wörter ausgeben gelassen habe.

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

Bewertung
0 lesenswert
nicht lesenswert
Entscheide dich für ein Programm und bleib dabei!

Es bringt nichts, jetzt noch von einem Programm zum anderen zu wechseln.
Wenn dein Programm nicht das tut was du willst, dann musst du das 
Programm ändern aber nicht laufend neue Programme im Web suchen.

So ist das nun mal.
Wenn man fremde Programme kopiert, dann übernimmt man in erser Linie 
deren Idee und passt die auf seine Bedürfnisse an. Die 
Wahrscheinlichkeit, dass du ein Programm findest, welches genau das tut 
was du willst, ist nahe 0.

Wenn die innere Endlosschleife in deinem Zusammenhang nicht das ist was 
du willst, dann schmeiss sie raus. Das nennt man programmieren! Genau 
dazu hast du einen Textedior mit dem man Programmtext ändern kann.

> Aber trotzdem bekomme ich nur die schwarzen Balken angezeigt.
> Finde es aber seltsam, da ich heute morgen noch mit der lcd-routines.c
> und der lcd-routines.h noch Wörter ausgeben gelassen habe.

Dem musst du auf den Grund gehen!
Fang nochmal mit dem Programm an, mit dem du Wörter ausgeben lassen 
konntest. Und dann erweiterst du dieses Programm mit den ADC Routinen. 
Erweitern! Und nicht schon wieder Programm wechseln.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

O.K. hast recht.
Hier jetzt noch mal von Anfang
int main(void)
{
  int16_t adcval0;
  lcd_init();
  lcd_string("Hello World!");
  while(1)
    {
    }
 
  return 0;
}
Ausgabe klappt. Also gehe ich davon aus, das das LCD richtig 
angeschlossen ist, und auch der Rest in der .h Datei stimmt.
Kann es sein, das sich ADC und LCD irgendwie in die Quere kommen können?

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

Bewertung
0 lesenswert
nicht lesenswert
OK.
Wie gehst deiner Meinung nach weiter?
Welche Teile aus diesem Programm kannst du übernehmen?
int main(void)
{
  int16_t adcval0;
  
  UCSRB |= (1<<TXEN);                            // UART TX einschalten
  UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1 ;
  DDRB = (1 << DDB0) | (1 << DDB1); 
  
  while(1)
  {
    adcval0 = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
    //adcval1 = ReadChannel(1); /* MUX-Bits auf 0b0010 -> Channel 1 */
  
    lcd_init();
    char Buffer[20]; 
    itoa( adcval0, Buffer, 10 ); 

    set_cursor(0,1);
 
    lcd_string(Buffer);
 
    while(1)
    {
    }
 
    return 0;
  }
}

Brauchst du USART?
Nein, also ist das uninteressant.

Brauchst du ADC?
Ja

also holst du dir von dort die ADC Routine ReadChannel und kopierst sie 
zu deinem Programm dazu.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke, dass ich:
ADCSRA |= _BV(ADSC);         //ADC-Wandler neu "ansto?em            
      
      while (ADCSRA & _BV(ADSC) )     //warten bis die AD-Wandlung fertig ist
      {
      }//end while     
    
      ADMUX=ADC0;        //AD-Wandler Multiplexregister initialisieren
                                  //Ausgabe ADC0-Wert      
      
      adcval0 = ADC;        //AD-Wandlungsergebnis aus dem ADC-Register
das übernehemn kann.
und meine itoa Zeile, also die Wandlung.
Aber diese Zeilen brauche ich nicht.
UCSRB |= (1<<TXEN);                            // UART TX einschalten
  UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1 ;
  DDRB = (1 << DDB0) | (1 << DDB1); 
Das hat ja was mit der UARt zu tun, ich schicke ja keine Daten an den 
PC, sondern an das Display und deshalb brauche ich die doch nicht, oder 
sehe ich das falsch?
Ds was ich für das Display brauche, steht ja in der lcd-routines.c und.h 
drin.
Wenn ich jetzt starte, dann sind die balken weg, und im Display steht 
nichts.

Sorry, habe deinen Beitrag erst jetzt gelesen.

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:
> Ich denke, dass ich:
>
> ADCSRA |= _BV(ADSC);         //ADC-Wandler neu "ansto?em
> 
>       while (ADCSRA & _BV(ADSC) )     //warten bis die AD-Wandlung
> fertig ist
>       {
>       }//end while
> 
>       ADMUX=ADC0;        //AD-Wandler Multiplexregister initialisieren
>                                   //Ausgabe ADC0-Wert
> 
>       adcval0 = ADC;        //AD-Wandlungsergebnis aus dem ADC-Register
> 
> das übernehemn kann.

NEIN!

Übernimm die ReadChannel!
Die ist fix und fertig und macht das was du willst!

Und zwar mit allem drum und drann.
Die stammt aus dem Tutorial und von der wissen wir, dass sie 
funktioniert. Das obige da konfiguriert den ADC nicht!

Wann immer du auf deinem Mega irgendeine Funktionalität nutzt, gibt es 2 
Fragen:

 * was muss ich wo einstellen, damit der Chip bzw. die Teilfunktion des
   Chips arbeitet.

   So wie du einmal lcd_init aufrufen musst, damit das LCD initalisiert
   und in die Arbeitskonfiguration versetzt wird, so muss für fast
   alles irgendwann die Arbeitskonfiguration festgelegt werden

 * wie benutze ich dann die entsprechende Funktionalität im laufenden
   Betrieb.

Wann immer du also irgendwo Code klaust, achte darauf dass der geklaute 
Code genau diese Fragestellungen beantwortet
* wird alles richtig initialisiert
* kriege ich meine Ergebnisse

Die ReadChannel hat alles in einer Funktion integriert. Sie konfiguriert 
den ADC auf Arbeitsbedingungen und lässt ihn auch gleich arbeiten. Das 
Registergrabsetzen da oben, macht das nicht.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@Karl heinz:
Ich muss dir wieder meinen DANK aussprechen, wie schon so oft, hast du 
mich zum Ziel geführt. Das Display zeigt 504 an. Ich verwende die 
externe Ref Spannung und habe an ADC0 eine Spannung von ca. 2,4..  kommt 
also wie ich finde hin.
Ich habe jetzt an ADC0 einen LDR Spannungsteiler. Jetzt verändert sich 
natürlich die Spannung je nach Lichteinfall und Widerstand des LDr.
Ich habe doch schon Alles in einer Schelife, aber warum ändert er mir 
nicht, wenn ich z.B. den LDR zuhalte, den Wert auf dem Display? Ich muss 
immer erst mein Netzteil aus und wieder anschalten.


LG

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl Heinz,
schon mal über Online Nachhilfestunden nachgedacht ??
Du solltest Kurse geben für die Copy and Paste Programmiermethode.
Dann lohnt sich Dein Aufwand wenigstens.

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

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:

> den ADC auf Arbeitsbedingungen und lässt ihn auch gleich arbeiten. Das
> Registergrabsetzen da oben, macht das nicht.

Ganz abgesehen davon, dass das hier unlogisch ist

     ADCSRA |= _BV(ADSC);         /*ADC-Wandler neu "ansto?em*/

      while (ADCSRA & _BV(ADSC) )     /*warten bis die AD-Wandlung 
fertig ist*/
      {
      }//end while

      ADMUX=ADC0;        /*AD-Wandler Multiplexregister initialisieren
                                  Ausgabe ADC0-Wert*/

      adcval0 = ADC;        /*AD-Wandlungsergebnis aus dem ADC-Register
                                  abholen*/

Aha, zuerst wird also der ADC Wandler angestossen und erst danach wird 
im ADMUX Register eingestellt welcher Kanal eigentlich gewandelt werden 
soll. Das ist ungefähr so, wie wenn du zuerst die Hose anziehst und erst 
danach machst du den Gürtel auf.

Daher auch der Rat: Geh mit dem Finger dein Programm durch! Eine Zeile 
nach der anderen. Überlege ob die Reihenfolge logisch ist!

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:

> Ich habe doch schon Alles in einer Schelife,

zeigen

> aber warum ändert er mir
> nicht, wenn ich z.B. den LDR zuhalte, den Wert auf dem Display? Ich muss
> immer erst mein Netzteil aus und wieder anschalten.

Und wieder.
Dein Finger ist der µC. Du arbeitest dein Programm ab, indem der Finger 
von einer Zeile zur nächsten geht. Dabei immer die Fragestellungen
  Was passiert?
  Welche Werte werden errechnet?
  Welche Variablen erhalten welchen Wert?
  Wie (mit welchem Befehl) gehst weiter?

In Gedanken nicht das tun was du denkst, dass passieren soll, sondern 
das tun, was am Papier (Monitor) steht.

Dazu muss man natürlich die C-'Befehle' kennen und wissen, was sie tun. 
Daher: Kauf dir endlich ein C-Buch und arbeite zumindest die erste 
Hälfte durch.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

sorry, hier ist der jetzt verwendete Code
int main(void)
{
  int16_t adcval0;
    lcd_init();
   
while(1)
  {
    adcval0 = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
    char Buffer[20]; 
    itoa( adcval0, Buffer, 10 ); 
    set_cursor(0,1);
    lcd_string(Buffer);
  }
}

Habe die Endlosschleife mal weg gemacht.
Jetzt laufen die Zahlen auf dem Display durch, ist logisch.
Mit der Endlosschelife, hat sich nur nach dem einschalten was getan.
Welche Möglichkeit habe ich jetzt, um mir eine Änderung anzeigen zu 
lassen?
Muss ich aus der Endlosschelife eine Schleife mit Bedingugn machen, 
damit er diese verlässt und wieder von oben anfängt?

DANKE

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe jetzt eine delay Funktion eingebaut, von einer Sekunde.
Funktioniert, bin eigentlich zufrieden.
Aber ohne euch hätte ich es nicht geschafft.
Hat noch eventuell einer eine Idee wegen Verbesserungen?


LG und schönes WE

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:

> Jetzt laufen die Zahlen auf dem Display durch, ist logisch.

Gut.
Genau das hast du ja auch programmiert

> Mit der Endlosschelife, hat sich nur nach dem einschalten was getan.

Auch logisch.
Denn nach der ersten Messung war er ja nach der Messung in der 
Endlosschleife gefangen und hat nichts sinnvolles mehr getan

> Welche Möglichkeit habe ich jetzt, um mir eine Änderung anzeigen zu
> lassen?

Indem du zunächst die Änderung feststellst :-)

> Muss ich aus der Endlosschelife eine Schleife mit Bedingugn machen,
> damit er diese verlässt und wieder von oben anfängt?

Nein.
Die Endlosschleife ist dein Rahmen.
Das Programm bleibt immer innerhalb der Endlosschleife.

Überleg dir mal, was so ein Konstrukt wohl macht
  uint16_t alterWert = 0;
  uint16_t neuerWert;

  ...

  alterWert = 0;
  while( 1 )
  {
    neuerWert = ReadChannel( 0 );

    if( neuerWert != alterWert )
    {
       ....
    }

    alterWert = neuerWert;
  }

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich würde mir jetzt gerne zwei Werte auf dem LCd ausgeben lassen, den 
einen in der ersten Zeile, den anderen in der zweiten.
Ich will aber vor die Werte noch was schreiben, was immer da stehen 
soll.
Hier ist der Code
int main(void)
{
  int16_t adcval0, adcval1;
    lcd_init();
    set_cursor(1,0);
  lcd_string("Tagesachse: ");
while(1)
  {
    adcval0 = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
    //adcval1 = ReadChannel(1);
    char Buffer0[20], Buffer1[20]; 
    itoa( adcval0, Buffer0, 10 ); 
    set_cursor(1,13);
    lcd_string(Buffer0);
    }
}
Tagesachse wird angeziegt, das ist kein Problem und der Wert nach dem 
einschalten auch noch, aber dann beginnt der Wert zu wandern. Der 1. 
Wert bleibt noch stehen, wird aber auch zum Teil überschrieben, dann 
laufen die Werte aus dem Display heraus, und nach einiger Zeit wieder in 
der Zeile drunter von links rein.
Verstehe es nciht, da ich doch in der Endlosschleife die Werte abfrage, 
umwandele und die Position der Ausgabe angebe.
Ich hätte einfach nur gerne, dass Tagesachse stehen bleibt, was es ja 
auch tut, und dann dahinter immer der neue Wert ausgegeben wird.

Kann ich die zwei Kanäle einfach so abfragen und dann abspeichern?

LG

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja ja, Display fortlaufend schreiben geht zwar, macht aber nicht viel 
Sinn in diesem Fall. Also Cursor setzen und alles wird gut.
www.sprut.de hat ne gute Abhandlung zu Displays.

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeigst du mal die set_cursor() Funktion bitte ?

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

anbei meine lcd_routines.h mit der set_cursor Fkt.
void lcd_data(unsigned char temp1);
void lcd_string(char *data);
void lcd_command(unsigned char temp1);
void lcd_enable(void);
void lcd_init(void);
void lcd_home(void);
void lcd_clear(void);
void set_cursor(uint8_t x, uint8_t y);
#define F_CPU 1000000
#define CLEAR_DISPLAY 0x01
#define CURSOR_HOME   0x02
#define LCD_PORT      PORTD
#define LCD_DDR       DDRD
#define LCD_RS        PD4
#define LCD_EN        PD5 

Ich setze den Cursor doch, oder?
Der erste Wert wird ja auch an der richtigen Stelle angezeigt, nur die 
anderen nicht.

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, eigentlich sollte das den Cursor setzen.

Und eigtenlich wäre ja die Funktion selbst interessant gewesen, aber 
egal..
Es scheint ja die aus dem Tutorial zu sein.

Sieht du irgendwelche Warnings beim Compilieren ?

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

nein, keine.
Hier dei Funktion, sorry
void set_cursor(uint8_t x, uint8_t y)
{
  uint8_t tmp;
 
  switch (y) {
    case 1: tmp=0x80+0x00+x; break;    // 1. Zeile
    case 2: tmp=0x80+0x40+x; break;    // 2. Zeile
    case 3: tmp=0x80+0x10+x; break;    // 3. Zeile
    case 4: tmp=0x80+0x50+x; break;    // 4. Zeile
    default: return;                   // für den Fall einer falschen Zeile
  }
  lcd_command(tmp);
}
 

ich habe aber nur zwei Zeilen, ist dass das Problem?

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint8_t x, uint8_t y

zuerst x, dann y übergeben !

Du hast es vertauscht und willst in Zeile 13 schreiben.

Sorry, hätte mir früher auffallen sollen.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

aber habe ich das nicht?
set_cursor(1,0);
.
.
.
 set_cursor(1,13);
Das oben heißt doch, dass ich in Zeile 1 (x=1) und Spalte 0 anfange.
Das wäre oben links.
das nächste set heißt doch, das ich in der gleichen Zeile (x=1), nur in 
Spalte 13 anfange.

Verbesser mich bitte wenn ich total daneben liege.

LG & DANKE

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
switch (y) {
    case 1: tmp=0x80+0x00+x; break;    // 1. Zeile
    case 2: tmp=0x80+0x40+x; break;    // 2. Zeile
    case 3: tmp=0x80+0x10+x; break;    // 3. Zeile
    case 4: tmp=0x80+0x50+x; break;    // 4. Zeile
    default: return;                   // für den Fall einer falschen 
Zeile

wie es aussieht ist y aber die Zeile.
Also deklarierst Du offensichtlich 1. Spalte in Zeile 13 beim schreiben.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe jetzt doch Warnings:

c:/winavr-20090313/lib/gcc/../../avr/include/util/delay.h:85:3: warning: 
#warning "F_CPU not defined for <util/delay.h>"
In file included from ../LDR_vergleichen.c:5:
../lcd-routines.h:9:1: warning: "F_CPU" redefined
In file included from ../LDR_vergleichen.c:4:
c:/winavr-20090313/lib/gcc/../../avr/include/util/delay.h:86:1: warning: 
this is the location of the previous definition
../LDR_vergleichen.c:6:1: warning: "F_CPU" redefined
In file included from ../LDR_vergleichen.c:5:
../lcd-routines.h:9:1: warning: this is the location of the previous 
definition
../LDR_vergleichen.c: In function 'main':
../LDR_vergleichen.c:71: warning: unused variable 'Buffer1'

Hier ist der Abgeänderte Text:
set_cursor(0,1);
lcd_string("Tagesachse: ");
.
.
.
set_cursor(13,0);
lcd_string(Buffer0);
Jetzt ist beim einschalten alles i.O., so wie es sein soll, aber wenn er 
dann den nächsten Wert schreibt, schreibt er ihn hinter den alten. Und 
das geht dann soweit, dass das Display voll geschrieben wird.
LG

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du x und y vertauscht sollte es gehen.

Und kommentiere mal die Defines für F_CPU bitte aus (in allen Dateien).
Du benutzt scheinbar Avr-studio, da sind diese Zeilen überflüssug, und 
können zu Verwirrung führen.
Du musst natürlich in AVR-Studio die passende Frequenz einstellen, falls 
nicht schon geschehen.

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Jetzt ist beim einschalten alles i.O., so wie es sein soll, aber wenn er
>dann den nächsten Wert schreibt, schreibt er ihn hinter den alten. Und

Dann weiss ich auch nicht weiter.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

irgendwie reagiert er nicht auf meine Änderungen.
Ich ändere was im Prog, dann drücke ich F7, danach will ich flashen, das 
klappt auch, aber die Änderungen werden nicht übernommen,.

LG

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du bekommst aber keine Fehlermeldungen beim compilieren, oder ?
Sind die Warnings jetzt eigentlich weg ?

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
entweder stimmt das setzen des Cursors nicht oder Du gibst auf einer 
Zeile mehr aus als rauf geht. Deswegen schiebt das Display weiter. Du 
hast nen Überlauf.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein 2x20 LCD.
Ich habe mal das erste setzen des Cursors
set_cursor(0,1);
mal weggelassen.
Dann wird das Ergebnis an den ersten Stellen ausgegeben.
Wenn der AD Wert am Anfang des Displays ausgegeben wird, dann gibt es 
keinen Überlauf, dann wird immer die Zahl an dieser Stelle erneuert, das 
finde ich komisch.
Wo fängt das LCD denn an, bei der 0 oder bei 1 ?
Ist das bei Zeile oder Spalte unterschiedlich?

LG

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>#warning "F_CPU not defined for <util/delay.h>"

Sorry, ich frag nochmal:
Ist die Warnung jetzt weg ?
Es könnte sonst Probleme bei der Initialisierung des Displays geben.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das sind jetzt noch meine Warnings:

- c:/winavr-20090313/lib/gcc/../../avr/include/util/delay.h:85:3: 
warning: #warning "F_CPU not defined for <util/delay.h>"
- In file included from ../LDR_vergleichen.c:5:
../lcd-routines.h:9:1: warning: "F_CPU" redefined
- In file included from ../LDR_vergleichen.c:4:
c:/winavr-20090313/lib/gcc/../../avr/include/util/delay.h:86:1: warning: 
this is the location of the previous definition


LG

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:
> Hallo,
>
> das sind jetzt noch meine Warnings:
>
> - c:/winavr-20090313/lib/gcc/../../avr/include/util/delay.h:85:3:
> warning: #warning "F_CPU not defined for <util/delay.h>"

Wie oft wurde dir jetzt schon gesagt:

Definier die Taktfrequenz in den Projekt-Einstellungen im AVR-Studio ...

> - In file included from ../LDR_vergleichen.c:5:
> ../lcd-routines.h:9:1: warning: "F_CPU" redefined

und schmeiss alle anderen
#define F_CPU ....

aus dem Code raus.

Jeder muss einmal wo anfangen, das ist schon klar. Aber irgendwie habe 
ich das Gefühl, du drehst dich im Kreis und lernst nichts dazu. Schön 
langsam musst du die (eh fast immer gleichen) Fehlermeldungen schon 
erkennen und in etwa wissen, was das Problem ist.

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.