Forum: Mikrocontroller und Digitale Elektronik Reset geht nicht


von Ein kleiner Bastler (Gast)


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.

von Helfer (Gast)


Lesenswert?

> 1N4148 nach +5V
> 4k7 nach +5V
> 10n nach GND

So?
           1N4148   4k7
Vcc 5V o----->|-----###---+---o RESET-Pin
                          |
GND    o---------||-------+
                 10n

Die 1N4148 ist richtig herum eingesetzt?

von Ein kleiner Bastler (Gast)


Angehängte Dateien:

Lesenswert?

So ist die Beschaltung...

von Fabian (Gast)


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

von Ein kleiner Bastler (Gast)


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?

von Klaus (Gast)


Lesenswert?

Ein kleiner Bastler schrieb:
> und eine eigene Delay-Routine

lass mich raten, du hast eine große Schleife gebastelt, die der 
Optimizer (zu Recht) einfach wieder rausgeschmissen hat.

von Ein kleiner Bastler (Gast)


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
}

von Tishima (Gast)


Lesenswert?

Hallo!

Nimm mal die Diode ganz raus oder dreh sie um.

gruß,
Bjoern

von Ein kleiner Bastler (Gast)


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
}

von Michael U. (amiga)


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

von Ein kleiner Bastler (Gast)


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
}

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.