styra HDA44780 med Atmega8 ger ingen vettig utskrift?

Lysdioder, Optiska sensorer, Fiberoptik, Displayer, Lasrar, Optiska kopplare
ASTRX
Inlägg: 68
Blev medlem: 12 januari 2005, 16:58:13

styra HDA44780 med Atmega8 ger ingen vettig utskrift?

Inlägg 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?
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Du skulle kunna jämföra med denna, den fungerar.
ASTRX
Inlägg: 68
Blev medlem: 12 januari 2005, 16:58:13

Inlägg 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?
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Stega igenom alla sekvenser du skickar till displayen och kontrollera att du får rätt spänningsnivåer vid displayen.
ASTRX
Inlägg: 68
Blev medlem: 12 januari 2005, 16:58:13

Inlägg 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.
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg 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.
ASTRX
Inlägg: 68
Blev medlem: 12 januari 2005, 16:58:13

Inlägg 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...
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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... :-)
ASTRX
Inlägg: 68
Blev medlem: 12 januari 2005, 16:58:13

Inlägg 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.
Användarvisningsbild
DeVille
Inlägg: 2361
Blev medlem: 29 mars 2004, 15:04:22
Ort: Dalsländska skogen.
Kontakt:

Inlägg 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.
Senast redigerad av DeVille 18 april 2006, 14:14:18, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
Senast redigerad av sodjan 18 april 2006, 17:01:58, redigerad totalt 1 gång.
ASTRX
Inlägg: 68
Blev medlem: 12 januari 2005, 16:58:13

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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 ?
Användarvisningsbild
DeVille
Inlägg: 2361
Blev medlem: 29 mars 2004, 15:04:22
Ort: Dalsländska skogen.
Kontakt:

Inlägg 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.
Skriv svar