Sida 1 av 1

styra HDA44780 med Atmega8 ger ingen vettig utskrift?

Postat: 16 april 2006, 16:43:03
av ASTRX
Nu har jag fastnat i mitt bygge, och det är LCD-styrningen som spökar. Jag använder mig at en Atmega8 samt en HDA44780-kompatibel LCD, men har stora problem med styrningen. Min kod verkar stämma och fungera, mina kopplingar borde vara korrekta, men det enda resultatet jag får på displayen är bara att pixlar över hela skärmen tänd och släcks i oregelbundna mönster. det är inte alltid hela teckenfönster som tänds och släcks.
jag kar koppat såhär men trimpot och grejer, om man bortser från LPT-porten:
Bild

min kod ser ut såhär:

main.c:

Kod: Markera allt

#include <avr/delay.h>
#include "lcd.h"

#define F_CPU 1000000
#define START_DELAY 1000

int main()
{

    _delay_ms(START_DELAY);

	init_display();
	
	while(1){
		printchar('A');
		printchar('l');
		printchar('s');
		printchar('k');
		printchar('a');
		printchar('l');
		printchar('l');
		printchar('a');
		printchar('r');
		printchar('e');
		printchar('A');
		printchar('l');
		printchar('s');
		printchar('k');
		printchar('a');
		printchar('l');
		printchar('l');
		printchar('a');
		printchar('r');

	}

	return 0;
}

lcd.c

Kod: Markera allt

#define DELAY 1000
#define CLR_DELAY 1000

void inline strobe()
{
	PORTD |= 0x01;         // E=1 ger puls
	_delay_ms(1000);  // Väntar då E regisreras
	PORTD &=~0x01;		  // E=0 avslutar puls
}


void clear_display()
{
	PORTD &=~0x02; 		  // RS=0 (instruktioner)
	PORTB=0b00000001; 		   
	strobe();
	_delay_ms(10000);
}


void init_display()
{
	DDRD=0x03;		  // Sätter port D till utport
	DDRB=0xFF;		  // Sätter port B till utport
	
	PORTD &=~0x02; 		  // RS=0 (instruktioner)
	PORTB=0b00001111; // Instruktionen för att starta 
	strobe();
	_delay_ms(10000);	  

	PORTB=0b00111000; // Instruktionen för function set 
	strobe();
	_delay_ms(10000);	 	  

	clear_display(); // Instruktion för att cleara display	   


}


void move_cursor(unsigned char adress)
{
	PORTD &=~0x02; 		  // RS=0 (instruktioner)
	PORTB=adress;	 	
	strobe();
	_delay_us(DELAY);

}

void printchar(unsigned char c)
{
	PORTD |= 0x02; 		  // RS=1 (data)
	PORTB=c;	 	 
	strobe();
	_delay_ms(DELAY);	 
}

kan det vara fel på min initiering?

Postat: 16 april 2006, 17:37:28
av $tiff
Du skulle kunna jämföra med denna, den fungerar.

Postat: 18 april 2006, 01:28:42
av ASTRX
blev samma fel med den koden. skitskumt. jag har kopplat allt rätt (vad jag vet). börjar tro att det är displayerna det är fel på men det låter ganska otroligt eftersom jag har testat med 2 st och båda kommer från sodjan här på forumet som alltid verkar kunna sina saker...dock får de två displayerna lite olika utskrifter: den ena får väldigt tydliga rader av halvtända teckenrutor, medans den andra får mr oregelbundna och skiftande styrka på mönstret. hur kan det komma sig?

jag har koppat databussen till PORTD, och RS,E,RW till PORTC.0, PORTC.2, PORTC.1. Spänningsmatning på VCC och AVCC. allt jord till jord.

vad fasen kan vara fel?

Postat: 18 april 2006, 01:52:57
av cykze
Stega igenom alla sekvenser du skickar till displayen och kontrollera att du får rätt spänningsnivåer vid displayen.

Postat: 18 april 2006, 02:08:59
av ASTRX
men hur ska jag stega igenom den? kan ju inte realtidsimulera (har en stk500), om det är det man behöver? är nybörjare så vore snällt om du ville utveckla lite.

