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


von Hans P. (gableguy2000)


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

von Karl H. (kbuchegg)


Lesenswert?


von Hans P. (gableguy2000)


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

von Karl H. (kbuchegg)


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.

von Hans P. (gableguy2000)


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

von Karl H. (kbuchegg)


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)

von Hans P. (gableguy2000)


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.
1
/*****************************************************************
2
*Programm zur Ansteuerung der ADC-PORTS PA0-PA7 ?ber einen Poti. *
3
*Analogwert soll in einen Digitalwert gewandelt. Die Ausgabe des *
4
*Wertes erfolgt ?ber ein LCD-Display.          *  
5
*LCD Lib wird von Peter Fleury verwendet       *  
6
*****************************************************************/
7
8
#include <stdlib.h>
9
#include <avr/io.h>
10
#include <avr/pgmspace.h>
11
#include "lcd.h"
12
13
14
/*****************************************************************
15
           Definitionen
16
*****************************************************************/
17
18
#define ADC0 0
19
#define ADC1 1
20
#define ADC2 2
21
#define ADC3 3
22
#define ADC4 4
23
#define ADC5 5
24
#define ADC6 6
25
#define ADC7 7
26
27
/*****************************************************************
28
      Hauptrogramm                   
29
*****************************************************************/
30
31
32
int main(void)
33
{
34
    lcd_init(LCD_DISP_ON);            /*Display einschalten*/
35
  int result0, result1;                    
36
  char buffer0[6], buffer1[6];
37
  
38
  
39
  ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS1) | _BV(ADPS2);   /*AD-Wandler initialisieren 
40
                  mit "|" -> "oder-Operator" um die einzelnen 
41
                  Bits zu setzen - die _BV() ist irgendwo 
42
                  als Funktion deffiniert*/            
43
  
44
    for (;;) 
45
    {  
46
      
47
48
49
      ADMUX=ADC0;          /*AD-Wandler Multiplexregister initialisieren
50
                    Ausgabe ADC0-Wert*/      
51
52
      ADCSRA |= _BV(ADSC);           /*AD-Wandler neu "ansto?em*/            
53
      
54
      while (ADCSRA & _BV(ADSC) )       /*warten bis die AD-Wandlung fertig ist*/
55
      {
56
      }//end while     
57
    
58
      
59
      
60
      result0 = ADC;          /*AD-Wandlungsergebnis aus dem ADC-Register
61
                    abholen*/  
62
      itoa(result0,buffer0,10);      /*10Bit anpassung des ADC Wertes als Integer Wert*/
63
      lcd_gotoxy(0,0);        /*Cursor auf Display 1. Zeile*/
64
      lcd_puts(buffer0);        /*Wert ausgeben*/
65
66
      
67
68
      
69
70
      ADMUX=ADC1;          /*Multiplexer auf ADC1 setzen*/
71
72
      ADCSRA |= _BV(ADSC);        /*ADC neu ansto?en*/
73
      
74
      while (ADCSRA & _BV(ADSC) )              
75
      {
76
      }//end while  
77
78
      result1=ADC;          /*AD-Wandlungsergebnis aus ADC-Register 
79
                    abholen*/  
80
      itoa(result1,buffer1,10);      /*10Bit Anpassung des ADC Wertes als Integer Wert*/    
81
      lcd_gotoxy(0,1);        /*Cursor auf Display zweite Temp.*/      
82
      lcd_puts(buffer1);        /*Wert ausgeben*/
83
84
85
    }//end for(;;)
86
87
      
88
}//end main
wie gesagt, habe den Code hier aus dem Forum.

LG

von Karl H. (kbuchegg)


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.

von Hans P. (gableguy2000)


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

von Karl H. (kbuchegg)


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
1
#define XTAL 4000000              /**< clock frequency in Hz, used to calculate delay timer */

