Forum: Mikrocontroller und Digitale Elektronik LCD-Display mit s6a0069 Controllter und Atmega 32


von Benjamin N. (riveda)


Lesenswert?

Hallo Leute,

Ich versuche seit ner Woche mein LCD Display zu initialisieren.
Leider hab ich echt keine idee wieso es nicht funktioniert.
Hab mir das 
Datenblatt(http://www.elpro.org/Images/html/Punktmatrixmodule/DEM16226SYH-LY.pdf)
angeguckt und auch die beiträge hier um forum zum s6a0069 gelesen.

meine intialisierung sieht bis jetzt so aus:

#include <avr/io.h>
#include <stdint.h>
#include <stdio.h>
#include <inttypes.h>
#include <util/delay.h>

#include <avr/signal.h>


  #define F_CPU 4000000           /* Oszillator-Frequenz in Hz */

int i;

int main ()
{
i=0;

DDRC=0b11111111;
DDRB=0b00000111;
DDRD=0b11110001;
_delay_ms(1000);
//funktion set
PORTB=0b00000000;
PORTC=0b00111000;
_delay_ms(1000);
PORTB=0b00000001;
_delay_ms(1000);
PORTB=0b00000000;

PORTB=0b00000000;
PORTC=0b00110000;
_delay_ms(1000);
PORTB=0b00000001;
_delay_ms(1000);
PORTB=0b00000000;
_delay_ms(1000);

PORTB=0b00000000;
PORTC=0b00111000;
_delay_ms(1000);
PORTB=0b00000001;
_delay_ms(1000);
PORTB=0b00000000;

PORTB=0b00000000;
PORTC=0b00111000;
_delay_ms(1000);
PORTB=0b00000001;
_delay_ms(1000);
PORTB=0b00000000;

PORTC=0b00001111;
_delay_ms(1000);
PORTB=0b00000001;
_delay_ms(1000);
PORTB=0b00000000;


_delay_ms(1000);
PORTB=0b00000000;
PORTC=0b00000001;
_delay_ms(1000);
PORTB=0b00000001;
_delay_ms(1000);
PORTB=0b00000000;
_delay_ms(1000);

PORTB=0b00000000;
PORTC=0b00000110;
_delay_ms(1000);
PORTB=0b00000001;
_delay_ms(1000);
PORTB=0b00000000;
//init ende

_delay_ms(1000);


for(;;)
{
if(i%2==0)
{
PORTD=0b11110001;
_delay_ms(1000);
}
else
{
PORTD=0b00000000;
_delay_ms(1000);
}
i++;
}

return(0);
}
hab es mit verschiedenen delay times versucht. auf 1000 steht es jetzt 
eigentlich nur wegen des letzten tests
Aber bei dem Display tut sich einfach garnichts.
Würd mich über nen bissi hilfe freun.

von roboterheld (Gast)


Lesenswert?

..._delay_ms(1000)....

die 1000 gibt es nicht bei dir mit 4mhz. schau mal ins tut. da gibt es 
eine berechnungsformel für.

von Werner B. (Gast)


Lesenswert?

...und wo ist die Soße zu dem Spagetticode?

Sorry, aber dieses Durcheinander von Zahlen und Bits fummelt dir niemand 
auseinander. Dafür gibt es #define. Dann kann auch jemand nachvollziehen 
was du dem Display mitzuteilen versuchst.

von Benjamin N. (riveda)


Lesenswert?

ja auf 1000 steht es nur weil ich verschiedene werte durchprobiert habe 
und 1000 ja auf jedenfall laaaang genug ist.

So ich habn mal die einzelnen kommentare eingefügt

// init ports
DDRC=0b11111111;//datenbits
DDRB=0b00000111;//steuerbits
DDRD=0b11110001;//out für LEDS

_delay_ms(1000);

//funktion set 1
PORTB=0b00000000;
PORTC=0b00111000;
_delay_ms(1000);

//übermahme
PORTB=0b00000001;
_delay_ms(1000);
PORTB=0b00000000;

//funktion set 2
PORTB=0b00000000;
PORTC=0b00110000;
_delay_ms(1000);

//übernahme
PORTB=0b00000001;
_delay_ms(1000);
PORTB=0b00000000;
_delay_ms(1000);

//funktion set 3
PORTB=0b00000000;
PORTC=0b00111000;
_delay_ms(1000);

//übernahme
PORTB=0b00000001;
_delay_ms(1000);
PORTB=0b00000000;


//funktion set
PORTB=0b00000000;
PORTC=0b00111000;
_delay_ms(1000);

//übernahme
PORTB=0b00000001;
_delay_ms(1000);
PORTB=0b00000000;

//display control
PORTC=0b00001111;
_delay_ms(1000);

//übermahme
PORTB=0b00000001;
_delay_ms(1000);
PORTB=0b00000000;

//display clear
_delay_ms(1000);
PORTB=0b00000000;
PORTC=0b00000001;
_delay_ms(1000);

//übernahme
PORTB=0b00000001;
_delay_ms(1000);
PORTB=0b00000000;
_delay_ms(1000);


//entry mode set
PORTB=0b00000000;
PORTC=0b00000110;
_delay_ms(1000);

//übernahme
PORTB=0b00000001;
_delay_ms(1000);
PORTB=0b00000000;
//init ende

_delay_ms(1000);

von Frank B. (frank_b) Benutzerseite


Lesenswert?

Nochmal :-)

