Skocz do zawartości

Atmega8 Problem z programem dla wyświetlacza.


Pomocna odpowiedź

Napisano

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.

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

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;
}

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];

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

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

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.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...