hier
1
#define LCD_LINES           2     /**< number of visible lines of the display */
2
#define LCD_DISP_LENGTH    16     /**< visibles characters per line of the display */
3
#define LCD_LINE_LENGTH  0x40     /**< internal line length of the display    */
4
#define LCD_START_LINE1  0x00     /**< DDRAM address of first char of line 1 */
5
#define LCD_START_LINE2  0x40     /**< DDRAM address of first char of line 2 */
6
#define LCD_START_LINE3  0x14     /**< DDRAM address of first char of line 3 */
7
#define LCD_START_LINE4  0x54     /**< DDRAM address of first char of line 4 */
8
#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
1
#define LCD_PORT         PORTA        /**< port for the LCD lines   */
2
#define LCD_DATA0_PORT   LCD_PORT     /**< port for 4bit data bit 0 */
3
#define LCD_DATA1_PORT   LCD_PORT     /**< port for 4bit data bit 1 */
4
#define LCD_DATA2_PORT   LCD_PORT     /**< port for 4bit data bit 2 */
5
#define LCD_DATA3_PORT   LCD_PORT     /**< port for 4bit data bit 3 */
6
#define LCD_DATA0_PIN    0            /**< pin for 4bit data bit 0  */
7
#define LCD_DATA1_PIN    1            /**< pin for 4bit data bit 1  */
8
#define LCD_DATA2_PIN    2            /**< pin for 4bit data bit 2  */
9
#define LCD_DATA3_PIN    3            /**< pin for 4bit data bit 3  */
10
#define LCD_RS_PORT      LCD_PORT     /**< port for RS line         */
11
#define LCD_RS_PIN       4            /**< pin  for RS line         */
12
#define LCD_RW_PORT      LCD_PORT     /**< port for RW line         */
13
#define LCD_RW_PIN       5            /**< pin  for RW line         */
14
#define LCD_E_PORT       LCD_PORT     /**< port for Enable line     */
15
#define LCD_E_PIN        6            /**< pin  for Enable line     */
hier gibst du deine Verdrahtung bekannt

von Hans P. (gableguy2000)


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.

von Karl H. (kbuchegg)


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.

von Hans P. (gableguy2000)


Lesenswert?

Hallo,
1
#define LCD_PORT         PORTD        /**< port for the LCD lines   */
2
#define LCD_DATA0_PORT   LCD_PORT     /**< port for 4bit data bit 0 */
3
#define LCD_DATA1_PORT   LCD_PORT     /**< port for 4bit data bit 1 */
4
#define LCD_DATA2_PORT   LCD_PORT     /**< port for 4bit data bit 2 */
5
#define LCD_DATA3_PORT   LCD_PORT     /**< port for 4bit data bit 3 */
6
#define LCD_DATA0_PIN    0            /**< pin for 4bit data bit 0  */
7
#define LCD_DATA1_PIN    1            /**< pin for 4bit data bit 1  */
8
#define LCD_DATA2_PIN    2            /**< pin for 4bit data bit 2  */
9
#define LCD_DATA3_PIN    3            /**< pin for 4bit data bit 3  */
10
#define LCD_RS_PORT      LCD_PORT     /**< port for RS line         */
11
#define LCD_RS_PIN       4            /**< pin  for RS line         */
12
#define LCD_RW_PORT      LCD_PORT     /**< port for RW line         */
13
#define LCD_RW_PIN       5            /**< pin  for RW line         */
14
#define LCD_E_PORT       LCD_PORT     /**< port for Enable line     */
15
#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.

von Karl H. (kbuchegg)


Lesenswert?

XTAL hast du angepasst?


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

1
#include <util/delay.h>
2
3
int main()
4
{
5
  ...
6
7
  delay_ms( 200 );
8
9
  lcd_init( LCD_DISP_ON );
10
11
  ...
12
}