_delay_ms(1000);

GEHT_NICHT :-)

lg, Frank

von Benjamin N. (riveda)


Lesenswert?

nochmal: ich hab das auch schon mit 50ms 5ms und 2ms und 1ms und 
überhaubt ausprobiert und auch in verschieden kombinationen , weil ja 
z.B clear länger braucht

auf 1000 steht es NUR weils das letzte war was ich getestet habe.



// init ports
DDRC=0b11111111;//datenbits
DDRB=0b00000111;//steuerbits
DDRD=0b11110001;//out für LEDS

_delay_ms(50);

//funktion set 1
PORTB=0b00000000;
PORTC=0b00111000;
_delay_ms(2);

//übermahme
PORTB=0b00000001;
_delay_ms(2);
PORTB=0b00000000;

//funktion set 2
PORTB=0b00000000;
PORTC=0b00110000;
_delay_ms(2);

//übernahme
PORTB=0b00000001;
_delay_ms(2);
PORTB=0b00000000;
_delay_ms(2);

//funktion set 3
PORTB=0b00000000;
PORTC=0b00111000;
_delay_ms(2);

//übernahme
PORTB=0b00000001;
_delay_ms(2);
PORTB=0b00000000;


//funktion set
PORTB=0b00000000;
PORTC=0b00111000;
_delay_ms(2);

//übernahme
PORTB=0b00000001;
_delay_ms(2);
PORTB=0b00000000;

//display control
PORTC=0b00001111;
_delay_ms(5);

//übermahme
PORTB=0b00000001;
_delay_ms(2);
PORTB=0b00000000;

//display clear
_delay_ms(2);
PORTB=0b00000000;
PORTC=0b00000001;
_delay_ms(2);

//übernahme
PORTB=0b00000001;
_delay_ms(2);
PORTB=0b00000000;
_delay_ms(2);


//entry mode set
PORTB=0b00000000;
PORTC=0b00000110;
_delay_ms(2);

//übernahme
PORTB=0b00000001;
_delay_ms(2);
PORTB=0b00000000;
//init ende

_delay_ms(2);


//so die 1000 währe dann raus, aber ändert nix

von holger (Gast)


Lesenswert?

So geht das:

  #define F_CPU 4000000           /* Oszillator-Frequenz in Hz */
//#define F_CPU unbedingt VOR dem nächsten include machen !!!!

#include <util/delay.h>

unsigned int i;

for(i=0; i<1000; i++) { _delay_ms(1); }

von Benjamin N. (riveda)


Lesenswert?

danke erstmal für die schnellen antworten.


oki das meine delay nicht richtig war, hab ich ja verstanden.
aber auch mit den for schleifen hat sich  noch nix geändert.

das problem muss irgendwo ander liegen


for(i=0; i<50; i++) { _delay_ms(1); }

//funktion set 1
PORTB=0b00000000;
PORTC=0b00111000;
for(i=0; i<2; i++) { _delay_ms(1); }

//übermahme
PORTB=0b00000001;
for(i=0; i<2; i++) { _delay_ms(1); }
PORTB=0b00000000;

//funktion set 2
PORTB=0b00000000;
PORTC=0b00110000;
for(i=0; i<2; i++) { _delay_ms(1); }

//übernahme
PORTB=0b00000001;
for(i=0; i<2; i++) { _delay_ms(1); }
PORTB=0b00000000;
for(i=0; i<2; i++) { _delay_ms(1); }

//funktion set 3
PORTB=0b00000000;
PORTC=0b00111000;
for(i=0; i<2; i++) { _delay_ms(1); }

//übernahme
PORTB=0b00000001;
for(i=0; i<2; i++) { _delay_ms(1); }
PORTB=0b00000000;


//funktion set
PORTB=0b00000000;
PORTC=0b00111000;
for(i=0; i<2; i++) { _delay_ms(1); }

//übernahme
PORTB=0b00000001;
for(i=0; i<2; i++) { _delay_ms(1); }
PORTB=0b00000000;

//display control
PORTC=0b00001111;
for(i=0; i<5; i++) { _delay_ms(1); }

//übermahme
PORTB=0b00000001;
for(i=0; i<2; i++) { _delay_ms(1); }
PORTB=0b00000000;

//display clear
for(i=0; i<2; i++) { _delay_ms(1); }
PORTB=0b00000000;
PORTC=0b00000001;
for(i=0; i<2; i++) { _delay_ms(1); }

//übernahme
PORTB=0b00000001;
for(i=0; i<2; i++) { _delay_ms(1); }
PORTB=0b00000000;
for(i=0; i<2; i++) { _delay_ms(1); }


//entry mode set
PORTB=0b00000000;
PORTC=0b00000110;
for(i=0; i<2; i++) { _delay_ms(1); }

//übernahme
PORTB=0b00000001;
for(i=0; i<2; i++) { _delay_ms(1); }
PORTB=0b00000000;
//init ende

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.