16*2 LCD, HD44780 byta pinnar på MCUn?

Lysdioder, Optiska sensorer, Fiberoptik, Displayer, Lasrar, Optiska kopplare
mmarks
Inlägg: 46
Blev medlem: 4 februari 2012, 16:00:14

16*2 LCD, HD44780 byta pinnar på MCUn?

Inlägg av mmarks »

Jag håller på med ett litet projekt i plugget där jag tyckte att det vore trevligt att kontinuerligt få ut datan på en liten display. Jag har tillgång till en färdig headerfil från de kursanansvariga som använder PORTB2-7 och PORTD0,1,4,6,7.
Problemet ligger i att jag använder funktioner som bara fungerar på PB3 och PD6 så jag skulle vilja byta ut dessa pinnar för displayens funktion. Är detta möjligt?

Följande rader definierar vilka pinnar som används:

#define PB_LCD_PINS 0b11111100
#define PD_LCD_PINS 0b11010011
#define PB_LCD_DATA_PINS 0b11111100
#define PD_LCD_DATA_PINS 0b11000000
#define PD_E 0
#define PD_RS 4
#define PD_RW 1

Jag har prövat att ändra dessa (och även sett till att flytta kontakterna till respektive pinne) men då får jag ut något som mest liknar ryska på displayen :oops:
Koden körs på en Atmega16.
sodjan
EF Sponsor
Inlägg: 43243
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: 16*2 LCD, HD44780 byta pinnar på MCUn?

Inlägg av sodjan »

> Jag har prövat att ändra dessa...

Och det är hemligt till vad !?
mmarks
Inlägg: 46
Blev medlem: 4 februari 2012, 16:00:14

Re: 16*2 LCD, HD44780 byta pinnar på MCUn?

Inlägg av mmarks »

Förlåt, jag tänkte inte att det kunde vara viktigt till vilka andra pinnar jag ändrade.

Jag prövade att ändra från:

#define PB_LCD_PINS 0b11111100
#define PD_LCD_PINS 0b11010011
#define PB_LCD_DATA_PINS 0b11111100
#define PD_LCD_DATA_PINS 0b11000000
#define PD_E 0
#define PD_RS 4
#define PD_RW 1

till:

#define PB_LCD_PINS 0b11111001
#define PD_LCD_PINS 0b10110011
#define PB_LCD_DATA_PINS 0b11111001
#define PD_LCD_DATA_PINS 0b10100000
#define PD_E 0
#define PD_RS 4
#define PD_RW 1

Med tanken att det då skulle ändra PB3 till PB1 och PD6 till PD5.
sodjan
EF Sponsor
Inlägg: 43243
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: 16*2 LCD, HD44780 byta pinnar på MCUn?

Inlägg av sodjan »

OK. Är det så det fungerar?
Hur vet programmvaran enbart utifrån en bit-map hur den ska göra?
Kör du 8 eller 4 bit mode?

> PB3 till PB1

Inte PB2 till PB0 ?
mmarks
Inlägg: 46
Blev medlem: 4 februari 2012, 16:00:14

Re: 16*2 LCD, HD44780 byta pinnar på MCUn?

Inlägg av mmarks »

Jag upptäckte precis att det jag skrev var PB2 till PB0, men den upptäckten löste ingenting tyvärr.

>> Hur vet programmvaran enbart utifrån en bit-map hur den ska göra?

Det är nog det som är mitt problem, jag kan inte förstå (och hittar ingenting på nätet) om hur programvaran förstår utifrån en bitmap vad den ska göra. Alla exempel jag har hittat på nätet använder också dessa pinnar så det är därför jag undrar om det "alltid är så" eller om man kan ändra vilka pinnar man kör på.

>>Kör du 8 eller 4 bit mode?

Det är om jag förstått det rätt 8-bit mode.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: 16*2 LCD, HD44780 byta pinnar på MCUn?

Inlägg av v-g »

Tycker det ser ut som att binärvärdena är mappning till vilken port som används sen det under är mappning till vilken pinne i porten som används (dåligt kodat om jag fattat rätt)

Mao så kan du ändra vilken pinne i porten som avses men inte port utan att ändra alla i/o till en annan port.

Normalt sett brukar jag definera en pinne såhär:

Kod: Markera allt

#DEFINE LCD_Enable PORTB, 1
#DEFINE LCD_Enable_TRIS TRISB, 1

Då fungerar det att flytta omkring hur man vill i koden om porten är ställt rätt (analog, A/D, komparatorer USART osv).
Användarvisningsbild
adent
Inlägg: 4242
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: 16*2 LCD, HD44780 byta pinnar på MCUn?

Inlägg av adent »