von Hans P. (gableguy2000)


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
1
/*****************************************************************
2
*Programm zur Ansteuerung der ADC-PORTS PA0-PA7 ?ber einen Poti. *
3
*Analogwert soll in einen Digitalwert gewandelt. Die Ausgabe des *
4
*Wertes erfolgt ?ber ein LCD-Display.          *  
5
*LCD Lib wird von Peter Fleury verwendet       *  
6
*****************************************************************/
7
8
#include <stdlib.h>
9
#include <avr/io.h>
10
#include <avr/pgmspace.h>
11
#include "lcd.h"
12
13
14
15
16
/*****************************************************************
17
           Definitionen
18
*****************************************************************/
19
20
#define ADC0 0
21
#define ADC1 1
22
#define ADC2 2
23
#define ADC3 3
24
#define ADC4 4
25
#define ADC5 5
26
#define ADC6 6
27
#define ADC7 7
28
29
/*****************************************************************
30
      Hauptrogramm                   
31
*****************************************************************/
32
33
34
int main(void)
35
{
36
    
37
38
  lcd_init(LCD_DISP_ON);            /*Display einschalten*/
39
  int result0, result1;                    
40
  char buffer0[6], buffer1[6];
41
  
42
  
43
  ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS1) | _BV(ADPS2);   /*AD-Wandler initialisieren 
44
                  mit "|" -> "oder-Operator" um die einzelnen 
45
                  Bits zu setzen - die _BV() ist irgendwo 
46
                  als Funktion deffiniert*/            
47
  
48
    for (;;) 
49
    {  
50
      
51
52
53
      ADMUX=ADC0;          /*AD-Wandler Multiplexregister initialisieren
54
                    Ausgabe ADC0-Wert*/      
55
56
      ADCSRA |= _BV(ADSC);           /*AD-Wandler neu "ansto?em*/            
57
      
58
      while (ADCSRA & _BV(ADSC) )       /*warten bis die AD-Wandlung fertig ist*/
59
      {
60
      }//end while     
61
    
62
      
63
      
64
      result0 = ADC;          /*AD-Wandlungsergebnis aus dem ADC-Register
65
                    abholen*/  
66
      itoa(result0,buffer0,10);      /*10Bit anpassung des ADC Wertes als Integer Wert*/
67
      lcd_gotoxy(0,0);        /*Cursor auf Display 1. Zeile*/
68
      lcd_puts(buffer0);        /*Wert ausgeben*/
69
70
      
71
72
      
73
74
      ADMUX=ADC1;          /*Multiplexer auf ADC1 setzen*/
75
76
      ADCSRA |= _BV(ADSC);        /*ADC neu ansto?en*/
77
      
78
      while (ADCSRA & _BV(ADSC) )              
79
      {
80
      }//end while  
81
82
      result1=ADC;          /*AD-Wandlungsergebnis aus ADC-Register 
83
                    abholen*/  
84
      itoa(result1,buffer1,10);      /*10Bit Anpassung des ADC Wertes als Integer Wert*/    
85
      lcd_gotoxy(0,1);        /*Cursor auf Display zweite Temp.*/      
86
      lcd_puts(buffer1);        /*Wert ausgeben*/
87
88
89
    }//end for(;;)
90
91
      
92
}//end main

Danke

von Karl H. (kbuchegg)


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
1
#include <stdlib.h>
2
#include <avr/io.h>
3
#include <util/delay.h>
4
#include "lcd.h"
5
6
int main(void)
7
{
8
  _delay_ms( 200 );
9
10
  lcd_init( LCD_DISP_ON );
11
  lcd_puts( "Hallo" );
12
13
  while( 1 )
14
    ;
15
}

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.

von Hans P. (gableguy2000)


Lesenswert?

Hallo,

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


LG und Danke

von Hans P. (gableguy2000)


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

von doc (Gast)


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.

von doc (Gast)


Lesenswert?

..und die PIN-Nummern des LCD's sind dem Code auch schnurz.

von Hans P. (gableguy2000)


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     */

von Karl H. (kbuchegg)


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?

von doc (Gast)


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  */

