Reset geht nicht

Gast #2125325
Lesenswert?

Hallo,
mein µC ist ein ATmega128,
im Moment ist nur ein HD44780 LCD im 4-Bit Modus dran.
Leider startet mein kleines Programm Hallo Welt nur richtig, wenn der 
AVRISP MKII dran hängt.
Wenn der nicht dran hängt, muß ich den Reset-Taster drücken.
Die Reset Pin Beschaltung die ich auf der Platine vorgefunden habe:
1N4148 nach +5V
4k7 nach +5V
10n nach GND

Habe jetzt 100k & 10µF drin, hat auch keine Besserung gebracht.
Gast #2125430
Lesenswert?

Das Problem ist, dass Du das Display zu früh ansprichst, es ist dann 
noch nicht bereit Daten zu empfangen. Das hat mit dem Reset Pin ansich 
erstmal nichts zu tun.

Wenn der MKII dran ist, führt der Controller nach ca 1/2 Sek. noch einen 
weiteren Reset durch. Dann ist auch das Display soweit.

Warte mal einen Moment mit deinem Programmablauf zum start. (z.b. durch)
1
_delay_ms(100);

Dann klappts auch...
Gast #2125487
Lesenswert?

Fabian schrieb:
> Warte mal einen Moment mit deinem Programmablauf zum start. (z.b. durch)
> _delay_ms(100);
> Dann klappts auch...

1. Ich hatte mir sowas schon gedacht und eine eigene Delay-Routine 
aufgerufen.
Bringt aber leider auch nix.

2. was muss ich includen damit ich
1
_delay_ms(100);
 benutzen kann?
Gast #2125550
Lesenswert?

Klaus schrieb:
> lass mich raten, du hast eine große Schleife gebastelt, die der
> Optimizer (zu Recht) einfach wieder rausgeschmissen hat.
1
void Pause(volatile unsigned long int i)
2
{
3
    for(;i;i--)
4
    {
5
    asm volatile("NOP"); //1
6
    asm volatile("NOP"); //2
7
    asm volatile("NOP"); //3
8
    asm volatile("NOP"); //4
9
    asm volatile("NOP"); //5
10
    asm volatile("NOP"); //6
11
    asm volatile("NOP"); //7
12
    asm volatile("NOP"); //8
13
    }
14
}
Gast #2125612
Lesenswert?

Tishima schrieb:
> Hallo!
>
> Nimm mal die Diode ganz raus oder dreh sie um.

Habe den Eindruck, des Fehler liegt woanders
1
void LCD_Init()
2
{
3
    LCD_Instruction(40);  //Function Set (4 bits)
4
    LCD_Instruction(40);  //Function Set (4 bits)
5
    LCD_Instruction(40);  //Function Set (4 bits)
6
    LCD_Instruction(1);    //Display clear
7
    Pause(2000);
8
    LCD_Instruction(2);    //Cursor home
9
    Pause(2000);
10
    LCD_Instruction(6);    //Entry mode (increment/display freeze)
11
    LCD_Instruction(12);  //Display on/off control (oder 14 !)
12
}
#2125668
Lesenswert?

Hallo,

wenn es wirklich ein HD44780 ist, stimmt da garnichts.

Erstmal 50ms warten.

0x3 an die Datenleitungen legen
E-Clock
5ms warten
E-Clock
5ms warten
E-Clock
5ms warten.

Das sendet 3x 0x30 mit Pausen an das Display im 8-Bit-Mode!
Die nicht angeschlossenen unteren 4 Bit werden vom Display ignoriert.
Das ist der Software-Reset für das Display, einige 44870-kompatible 
haben eine interne Resetsteuerung, da kann man das theoretisch 
weglassen.

0x2 an die Displaydaten
E-Clock

Hier erfolgt die Umschaltung auf 4 Bit (immernoch im 8-Bit-Mode des 
Display, also nicht das untere Nibble auch senden...

An jetzt sind wir im 4-Bit-Mode und ab jetzt müssen beide Nibble 
gesendet werden.

0x28 senden (bei 2-Zeilen-Display
0x01 Display löschen

usw. usw.

PS: die Wartezeiten sind aus einer Source von mir, die genauen stehen im 
Datenblatt des HD44780

Gruß aus Berlin
Michael
Gast #2126856
Lesenswert?

Jetzt geht es!
1
void LCD_Init()
2
{
3
  for(unsigned char n=3;n;n--)
4
  {
5
    PORTE = (PORTE & 0x0F) | 0x30;
6
    LCD_Load_puls();
7
    Pause(5000);
8
  }
9

10
  PORTE = (PORTE & 0x0F) | 0x20;
11
  LCD_Load_puls();
12
  Pause(5000);
13

14
    LCD_Instruction(0x01);  //Display clear
15
    Pause(2000);
16
    LCD_Instruction(0x02);  //Cursor home
17
    Pause(2000);
18
    LCD_Instruction(0x06);  //Entry mode (increment/display freeze)
19
    LCD_Instruction(0x0C);  //Display on/off control (oder 14 !)
20
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren