Sida 3 av 5
Postat: 14 oktober 2005, 14:41:37
av Virr3
Supertack mrhedin
tänkte kolla om det är förlite ström, men jag vet att folk har kortslutit det mesta genom att mäta fel, så bäst att jag frågar... vart ska ja mäta?
Postat: 14 oktober 2005, 15:13:52
av mrhedin
För lite ström borde det ju inte vara eftersom du fick LCD:n att lysa.
En atmega8 med lcd vet jag drar ungefär 115mA, så har du nåt som klarar att leverera det borde det ju vara lugnt.
Strömmen mäter du genom att bryta kretsen, ta utgången från din strömförsörjning, koppla den in i din multimeter, sedan från multimetern tillbaka till kretsen igen.
Postat: 14 oktober 2005, 15:50:22
av Virr3
det är nog som du säjer, tänke aldrig så långt...
men, va fan kan de va?
ska ta en bild på hur det är kopplat ikväll... så kasnske någon kan se ifall något är galet...
det är denna display så, det är ingen lcd, utan oled men, den är ju hd44780 kompartibel så det borde ju inte vara något problem, eller?
http://www.lawicel-shop.se/shop/custom/ ... &refcode=p
Postat: 14 oktober 2005, 21:24:40
av Virr3
känns lite som att ifall inte lcd:n va sönder när ja fick den så är den definitivt nu...
aja, här är två bilder på hur jag "riggat"
hoppas att ni ser där, och att någon kan se vad som är fel...
Postat: 14 oktober 2005, 21:36:08
av Jeppsson
I och med att du bara kör med 4 bitars kommunikation istället för 8 bitar så bör du binda de anda fyra till GND som du inte använder.
Annars kan de inta ett okänt nivå tex 1 eller 0.
Postat: 14 oktober 2005, 21:54:56
av Virr3
okej:)
gjort de, ingen förändring
den är kolsvart
Postat: 14 oktober 2005, 22:37:42
av sodjan
> I och med att du bara kör med 4 bitars kommunikation istället för 8 bitar så bör du binda de anda fyra till GND som du inte använder.
Säker på det ? Jag har för mig att de 4 oanvända data linjerna bör/ska vara "floating". LCD controllern håller dom "uppe" med interna pull-ups. Och när man switchar om RW för att läsa så kan en "hård" pull-up/down av signalerna komma i konflikt med det data som controllern (försöker) lägger ut.
Postat: 14 oktober 2005, 22:48:04
av Virr3
hmm...
sak samma, den är stendöd
finns det något sätt så att den bara lyser? alltså, så att kolla ifall den funkar bara...
Postat: 14 oktober 2005, 22:50:30
av cykze
Du kan prova den här gamla koden som jag skrev när jag höll på och lära mig AVR. Koppla precis som define-raderna antyder och ändra ingenting. För det tror jag nämnligen inte att koden klarar av i sitt nuvarande skick.
Det var faktiskt just en OLED-display jag använde då.
Kod: Markera allt
#include <avr/io.h>
#include <avr/delay.h>
#include <inttypes.h>
#define LCD_D4 PB1
#define LCD_D5 PB2
#define LCD_D6 PB3
#define LCD_D7 PB4
#define LCD_RS PD0
#define LCD_E PD1
#define delay _delay_loop_2
// Initieringskommandon till LCD:n
static const uint8_t lcd_init_cmds[] =
{
_BV(LCD_D5)|_BV(LCD_D4),
_BV(LCD_D5)|_BV(LCD_D4),
_BV(LCD_D5)|_BV(LCD_D4),
_BV(LCD_D5),
_BV(LCD_D5),
_BV(LCD_D7),
_BV(0), _BV(LCD_D7),
_BV(0), _BV(LCD_D4),
_BV(0), _BV(LCD_D6)|_BV(LCD_D5),
_BV(0), _BV(LCD_D7)|_BV(LCD_D6)
};
void lcd_cmd(uint8_t cmd)
{
PORTB &= ~(_BV(LCD_D7)|_BV(LCD_D6)|_BV(LCD_D5)|_BV(LCD_D4));
PORTB |= cmd;
PORTD |= _BV(LCD_E);
delay(10);
PORTD &= ~_BV(LCD_E);
delay(1000);
}
void lcd_byte(uint8_t byte)
{
PORTD |= _BV(LCD_RS);
delay(10);
lcd_cmd((byte&0xf0) >> 3);
lcd_cmd((byte&0xf) << 1);
PORTD &= ~_BV(LCD_RS);
delay(10);
}
void lcd_print_string(uint8_t *string)
{
while (*string)
lcd_byte(*string++);
}
void lcd_move_cursor(const uint8_t row, const uint8_t offset)
{
lcd_cmd(_BV(LCD_D7) | (row==1 ? _BV(LCD_D6) : 0) | (offset&16 ? _BV(LCD_D4) : 0));
lcd_cmd((offset&0xf) << 1);
}
void lcd_init()
{
uint8_t i;
DDRB |= _BV(LCD_D4)|_BV(LCD_D5)|_BV(LCD_D6)|_BV(LCD_D7);
PORTB |= _BV(LCD_D4)|_BV(LCD_D5)|_BV(LCD_D6)|_BV(LCD_D7);
DDRD |= _BV(LCD_RS)|_BV(LCD_E);
PORTD &= ~(_BV(LCD_RS)|_BV(LCD_E));
delay(20000); //20ms
for (i=0;i<sizeof(lcd_init_cmds);i++)
lcd_cmd(lcd_init_cmds[i]);
}
int main()
{
lcd_init();
lcd_move_cursor(0,0);
lcd_print_string("Hej");
return 0;
}
edit: Ändrade en grejj i koden
edit2: delay
Postat: 14 oktober 2005, 22:59:45
av Virr3
-------- begin --------
avr-gcc (GCC) 3.4.3
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Compiling: display.c
avr-gcc -c -mmcu=atmega32 -I. -gstabs -DF_CPU=8000000UL -O0 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=display.lst -std=gnu99 -MD -MP -MF .dep/display.o.d display.c -o display.o
display.c: In function `lcd_cmd':
display.c:35: warning: implicit declaration of function `delay'
display.c: At top level:
display.c:66: warning: function declaration isn't a prototype
display.c:82: warning: function declaration isn't a prototype
display.c:87:3: warning: no newline at end of file
Linking: display.elf
avr-gcc -mmcu=atmega32 -I. -gstabs -DF_CPU=8000000UL -O0 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=display.o -std=gnu99 -MD -MP -MF .dep/display.elf.d display.o --output display.elf -Wl,-Map=display.map,--cref -lm
display.o(.text+0x3a): In function `lcd_cmd':
display.c:35: undefined reference to `delay'
display.o(.text+0x4e):display.c:38: undefined reference to `delay'
display.o(.text+0x88): In function `lcd_byte':
display.c:44: undefined reference to `delay'
display.o(.text+0xbc):display.c:50: undefined reference to `delay'
display.o(.text+0x1d8): In function `lcd_init':
display.c:75: undefined reference to `delay'
make.exe: *** [display.elf] Error 1
det blir fel, den antyder att de itne finns någon delay funktion....
Edit: ändrade till _delay_loop_2 då kompilerade den... men, fortfarande kolsvart på displayen
Postat: 14 oktober 2005, 23:24:01
av Virr3
nu har jag mätt och dessa är resultaten:
data1 1,4v - 2,2v
data2 5v
data3 1,4v - 2,2v
data4 1,4 - 2,2v
rs 5v
rw 5v
e 0,4v
lite konstigt tycker jag ändå att det är...
det är den koden som cykze skrev... men jag tvivlar på att det är den som det är fel på...
Postat: 14 oktober 2005, 23:27:30
av cykze
Ja, det skulle vara _delay_loop_2 istället. Tråkigt att det ändå inte fungerar.
Kopplade du så här?
#define LCD_D4 PB1
#define LCD_D5 PB2
#define LCD_D6 PB3
#define LCD_D7 PB4
#define LCD_RS PD0
#define LCD_E PD1
Enligt output:en så kör du AVR:en i 12 MHz. Stämmer det? Om du kör med den interna oscillatorn och inte har ändrat på något bör den gå i 1 MHz, om jag inte minns fel. Nu spelar det ingen roll i det här fallet men du bör ändå sätta F_CPU till rätt värde i Makefile:en.
Postat: 14 oktober 2005, 23:33:50
av mrhedin
Använder du den kopplingen som du har där så kan du inte använda min kod heller p.g.a. att den baserar sig på 8-bitars överföring.
Postat: 14 oktober 2005, 23:34:32
av cykze
RW ska du koppla till jord.
Postat: 14 oktober 2005, 23:37:01
av mrhedin
Men du! När jag vänder på min LCD som ser identisk ut som den du har där på baksidan, så är stiften numrerade från höger till vänster. Det ser ut som du spegelvänt det hela...