von Hans P. (gableguy2000)


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:
1
#define LCD_LINES           2     /**< number of visible lines of the display */
2
#define LCD_DISP_LENGTH    20     /**< visibles characters per line of the display */
3
#define LCD_LINE_LENGTH  0x40     /**< internal line length of the display    */
4
#define LCD_START_LINE1  0x00     /**< DDRAM address of first char of line 1 */
5
#define LCD_START_LINE2  0x40     /**< DDRAM address of first char of line 2 */
6
#define LCD_START_LINE3  0x14     /**< DDRAM address of first char of line 3 */
7
#define LCD_START_LINE4  0x54     /**< DDRAM address of first char of line 4 */
8
#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

von doc (Gast)


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.

von doc (Gast)


Lesenswert?

>#warning "F_CPU not defined for <util/delay.h>"

Was benutzt du für ein Makefile  ?

von Hans P. (gableguy2000)


Lesenswert?

Hallo,

mein Display ist von Pollin.
Es ist ein Datavision DV-20208.
Datenblatt:
http://www.pollin.de/shop/dt/MDg0OTc4OTk-/Bauelemente/Aktiv/Displays/LCD_Modul_DATAVISION_DV_20208.html
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

von Karl H. (kbuchegg)


Lesenswert?

Hans Peter schrieb:
> Hallo,
>
> mein Display ist von Pollin.
> Es ist ein Datavision DV-20208.
> Datenblatt:
> 
http://www.pollin.de/shop/dt/MDg0OTc4OTk-/Bauelemente/Aktiv/Displays/LCD_Modul_DATAVISION_DV_20208.html
> 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.

von Hans P. (gableguy2000)


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

von Karl H. (kbuchegg)


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.

von Hans P. (gableguy2000)


Angehängte Dateien:

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.

von Karl H. (kbuchegg)


Lesenswert?

Und wo sehe ich da das LCD.

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

von Hans P. (gableguy2000)


Angehängte Dateien:

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.

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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.

1
#define F_CPU 1000000
2
3
#include <stdlib.h>
4
#include <avr/io.h>
5
#include <util/delay.h>
6
#include "lcd.h"
7
8
int main(void)
9
{
10
  DDRB = 0xFF;
11
12
  _delay_ms( 200 );
13
14
  lcd_init( LCD_DISP_ON );
15
  lcd_puts( "Hallo" );
16
17
  while( 1 ) {
18
    PORTB = 0xFF;
19
    _delay_ms( 500 );
20
    PORTB = 0x00;
21
    _delay_ms( 500 );
22
  }
23
}

Die Led muss blinken.

von Hans P. (gableguy2000)


Angehängte Dateien:

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.

von Hans P. (gableguy2000)


Lesenswert?

Halllo,

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

Ist der mC defekt?

von doc (Gast)


Lesenswert?

Evtl will der avr nur einen Quarz...

von doc (Gast)


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.

von Hans P. (gableguy2000)


Angehängte Dateien:

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.

von doc (Gast)


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 ?

von Karl H. (kbuchegg)


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

von Karl H. (kbuchegg)


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

von Hans P. (gableguy2000)


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?

von Karl H. (kbuchegg)


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

von Karl H. (kbuchegg)


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.

von Hans P. (gableguy2000)


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?

von Karl H. (kbuchegg)


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:
1
#define F_CPU 1000000
2
3
#include <stdlib.h>
4
#include <avr/io.h>
5
#include <util/delay.h>
6
#include "lcd.h"
7
8
int main(void)
9
{
10
  DDRB = 0xFF;
11
12
  _delay_ms( 200 );
13
14
//  lcd_init( LCD_DISP_ON );
15
//  lcd_puts( "Hallo" );
16
17
  while( 1 ) {
18
    PORTB = 0xFF;
19
    _delay_ms( 500 );
20
    PORTB = 0x00;
21
    _delay_ms( 500 );
22
  }
23
}

