Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  16 1639
Her er linken til første forsøk på å drive LCD fra atmega8

http://www.youtube.com/watch?v=yufM8AijHRo

Kvaliteten på videoen ble heller skrøpelig, det samme vil vel
mange si om programmet ( C koden ) jeg skrev.

Kode

#define F_CPU 16000000	//Klokkefrekvens

#include <avr/io.h>
#include <util/delay.h>	//Header for _delay_ms()

int main(){
	DDRD = 0xFF;
	DDRC = 0xFF;		//Sett alle pinner på PORT() til utganger
	PORTD = 0xFF;
	PORTC = 0x00;
	int tid = 10;        //Ventetid mellom tegn
	int tell = 0;
	
			
      	PORTD = 56;     //sett 2 linjer
		PORTC = 4;
		_delay_ms(tid);
		PORTC = 0 ;
		_delay_ms(tid);
		tell++;		


while(1){
	    	
	



        PORTC = 0;
		PORTD = 0;
		_delay_ms(tid);
		 
		PORTD = 15;   //Slå på display
		PORTC = 4;    //E
		_delay_ms(tid);

		PORTD = 15;
		PORTC = 0;

		_delay_ms(tid);


		PORTC = 2;    //RS=1
		_delay_ms(tid);

		PORTD = 65;    //A
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);

		PORTD = 116;   //t
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);

		PORTD = 109;   //m
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);

		PORTD = 101;     //e
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);

     	PORTD = 108;     //l
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);

   

	    PORTD = 254;     //space
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);

		PORTD = 65;    //A
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);

		PORTD = 84;   //T
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);

		PORTD = 109;   //m
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);

		PORTD = 101;     //e
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);

     	PORTD = 103;     //g
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);

    	PORTD = 97;     //a
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);

    	PORTD = 56;     //8
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);

	    PORTD = 192;     //linje 2
		PORTC = 4;
		_delay_ms(tid);
		PORTC = 0 ;
		_delay_ms(tid);


    	PORTD = 38;     //&
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);

	    PORTD = 254;     //space
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);

	    PORTD = 76;     //L
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);


     	PORTD = 67;     //C
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);


    	PORTD = 68;     //D
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);


	    PORTD = 254;     //space
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);


	    PORTD = 72;     //H
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;

	    PORTD = 68;     //D
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);


    	PORTD = 52;     //4
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);

    	PORTD = 52;     //4
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);

    	PORTD = 55;     //7
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);

    	PORTD = 56;     //8
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);

    	PORTD = 48;     //0
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(tid);

	    PORTD = 254;     //space
		PORTC = 6;
		_delay_ms(tid);
		PORTC = 2 ;
		_delay_ms(200);





tell = 0;




		while(tell < 15){

		
      	PORTD = 24;     //space
		PORTC = 4;
		_delay_ms(tid);
		PORTC = 0 ;
		_delay_ms(tid);
		tell++;
     
	}
	tell =0;

		while(tell < 15){
		
      	PORTD = 28;     //space
		PORTC = 4;
		_delay_ms(tid);
		PORTC = 0 ;
		_delay_ms(tid);
		tell++;
     
	}
	tell =0;

		PORTD = 1;    //D
		PORTC = 0;
		_delay_ms(tid);
		PORTC = 4 ;
		_delay_ms(200);
	}

}
Til de som kan dette langt bedre, kom med råd og tips.

Koden er litt sånn bit for bit, byte for byte.
Hvis man klarer lære sen det enkle, er muligheten for å lære seg
litt mere kompliserte ting større.

Displayets data innganger er koblet rett mot PORTD, R/W, RS og E er koblet
til PIN0, PIN1 og PIN2 ( i samme rekkefølge ) på PORTC

Displayet som brukes kan finnes hos EBAY, søkefrase HD44780
HD44780 er navnet på standarden som brukes til å sende informasjonen.

Nyttige linker:

http://www.dinceraydin.com/djlcdsim/djlcdsim.html
http://www.wekers.com.br/ml/datasheet/Display_162A.pdf
http://joshuagalloway.com/lcd.html
Godt gjort å skrive alt på egenhånd! Men det finnes ferdige librarys du kan bruke..
http://homepage.hispeed.ch/peterfleu...-software.html
Se litt lenger ned under "LCD library for HD44870 based LCD's", med manual og download link.
Trådstarter
Noen som har enkle program ( c code ) som passer for 8-bit mode LCD ?
Sitat av asmika Vis innlegg
Noen som har enkle program ( c code ) som passer for 8-bit mode LCD ?
Vis hele sitatet...
Bare av ren nyskjerrighet, og det er ikke off topic, men likevel ikke svar på spørsmålet ditt: Hvorfor ønsker du å "sløse" ekstra utganger på å drive en LCD i 8-bit mode?
Trådstarter
Sitat av capidog Vis innlegg
Bare av ren nyskjerrighet, og det er ikke off topic, men likevel ikke svar på spørsmålet ditt: Hvorfor ønsker du å "sløse" ekstra utganger på å drive en LCD i 8-bit mode?
Vis hele sitatet...
Har råd til å sløse bort fire extra utganger

Starter med helt enkle ting til å begynne med, så får tiden vise om jeg etterhvert tar kontroll over hver enkel pixel, i fire bit mode.
Sitat av asmika Vis innlegg
Har råd til å sløse bort fire extra utganger
...
Vis hele sitatet...
Bakgrunnen for spørsmålet er at de fleste ikke bruker flere utganger enn nødvendig. De fleste libraries bruker 4-bit modus av denne grunnen, så jeg lurte på om det var et ekstra poeng med 8-bit i ditt tilfelle.

I 4-bit modus sender du en nibble om gangen, så du får to operasjoner pr byte. Det er ellers ingen forskjell i funksjonaliteten.

Hvis du har lyst til å ta den et hakk lenger så bruker du et shift-register og overfører bit for bit. Det finnes mange tegninger på dette, og gir deg en liten ekstra programmeringsutfordring.
Trådstarter
Sitat av capidog Vis innlegg
Bakgrunnen for spørsmåle
Vis hele sitatet...
En plass måtte jeg nesten starte, helst på ett nivå jeg anså som lettest å forstå. Hvis tiden strekker til håper jeg å lære meg mere. Har liggende noen ATmega8 og venter inn enn liten bunke LCD nærmeste dagene.

C programering er rimelig nytt for meg, men programmerte en god del basic allerede i 1980
Sitat av asmika Vis innlegg
En plass måtte jeg nesten starte, helst på ett nivå jeg anså som lettest å forstå.
...
Vis hele sitatet...
Det er ikke noe vanskeligere med 4-bit vs 8-bit LCD. Den eneste forskjellen er hvordan du skriver dataene til displayet.

Her er et library som viser både 4-bit og 8-bit:

http://winavr.scienceprog.com/exampl...d-library.html

Hvis du ser på rutinen LCDsendChar(uint8_t ch), så ser du tydelig forskjell på 4/8 bit. Alt annet er likt mellom 4/8-bit.
Trådstarter
Sitat av capidog Vis innlegg
Det er ikke noe vanskeligere med 4-bit vs 8-bit LCD. Den eneste forskjellen er hvordan du skriver dataene til displayet.

Her er et library som viser både 4-bit og 8-bit:

http://winavr.scienceprog.com/exampl...d-library.html

Hvis du ser på rutinen LCDsendChar(uint8_t ch), så ser du tydelig forskjell på 4/8 bit. Alt annet er likt mellom 4/8-bit.
Vis hele sitatet...
Ser nytteverdien, men sliter ennå litt med å få tatt i bruk sånne library
Du kan vel med fordel lage en funksjon ala;

void write_display(char display_value,int tid)
{
PORTD = display_value;
PORTC = 6;
_delay_ms(tid);
PORTC = 2 ;
_delay_ms(tid);
}
Trådstarter
Sitat av kme Vis innlegg
Du kan vel med fordel lage en funksjon ala;

void write_display(char display_value,int tid)
{
PORTD = display_value;
PORTC = 6;
_delay_ms(tid);
PORTC = 2 ;
_delay_ms(tid);
}
Vis hele sitatet...
Helt klart, men er i startgropa ennå

