Witam jestem z tych początkujących. Zbudowałem sobie ostatnio układ na którym zamontowałem Atmegę8 i wyświetlacz 2*16 hd44780 JHD 162A. Ale mój problem nie dotyczy hardware tylko software, korzystałem z kursu AVR-GCC cz.5 czyli o programach z tekstem, robiłem wszystko tak jak jest w opisie tylko że klikając na MakeAll w winavr wywala mi błąd:
w folderze z projektem mam 5 plików:
Makefile (w Main file name jest "main", a w C/C++ source file(s) jest "file1.c file2.c")
hd44780 (w C/C++ source file(s) jest "hd44780.c"
hd44780.c
hd44780.h
main.c
te 3 kody źródłowe nie są mojego autorstwa nie wiem co zrobić żeby to działało, może ktoś spotkał się już z takim przypadkiem i wie co zrobić. Proszę o pomoc sam sobie z tym nie poradzę.
> "make.exe" all
-------- begin --------
avr-gcc (WinAVR 20080610) 4.3.0
Copyright (C) 2008 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.
make.exe: *** No rule to make target `main.elf', needed by `elf'. Stop.
> Process Exit Code: 2
> Time Taken: 00:03w folderze z projektem mam 5 plików:
Makefile (w Main file name jest "main", a w C/C++ source file(s) jest "file1.c file2.c")
hd44780 (w C/C++ source file(s) jest "hd44780.c"
hd44780.c
/*
Plik hd44780.c
Definicje kilku funkcji do obsługi alfanumerycznego
wyświetlacza LCD HD44780
*/
#include<avr/io.h>
#include<util/delay.h>
#include "hd44780.h"
/*--------------------------------------------------------*/
/* Zapis danej lub instrukcji */
void WriteToLCD (unsigned char v,unsigned char rs)
{
unsigned char bf;
SET_OUT_LCD_D4;
SET_OUT_LCD_D5;
SET_OUT_LCD_D6;
SET_OUT_LCD_D7;
if(v&0x10) SET_LCD_D4; else CLR_LCD_D4;
if(v&0x20) SET_LCD_D5; else CLR_LCD_D5;
if(v&0x40) SET_LCD_D6; else CLR_LCD_D6;
if(v&0x80) SET_LCD_D7; else CLR_LCD_D7;
CLR_LCD_E;
if(rs) SET_LCD_RS;else CLR_LCD_RS;
CLR_LCD_RW;
LCD_NOP;
SET_LCD_E;
LCD_NOP;
CLR_LCD_E;
LCD_NOP;
if(v&0x01) SET_LCD_D4; else CLR_LCD_D4;
if(v&0x02) SET_LCD_D5; else CLR_LCD_D5;
if(v&0x04) SET_LCD_D6; else CLR_LCD_D6;
if(v&0x08) SET_LCD_D7; else CLR_LCD_D7;
LCD_NOP;
SET_LCD_E;
LCD_NOP;
CLR_LCD_E;
LCD_NOP;
SET_IN_LCD_D4;
SET_IN_LCD_D5;
SET_IN_LCD_D6;
SET_IN_LCD_D7;
CLR_LCD_RS;
SET_LCD_RW;
SET_LCD_D7;
/* Przydałby się pełny odczyt */
do
{
LCD_NOP;
SET_LCD_E;
LCD_NOP;
bf = IS_SET_LCD_D7;
CLR_LCD_E;
LCD_NOP;
SET_LCD_E;
LCD_NOP;
LCD_NOP;
CLR_LCD_E;
}while( bf );
}
/*--------------------------------------------------------*/
/* Funkcja odczytuje adres i flage zajetosci */
unsigned char ReadAddressLCD ( void)
{
unsigned char g = 0 ;
CLR_LCD_RS;
SET_LCD_RW;
SET_IN_LCD_D4;
SET_IN_LCD_D5;
SET_IN_LCD_D6;
SET_IN_LCD_D7;
LCD_NOP;
SET_LCD_E;
LCD_NOP;
if(IS_SET_LCD_D4) g+=16;
if(IS_SET_LCD_D4) g+=32;
if(IS_SET_LCD_D4) g+=64;
if(IS_SET_LCD_D4) g+=128;
CLR_LCD_E;
LCD_NOP;
SET_LCD_E;
LCD_NOP;
if(IS_SET_LCD_D4) g+=8;
if(IS_SET_LCD_D4) g+=4;
if(IS_SET_LCD_D4) g+=2;
if(IS_SET_LCD_D4) g+=1;
CLR_LCD_E;
return g ;
}
/*---------------------------------------------------------*/
/* Inicjalizacja wyświetlacza */
void lcd_init(void)
{
_delay_ms(31);
SET_OUT_LCD_RS;
SET_OUT_LCD_RW;
SET_OUT_LCD_E;
SET_OUT_LCD_D4;
SET_OUT_LCD_D5;
SET_OUT_LCD_D6;
SET_OUT_LCD_D7;
CLR_LCD_E;
CLR_LCD_RS;
CLR_LCD_RW;
SET_LCD_D4;
SET_LCD_D5;
CLR_LCD_D6;
CLR_LCD_D7;
LCD_NOP;
SET_LCD_E;
LCD_NOP;
CLR_LCD_E;
LCD_NOP;
_delay_ms(10);
LCD_NOP;
SET_LCD_E;
LCD_NOP;
CLR_LCD_E;
LCD_NOP;
_delay_ms(2);
LCD_NOP;
SET_LCD_E;
LCD_NOP;
CLR_LCD_E;
LCD_NOP;
_delay_ms(2);
CLR_LCD_D4;
LCD_NOP;
SET_LCD_E;
LCD_NOP;
CLR_LCD_E;
LCD_NOP;
_delay_us(80);
WriteToLCD (0x28 , LCDCOMMAND) ;
LCD_DISPLAY(0) ;
LCD_CLEAR ;
LCD_ENTRY_MODE(LCDINCREMENT) ;
}
/*--------------------------------------------------------*/
/* Wyswietla tekst na aktualnej pozycji kursora */
void lcd_puts(char *str)
{
unsigned char i =0;
while( str[i])
LCD_WRITE_DATA(str[i++]) ;
}hd44780.h
/*
Plik hd44780.h
*/
#ifndef LCD_HD44780
#define LCD_HD44780
/* RS */
#define SET_OUT_LCD_RS DDRD |= _BV(PD0)
#define SET_LCD_RS PORTD |= _BV(PD0)
#define CLR_LCD_RS PORTD &= ~_BV(PD0)
/* RW */
#define SET_OUT_LCD_RW DDRD |= _BV(PD1)
#define SET_LCD_RW PORTD |= _BV(PD1)
#define CLR_LCD_RW PORTD &= ~_BV(PD1)
/* E */
#define SET_OUT_LCD_E DDRD |= _BV(PD2)
#define SET_LCD_E PORTD |= _BV(PD2)
#define CLR_LCD_E PORTD &= ~_BV(PD2)
/* D4 */
#define SET_OUT_LCD_D4 DDRD |= _BV(PD3)
#define SET_IN_LCD_D4 DDRD &= ~_BV(PD3)
#define SET_LCD_D4 PORTD |= _BV(PD3)
#define CLR_LCD_D4 PORTD &= ~_BV(PD3)
#define IS_SET_LCD_D4 PIND & _BV(PD3)
/* D5 */
#define SET_OUT_LCD_D5 DDRD |= _BV(PD4)
#define SET_IN_LCD_D5 DDRD &= ~_BV(PD4)
#define SET_LCD_D5 PORTD |= _BV(PD4)
#define CLR_LCD_D5 PORTD &= ~_BV(PD4)
#define IS_SET_LCD_D5 PIND & _BV(PD4)
/* D6 */
#define SET_OUT_LCD_D6 DDRD |= _BV(PD5)
#define SET_IN_LCD_D6 DDRD &= ~_BV(PD5)
#define SET_LCD_D6 PORTD |= _BV(PD5)
#define CLR_LCD_D6 PORTD &= ~_BV(PD5)
#define IS_SET_LCD_D6 PIND & _BV(PD5)
/* D7 */
#define SET_OUT_LCD_D7 DDRD |= _BV(PD6)
#define SET_IN_LCD_D7 DDRD &= ~_BV(PD6)
#define SET_LCD_D7 PORTD |= _BV(PD6)
#define CLR_LCD_D7 PORTD &= ~_BV(PD6)
#define IS_SET_LCD_D7 PIND & _BV(PD6)
#define LCD_NOP asm volatile("nop\n\t""nop\n\t" "nop\n\t" "nop\n\t" ::);
#define LCDCOMMAND 0
#define LCDDATA 1
#define LCD_LOCATE(x,y) WriteToLCD(0x80|((x)+((y)*0x40)), LCDCOMMAND)
#define LCD_CLEAR WriteToLCD(0x01, LCDCOMMAND)
#define LCD_HOME WriteToLCD(0x02, LCDCOMMAND)
/* IDS */
#define LCDINCREMENT 0x02
#define LCDDECREMENT 0x00
#define LCDDISPLAYSHIFT 0x01
#define LCD_ENTRY_MODE(IDS) WriteToLCD(0x04|(IDS), LCDCOMMAND)
/* BCD */
#define LCDDISPLAY 0x04
#define LCDCURSOR 0x02
#define LCDBLINK 0x01
#define LCD_DISPLAY(DCB) WriteToLCD(0x08|(DCB), LCDCOMMAND)
/* RL */
#define LCDLEFT 0x00
#define LCDRIGHT 0x04
#define LCD_SHIFT_DISPLAY(RL) WriteToLCD(0x18|(RL), LCDCOMMAND)
#define LCD_SHIFT_CURSOR(RL) WriteToLCD(0x10|(RL), LCDCOMMAND)
#define LCD_CGRAM_ADDRESS(A) WriteToLCD(0x40|((A)&0x3f), LCDCOMMAND)
#define LCD_DDRAM_ADDRESS(A) WriteToLCD(0x80|((A)&0x7f), LCDCOMMAND)
#define LCD_WRITE_DATA(D) WriteToLCD((D),LCDDATA)
void lcd_init(void);
void WriteToLCD(unsigned char v,unsigned char rs);
unsigned char ReadAddressLCD(void);
void lcd_puts(char *str);
#endif
main.c
*
Plik main.c
KURS AVR-GCC cz.5
Wyświetlacz alfanumeryczny LCD HD44780
(schemat i opis działania w artykule)
układ atmega8 (1MHz)
*/
#include <avr/io.h>
#include <util/delay.h>
/* Wstawia w tym miejscu zawartość
pliku hd44780.h*/
#include "hd44780.h"
int main(void)
{
/* Napisy przechowujemy w tablicach */
char str1[] = "KURS";
char str2[] = " AVR-GCC";
char str3[] = "cz.5";
/* Funkcja inicjalizuje wyświetlacz*/
lcd_init();
/* Włącza wyświetlanie */
LCD_DISPLAY(LCDDISPLAY);
while(1)
{
/* Czyści cały ekran */
LCD_CLEAR;
/* Ustawia kursor w pozycji:
pierwszy wiersz, szósta kolumna */
LCD_LOCATE(5,0);
/* Wysyła do wyświetlacza jeden znak*/
LCD_WRITE_DATA('S');
_delay_ms(200);
LCD_WRITE_DATA('i');
_delay_ms(200);
LCD_WRITE_DATA('e');
_delay_ms(200);
LCD_WRITE_DATA('m');
_delay_ms(200);
LCD_WRITE_DATA('k');
_delay_ms(200);
LCD_WRITE_DATA('a');
_delay_ms(200);
LCD_WRITE_DATA('!');
_delay_ms(2000);
LCD_CLEAR;
LCD_LOCATE(2,0);
/* Funkcja lcd_puts wysyła do
wyświetlacza ciąg znaków */
lcd_puts(str1);
_delay_ms(800);
lcd_puts(str2);
_delay_ms(800);
LCD_LOCATE(6,1);
lcd_puts(str3);
_delay_ms(2000);
LCD_CLEAR;
LCD_LOCATE(1,0);
/* Jako argumentu funkcji można
wstawić stałą napisową */
lcd_puts("Programy");
_delay_ms(800);
LCD_LOCATE(4,1);
lcd_puts("z tekstem:)");
/* Czeka 2.5 sek. */
_delay_ms(2500);
}
return 0;
}te 3 kody źródłowe nie są mojego autorstwa nie wiem co zrobić żeby to działało, może ktoś spotkał się już z takim przypadkiem i wie co zrobić. Proszę o pomoc sam sobie z tym nie poradzę.