Jag tror inte det är några problem att göra det. Problemet är väl då att man nog måste förstå deras kod för att prata med displayen och ändra hur den fungerar.

Du kanske kan bifoga koden till lcd-"drivern" så kan du nog få ett tips.

MVH: Mikael
mmarks
Inlägg: 46
Blev medlem: 4 februari 2012, 16:00:14

Re: 16*2 LCD, HD44780 byta pinnar på MCUn?

Inlägg av mmarks »

Ja varsågod om ni orkar titta så vore det toppen :)
bör väl kanske tilläggas att det är copyright på koden och jag har tagit bort namn etc ur kommentarerna, jag är inte säker på att det här är allt för populärt :s
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
sodjan
EF Sponsor
Inlägg: 43243
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: 16*2 LCD, HD44780 byta pinnar på MCUn?

Inlägg av sodjan »

> Det är om jag förstått det rätt 8-bit mode.

Men då behöver du ju en hel 8-bits PORT.
Jag förstår inte var dribblandet med enstaka pinnar kommer in i bilden.
Jag fattar ennu mindre av koden... :-)
Hur är det hela kopplat? Vilka LCD pinnar till vilken AVR pinne?
mmarks
Inlägg: 46
Blev medlem: 4 februari 2012, 16:00:14

Re: 16*2 LCD, HD44780 byta pinnar på MCUn?

Inlägg av mmarks »

Ja du är inte den enda som är förvirrad :)
LCDn har 14 pinnar som kopplas enligt nedan:

1 - GND
2 - VCC
3 - VEE (här justeras konstrasten mha spänningregulator)
4 - PD4
5 - PD1
6 - PD0
7 - PD6
8 - PD7
9 - PB2
10-PB3
11-PB4
12-PB5
13-PB6
14-PB7
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: 16*2 LCD, HD44780 byta pinnar på MCUn?

Inlägg av snigelen »

Koden förutsätter att de två lägsta bitarna av de 8 databitarn är på PD6,PD7, och att resten av bitarna är på PB2-PB7.

Kod: Markera allt

void Write_data_lcd(unsigned int byte)
{
	unsigned int slask = 0;
	slask = (byte & ~PB_LCD_DATA_PINS); // Pick bits 0x03 = 0b00000011
	PORTD |= slask<<6; // Output to bits 0xC0 of PORTD
	slask = (byte & PB_LCD_DATA_PINS); // Pick bits 0xFC = 0b11111100
	PORTB |= slask;	
}
Du måste ändra en del i programmet om du skall byta pinnar, särskilt om du väljer att inte ha dem i rad. Men det finns ju massor av lcd-exempel på nätet som använder 4-bitar mode, då är det ju lite enklare att pussla ihop det med andra krav.
sodjan
EF Sponsor
Inlägg: 43243
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: 16*2 LCD, HD44780 byta pinnar på MCUn?

Inlägg av sodjan »

OK, så data använder 6 bitar på en port och 2 bitar på en annan.

Så vitt jag kan se så förutsätter denna kod :

Kod: Markera allt

void Write_data_lcd(unsigned int byte)
{
	unsigned int slask = 0;
	slask = (byte & ~PB_LCD_DATA_PINS); // Pick bits 0x03 = 0b00000011
	PORTD |= slask<<6; // Output to bits 0xC0 of PORTD
	slask = (byte & PB_LCD_DATA_PINS); // Pick bits 0xFC = 0b11111100
	PORTB |= slask;	
}
att vissa speciella pinnar används i speciella kombinationer.
Att du får konstiga tecken är nog normalt och förväntat vid den ändring som du har provat.

Lösning: Skriv egna LCD rutiner!
mmarks
Inlägg: 46
Blev medlem: 4 februari 2012, 16:00:14

Re: 16*2 LCD, HD44780 byta pinnar på MCUn?

Inlägg av mmarks »

Okej jag tror jag förstår vad ni menar, jag använder ioförsig inte PORTA eller PORTE så då skulle det fungera att köra en "replace all" från PORTB och -D till PORTA och -E?

Att sätta mig in i och skriva nya rutiner är tyvärr ingenting jag har tid med då vi sysslar med "modulspecifika" fördjupningar och att ha resultatet på en LCD egentligen är ett sidospår från min sida.
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: 16*2 LCD, HD44780 byta pinnar på MCUn?

Inlägg av snigelen »

Det borde gå att byta till PORTA och PORTC (PORTE finns inte på mega16). Byt bara alla PORTx och DDRx i koden.
mmarks
Inlägg: 46
Blev medlem: 4 februari 2012, 16:00:14

Re: 16*2 LCD, HD44780 byta pinnar på MCUn?

Inlägg av mmarks »

Okej nu fungerar det! Tack för hjälpen! :)
Skriv svar