Sliter noe med den tilsynelatende kryptiske måten ting gjøres på.
void tilsvare noe ala subrutiner i basic, tror jeg
"void" sier bare at funksjonen "write_display" ikke skal returnere noen verdi. Det kan erstattes med en annen variabeltype, slik som char, int osv, hvis du vil returnere en verdi av denne typen.
Sist endret av Provo; 13. januar 2011 kl. 21:51.
Anbefaler altså det library'et jeg linket til over her, brukte det i dag og det fungerte strålende. Du laster ned mappen med lcd.c og lcd.h filen. Hvis du bruker avr-gcc i avr studio så må du bare høyreklikke på mappen for source files til venstre i avrstudio og legge til lcd.c. H-filen inkluderer du øverst som #include "lcd.h". Begge filene må ligge i samme mappe som prosjektet ditt. Nå redigerer du h-fila, veldig enkelt, står forklart i linken jeg ga deg. Husk å initialisere lcd modulen med lcd_init(parametre) før du begynner å bruke resten av funksjonene

edit: og ja, dette biblioteket støtter ikke 8 bit i/o mode som du vil, men det merker jo uansett ikke du noe til når du bruker ferdige funksjoner. Og du sparer 4 utganger
Sist endret av wanna-b; 16. januar 2011 kl. 04:57.
Trådstarter
Sitat av wanna-b Vis innlegg
Anbefaler altså det library'et jeg linket til over her, brukte det i dag og det fungerte strålende. Du laster ned mappen med lcd.c og lcd.h filen. Hvis du bruker avr-gcc i avr studio så må du bare høyreklikke på mappen for source files til venstre i avrstudio og legge til lcd.c. H-filen inkluderer du øverst som #include "lcd.h". Begge filene må ligge i samme mappe som prosjektet ditt. Nå redigerer du h-fila, veldig enkelt, står forklart i linken jeg ga deg. Husk å initialisere lcd modulen med lcd_init(parametre) før du begynner å bruke resten av funksjonene

edit: og ja, dette biblioteket støtter ikke 8 bit i/o mode som du vil, men det merker jo uansett ikke du noe til når du bruker ferdige funksjoner. Og du sparer 4 utganger
Vis hele sitatet...
Har planer om å få til bruk av library'et, etterhvert, men ting tar litt (for lang ) tid. Skal lodde samme nytt kort så snart de nye LCDen ligger i postkassen, og da satser jeg på 4 bit mode. Kortet jeg startet med denne gangen var i utganspunktet ment for å eksperimentere med LED ( på hele portd ) Så derfor så det bare litt naturlig ut å feste LCDeen til de samme beina på kretsen.

Har også bygget ett voltmeter med 3x7segment display, der jeg la inn en ferdig code fra leverandøren. Men ønsker helst å lære å bygge programmer fra starten.
En ting som kanskje er verd å nevne er at det er mer koding for 4-bit mode enn 8-bit mode..
Sitat av Skummetmelk Vis innlegg
En ting som kanskje er verd å nevne er at det er mer koding for 4-bit mode enn 8-bit mode..
Vis hele sitatet...
Personlig synes jeg ikke dette er noe å nevne, for det er en bagatell.

Som tidligere dokumentert i tråden er det kun ved sending av data til displayet at rutinen blir forskjellig, fordi man sender en nibble om gangen. Dette betyr 2 operasjoner for å sende 1 byte.

Å kode noen få linjer ekstra (om man ikke bruker et ferdig library) for å spare 4 I/O-porter er en veldig god investering i mikrokontrollersammenheng.
Trådstarter
Sitat av capidog Vis innlegg
Personlig synes jeg ikke dette er noe å nevne, for det er en bagatell.
Vis hele sitatet...
Jeg synes nå i starten att det er svært greit med 8bit. Istedet for å se nærmere på library valgte jeg å skrive om koden, slik att det nå kan brukes til voltmeter.
Planlegger å bruke ennå en analog inngang, der det forsåvidt blir målt spenning, men da over en motstand, for derfra og beregne strømmen. ( overvåkning volt ampere ) og kanskje gå videre til styring i en strømforsyning lik denne http://tuxgraphics.org/electronics/2...upply-v3.shtml

Men satser på å skrive en kode i størst mulig grad selv, for forståelsen sin del.

PS Har ennå bare brukt 12 av portene, så jeg har ennå litt å gå på.
Sist endret av asmika; 18. januar 2011 kl. 18:40.