Forum: Mikrocontroller und Digitale Elektronik ATmega16 / 8 to LCD


von Jey B. (jeybee)


Angehängte Dateien:

Lesenswert?

Moin moin,

Ich bin hier am verzeifeln. Ich weiss echt nicht mehr weiter:
Ich habe hier sechs LCDs von myavr.de bestellt, um diese auf eine 
selbsterstelle Experimentierplatine zu montieren. Auf der Platine 
befindet sich ein ATmega16 (16MHz) und ich benutze die Peter Fleury 
Library (LCD ist HD44780 kompatibel).
Ich kriege das LCD auf der Platine mit dem ATmega16 einfach nicht zum 
laufen. Deswegen habe ich auf einer Platine, die ich eh noch zu 
testzewcken brauchen werde das selbige LCD mit einem ATmega8 aufgebaut. 
Diese Schaltung lläuft prima und das LCD macht seine Dienste. Wenn ich 
das Programm so uumschreibe, dass ich es auf der Platine mit dem m16 
benutze könnte, ffunktioniert dort jedoch nichts.
Wie gesagt, ich bin ratlos. Könnt ihr mir helfen?


lcd.h:
http://pastebin.com/FQ5ZgWgQ

lcd-main.c:
http://pastebin.com/0ZXQWmrH

Und hier noch der Ausschnitt des Schaltplanes (Anhang).


Vielen Dank im Voraus.

Greez Jey

von Anderer Gast (Gast)


Lesenswert?

Hallo,

hast du bei den Fuses das JTAG Interface deaktiviert?

Gruß

von Jey B. (jeybee)


Lesenswert?

Jap.

von Jey B. (jeybee)


Lesenswert?

Also die fuses hab ich soweit eigentlich richtig eingestellt:

High:  0xD9
Low:   0xFF



Greez Jey

von Frank K. (fchk)


Lesenswert?

Teste es doch mal mit einer LED, ob Du alle Portpins richtig ansteuern 
kannst (reihum überall anklemmen und sehen, ob es blinkt). Dann weißt Du 
schon mal mehr.

fchk

von Jey B. (jeybee)


Lesenswert?

Hey,

also, ich habe jetzt mal an alle 7 Pins eine LED gegen Masse geschaltet. 
Anschliessend musste ich feststellen, dass an E, RW, RS jeweils nur rund 
1.4V anliegen. Die Db0 - Db3 haben jeweils ca. 4V.
Kann das daran liegen, dass die mit einer hohen Frequenz angesteuert 
werden, und darum das ganze eine art PWM wird?

Der Controller ist übrigends Fabrikneu und ein neuer hat auch nichts 
gebracht.



Greez Jey

von Rolf D. (rolfdegen)


Lesenswert?

Hallo

Um die Portpins mit dem Led zu testen, solltest du ein kleines 
Testprogramm schreiben, das unabhängig von der LCD-Routinen die 
einzelnen Portpins ansteuert. Innerhalb des LCD-Programms ist das mit 
einer Led kaum möglich.

Led-Testprogramm:
1
#define     DF_CPU 1000000           // Taktfrequenz ATmega 1MHz
2
#include    <avr/io.h>               // AVR Register und Konstantendefinitionen
3
#include    <util/delay.h>           // Bibliothek mit Warteroutinen (es wird kein Timer im ATmega verwendet)
4
5
// Main-Programm
6
int main (void)
7
 {
8
  DDRA |= (1<<DDA4);    // Portpins auf Ausgang
9
  DDRA |= (1<<DDA5);
10
  DDRC |= (1<<DDC1);
11
  DDRC |= (1<<DDC2);
12
  DDRC |= (1<<DDC4);
13
  DDRC |= (1<<DDC5);
14
  DDRC |= (1<<DDC6);
15
  DDRC |= (1<<DDC7);
16
17
// Programmschleife
18
  while(1)
19
  {
20
        PORTA |= (1<<PA4);     // Portpin auf high
21
        PORTA |= (1<<PA5);     // Portpin auf high
22
        PORTC |= (1<<PC1);     // Portpin auf high
23
        PORTC |= (1<<PC2);     // Portpin auf high
24
        PORTC |= (1<<PC4);     // Portpin auf high
25
        PORTC |= (1<<PC5);     // Portpin auf high
26
        PORTC |= (1<<PC6);     // Portpin auf high
27
        PORTC |= (1<<PC7);     // Portpin auf high
28
        _delay_ms(500);
29
        PORTA &=~(1<<PA4);     // Portpin auf low
30
        PORTA &=~(1<<PA5);     // Portpin auf low
31
        PORTC &=~(1<<PC1);     // Portpin auf low
32
        PORTC &=~(1<<PC2);     // Portpin auf low
33
        PORTC &=~(1<<PC4);     // Portpin auf low
34
        PORTC &=~(1<<PC5);     // Portpin auf low
35
        PORTC &=~(1<<PC6);     // Portpin auf low
36
        PORTC &=~(1<<PC7);     // Portpin auf low
37
        _delay_ms(500);
38
  return 0;
39
        }
40
 }

Gruß Rolf

von JeyBee66 (Gast)


Lesenswert?

Hi,

Als erstes habe ich das Programm eben kurz vereinfacht:
1
#include    <avr/io.h>               // AVR Register und Konstantendefinitionen
2
#include    <util/delay.h>           // Bibliothek mit Warteroutinen (es wird kein Timer im ATmega verwendet)
3
4
// Main-Programm
5
int main (void)
6
 {
7
  DDRC = 0xFF;
8
  DDRA = 0xFF;
9
  DDRD = 0xFF;
10
11
// Programmschleife
12
  while(1)
13
  {
14
        PORTA ^= (1<<PA4);     // Portpin auf high
15
        PORTA ^= (1<<PA5);     // Portpin auf high  //Das ist das Backlight...
16
        PORTC ^= (1<<PC1);     // Portpin auf high
17
        PORTC ^= (1<<PC2);     // Portpin auf high
18
        PORTC ^= (1<<PC4);     // Portpin auf high
19
        PORTC ^= (1<<PC5);     // Portpin auf high
20
        PORTC ^= (1<<PC6);     // Portpin auf high
21
        PORTC ^= (1<<PC7);     // Portpin auf high
22
        _delay_ms(500);
23
  }
24
  return 0;
25
}


Die LEDs blinken jetzt im 500ms Takt....
Wie gesagt, die Leitungen sind okay.

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.