Forum: Mikrocontroller und Digitale Elektronik LCD Ansteuerung - Kann Fehler nicht finden


von Peter S. (petershaw)


Angehängte Dateien:

Lesenswert?

Hallo,

ich wende mich jetzt doch an euch. Denn ich kann den Fehler nicht 
finden. Es handelt sich um das zweite Display das ich verbauen möchte. 
Mit dem ersten ging alles super. Ein halbes Jahr später gibt es 
Probleme.

Ich habe nun ein zweites Board gebaut um alles zu prüfen. Wieder 
Fehlschläge. Ich bin sicher, wenn ihr den Output seht, dann fallen euch 
zig Gründe ein woran es liegen kann, die ich noch nicht geprüft habe, 
obwohl ich schon 8 mach durch alles durchgegangen bin.

Ich bin am Ende meine Ideen und frage höflich nach Debugging-Tipps und 
Ideen.

Ich benutze die Lib von Peter Fleury. RW habe ich verbunden.
Das "lustige" ist, er kommt durch die Initialisierungs-Methode durch. 
Doch er zeigt leider nichts an!
Ich hänge euch mal das Bild vom Display ran.

Hier die Belegung:
1
#define   LCD_PORT        PORTD
2
#define   LCD_DATA0_PORT  LCD_PORT
3
#define   LCD_DATA1_PORT  LCD_PORT
4
#define   LCD_DATA2_PORT  LCD_PORT
5
#define   LCD_DATA3_PORT  LCD_PORT
6
#define   LCD_DATA0_PIN   0
7
#define   LCD_DATA1_PIN   1
8
#define   LCD_DATA2_PIN   2
9
#define   LCD_DATA3_PIN   3
10
#define   LCD_RS_PORT     PORTD
11
#define   LCD_RS_PIN      4
12
#define   LCD_RW_PORT     PORTD
13
#define   LCD_RW_PIN      6
14
#define   LCD_E_PORT      PORTD
15
#define   LCD_E_PIN       5

Und dies ist meine Testroutine:
1
//
2
//  main.c
3
//  AnalyserDude
4
//
5
//  Created by Peter Shaw
6
//  Copyright (c) 2013. All rights reserved.
7
//
8
9
#include <stdlib.h>
10
#include <stdbool.h>
11
12
#include <util/delay.h>
13
#include <avr/io.h>
14
#include <avr/interrupt.h>
15
16
#include "../src-lib/lcd/lcd.h"
17
18
#define LIGHT_ON(l)                     (PORTB |= (l))
19
#define LIGHT_OFF(l)                    (PORTB &= ~(l))
20
#define LIGHT_TOGGLE(l)                 (PORTB ^= (l))
21
22
int i;
23
24
// DUMMY FUNCTION
25
// ---------------------------------------------
26
void *dummy(void){return (void *) NULL;};
27
28
/**
29
 * Initialize the lcd and printout a welcome message
30
 */
31
void initialize_lcd(void){
32
  LIGHT_ON(1<<PB1);
33
    lcd_init(LCD_DISP_ON);                                      // initialize display, cursor off
34
    LIGHT_OFF(1<<PB1);
35
    
36
    lcd_puts("XOXOXOXOXOXOXOXO\n");                             // welcome message
37
    lcd_puts("OXOXOXOXOXOXOXOX");
38
}
39
40
41
int main(void) {
42
    
43
    DDRB |= (1<<PB0) | (1<<PB1);
44
    LIGHT_ON(1<<PB0);
45
    _delay_ms(500);
46
    LIGHT_OFF(1<<PB0);
47
    
48
    //initialize the device
49
    initialize_lcd();
50
    _delay_ms(1000);                    
51
    lcd_clrscr();
52
    
53
    
54
    // mainloop
55
    while(1) {
56
        LIGHT_ON(1<<PB0);
57
58
        for(i=0;i<16;i++){
59
            lcd_puts("X");
60
            _delay_ms(300);
61
        }
62
        lcd_puts("\n");
63
        for(i=0;i<16;i++){
64
            lcd_puts("X");
65
            _delay_ms(200);
66
        }
67
68
        LIGHT_OFF(1<<PB0);
69
        _delay_ms(1000);
70
        lcd_clrscr();
71
    }
72
73
}

Danke für Ideen.

von Georg G. (df2au)


Lesenswert?

Wenn du nicht eine extrem gutmütige LCD Variante hast und dein Prozessor 
schön langsam ist, ist das Flachbandkabel tödlich. 10cm können schon zu 
viel sein.

von Timmo H. (masterfx)


Lesenswert?

Was mir als erstes aufgefallen ist:
1
#define LIGHT_ON(l)                     (PORTB |= (l))
2
#define LIGHT_OFF(l)                    (PORTB &= ~(l))
3
#define LIGHT_TOGGLE(l)                 (PORTB ^= (l))
sowie
1
LIGHT_ON(1<<PB1);
2
lcd_init(LCD_DISP_ON);                // initialize display, cursor off
3
LIGHT_OFF(1<<PB1);
und
1
LIGHT_ON(1<<PB0);
2
_delay_ms(500);
3
LIGHT_OFF(1<<PB0);
4
5
....
6
7
    while(1) {
8
        LIGHT_ON(1<<PB0);
9
10
        for(i=0;i<16;i++){
11
            lcd_puts("X");
12
            _delay_ms(300);
13
        }
14
        lcd_puts("\n");
15
        for(i=0;i<16;i++){
16
            lcd_puts("X");
17
            _delay_ms(200);
18
        }
19
20
        LIGHT_OFF(1<<PB0);
21
        _delay_ms(1000);
22
        lcd_clrscr();
23
    }
