Mikrocontroller und Digitale Elektronik
›
Thread
Kompilieren von C Dateien in Kubuntu
A
AT90SXXXX
Gast
12.05.2010 20:33
#1709104
Hallo
Ich habe das LCD "YL162-90" von Polin das tut auch, nun wollte ich es
mit einem ATmega8 ansteuern 4 bitmodus, ich habe dazu die library von
http://homepage.hispeed.ch/peterfleury/avr-software.html#libs das "LCD
library for HD44870 based LCD's" heruntergeladen und für meine Hardware
angepasst nun wollte ich das Testprogramm das dabei ist Kompilieren aber
es kommt die Fehlermeldung.:
~/AVR$ make
-------- begin --------
avr-gcc (GCC) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
Dies ist freie Software; die Kopierbedingungen stehen in den Quellen. Es
gibt KEINE Garantie; auch nicht für MARKTGÄNGIGKEIT oder FÜR SPEZIELLE
ZWECKE.
Compiling C: main.c
avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -Os -funsigned-char
-funsigned-bitfields -fpack-struct -fshort-enums -Wall
-Wstrict-prototypes -Wa,-adhlns=main.lst -std=gnu99 -Wundef -MD -MP -MF
.dep/main.o.d main.c -o /main.o
Assembler messages:
Fatal error: can't create /main.o: Permission denied
make: *** [/main.o] Fehler 1
das ist mein Makefile das siech auch in dem Ordner befindet wo die
Dateien zum kompilieren sind
http://nopaste.penguinfriends.org/view/933/
ich habe das hier mal installiert und in eine init.d Datei registriert
http://www.sax.de/~joerg/mfile/
was ich da genau gemacht habe weiß ich nicht mehr aber ich vermute mal
das ich den Befehll make global gesetzt habe und das immer ein
bestimmtes Makefile ausgeführt wird.
ich benutze Kubuntu und kenne mich mit Kubuntu noch nicht so aus.
ich möchte aus den Dateien "main.c", "lcd.c", "lcd.h" eine HEX Datei
machen nun bekomme ich das nicht hin was mache ich falsch wo könnte der
Fehler sein?
MfG AT90S1200
> ... -o /main.o
Wo kommt der Schrägstrich hier her?
Du hast als normaler Benutzer nicht die Berechtigung ins Root-Directory
zu schreiben (macht auch keinen Sinn, dort die Object-Files zu
platzieren).
AT90SXXXX schrieb:
> Fatal error: can't create /main.o: Permission denied
Da Du vermutlich als nicht-root Benutzer kompilierst, hast du unter /
keine Schreibrechte, und kannst somit keine /main.o anlegen.
Da stimmt was im Makefile nicht. Das sollte etwa so
... -o ./main.o
oder so:
... -o main.o
aussehen
Gruss,
rweber
Stefan Ernst schrieb:
> Wo kommt der Schrägstrich hier her?
Ok, ich beantworte das mal eben selber. ;-)
Du kannst im Makefile die Zuweisung an OBJDIR nicht einfach
auskommentieren. Wenn alles ins selbe Verzeichnis soll, wie die
Source-Files, kannst du dort auch ein "." zuweisen.
A
AT90SXXXX
Gast
12.05.2010 20:45
#1709122
ich habe im Ordner home eine weiteren ordner AVR und dort sind alle
Dateien da sollte er auch alles rein machen warum er dort ein / macht
weiß ich nicht
wie ich schon geschrieben habe stimmt dort was nicht
danke für die schnelle Antwort (-:
mfg AT90S1200
A
AT90SXXXX
Gast
12.05.2010 20:52
#1709128
Ok
nun kommt disser Fehler.:
~/AVR$ make
-------- begin --------
avr-gcc (GCC) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
Dies ist freie Software; die Kopierbedingungen stehen in den Quellen. Es
gibt KEINE Garantie; auch nicht für MARKTGÄNGIGKEIT oder FÜR SPEZIELLE
ZWECKE.
Compiling C: main.c
avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -Os -funsigned-char
-funsigned-bitfields -fpack-struct -fshort-enums -Wall
-Wstrict-prototypes -Wa,-adhlns=main.lst -std=gnu99 -Wundef -MD -MP -MF
.dep/main.o.d main.c -o main.o
Compiling C: lcd.c
avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -Os -funsigned-char
-funsigned-bitfields -fpack-struct -fshort-enums -Wall
-Wstrict-prototypes -Wa,-adhlns=lcd.lst -std=gnu99 -Wundef -MD -MP -MF
.dep/lcd.o.d lcd.c -o lcd.o
lcd.c: In Funktion »lcd_write«:
lcd.c:145: Fehler: expected expression before »)« token
lcd.c: In Funktion »lcd_read«:
lcd.c:225: Fehler: expected expression before »)« token
lcd.c: In Funktion »lcd_init«:
lcd.c:531: Fehler: expected expression before »==« token
lcd.c:542: Fehler: expected expression before »)« token
lcd.c:549: Fehler: expected expression before »)« token
lcd.c:596:5: Warnung: »KS0073_4LINES_MODE« ist nicht definiert
make: *** [lcd.o] Fehler 1
findet der die lcd.h nicht?
mfg AT90S1200
A
AT90SXXXX
Gast
12.05.2010 20:54
#1709130
ich habe das
# Object files directory
OBJDIR = .
geändert
mfg AT90S1200
W
Walter
Gast
12.05.2010 20:55
#1709131
jetzt wäre vielleicht der Programmtext angesagt?
A
AT90SXXXX
Gast
12.05.2010 20:57
#1709134
/***********************************************************************
*****
Title : HD44780U LCD library
Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
File: $Id: lcd.c,v 1.14.2.1 2006/01/29 12:16:41 peter Exp $
Software: AVR-GCC 3.3
Target: any AVR device, memory mapped mode only for
AT90S4414 /8515/Mega
DESCRIPTION
Basic routines for interfacing a HD44780U -based text lcd display
Originally based on Volker Oth's lcd library,
changed lcd_init(), added additional constants for lcd_command(),
added 4-bit I/O mode, improved and optimized code.
Library can be operated in memory mapped mode (LCD_IO_MODE=0) or
in
4-bit IO port mode (LCD_IO_MODE=1). 8-bit IO port mode not
supported.
Memory mapped mode compatible with Kanda STK200, but supports
also
generation of R/W signal through A8 address line.
USAGE
See the C include lcd.h file for a description of each function
************************************************************************
*****/
#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "lcd.h"
/*
** constants/macros
*/
#define DDR(x) (*(&x - 1)) /* address of data direction register of
port x */
#if defined(_AVR_ATmega64_ ) || defined(_AVR_ATmega128_ )
/* on ATmega64/128 PINF is on port 0x00 and not 0x60 */
#define PIN(x) ( &PORTF==&(x) ? _SFR_IO8(0x00) : (*(&x - 2)) )
#else
#define PIN(x) (*(&x - 2)) /* address of input register of port x
*/
#endif
#if LCD_IO_MODE
#define lcd_e_delay() _asm_ __volatile__( "rjmp 1f\n 1:" );
#define lcd_e_high() LCD_E_PORT |= _BV(LCD_E_PIN);
#define lcd_e_low() LCD_E_PORT &= ~_BV(LCD_E_PIN);
#define lcd_e_toggle() toggle_e()
#define lcd_rw_high() LCD_RW_PORT |= _BV(LCD_RW_PIN)
#define lcd_rw_low() LCD_RW_PORT &= ~_BV(LCD_RW_PIN)
#define lcd_rs_high() LCD_RS_PORT |= _BV(LCD_RS_PIN)
#define lcd_rs_low() LCD_RS_PORT &= ~_BV(LCD_RS_PIN)
#endif
#if LCD_IO_MODE
#if LCD_LINES==1
#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_1LINE
#else
#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_2LINES
#endif
#else
#if LCD_LINES==1
#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_8BIT_1LINE
#else
#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_8BIT_2LINES
#endif
#endif
#if LCD_CONTROLLER_KS0073
#if LCD_LINES==4
#define KS0073_EXTENDED_FUNCTION_REGISTER_ON 0x24 /* |0|010|0100
4-bit mode extension-bit RE = 1 */
#define KS0073_EXTENDED_FUNCTION_REGISTER_OFF 0x20 /* |0|000|1001 4
lines mode */
#define KS0073_4LINES_MODE 0x09 /* |0|001|0000
4-bit mode, extension-bit RE = 0 */
#endif
#endif
/*
** function prototypes
*/
#if LCD_IO_MODE
static void toggle_e(void);
#endif
/*
** local functions
*/
/***********************************************************************
**
delay loop for small accurate delays: 16-bit counter, 4 cycles/loop
************************************************************************
*/
static inline void _delayFourCycles(unsigned int __count)
{
if ( __count == 0 )
_asm_ __volatile__( "rjmp 1f\n 1:" ); // 2 cycles
else
_asm__ __volatile_ (
"1: sbiw %0,1" "\n\t"
"brne 1b" // 4 cycles/loop
: "=w" (__count)
: "0" (__count)
);
}
/***********************************************************************
**
delay for a minimum of <us> microseconds
the number of loops is calculated at compile-time from MCU clock
frequency
************************************************************************
*/
#define delay(us) _delayFourCycles( ( ( 1*(XTAL/4000) )*us)/1000 )
#if LCD_IO_MODE
/* toggle Enable Pin to initiate write */
static void toggle_e(void)
{
lcd_e_high();
lcd_e_delay();
lcd_e_low();
}
#endif
/***********************************************************************
**
Low-level function to write byte to LCD controller
Input: data byte to write to LCD
rs 1: write data
0: write instruction
Returns: none
************************************************************************
*/
#if LCD_IO_MODE
static void lcd_write(uint8_t data,uint8_t rs)
{
unsigned char dataBits ;
if (rs) { /* write data (RS=1, RW=0) */
lcd_rs_high();
} else { /* write instruction (RS=0, RW=0) */
lcd_rs_low();
}
lcd_rw_low();
if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT ==
&LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT )
&& (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN
== 2) && (LCD_DATA3_PIN == 3) )
{
/* configure data pins as output */
DDR(LCD_DATA0_PORT) |= 0x0F;
/* output high nibble first */
dataBits = LCD_DATA0_PORT & 0xF0;
LCD_DATA0_PORT = dataBits |((data>>4)&0x0F);
lcd_e_toggle();
/* output low nibble */
LCD_DATA0_PORT = dataBits | (data&0x0F);
lcd_e_toggle();
/* all data pins high (inactive) */
LCD_DATA0_PORT = dataBits | 0x0F;
}
else
{
/* configure data pins as output */
DDR(LCD_DATA0_PORT) |= _BV(LCD_DATA0_PIN);
DDR(LCD_DATA1_PORT) |= _BV(LCD_DATA1_PIN);
DDR(LCD_DATA2_PORT) |= _BV(LCD_DATA2_PIN);
DDR(LCD_DATA3_PORT) |= _BV(LCD_DATA3_PIN);
/* output high nibble first */
LCD_DATA3_PORT &= ~_BV(LCD_DATA3_PIN);
LCD_DATA2_PORT &= ~_BV(LCD_DATA2_PIN);
LCD_DATA1_PORT &= ~_BV(LCD_DATA1_PIN);
LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN);
if(data & 0x80) LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN);
if(data & 0x40) LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN);
if(data & 0x20) LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN);
if(data & 0x10) LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN);
lcd_e_toggle();
/* output low nibble */
LCD_DATA3_PORT &= ~_BV(LCD_DATA3_PIN);
LCD_DATA2_PORT &= ~_BV(LCD_DATA2_PIN);
LCD_DATA1_PORT &= ~_BV(LCD_DATA1_PIN);
LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN);
if(data & 0x08) LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN);
if(data & 0x04) LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN);
if(data & 0x02) LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN);
if(data & 0x01) LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN);
lcd_e_toggle();
/* all data pins high (inactive) */
LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN);
LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN);
LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN);
LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN);
}
}
#else
#define lcd_write(d,rs) if (rs) *(volatile uint8_t*)(LCD_IO_DATA) = d;
else *(volatile uint8_t*)(LCD_IO_FUNCTION) = d;
/* rs==0 -> write instruction to LCD_IO_FUNCTION */
/* rs==1 -> write data to LCD_IO_DATA */
#endif
/***********************************************************************
**
Low-level function to read byte from LCD controller
Input: rs 1: read data
0: read busy flag / address counter
Returns: byte read from LCD controller
************************************************************************
*/
#if LCD_IO_MODE
static uint8_t lcd_read(uint8_t rs)
{
uint8_t data;
if (rs)
lcd_rs_high(); /* RS=1: read data */
else
lcd_rs_low(); /* RS=0: read busy flag */
lcd_rw_high(); /* RW=1 read mode */
if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT ==
&LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT )
&& ( LCD_DATA0_PIN == 0 )&& (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN
== 2) && (LCD_DATA3_PIN == 3) )
{
DDR(LCD_DATA0_PORT) &= 0xF0; /* configure data pins as
input */
lcd_e_high();
lcd_e_delay();
data = PIN(LCD_DATA0_PORT) << 4; /* read high nibble first
*/
lcd_e_low();
lcd_e_delay(); /* Enable 500ns low
*/
lcd_e_high();
lcd_e_delay();
data |= PIN(LCD_DATA0_PORT)&0x0F; /* read low nibble
*/
lcd_e_low();
}
else
{
/* configure data pins as input */
DDR(LCD_DATA0_PORT) &= ~_BV(LCD_DATA0_PIN);
DDR(LCD_DATA1_PORT) &= ~_BV(LCD_DATA1_PIN);
DDR(LCD_DATA2_PORT) &= ~_BV(LCD_DATA2_PIN);
DDR(LCD_DATA3_PORT) &= ~_BV(LCD_DATA3_PIN);
/* read high nibble first */
lcd_e_high();
lcd_e_delay();
data = 0;
if ( PIN(LCD_DATA0_PORT) & _BV(LCD_DATA0_PIN) ) data |= 0x10;
if ( PIN(LCD_DATA1_PORT) & _BV(LCD_DATA1_PIN) ) data |= 0x20;
if ( PIN(LCD_DATA2_PORT) & _BV(LCD_DATA2_PIN) ) data |= 0x40;
if ( PIN(LCD_DATA3_PORT) & _BV(LCD_DATA3_PIN) ) data |= 0x80;
lcd_e_low();
lcd_e_delay(); /* Enable 500ns low
*/
/* read low nibble */
lcd_e_high();
lcd_e_delay();
if ( PIN(LCD_DATA0_PORT) & _BV(LCD_DATA0_PIN) ) data |= 0x01;
if ( PIN(LCD_DATA1_PORT) & _BV(LCD_DATA1_PIN) ) data |= 0x02;
if ( PIN(LCD_DATA2_PORT) & _BV(LCD_DATA2_PIN) ) data |= 0x04;
if ( PIN(LCD_DATA3_PORT) & _BV(LCD_DATA3_PIN) ) data |= 0x08;
lcd_e_low();
}
return data;
}
#else
#define lcd_read(rs) (rs) ? *(volatile
uint8_t*)(LCD_IO_DATA+LCD_IO_READ) : *(volatile
uint8_t*)(LCD_IO_FUNCTION+LCD_IO_READ)
/* rs==0 -> read instruction from LCD_IO_FUNCTION */
/* rs==1 -> read data from LCD_IO_DATA */
#endif
/***********************************************************************
**
loops while lcd is busy, returns address counter
************************************************************************
*/
static uint8_t lcd_waitbusy(void)
{
register uint8_t c;
/* wait until busy flag is cleared */
while ( (c=lcd_read(0)) & (1<<LCD_BUSY)) {}
/* the address counter is updated 4us after the busy flag is cleared
*/
delay(2);
/* now read the address counter */
return (lcd_read(0)); // return address counter
}/* lcd_waitbusy */
/***********************************************************************
**
Move cursor to the start of next line or to the first line if the cursor
is already on the last line.
************************************************************************
*/
static inline void lcd_newline(uint8_t pos)
{
register uint8_t addressCounter;
#if LCD_LINES==1
addressCounter = 0;
#endif
#if LCD_LINES==2
if ( pos < (LCD_START_LINE2) )
addressCounter = LCD_START_LINE2;
else
addressCounter = LCD_START_LINE1;
#endif
#if LCD_LINES==4
#if KS0073_4LINES_MODE
if ( pos < LCD_START_LINE2 )
addressCounter = LCD_START_LINE2;
else if ( (pos >= LCD_START_LINE2) && (pos < LCD_START_LINE3) )
addressCounter = LCD_START_LINE3;
else if ( (pos >= LCD_START_LINE3) && (pos < LCD_START_LINE4) )
addressCounter = LCD_START_LINE4;
else
addressCounter = LCD_START_LINE1;
#else
if ( pos < LCD_START_LINE3 )
addressCounter = LCD_START_LINE2;
else if ( (pos >= LCD_START_LINE2) && (pos < LCD_START_LINE4) )
addressCounter = LCD_START_LINE3;
else if ( (pos >= LCD_START_LINE3) && (pos < LCD_START_LINE2) )
addressCounter = LCD_START_LINE4;
else
addressCounter = LCD_START_LINE1;
#endif
#endif
lcd_command((1<<LCD_DDRAM)+addressCounter);
}/* lcd_newline */
/*
** PUBLIC FUNCTIONS
*/
/***********************************************************************
**
Send LCD controller instruction command
Input: instruction to send to LCD controller, see HD44780 data sheet
Returns: none
************************************************************************
*/
void lcd_command(uint8_t cmd)
{
lcd_waitbusy();
lcd_write(cmd,0);
}
/***********************************************************************
**
Send data byte to LCD controller
Input: data to send to LCD controller, see HD44780 data sheet
Returns: none
************************************************************************
*/
void lcd_data(uint8_t data)
{
lcd_waitbusy();
lcd_write(data,1);
}
/***********************************************************************
**
Set cursor to specified position
Input: x horizontal position (0: left most position)
y vertical position (0: first line)
Returns: none
************************************************************************
*/
void lcd_gotoxy(uint8_t x, uint8_t y)
{
#if LCD_LINES==1
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE1+x);
#endif
#if LCD_LINES==2
if ( y==0 )
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE1+x);
else
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE2+x);
#endif
#if LCD_LINES==4
if ( y==0 )
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE1+x);
else if ( y==1)
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE2+x);
else if ( y==2)
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE3+x);
else /* y==3 */
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE4+x);
#endif
}/* lcd_gotoxy */
/***********************************************************************
**
************************************************************************
*/
int lcd_getxy(void)
{
return lcd_waitbusy();
}
/***********************************************************************
**
Clear display and set cursor to home position
************************************************************************
*/
void lcd_clrscr(void)
{
lcd_command(1<<LCD_CLR);
}
/***********************************************************************
**
Set cursor to home position
************************************************************************
*/
void lcd_home(void)
{
lcd_command(1<<LCD_HOME);
}
/***********************************************************************
**
Display character at current cursor position
Input: character to be displayed
Returns: none
************************************************************************
*/
void lcd_putc(char c)
{
uint8_t pos;
pos = lcd_waitbusy(); // read busy-flag and address counter
if (c=='\n')
{
lcd_newline(pos);
}
else
{
#if LCD_WRAP_LINES==1
#if LCD_LINES==1
if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) {
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
}
#elif LCD_LINES==2
if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) {
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE2,0);
}else if ( pos == LCD_START_LINE2+LCD_DISP_LENGTH ){
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
}
#elif LCD_LINES==4
if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) {
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE2,0);
}else if ( pos == LCD_START_LINE2+LCD_DISP_LENGTH ) {
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE3,0);
}else if ( pos == LCD_START_LINE3+LCD_DISP_LENGTH ) {
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE4,0);
}else if ( pos == LCD_START_LINE4+LCD_DISP_LENGTH ) {
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
}
#endif
lcd_waitbusy();
#endif
lcd_write(c, 1);
}
}/* lcd_putc */
/***********************************************************************
**
Display string without auto linefeed
Input: string to be displayed
Returns: none
************************************************************************
*/
void lcd_puts(const char *s)
/* print string on lcd (no auto linefeed) */
{
register char c;
while ( (c = *s++) ) {
lcd_putc(c);
}
}/* lcd_puts */
/***********************************************************************
**
Display string from program memory without auto linefeed
Input: string from program memory be be displayed
Returns: none
************************************************************************
*/
void lcd_puts_p(const char *progmem_s)
/* print string from program memory on lcd (no auto linefeed) */
{
register char c;
while ( (c = pgm_read_byte(progmem_s++)) ) {
lcd_putc(c);
}
}/* lcd_puts_p */
/***********************************************************************
**
Initialize display and select type of cursor
Input: dispAttr LCD_DISP_OFF display off
LCD_DISP_ON display on, cursor off
LCD_DISP_ON_CURSOR display on, cursor on
LCD_DISP_CURSOR_BLINK display on, cursor on
flashing
Returns: none
************************************************************************
*/
void lcd_init(uint8_t dispAttr)
{
#if LCD_IO_MODE
/*
* Initialize LCD to 4 bit I/O mode
*/
if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT ==
&LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT )
&& ( &LCD_RS_PORT == &LCD_DATA0_PORT) && ( &LCD_RW_PORT ==
&LCD_DATA0_PORT) && (&LCD_E_PORT == &LCD_DATA0_PORT)
&& (LCD_DATA0_PIN == 0 ) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN
== 2) && (LCD_DATA3_PIN == 3)
&& (LCD_RS_PIN == 4 ) && (LCD_RW_PIN == 5) && (LCD_E_PIN == 6 ) )
{
/* configure all port bits as output (all LCD lines on same
port) */
DDR(LCD_DATA0_PORT) |= 0x7F;
}
else if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT
== &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT )
&& (LCD_DATA0_PIN == 0 ) && (LCD_DATA1_PIN == 1) &&
(LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) )
{
/* configure all port bits as output (all LCD data lines on same
port, but control lines on different ports) */
DDR(LCD_DATA0_PORT) |= 0x0F;
DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN);
DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN);
DDR(LCD_E_PORT) |= _BV(LCD_E_PIN);
}
else
{
/* configure all port bits as output (LCD data and control lines
on different ports */
DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN);
DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN);
DDR(LCD_E_PORT) |= _BV(LCD_E_PIN);
DDR(LCD_DATA0_PORT) |= _BV(LCD_DATA0_PIN);
DDR(LCD_DATA1_PORT) |= _BV(LCD_DATA1_PIN);
DDR(LCD_DATA2_PORT) |= _BV(LCD_DATA2_PIN);
DDR(LCD_DATA3_PORT) |= _BV(LCD_DATA3_PIN);
}
delay(16000); /* wait 16ms or more after power-on */
/* initial write to lcd is 8bit */
LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN); // _BV(LCD_FUNCTION)>>4;
LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN); // _BV(LCD_FUNCTION_8BIT)>>4;
lcd_e_toggle();
delay(4992); /* delay, busy flag can't be checked here */
/* repeat last command */
lcd_e_toggle();
delay(64); /* delay, busy flag can't be checked here */
/* repeat last command a third time */
lcd_e_toggle();
delay(64); /* delay, busy flag can't be checked here */
/* now configure for 4bit mode */
LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN); //
LCD_FUNCTION_4BIT_1LINE>>4
lcd_e_toggle();
delay(64); /* some displays need this additional delay */
/* from now the LCD only accepts 4 bit I/O, we can use lcd_command()
*/
#else
/*
* Initialize LCD to 8 bit memory mapped mode
*/
/* enable external SRAM (memory mapped lcd) and one wait state */
MCUCR = _BV(SRE) | _BV(SRW);
/* reset LCD */
delay(16000); /* wait 16ms after power-on
*/
lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit
interface */
delay(4992); /* wait 5ms
*/
lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit
interface */
delay(64); /* wait 64us
*/
lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit
interface */
delay(64); /* wait 64us
*/
#endif
#if KS0073_4LINES_MODE
/* Display with KS0073 controller requires special commands for
enabling 4 line mode */
lcd_command(KS0073_EXTENDED_FUNCTION_REGISTER_ON);
lcd_command(KS0073_4LINES_MODE);
lcd_command(KS0073_EXTENDED_FUNCTION_REGISTER_OFF);
#else
lcd_command(LCD_FUNCTION_DEFAULT); /* function set: display
lines */
#endif
lcd_command(LCD_DISP_OFF); /* display off
*/
lcd_clrscr(); /* display clear
*/
lcd_command(LCD_MODE_DEFAULT); /* set entry mode
*/
lcd_command(dispAttr); /* display/cursor control
*/
}/* lcd_init */
A
AT90SXXXX
Gast
12.05.2010 21:01
#1709137
Sorry ich habe das falsch eingefügt habe erst später gesehen das man
Dateien auch hoch laden kann hier ist noch die lcd.h und main.c
Diese Zeile in lcd.h ist der Grund für die Fehlermeldungen: 1 #define LCD_RW_PIN /**< pin for RW line */
A
AT90SXXXX
Gast
12.05.2010 21:12
#1709144
ich habe das nach diser vorlage
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung#Anschluss_an_den_Controller
beschaltet nun ist ja RW an GND, was muss ich dan dort:
#define LCD_RW_PIN /**< pin for RW line */
eintragen wen das nicht offen bleiben darf?
mfg AT90S1200
AT90SXXXX schrieb:
> nun ist ja RW an GND
Dann kannst du den Fleury-Code nicht benutzen.
A
AT90SXXXX
Gast
12.05.2010 22:03
#1709186
So ich habe noch mal nach geschaut:
#define LCD_PORT PORTB /**< port for the LCD lines */
#define LCD_DATA0_PORT LCD_PORT /**< port for 4bit data bit 0 */
#define LCD_DATA1_PORT LCD_PORT /**< port for 4bit data bit 1 */
#define LCD_DATA2_PORT LCD_PORT /**< port for 4bit data bit 2 */
#define LCD_DATA3_PORT LCD_PORT /**< port for 4bit data bit 3 */
#define LCD_DATA0_PIN 0 /**< pin for 4bit data bit 0 */
#define LCD_DATA1_PIN 1 /**< pin for 4bit data bit 1 */
#define LCD_DATA2_PIN 2 /**< pin for 4bit data bit 2 */
#define LCD_DATA3_PIN 3 /**< pin for 4bit data bit 3 */
#define LCD_RS_PORT LCD_PORT /**< port for RS line */
#define LCD_RS_PIN 4 /**< pin for RS line */
#define LCD_RW_PORT LCD_PORT /**< port for RW line */
#define LCD_RW_PIN 6 /**< pin for RW line */
#define LCD_E_PORT LCD_PORT /**< port for Enable line */
#define LCD_E_PIN 5 /**< pin for Enable line */
so soll es angeschlossen sein.
und ich habe es hardwareseitig so:
#define LCD_PORT PORTB /**< port for the LCD lines */
#define LCD_DATA0_PORT LCD_PORT /**< port for 4bit data bit 0 */
#define LCD_DATA1_PORT LCD_PORT /**< port for 4bit data bit 1 */
#define LCD_DATA2_PORT LCD_PORT /**< port for 4bit data bit 2 */
#define LCD_DATA3_PORT LCD_PORT /**< port for 4bit data bit 3 */
#define LCD_DATA4_PIN 0 /**< pin for 4bit data bit 0 */
#define LCD_DATA5_PIN 1 /**< pin for 4bit data bit 1 */
#define LCD_DATA6_PIN 2 /**< pin for 4bit data bit 2 */
#define LCD_DATA7_PIN 3 /**< pin for 4bit data bit 3 */
#define LCD_RS_PORT LCD_PORT /**< port for RS line */
#define LCD_RS_PIN 4 /**< pin for RS line */
#define LCD_RW_PORT LCD_PORT /**< port for RW line */
#define LCD_RW_PIN 6 /**< pin for RW line */
#define LCD_E_PORT LCD_PORT /**< port for Enable line */
#define LCD_E_PIN 5 /**< pin for Enable line */
der Rest stimmt über ein, kann ich das so in die lcd.h datei
reinschreiben?
ich verwende ja nur die andere Seite vom Byte?
mfg AT90S1200
H
holger
Gast
12.05.2010 22:26
#1709210
>> nun ist ja RW an GND
>Dann kannst du den Fleury-Code nicht benutzen.
So ist es.
AT90SXXXX schrieb:
> kann ich das so in die lcd.h datei
> reinschreiben?
Nein. Du kannst bei den Defines die linke Seite nicht verändern.
A
AT90SXXXX
Gast
12.05.2010 22:40
#1709224
ok
ich habe RW an Pin 6 gehängt
muss ich das nibbel jetzt auch um löteten?
mfg AT90S1200
A
AT90SXXXX
Gast
13.05.2010 01:08
#1709306
okay
ich habe das jetzt so um gelötet das es PIN konform mit der lcd.h Datei
ist.
nun es kommt immer ein schwarzer Balken den ich mit dem Kontrast heller
dunkler machen kann.
ich weiß so langsam nicht mehr weiter
mfg AT90S1200
Hi
Also jetzt habe ich alles um gelötet das es mit der Hardware
übereinstimmt, an bei habe ich noch die Dateien die ich zur Verfügung
habe ich möchte einen ATmega8 verwenden, zur zeit sehe ich nur einen
schwarzen Balken und ich habe auch schon einen ATmega32, ATmega644
ausprobiert immer das gleiche Ergebnis.
mfg AT90S1200 .
Antwort schreiben