(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.

von doc (Gast)


Lesenswert?

Naja, Hauptsache, er hat nichts an den Fuses gedreht.
Darum der Quarz.

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

von Karl H. (kbuchegg)


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.

von Hans P. (gableguy2000)


Lesenswert?

Ja, blinkt.

von doc (Gast)


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.

von Karl H. (kbuchegg)


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.

von Hans P. (gableguy2000)


Angehängte Dateien:

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.

von Karl H. (kbuchegg)


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.

von Hans P. (gableguy2000)


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.

von Karl H. (kbuchegg)


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.

von Hans P. (gableguy2000)


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

von Karl H. (kbuchegg)


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

von doc (Gast)


Lesenswert?

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

von Hans P. (gableguy2000)


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
1
int main(void)
2
{
3
  int16_t adcval0;
4
  
5
  UCSRB |= (1<<TXEN);                            // UART TX einschalten
6
  UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1 ;
7
  DDRB = (1 << DDB0) | (1 << DDB1); 
8
  
9
  while(1)
10
  {
11
  adcval0 = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
12
  //adcval1 = ReadChannel(1); /* MUX-Bits auf 0b0010 -> Channel 1 */
13
  
14
  lcd_init();
15
  char Buffer[20]; 
16
       itoa( adcval0, Buffer, 10 ); 
17
18
  
19
    set_cursor(0,1);
20
 
21
    lcd_string(Buffer);
22
 
23
    while(1)
24
    {
25
    }
26
 
27
    return 0;
28
}
29
}
Wie gesagt, habe mir aus den zwei Programmen, die auch gelaufen sind, 
die Teile die ich brauche rauskopiert.

LG

von Karl H. (kbuchegg)


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.

von Hans P. (gableguy2000)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

Rück das ganze mal vernünftig und richtig ein
1
int main(void)
2
{
3
  int16_t adcval0;
4
  
5
  UCSRB |= (1<<TXEN);                            // UART TX einschalten
6
  UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1 ;
7
  DDRB = (1 << DDB0) | (1 << DDB1); 
8
  
9
  while(1)
10
  {
11
    adcval0 = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
12
    //adcval1 = ReadChannel(1); /* MUX-Bits auf 0b0010 -> Channel 1 */
13
  
14
    lcd_init();
15
    char Buffer[20]; 
16
    itoa( adcval0, Buffer, 10 ); 
17
18
    set_cursor(0,1);
19
 
20
    lcd_string(Buffer);
21
 
22
    while(1)
23
    {
24
    }
25
 
26
    return 0;
27
  }
28
}

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?

von Hans P. (gableguy2000)


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

von Karl H. (kbuchegg)


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.

von Hans P. (gableguy2000)


Lesenswert?

1
int main(void)
2
{
3
  int16_t adcval0;
4
  
5
  UCSRB |= (1<<TXEN);                            // UART TX einschalten
6
  UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1 ;
7
  DDRB = (1 << DDB0) | (1 << DDB1); 
8
  
9
  while(1)
10
  {
11
    adcval0 = ReadChannel(0); //speichert Wert von ADC0 in adcval0
12
    
13
  
14
    lcd_init(); //initialisiert lcd
15
    char Buffer[20]; //legt Variable an 
16
    itoa( adcval0, Buffer, 10 ); //wandelt um
17
18
    set_cursor(0,1); //setzt den Cursor
19
 
20
    lcd_string(Buffer); //gibt den Wert aus
21
 
22
    while(1) //Endlosscheleife
23
    {
24
    }
25
 
26
    return 0;
27
  }
28
}
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?

von Karl H. (kbuchegg)


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

von Karl H. (kbuchegg)


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!

von Hans P. (gableguy2000)


Lesenswert?

Aha,

O.K. das ist schlecht.
1
int16_t adcval0;
2
  
3
  UCSRB |= (1<<TXEN);                            // UART TX einschalten
4
  UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1 ;
5
  DDRB = (1 << DDB0) | (1 << DDB1); 
6
  //int result0, result1;                    
7
  char buffer0[6], buffer1[6];
8
9
  for (;;) 
10
    {  
11
      
12
      lcd_init();
13
      ADCSRA |= _BV(ADSC);         /*ADC-Wandler neu "ansto?em*/            
14
      
15
      while (ADCSRA & _BV(ADSC) )     /*warten bis die AD-Wandlung fertig ist*/
16
      {
17
      }//end while     
18
    
19
      ADMUX=ADC0;        /*AD-Wandler Multiplexregister initialisieren
20
                                  Ausgabe ADC0-Wert*/      
21
      
22
      adcval0 = ADC;        /*AD-Wandlungsergebnis aus dem ADC-Register
23
                                  abholen*/  
24
      itoa(adcval0,buffer0,10);    /*10Bit anpassung des ADC Wertes als Integer Wert*/
25
      set_cursor(0,1);
26
      lcd_string (buffer0);
27
      set_cursor(0,2);
28
      lcd_string("Hallo!");
29
    
30
 
31
    }//end for(;;)
32
33
}
Wie ist diese Lösung, ist die eleganter, oder soll ich leiber bei miener 
bleiben?

