PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD und I2C



Paulchen 999
23.03.2014, 13:47
Hallo
Versuche das Display von Pollin mit dem I2C Adapter in Betrieb zu nehmen. Habe bisher den folgenden Code:


#define F_CPU 16000000UL
#include "i2cmaster.h"
#include <util/delay.h>
#include "lcd.h"

#include "i2clcd.h"

#define LCD_I2C_ADDRESS 0x40 // Adresse I2C

#define ENABLE_MASK 0b01000000
#define DISABLE_MASK 0b10111111
#define COMMAND_MASK 0b00000000
#define DATA_MASK 0b00100000

#define INIT_4BIT_MODE 0b00000010

void write_to_pcf8574(char data)
{
i2c_write(data);
_delay_us(40);
i2c_write(data | ENABLE_MASK);
_delay_us(40);
i2c_write(data & DISABLE_MASK);
_delay_us(40);
}

void write_byte(char data, char mask)
{
//write the high nibble first...
char nibble = mask | ((data & 0xF0) >> 4);
write_to_pcf8574(nibble);

//...then the low nibble
nibble = mask | (data & 0x0F);
write_to_pcf8574(nibble);
}

void write_command(char data)
{
write_byte(data, COMMAND_MASK);
}

void write_data(char data)
{
write_byte(data, DATA_MASK);
}

void write_string(char string)
{
while (string)
{
write_data(string);
string++;
}
}

void init_display()
{
//turn on 4 bit mode
write_to_pcf8574(INIT_4BIT_MODE);
write_command(0x28);
_delay_ms(50);
write_command(0x0c);
_delay_ms(50);
write_command(0x06);
_delay_ms(50);
write_command(0x01);
_delay_ms(50);
write_command(0x0f);
_delay_ms(50);
}

int main()
{
lcd_init();
i2c_init();
i2c_start_wait(LCD_I2C_ADDRESS + I2C_WRITE);
write_string("Hello World");
i2c_stop();
return 0;
}

Arbeite mit einem ATmega 32, 16 MHz, AVR Studio 6, PCF8574 Adresse 0x40. Die Datein habe ich eingebunden
Bekomme die folgenden Fehlermeldungen. Leider konnte ich diese nicht zuordnen:

Warning 2 declared here
Warning 4 expected 'char' but argument is of type 'char *'
Warning 3 passing argument 1 of 'write_string' makes integer from pointer without a cast [enabled by default]
Error 1 too few arguments to function 'lcd_init'

Paulchen 999
23.03.2014, 17:36
Hallo
hat keiner eine Idee was ich falsch mache?
Hat vielleicht jemand ein Stück Code was geht? So als Hinweis.
Paul

askazo
24.03.2014, 07:46
Hi,

mit Warning 2 kann ich so nichts anfangen - da müsste man schon die Zeile kennen, auf die sich die Warning bezieht.

Warning 3 und 4 beziehen sich beide auf die Funktion write_string(), die so nicht funktionieren kann.
Richtigerweise müsste die so aussehen:



void write_string(char* string)
{
while (*string)
{
write_data(*string);
string++;
}
}


Du solltest Dich vielleicht mal ein bißchen mit dem Thema Pointer auseinandersetzen.
Ist am Amnfang nicht so einfach da durchzublicken - aber wenn man's verstanden hat, ist's ungeheuer nützlich!

Zu Fehler 1:
Du rufst die Funktion lcd_init() ohne Argumente auf.
Die Funktion erwartet aber mindestens 1 Argument.
Wieviele genau und welche kann ich nicht sagen, da ich die Definition der Funktion nicht kenne.

Gruß,
askazo

fredred
25.03.2014, 15:56
Hallo Paulchen 999 (https://www.roboternetz.de/community/threads/members/63327-Paulchen-999) ,

Programmiere zwar nur noch in BASCOM AVR und habe damit schon viele Beispiele im Forum abgestellt. I2C bis zum „abwinken“.
Das aller wichtigste ist immer die Abfrage meldet sich der Busteilnehmer. Habe in meinen Code eine sehr zuverlässige Abfrage integriert.
Wenn ja bist du dich sicher die Hardware ist OK.
Es könnte sein dein IC ist nicht ein A sondern ein AP Typ. Somit 0x40 durch 0x70 ersetzen. Vorausgesetzt du hast alle Adr-Bin auf GND gelegt.
Gruß
fredred

Paulchen 999
26.03.2014, 06:29
Hallo fredred
bin mir zwar sicher das ich es gemacht habe, werde es aber gleich kontrollieren. Die Adressen liegen alle auf GND.
Paul