So ganz richtig ist das nicht. Ob das jetzt dein Problem ist weiß ich 
nicht... aber zumindest EIN Problem

von Peter S. (petershaw)


Lesenswert?

Hi Timmo, Hi Georg

da hast du recht. Zusammengeschustert. Es geb mal eine Definition 
LED_GREEN und LED_YELLOW.
Hab es wieder eingebaut, aber neee, das Problem ist es nicht.

Der Kabeltipp von Georg kann schon sein, bei meinem ersten Display ist 
es höchstens 12cm lang.

Der uC läuft mit externen 16Mhz.
Was benutze ich denn am Besten um die Distanz zu überbrücken?

von Wolfgang (Gast)


Lesenswert?

Peter Shaw schrieb:
> Denn ich kann den Fehler nicht finden.
Ohne den Schaltplan von deinem Aufbau ist das für Schaltungsfehler 
anhand des Mini-Photos auch nicht einfach.

von Georg G. (df2au)


Lesenswert?

Peter Shaw schrieb:
> Was benutze ich denn am Besten um die Distanz zu überbrücken?

Flachbandkabel ist schon in Ordnung. Aber bitte ohne Umwege und KURZ.

von Peter S. (petershaw)


Lesenswert?

Habe das Kabel auf 4cm gekürzt. Selber Effekt.

von Thomas E. (thomase)


Lesenswert?

Peter Shaw schrieb:
> Habe das Kabel auf 4cm gekürzt. Selber Effekt.
War auch nicht anders zu erwarten. Bei mir ist das Kabel 1/2 Meter lang 
und das Display funktioniert.

> #include <util/delay.h>
Wo ist denn F_CPU definiert?

mfg.

von Peter S. (petershaw)


Lesenswert?

F_cpu habe ich immer im makefile
16000000UL

von Thomas E. (thomase)


Lesenswert?

Kontrast richtig eingestellt?

mfg.

von Wolfgang (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Wo ist denn F_CPU definiert?

Spätestens in util.h
Dann sollte aber die Warnmeldung gekommen sein ;-)
1
#ifndef F_CPU
2
/* prevent compiler error by supplying a default */
3
# warning "F_CPU not defined for <util/delay.h>"
4
# define F_CPU 1000000UL
5
#endif

von Thomas E. (thomase)


Lesenswert?

Wolfgang schrieb:
> Thomas Eckmann schrieb:
>> Wo ist denn F_CPU definiert?
>
> Spätestens in util.h
> Dann sollte aber die Warnmeldung gekommen sein ;-)
>
>
1
#ifndef F_CPU
2
> /* prevent compiler error by supplying a default */
3
> # warning "F_CPU not defined for <util/delay.h>"
4
> # define F_CPU 1000000UL
5
> #endif
6
>

Wenn du hier seit mehr als drei Tagen mitliest, solltest du wissen, daß 
dies einer der absoluten Top-10 Fehler ist und die Warnings 
grundsätzlich nicht beachtet werden.

Mfg.

von Sebastian H. (technik_freak)


Lesenswert?

Kann die Ursache in dem Adapter liegen, wo das Flachbandkabel an die 
Stiftleiste übergeben wird? (Verbindung falsch gelegt oder sogar 
kurzgeschlossen?)

von Wolfgang (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Wenn du hier seit mehr als drei Tagen mitliest, solltest du wissen, daß
> dies einer der absoluten Top-10 Fehler ist und die Warnings
> grundsätzlich nicht beachtet werden.

Deshalb der Hinweis, dass util.h blöderweise ggf. einen Default-Wert 
setzt, der eine anständige Fehlermeldung verhindert, obwohl der Wert mit 
großer Wahrscheinlichkeit vollständiger Humbug ist ;-)

von Peter S. (petershaw)


Lesenswert?

Den Adapter habe ich gebaut um vom eigentlichen Board auf mein geprüftes 
dev- Board zu gehen. Und durchgemessen. Alles ok.

Habe gerade ein zweites Display geklickt, und versuche das letzte Teil 
auszutauschen, an dem es liegen könnte. Alles andere redundant geprüft.
Und  auch Kontrast und CPU tacktung geändert.

Ist doch echt merkwürdig, oder?
Hoffe Display kommt bald, bin echt wild drauf das in betrieb zu nehmen, 
ist das letzte Bauteil eines größeren Orojektes für meine Frau und 
beschäftigt mich seit Mittwoch...

von Peter S. (petershaw)


Lesenswert?

Fehler gefunden: Display war wirklich kaputt und im zweiten Board ein 
datapin überlagert.
Dank euch!

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.