von Michael W. (retikulum)


Lesenswert?

lcd_init raus aus der Endlosschleife. Die brauchst du nur einmal.

Michael

von Hans P. (gableguy2000)


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.

von Karl H. (kbuchegg)


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.

von Hans P. (gableguy2000)


Lesenswert?

Hallo,

O.K. hast recht.
Hier jetzt noch mal von Anfang
1
int main(void)
2
{
3
  int16_t adcval0;
4
  lcd_init();
5
  lcd_string("Hello World!");
6
  while(1)
7
    {
8
    }
9
 
10
  return 0;
11
}
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?

von Karl H. (kbuchegg)


Lesenswert?

OK.
Wie gehst deiner Meinung nach weiter?
Welche Teile aus diesem Programm kannst du übernehmen?
1
int main(void)
2
{
3
  int16_t adcval0;
4
  
5
  UCSRB |= (1<<TXEN);                            // UART TX einschalten
6
  UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1 ;
7
  DDRB = (1 << DDB0) | (1 << DDB1); 
8
  
9
  while(1)
10
  {
11
    adcval0 = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
12
    //adcval1 = ReadChannel(1); /* MUX-Bits auf 0b0010 -> Channel 1 */
13
  
14
    lcd_init();
15
    char Buffer[20]; 
16
    itoa( adcval0, Buffer, 10 ); 
17
18
    set_cursor(0,1);
19
 
20
    lcd_string(Buffer);
21
 
22
    while(1)
23
    {
24
    }
25
 
26
    return 0;
27
  }
28
}

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.

von Hans P. (gableguy2000)


Lesenswert?

Ich denke, dass ich:
1
ADCSRA |= _BV(ADSC);         //ADC-Wandler neu "ansto?em            
2
      
3
      while (ADCSRA & _BV(ADSC) )     //warten bis die AD-Wandlung fertig ist
4
      {
5
      }//end while     
6
    
7
      ADMUX=ADC0;        //AD-Wandler Multiplexregister initialisieren
8
                                  //Ausgabe ADC0-Wert      
9
      
10
      adcval0 = ADC;        //AD-Wandlungsergebnis aus dem ADC-Register
das übernehemn kann.
und meine itoa Zeile, also die Wandlung.
Aber diese Zeilen brauche ich nicht.
1
UCSRB |= (1<<TXEN);                            // UART TX einschalten
2
  UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1 ;
3
  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.

von Karl H. (kbuchegg)


Lesenswert?

