byxu Napisano Luty 26, 2011 Udostępnij Napisano Luty 26, 2011 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: > "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. Size before: c:\WinAVR-20080610\bin\avr-size.exe: main.elf: File format not recognized Creating load file for Flash: main.hex avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock main.elf main.hex avr-objcopy: main.elf: File format not recognized make.exe: *** [main.hex] Error 1 > Process Exit Code: 2 > Time Taken: 00:03 dodam że w folderze z projektem mam następujące pliki: Makefile hd44780.c hd44780.h hd44780 main.c main.elf (zrobiony w programie makefile w "Main file name" wpisałem "main.elf" i zapisując dałem rozszerzenie main.elf a w folderze .dep jest plik o nazwie main.o.d który zajmuje 0KB niewiem co zrobić, może ktoś się już spotkał z tym błędem, jak robiłem jakieś programy na atmege typu migające diody to nie było problemu tylko teraz. Cytuj Link do komentarza Share on other sites More sharing options...
olimek Luty 26, 2011 Udostępnij Luty 26, 2011 Wygląda na to że main.elf ma złe rozszerzenie . Cytuj Link do komentarza Share on other sites More sharing options...
Armir Luty 27, 2011 Udostępnij Luty 27, 2011 Main file name ma być main.c Cytuj Link do komentarza Share on other sites More sharing options...
Harnas Luty 27, 2011 Udostępnij Luty 27, 2011 Z tego co pamiętam ma być same main.Przynajmniej tak mam we większości programów. Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
byxu Luty 27, 2011 Autor tematu Udostępnij Luty 27, 2011 tylko że ja utworzyłem 3 pliki w programie Mfile: 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" main.elf (w Main file name jest "main.elf" a gdy usunę z folderu projektu plik "main.elf" to wywala błąd: > "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:03 Cytuj Link do komentarza Share on other sites More sharing options...
Armir Luty 27, 2011 Udostępnij Luty 27, 2011 Daj kod programu. Pliki powinieneś dołączyć przez include w kodzie a nie w makefile. Cytuj Link do komentarza Share on other sites More sharing options...
byxu Luty 27, 2011 Autor tematu Udostępnij Luty 27, 2011 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; } Cytuj Link do komentarza Share on other sites More sharing options...
Armir Luty 27, 2011 Udostępnij Luty 27, 2011 Zamiast tej biblioteki polecam http://radzio.dxp.pl/hd44780/ Dla ciebie to będzie 4bitowy z odczytem Obsługa prawie identyczna jak tej tylko zamiast #include "hd44780.h" dajesz #include "hd44780.c" Na początku programu LCD_Initalize(); ,do wyświetlania tekstu LCD_WriteText("teks"); ,a do zmiennej LCD_WriteText(itoa(zmienna,b,10)); i musisz dodać na początku char b[10]; Cytuj Link do komentarza Share on other sites More sharing options...
byxu Luty 27, 2011 Autor tematu Udostępnij Luty 27, 2011 program ma już skompilowany tylko teraz mam problem z błędem: > "make.exe" program make.exe: *** No rule to make target `program'. Stop. > Process Exit Code: 2 > Time Taken: 00:00 użyłem gotowego pliku makefile z przykładów winavr chyba trzeba jakoś przerobić plik makefile tylko jak? używam programatora zgodnego z stk500v2 firmy And-Tech i ustawionego na port com3 poniżej zawartość mojego folderu z projektem: main.rar Cytuj Link do komentarza Share on other sites More sharing options...
Armir Luty 27, 2011 Udostępnij Luty 27, 2011 Makefile robi się programem dostępnym z winavr. W załączniku jest dobry. Cytuj Link do komentarza Share on other sites More sharing options...
byxu Luty 27, 2011 Autor tematu Udostępnij Luty 27, 2011 No już chyba sprawa software załatwiona tylko przy programowaniu atmegi mam jakiś błąd: > "make.exe" program avrdude -p -c stk500v2 -P com3 -V -U flash:w:main.hex avrdude: no programmer has been specified on the command line or the config file Specify a programmer using the -c option and try again make.exe: *** [program] Error 1 > Process Exit Code: 2 > Time Taken: 00:00 Ten błąd występuje nawet wtedy gdy mam odłączony programator. Aha i ten błąd występuje tylko wtedy gdy próbuję wgrać do atmegi ten program do obsługi wyświetlacza, przedchwilą próbowałem wgrać inny program(taki prosty co zapala naprzemian diody parzyste i nieparzyste po określonym czasie) to ten program wgrywa się elegancko, a oto raport z wgrywania tego prostego programu: > "make.exe" program avrdude -p atmega8 -P com3 -c stk500v2 -U flash:w:testowy.hex avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.10s avrdude: Device signature = 0x1e9307 avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed To disable this feature, specify the -D option. avrdude: erasing chip avrdude: reading input file "testowy.hex" avrdude: input file testowy.hex auto detected as Intel Hex avrdude: writing flash (144 bytes): Writing | ################################################## | 100% 0.98s avrdude: 144 bytes of flash written avrdude: verifying flash memory against testowy.hex: avrdude: load data flash data from input file testowy.hex: avrdude: input file testowy.hex auto detected as Intel Hex avrdude: input file testowy.hex contains 144 bytes avrdude: reading on-chip flash data: Reading | ################################################## | 100% 0.86s avrdude: verifying ... avrdude: 144 bytes of flash verified avrdude done. Thank you. > Process Exit Code: 0 > Time Taken: 00:03 jak temu zaradzić? Cytuj Link do komentarza Share on other sites More sharing options...
trixiglk Marzec 3, 2011 Udostępnij Marzec 3, 2011 Porównaj co sam napisałeś w tych linijkach: "avrdude -p -c stk500v2 -P com3 -V -U flash:w:main.hex " - to ci nie działa "avrdude -p atmega8 -P com3 -c stk500v2 -U flash:w:testowy.hex " - a to działa nie jestem pewnien ale może kolejność zdefiniowania niektórych parametrów ma znaczenie. I czytaj ze zrozumieniem - on do Ciebie krzyczy że nie zdefiniowałeś programatora, i że definiuje się przy uzyciu opcji "-c" porównaj dokładnie kolejność i wystąpienia tej opcji. Cytuj Link do komentarza Share on other sites More sharing options...
mactro Marzec 3, 2011 Udostępnij Marzec 3, 2011 Raczej chodzi o to, że nie ma podanego rodzaju uC. Po -p musisz podać co programujesz, np. atmega8 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!