Postat: 18 april 2006, 03:19:16
av $tiff
Kör ett kommando i taget. Antingen en väldigt lång paus mellan varje kommando eller en vänt-loop som väntar på någon annan lämplig input, du har ju gott om knappar på STK500 t.ex.

Postat: 18 april 2006, 03:29:37
av ASTRX
ja men jag måste ju flytta uC:n när jag ska testa den med displayen. antar att jag får ja väldigt långa pauser.
för finns det något sätt att programmera uC:n externt med stk500?
är ju jobbigt att flytta den hela tiden, det sliter ju...

Postat: 18 april 2006, 10:18:14
av sodjan
OK, lite nyfiken eftersom LCDn verkar ha kommit från mig...

Vilken LCD är det ? Konstigt att du inte har nämnt det...

Om du inte tänker *läsa* från LCDn så kan du lägga RW hög (eller låg,
minns inte vilket) så sparar du i alla fall en I/O pinne (och får en felkälla mindre).

Sen är det ju roligt att du upptäckt strulet med "off-circuit" programmering ! :-)
Försök och fixa så att du inte behöver flytta processorn mellan varje test-skott...

För övrigt vet jag inte, jag kommenterar sällan C-kod eftersom det ligger
utanför mitt kompetens (och intresse) område... :-)

Postat: 18 april 2006, 12:40:03
av ASTRX
Displayen är av typen EDT EW20400YR, samma som denna:

http://www.tradera.com/auction/aid_24406469

Ja RW-pinnen har jag testat att koppla till jord. spelar ingen roll.

ja det är ett hel**te att flytta uC:n hela tiden, men vet inte hur jag ska ordna det med stk500. får väl köpa en separat ISP-programmerare.

men vore bra om det gick att lösa på annat sätt.

sodjan, du har inte den exempelkod som du testar displayen med på bilden?
skulle kanske gå att klura ut med hjälp av den vart jag har gjort bort mig. assembler eller C spelar ingen roll.

Postat: 18 april 2006, 12:47:31
av DeVille
I denna filen ligger det exempel kod, är iofs avsedd för AT90S8515
men det skiljer nog inte så mycket.

Lycka till.

Microdatorer.zip

Länk till filen finns även på wikin, under allmänt om microkontrollers. Längst ner.

Jag kan köra min AVR i STK500 an iaf. använder portarna på STK:n för att föra över till exvis breadboarden.

Postat: 18 april 2006, 12:55:34
av sodjan
OK.
Jag har koden till det som syns i auktionen. ASM till PIC16F630
Inte speciellt snygg eller optimerad kod, och mycket
är gjort "safe", d.v.s sannlikt mycket med delays och NOP's
än nödvändigt. Garanterat fritt från kommenterer och annat "skräp" :-)

PM'a sin mailadress så skickar jag en kopia...
EDIT : gjort...

Postat: 18 april 2006, 14:55:23
av ASTRX
DeVille skrev:Jag kan köra min AVR i STK500 an iaf. använder portarna på STK:n för att föra över till exvis breadboarden.
Ja man kan ju iofs koppla in sig på header-kontakterna på STK:n. vad använder du för kabel/kontakter till det i så fall? Elfa artikelnr?

sodjan: du använder 4bitars interface ser jag, blir ju lite klurigare då...tycker det är ruksigt knepigt att det inte fungerar men den testkoden som nån länkade till i ett tidigare inlägg. den ska ju beviserligen fungera på en atmega8. och jag kan inte inbilla mig att jag kopplat fel, det är ju inte det som är det svåra.

Postat: 18 april 2006, 17:09:25
av sodjan
En vild gissning bara...

Jag vet inte hur AVR fungerar, men på (många) PIC processorer
måste man ibland själv stänga av vissa enheter (ADC eller komparator)
eftersom respektive pinnar är "analoga" efter en reset.

Har du kollat så att inte pinnarna är "upptagna" av något annat ?

Postat: 19 april 2006, 10:40:25
av DeVille
Använder flatkabel samt sådana 10poliga kontakter som du hittar på exvis moderkort.. anslutning till firewire, eller serieporten.

Hittar inte på elfa för tillfället. ska kolla i datorn om inte beställningslistan finns kvar nånstans.