Skocz do zawartości

Atmega8 Problem z programem dla wyświetlacza.


byxu

Pomocna odpowiedź

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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

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
Link do komentarza
Share on other sites

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;
}
Link do komentarza
Share on other sites

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];
Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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ć?

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.