Hans Peter schrieb:
> Ich denke, dass ich:
>
1
> ADCSRA |= _BV(ADSC);         //ADC-Wandler neu "ansto?em
2
> 
3
>       while (ADCSRA & _BV(ADSC) )     //warten bis die AD-Wandlung
4
> fertig ist
5
>       {
6
>       }//end while
7
> 
8
>       ADMUX=ADC0;        //AD-Wandler Multiplexregister initialisieren
9
>                                   //Ausgabe ADC0-Wert
10
> 
11
>       adcval0 = ADC;        //AD-Wandlungsergebnis aus dem ADC-Register
12
>
> 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.

von Hans P. (gableguy2000)


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

von Stephan H. (stephan-)


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.

von Karl H. (kbuchegg)


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!

von Karl H. (kbuchegg)


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.

von Hans P. (gableguy2000)


Lesenswert?

Hallo,

sorry, hier ist der jetzt verwendete Code
1
int main(void)
2
{
3
  int16_t adcval0;
4
    lcd_init();
5
   
6
while(1)
7
  {
8
    adcval0 = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
9
    char Buffer[20]; 
10
    itoa( adcval0, Buffer, 10 ); 
11
    set_cursor(0,1);
12
    lcd_string(Buffer);
13
  }
14
}
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

von Hans P. (gableguy2000)


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

von Karl H. (kbuchegg)


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
1
  uint16_t alterWert = 0;
2
  uint16_t neuerWert;
3
4
  ...
5
6
  alterWert = 0;
7
  while( 1 )
8
  {
9
    neuerWert = ReadChannel( 0 );
10
11
    if( neuerWert != alterWert )
12
    {
13
       ....
14
    }
15
16
    alterWert = neuerWert;
17
  }

von Hans P. (gableguy2000)


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
1
int main(void)
2
{
3
  int16_t adcval0, adcval1;
4
    lcd_init();
5
    set_cursor(1,0);
6
  lcd_string("Tagesachse: ");
7
while(1)
8
  {
9
    adcval0 = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
10
    //adcval1 = ReadChannel(1);
11
    char Buffer0[20], Buffer1[20]; 
12
    itoa( adcval0, Buffer0, 10 ); 
13
    set_cursor(1,13);
14
    lcd_string(Buffer0);
15
    }
16
}
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

von Stephan H. (stephan-)


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.

von doc (Gast)


Lesenswert?

Zeigst du mal die set_cursor() Funktion bitte ?

von Hans P. (gableguy2000)


Lesenswert?

Hallo,

anbei meine lcd_routines.h mit der set_cursor Fkt.
1
void lcd_data(unsigned char temp1);
2
void lcd_string(char *data);
3
void lcd_command(unsigned char temp1);
4
void lcd_enable(void);
5
void lcd_init(void);
6
void lcd_home(void);
7
void lcd_clear(void);
8
void set_cursor(uint8_t x, uint8_t y);
9
#define F_CPU 1000000
10
#define CLEAR_DISPLAY 0x01
11
#define CURSOR_HOME   0x02
12
#define LCD_PORT      PORTD
13
#define LCD_DDR       DDRD
14
#define LCD_RS        PD4
15
#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.

von doc (Gast)


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 ?

von Hans P. (gableguy2000)


Lesenswert?

Hallo,

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

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

von doc (Gast)


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.

von Hans P. (gableguy2000)


Lesenswert?

Hallo,

aber habe ich das nicht?
1
set_cursor(1,0);
2
.
3
.
4
.
5
 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

von Stephan H. (stephan-)


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.

von Hans P. (gableguy2000)


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:
1
set_cursor(0,1);
2
lcd_string("Tagesachse: ");
3
.
4
.
5
.
6
set_cursor(13,0);
7
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

von doc (Gast)


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.

von doc (Gast)


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.

von Hans P. (gableguy2000)


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

von doc (Gast)


Lesenswert?

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

von Stephan H. (stephan-)


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.

von Hans P. (gableguy2000)


Lesenswert?

Hallo,

ich habe ein 2x20 LCD.
Ich habe mal das erste setzen des Cursors
1
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

von doc (Gast)


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.

von Hans P. (gableguy2000)


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

von Karl H. (kbuchegg)


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.

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.