Sida 1 av 2
16*2 LCD, HD44780 byta pinnar på MCUn?
Postat: 17 mars 2012, 12:03:03
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

Koden körs på en Atmega16.
Re: 16*2 LCD, HD44780 byta pinnar på MCUn?
Postat: 17 mars 2012, 12:16:20
av sodjan
> Jag har prövat att ändra dessa...
Och det är hemligt till vad !?
Re: 16*2 LCD, HD44780 byta pinnar på MCUn?
Postat: 17 mars 2012, 12:19:16
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.
Re: 16*2 LCD, HD44780 byta pinnar på MCUn?
Postat: 17 mars 2012, 12:28:39
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 ?
Re: 16*2 LCD, HD44780 byta pinnar på MCUn?
Postat: 17 mars 2012, 12:37:42
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.
Re: 16*2 LCD, HD44780 byta pinnar på MCUn?
Postat: 17 mars 2012, 12:43:01
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).
Re: 16*2 LCD, HD44780 byta pinnar på MCUn?
Postat: 17 mars 2012, 12:44:30
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
Re: 16*2 LCD, HD44780 byta pinnar på MCUn?
Postat: 17 mars 2012, 13:00:38
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

Re: 16*2 LCD, HD44780 byta pinnar på MCUn?
Postat: 17 mars 2012, 13:11:42
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?
Re: 16*2 LCD, HD44780 byta pinnar på MCUn?
Postat: 17 mars 2012, 13:17:45
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
Re: 16*2 LCD, HD44780 byta pinnar på MCUn?
Postat: 17 mars 2012, 13:23:38
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.
Re: 16*2 LCD, HD44780 byta pinnar på MCUn?
Postat: 17 mars 2012, 13:24:09
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!
Re: 16*2 LCD, HD44780 byta pinnar på MCUn?
Postat: 17 mars 2012, 13:41:57
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.
Re: 16*2 LCD, HD44780 byta pinnar på MCUn?
Postat: 17 mars 2012, 13:49:51
av snigelen
Det borde gå att byta till PORTA och PORTC (PORTE finns inte på mega16). Byt bara alla PORTx och DDRx i koden.
Re: 16*2 LCD, HD44780 byta pinnar på MCUn?
Postat: 17 mars 2012, 14:35:04
av mmarks
Okej nu fungerar det! Tack för hjälpen!
