<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=9459&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-05-12T18:48:24+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=9459&amp;mode</id>
<entry>
<author><name><![CDATA[basti2001]]></name></author>
<updated>2015-05-12T18:48:24+01:00</updated>
<published>2015-05-12T18:48:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=128986#p128986</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=128986#p128986"/>
<title type="html"><![CDATA[Re: undefined reference to `__eerd_byte_m16']]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=128986#p128986"><![CDATA[
<div class="quotetitle">domelos napisał(a):</div><div class="quotecontent"><br />Okazuje się iż błąd pojawia się po zmianie typy procesora do kompilacji z ATmega16 (OK) na ATmega8 (błędy).<br />Dziwnie wygląda również jeden z komunikatów przy kompilacji, który informuje o kompilacji na procesor ATmega16<br /><br /><em>20:08:37 **** Clean-only build of configuration Release for project menu_przyklad ****<br />make clean <br />rm -rf  menu_przyklad.hex  ./menu/menu.o  ./lcd/lcd44780.o  ./main.o  menu_przyklad.eep  sizedummy  menu_przyklad.lss  ./menu/menu.d  ./lcd/lcd44780.d  ./main.d  menu_przyklad.elf<br />' '<br /><br />20:08:37 Build Finished (took 485ms)<br /><br />20:08:37 **** Incremental Build of configuration Release for project menu_przyklad ****<br />make all <br />'Building file: ../menu/menu.c'<br />'Invoking: AVR Compiler'<br />avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=12000000UL -MMD -MP -MF&quot;menu/menu.d&quot; -MT&quot;menu/menu.d&quot; -c -o &quot;menu/menu.o&quot; &quot;../menu/menu.c&quot;<br />'Finished building: ../menu/menu.c'<br />' '<br />'Building file: ../lcd/lcd44780.c'<br />'Invoking: AVR Compiler'<br /><strong>avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega16 -DF_CPU=16000000UL -MMD -MP -MF&quot;lcd/lcd44780.d&quot; -MT&quot;lcd/lcd44780.d&quot; -c -o&quot;lcd/lcd44780.o&quot; &quot;../lcd/lcd44780.c&quot;<br />'Finished building: ../lcd/lcd44780.c'<br /></strong>' '<br />'Building file: ../main.c'<br />'Invoking: AVR Compiler'<br />avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=12000000UL -MMD -MP -MF&quot;main.d&quot; -MT&quot;main.d&quot; -c -o &quot;main.o&quot; &quot;../main.c&quot;<br />'Finished building: ../main.c'<br />' '<br />'Building target: menu_przyklad.elf'<br />'Invoking: AVR C Linker'<br />avr-gcc -Wl,-Map,menu_przyklad.map -mmcu=atmega8 -o &quot;menu_przyklad.elf&quot;  ./menu/menu.o  ./lcd/lcd44780.o  ./main.o   <br />./lcd/lcd44780.o: In function `lcd_str_E':<br />lcd44780.c:(.text+0xba): undefined reference to `__eerd_byte_m16'<br />./lcd/lcd44780.o: In function `lcd_defchar_E':<br />lcd44780.c:(.text+0x1dc): undefined reference to `__eerd_byte_m16'<br />collect2.exe: error: ld returned 1 exit status<br />make: *** [menu_przyklad.elf] Błąd 1<br /><br />20:08:39 Build Finished (took 1s.657ms)<br /></em><br /><br />main.c<br />[syntax=c]/*<br /> * main.c<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;lcd/lcd44780.h&quot;<br />#include &quot;menu/menu.h&quot;<br /><br />#define KL1 (1&lt;&lt;PC0)<br />#define KL2 (1&lt;&lt;PC1)<br />#define KL3 (1&lt;&lt;PC2)<br />#define KL4 (1&lt;&lt;PC3)<br /><br />#define NULL 0<br />#define DEFAULT 0<br /><br />volatile uint16_t Timer1, Timer2;/* timery programowe 100Hz */<br /><br />uint8_t init;<br /><br />/************** funkcja SuperDebounce do obsługi pojedynczych klawiszy ***************/<br />void SuperDebounce(uint8_t * key_state, volatile uint8_t *KPIN,<br />uint8_t key_mask, uint16_t rep_time, uint16_t rep_wait,<br />void (*push_proc)(void), void (*rep_proc)(void) );<br /><br /><br />void inicjalizuj_lcd(void) {<br />if(!init) {<br />lcd_init();<br />lcd_str(&quot;Start...&quot;);<br />init=1;<br />}<br />}<br /><br />void licznik_na_lcd(void) {<br />static uint8_t licznik;<br />if(init) {<br />lcd_locate(1,0);<br />lcd_str(&quot;licznik: &quot;);<br />lcd_int(licznik++);<br />lcd_str(&quot;  &quot;);<br />}<br />}<br /><br />void display_menu_off(void);<br /><br />int main(void) {//rejestracja ekranu głównego<br />register_ekran_glowny(display_menu_off);<br /><br />inicjalizuj_lcd();<br /><br />PORTB |= KL1|KL2|KL3|KL4; // podciągnięcie pinów do VCC<br />DDRB &amp;= ~(KL1|KL2|KL3|KL4); // kierunek pinów - wejściowy<br /><br />/* Timer2 – inicjalizacja przerwania co 10ms */<br />TCCR2 |= (1&lt;&lt;WGM21);// tryb pracy CTC<br />TCCR2 |= (1&lt;&lt;CS22)|(1&lt;&lt;CS20);// preskaler = 1024<br />OCR2 = 107;// przerwanie porównania co 10ms (100Hz)<br />TIMSK |= (1&lt;&lt;OCIE2);// Odblokowanie przerwania CompareMatch<br /><br />uint8_t k1, k2, k3, k4;  // zmienne pomocnicze do przechowywania stanów klawiszy<br /><br />pozycja = &amp;stop; //* pozycja początkowa menu<br />menu_flag=0;//*<br />sei();<br />while(1) {<br />if(menu_flag!=pozycja) { // * &quot;chodzenie&quot; po menu<br />SuperDebounce(&amp;k1, &amp;PINB, KL1, 20, 500, next, NULL );<br />SuperDebounce(&amp;k2, &amp;PINB, KL2, 20, 500, prev, NULL );<br />SuperDebounce(&amp;k3, &amp;PINB, KL3, 20, 500, enter, NULL );<br />SuperDebounce(&amp;k4, &amp;PINB, KL4, 20, 500, back, NULL );<br />}<br /><br />//przykaładowe wywołanie funkcji przez menu<br />if(menu_flag==&amp;submenu2) {<br />menu_flag=0;/*wywołanie funkcji */}  //*<br />if(menu_flag==&amp;submenu11)<br />menu_flag=0;//*<br />if(menu_flag==&amp;submenu12)<br />menu_flag=0;//*<br />if(menu_flag==&amp;menu3)<br />menu_flag=0;//*<br /><br />menu_lcd(); //wyświetlanie menu<br />}//koniec while //*<br />}<br /><br />void display_menu_off()<br />{<br />lcd_locate(0,0); lcd_str(&quot;ekran glowny&quot;);<br />lcd_locate(1,0); lcd_str(&quot; ###MENU OFF### &quot;);<br />}<br /><br />/************** funkcja SuperDebounce do obsługi pojedynczych klawiszy ***************<br /> * AUTOR: Mirosław Kardaś<br /> * ZALETY:<br /> * - nie wprowadza najmniejszego spowalnienia<br /> * - posiada funkcję REPEAT (powtarzanie akcji dla dłużej wciśniętego przycisku)<br /> * - można przydzielić różne akcje dla trybu REPEAT i pojedynczego kliknięcia<br /> * - można przydzielić tylko jedną akcję wtedy w miejsce drugiej przekazujemy 0 (NULL)<br /> *<br /> * Wymagania:<br /> * Timer programowy utworzony w oparciu o Timer sprzętowy (przerwanie 100Hz)<br /> *<br /> * Parametry wejściowe:<br /> *<br /> * *key_state - wskaźnik na zmienną w pamięci RAM (1 bajt) - do przechowywania stanu klawisza<br /> *  *KPIN - nazwa PINx portu na którym umieszczony jest klawisz, np: PINB<br /> *  key_mask - maska klawisza np: (1&lt;&lt;PB3)<br /> *  rep_time - czas powtarzania funkcji rep_proc w trybie REPEAT<br /> *  rep_wait - czas oczekiwania do przejścia do trybu REPEAT<br /> *  push_proc - wskaźnik do własnej funkcji wywoływanej raz po zwolenieniu przycisku<br /> *  rep_proc - wskaźnik do własnej funkcji wykonywanej w trybie REPEAT<br /> **************************************************************************************/<br />void SuperDebounce(uint8_t * key_state, volatile uint8_t *KPIN,<br />uint8_t key_mask, uint16_t rep_time, uint16_t rep_wait,<br />void (*push_proc)(void), void (*rep_proc)(void) ) {<br /><br />enum {idle, debounce, go_rep, wait_rep, rep};<br /><br />if(!rep_time) rep_time=20;<br />if(!rep_wait) rep_wait=150;<br /><br />uint8_t key_press = !(*KPIN &amp; key_mask);<br /><br />if( key_press &amp;&amp; !*key_state ) {<br />*key_state = debounce;<br />Timer1 = 15;<br />} else<br />if( *key_state  ) {<br /><br />if( key_press &amp;&amp; debounce==*key_state &amp;&amp; !Timer1 ) {<br />*key_state = 2;<br />Timer1=5;<br />} else<br />if( !key_press &amp;&amp; *key_state&gt;1 &amp;&amp; *key_state&lt;4 ) {<br />if(push_proc) push_proc();/* KEY_UP */<br />*key_state=idle;<br />} else<br />if( key_press &amp;&amp; go_rep==*key_state &amp;&amp; !Timer1 ) {<br />*key_state = wait_rep;<br />Timer1=rep_wait;<br />} else<br />if( key_press &amp;&amp; wait_rep==*key_state &amp;&amp; !Timer1 ) {<br />*key_state = rep;<br />} else<br />if( key_press &amp;&amp; rep==*key_state &amp;&amp; !Timer1 ) {<br />Timer1 = rep_time;<br />if(rep_proc) rep_proc();/* KEY_REP */<br />}<br />}<br />if( *key_state&gt;=3 &amp;&amp; !key_press ) *key_state = idle;<br />}<br /><br />ISR(TIMER2_COMP_vect)<br />{<br />uint16_t n;<br /><br />n = Timer1;/* 100Hz Timer1 */<br />if (n) Timer1 = --n;<br />n = Timer2;/* 100Hz Timer2 */<br />if (n) Timer2 = --n;<br />}[/syntax]<br /><br /><br />Skorzystałem z plików dla tworzenia menu od kolegi Lukasz89<br /> <br />plik menu.h<br />[syntax=c]/*<br /> * menu.h<br /> *<br /> *  Created on: 2012-07-24<br /> *      Author: Łukasz<br /> */<br /><br />#ifndef MENU_H_<br />#define MENU_H_<br />#include &lt;avr/pgmspace.h&gt;<br /><br />typedef const char PROGMEM tmenu;<br />typedef struct menu menu;<br />struct menu<br />{// struktura reazlaiujaca menu<br />tmenu *name;//napis wyświetlany na lcd<br /> menu *sub;//wskaźnik do submenu<br /> menu *next;//wskaźnik do następnego manu na tym samym poziomie<br /> menu *parent;//wskaźnik do manu nadrzędnego<br />};<br />//deklaracja elemntów menu<br />extern menu stop;<br /><br />extern menu menu1;<br />extern menu submenu11;<br />extern menu submenu12;<br /><br />extern menu menu2;<br />extern menu submenu2;<br />extern menu menu3;<br /><br />extern menu *menu_flag;<br />extern menu *pozycja;<br /><br />void next(void);  //funkcje do pouszania się po menu<br />void prev(void);<br />void enter(void);<br />void back(void);<br /><br />void lcd_clear(void); //czyszczeni całego ekranu<br />void menu_lcd(void);  // wyswietlanie menu<br /><br /><br />void register_ekran_glowny (void (*callback)()); //rejestracja ekranu głównego<br /><br /><br /><br />#endif /* MENU_H_ */[/syntax]<br /><br />menu.c<br />[syntax=c]/*<br /> * menu.c<br /> *<br /> *  Created on: 2012-07-24<br /> *      Author: Łukasz<br /> */<br /><br />#include &quot;menu.h&quot;<br />#include &quot;../lcd/lcd44780.h&quot;  //lib Mirka do LCD<br /><br />#define LCD_Y 2<br />#define LCD_X 16<br /><br />// napisy na LCD elemntów menu<br />tmenu tmenu1&#91;&#93; = &quot;menu1&quot;;<br />tmenu tmenu2&#91;&#93; = &quot;menu2&quot;;<br />tmenu tmenu3&#91;&#93; = &quot;menu3&quot;;<br />tmenu tsub11&#91;&#93; = &quot;podmenu1&quot;;<br />tmenu tsub12&#91;&#93; = &quot;podmenu2&quot;;<br />tmenu tmenu21&#91;&#93; =&quot;pojedyncze sub&quot;;<br /><br /><br />//deficja elemntów menu<br />menu stop;<br /><br />menu menu1;<br />menu submenu11;<br />menu submenu12;<br /><br />menu menu2;<br />menu submenu2;<br />menu menu3;<br />menu stop = {0,&amp;menu1,&amp;menu1,&amp;stop};<br /><br />menu menu1 = {tmenu1, &amp;submenu11, &amp;menu2, &amp;stop};<br />menu submenu11 = {tsub11, &amp;submenu11, &amp;submenu12, &amp;menu1};<br />menu submenu12= {tsub12, &amp;submenu12 ,&amp;submenu11, &amp;menu1};<br /><br />menu menu2={tmenu2, &amp;submenu2, &amp;menu3, &amp;stop};<br />menu submenu2={tmenu21, &amp;submenu2, &amp;submenu2, &amp;menu2};<br /><br />menu menu3 = {tmenu3, &amp;menu3, &amp;menu1, &amp;stop};<br /><br /><br />uint8_t tab1&#91;&#93;={ 0x08, 0x0C, 0x0E, 0x0F, 0x0E, 0x0C, 0x08, 0x00,};<br /><br />menu *menu_flag=0;<br />menu *pozycja = &amp;stop;<br /><br />static void (*ekran_glowny)();<br />void register_ekran_glowny (void (*callback)()){<br />ekran_glowny=callback;<br />}<br /><br /><br />void next(void)<br />{pozycja = pozycja-&gt;next;<br />}<br /><br />void prev(void)<br />{<br />menu*i;<br />i=(pozycja-&gt;parent)-&gt;sub;<br />if(pozycja != &amp;stop){<br />while(i-&gt;next != pozycja)i=i-&gt;next;}<br />pozycja=i;<br /><br />}<br /><br />void enter(void)<br />{<br />if(pozycja==pozycja-&gt;sub) menu_flag=pozycja;<br />else pozycja = pozycja-&gt;sub;<br />}<br /><br />void back(void)<br />{pozycja=pozycja-&gt;parent;<br />}<br /><br />void lcd_clear(void)<br />{uint8_t i,j;<br />for(j=0;j&lt;=LCD_Y;j++){<br />for(i=0;i&lt;=LCD_X;i++){<br />lcd_locate(j,i);lcd_str(&quot; &quot;);<br />}<br />}}<br /><br />void menu_lcd(void)<br />{ static uint16_t z=0;<br />if(pozycja!=&amp;stop &amp;&amp; menu_flag!=pozycja)<br />{ //wyświetlaj gdy jest w menu i nie w funkcji wyołwanej przez menu<br />lcd_defchar( 0x80, tab1);<br />static uint16_t a=0;<br />menu *i, *j; //lokalne pozycje<br />int8_t b=0,c=1;<br />if(a!=(uint16_t)pozycja)lcd_clear();<br />i=(pozycja-&gt;parent)-&gt;sub;<br />j=(pozycja-&gt;parent)-&gt;sub;<br /><br />while(i!=pozycja) // wyznaczanie liczby pozycji mna obecnym poziomie menu<br />{i=i-&gt;next;<br />c++;<br />}<br />i=(pozycja-&gt;parent)-&gt;sub;<br />if((c-LCD_Y)&gt;0){ //wyświetlanie menu gdy pozycji jest więcej niż wierszy LCD<br />for(b=-(c-LCD_Y);b&lt;=(LCD_Y-1);b++){<br />lcd_locate(b,1);if(b&gt;=0)lcd_str_P(i-&gt;name);<br />if(i==pozycja){lcd_locate(b,0);<br />lcd_str(&quot;\x80&quot;); }<br />i=i-&gt;next;<br />}<br />}<br />else{ // wyświetlanie gdy pozycji menu jest mniej lub tyle samo co wierszy LCD<br />for(b=0;b&lt;=(LCD_Y-1);b++){<br />lcd_locate(b,1);lcd_str_P(i-&gt;name);<br />if(i==pozycja){lcd_locate(b,0);<br />lcd_str(&quot;\x80&quot;);}<br />if(i-&gt;next==j)break;<br />i=i-&gt;next;<br />}<br />}<br /><br />//b=0;c=1;<br /><br />a=(uint16_t)pozycja;z=0;<br />}<br />else if(pozycja==&amp;stop) {//wyświetlanie ekranu głównego - to co jest natywnie na lcd gdy nie jesturuchomione menu<br />if(z==0)lcd_clear();<br />if (ekran_glowny)ekran_glowny();<br />z++;<br />}<br />//koniec funkcji menu_lcd<br />}[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 21 minutach ]</span></strong><br /><br />Założyłem nowy czysty projekt, skopiowałem pliki i ... pomogło.<br /></div><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7949">basti2001</a> — 12 maja 2015, o 18:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[domelos]]></name></author>
<updated>2014-11-28T20:21:35+01:00</updated>
<published>2014-11-28T20:21:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106453#p106453</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106453#p106453"/>
<title type="html"><![CDATA[Re: undefined reference to `__eerd_byte_m16']]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106453#p106453"><![CDATA[
Okazuje się iż błąd pojawia się po zmianie typy procesora do kompilacji z ATmega16 (OK) na ATmega8 (błędy).<br />Dziwnie wygląda również jeden z komunikatów przy kompilacji, który informuje o kompilacji na procesor ATmega16<br /><br /><em>20:08:37 **** Clean-only build of configuration Release for project menu_przyklad ****<br />make clean <br />rm -rf  menu_przyklad.hex  ./menu/menu.o  ./lcd/lcd44780.o  ./main.o  menu_przyklad.eep  sizedummy  menu_przyklad.lss  ./menu/menu.d  ./lcd/lcd44780.d  ./main.d  menu_przyklad.elf<br />' '<br /><br />20:08:37 Build Finished (took 485ms)<br /><br />20:08:37 **** Incremental Build of configuration Release for project menu_przyklad ****<br />make all <br />'Building file: ../menu/menu.c'<br />'Invoking: AVR Compiler'<br />avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=12000000UL -MMD -MP -MF&quot;menu/menu.d&quot; -MT&quot;menu/menu.d&quot; -c -o &quot;menu/menu.o&quot; &quot;../menu/menu.c&quot;<br />'Finished building: ../menu/menu.c'<br />' '<br />'Building file: ../lcd/lcd44780.c'<br />'Invoking: AVR Compiler'<br /><strong>avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega16 -DF_CPU=16000000UL -MMD -MP -MF&quot;lcd/lcd44780.d&quot; -MT&quot;lcd/lcd44780.d&quot; -c -o&quot;lcd/lcd44780.o&quot; &quot;../lcd/lcd44780.c&quot;<br />'Finished building: ../lcd/lcd44780.c'<br /></strong>' '<br />'Building file: ../main.c'<br />'Invoking: AVR Compiler'<br />avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=12000000UL -MMD -MP -MF&quot;main.d&quot; -MT&quot;main.d&quot; -c -o &quot;main.o&quot; &quot;../main.c&quot;<br />'Finished building: ../main.c'<br />' '<br />'Building target: menu_przyklad.elf'<br />'Invoking: AVR C Linker'<br />avr-gcc -Wl,-Map,menu_przyklad.map -mmcu=atmega8 -o &quot;menu_przyklad.elf&quot;  ./menu/menu.o  ./lcd/lcd44780.o  ./main.o   <br />./lcd/lcd44780.o: In function `lcd_str_E':<br />lcd44780.c:(.text+0xba): undefined reference to `__eerd_byte_m16'<br />./lcd/lcd44780.o: In function `lcd_defchar_E':<br />lcd44780.c:(.text+0x1dc): undefined reference to `__eerd_byte_m16'<br />collect2.exe: error: ld returned 1 exit status<br />make: *** [menu_przyklad.elf] Błąd 1<br /><br />20:08:39 Build Finished (took 1s.657ms)<br /></em><br /><br />main.c<br />[syntax=c]/*<br /> * main.c<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;lcd/lcd44780.h&quot;<br />#include &quot;menu/menu.h&quot;<br /><br />#define KL1 (1&lt;&lt;PC0)<br />#define KL2 (1&lt;&lt;PC1)<br />#define KL3 (1&lt;&lt;PC2)<br />#define KL4 (1&lt;&lt;PC3)<br /><br />#define NULL 0<br />#define DEFAULT 0<br /><br />volatile uint16_t Timer1, Timer2;/* timery programowe 100Hz */<br /><br />uint8_t init;<br /><br />/************** funkcja SuperDebounce do obsługi pojedynczych klawiszy ***************/<br />void SuperDebounce(uint8_t * key_state, volatile uint8_t *KPIN,<br />uint8_t key_mask, uint16_t rep_time, uint16_t rep_wait,<br />void (*push_proc)(void), void (*rep_proc)(void) );<br /><br /><br />void inicjalizuj_lcd(void) {<br />if(!init) {<br />lcd_init();<br />lcd_str(&quot;Start...&quot;);<br />init=1;<br />}<br />}<br /><br />void licznik_na_lcd(void) {<br />static uint8_t licznik;<br />if(init) {<br />lcd_locate(1,0);<br />lcd_str(&quot;licznik: &quot;);<br />lcd_int(licznik++);<br />lcd_str(&quot;  &quot;);<br />}<br />}<br /><br />void display_menu_off(void);<br /><br />int main(void) {//rejestracja ekranu głównego<br />register_ekran_glowny(display_menu_off);<br /><br />inicjalizuj_lcd();<br /><br />PORTB |= KL1|KL2|KL3|KL4; // podciągnięcie pinów do VCC<br />DDRB &amp;= ~(KL1|KL2|KL3|KL4); // kierunek pinów - wejściowy<br /><br />/* Timer2 – inicjalizacja przerwania co 10ms */<br />TCCR2 |= (1&lt;&lt;WGM21);// tryb pracy CTC<br />TCCR2 |= (1&lt;&lt;CS22)|(1&lt;&lt;CS20);// preskaler = 1024<br />OCR2 = 107;// przerwanie porównania co 10ms (100Hz)<br />TIMSK |= (1&lt;&lt;OCIE2);// Odblokowanie przerwania CompareMatch<br /><br />uint8_t k1, k2, k3, k4;  // zmienne pomocnicze do przechowywania stanów klawiszy<br /><br />pozycja = &amp;stop; //* pozycja początkowa menu<br />menu_flag=0;//*<br />sei();<br />while(1) {<br />if(menu_flag!=pozycja) { // * &quot;chodzenie&quot; po menu<br />SuperDebounce(&amp;k1, &amp;PINB, KL1, 20, 500, next, NULL );<br />SuperDebounce(&amp;k2, &amp;PINB, KL2, 20, 500, prev, NULL );<br />SuperDebounce(&amp;k3, &amp;PINB, KL3, 20, 500, enter, NULL );<br />SuperDebounce(&amp;k4, &amp;PINB, KL4, 20, 500, back, NULL );<br />}<br /><br />//przykaładowe wywołanie funkcji przez menu<br />if(menu_flag==&amp;submenu2) {<br />menu_flag=0;/*wywołanie funkcji */}  //*<br />if(menu_flag==&amp;submenu11)<br />menu_flag=0;//*<br />if(menu_flag==&amp;submenu12)<br />menu_flag=0;//*<br />if(menu_flag==&amp;menu3)<br />menu_flag=0;//*<br /><br />menu_lcd(); //wyświetlanie menu<br />}//koniec while //*<br />}<br /><br />void display_menu_off()<br />{<br />lcd_locate(0,0); lcd_str(&quot;ekran glowny&quot;);<br />lcd_locate(1,0); lcd_str(&quot; ###MENU OFF### &quot;);<br />}<br /><br />/************** funkcja SuperDebounce do obsługi pojedynczych klawiszy ***************<br /> * AUTOR: Mirosław Kardaś<br /> * ZALETY:<br /> * - nie wprowadza najmniejszego spowalnienia<br /> * - posiada funkcję REPEAT (powtarzanie akcji dla dłużej wciśniętego przycisku)<br /> * - można przydzielić różne akcje dla trybu REPEAT i pojedynczego kliknięcia<br /> * - można przydzielić tylko jedną akcję wtedy w miejsce drugiej przekazujemy 0 (NULL)<br /> *<br /> * Wymagania:<br /> * Timer programowy utworzony w oparciu o Timer sprzętowy (przerwanie 100Hz)<br /> *<br /> * Parametry wejściowe:<br /> *<br /> * *key_state - wskaźnik na zmienną w pamięci RAM (1 bajt) - do przechowywania stanu klawisza<br /> *  *KPIN - nazwa PINx portu na którym umieszczony jest klawisz, np: PINB<br /> *  key_mask - maska klawisza np: (1&lt;&lt;PB3)<br /> *  rep_time - czas powtarzania funkcji rep_proc w trybie REPEAT<br /> *  rep_wait - czas oczekiwania do przejścia do trybu REPEAT<br /> *  push_proc - wskaźnik do własnej funkcji wywoływanej raz po zwolenieniu przycisku<br /> *  rep_proc - wskaźnik do własnej funkcji wykonywanej w trybie REPEAT<br /> **************************************************************************************/<br />void SuperDebounce(uint8_t * key_state, volatile uint8_t *KPIN,<br />uint8_t key_mask, uint16_t rep_time, uint16_t rep_wait,<br />void (*push_proc)(void), void (*rep_proc)(void) ) {<br /><br />enum {idle, debounce, go_rep, wait_rep, rep};<br /><br />if(!rep_time) rep_time=20;<br />if(!rep_wait) rep_wait=150;<br /><br />uint8_t key_press = !(*KPIN &amp; key_mask);<br /><br />if( key_press &amp;&amp; !*key_state ) {<br />*key_state = debounce;<br />Timer1 = 15;<br />} else<br />if( *key_state  ) {<br /><br />if( key_press &amp;&amp; debounce==*key_state &amp;&amp; !Timer1 ) {<br />*key_state = 2;<br />Timer1=5;<br />} else<br />if( !key_press &amp;&amp; *key_state&gt;1 &amp;&amp; *key_state&lt;4 ) {<br />if(push_proc) push_proc();/* KEY_UP */<br />*key_state=idle;<br />} else<br />if( key_press &amp;&amp; go_rep==*key_state &amp;&amp; !Timer1 ) {<br />*key_state = wait_rep;<br />Timer1=rep_wait;<br />} else<br />if( key_press &amp;&amp; wait_rep==*key_state &amp;&amp; !Timer1 ) {<br />*key_state = rep;<br />} else<br />if( key_press &amp;&amp; rep==*key_state &amp;&amp; !Timer1 ) {<br />Timer1 = rep_time;<br />if(rep_proc) rep_proc();/* KEY_REP */<br />}<br />}<br />if( *key_state&gt;=3 &amp;&amp; !key_press ) *key_state = idle;<br />}<br /><br />ISR(TIMER2_COMP_vect)<br />{<br />uint16_t n;<br /><br />n = Timer1;/* 100Hz Timer1 */<br />if (n) Timer1 = --n;<br />n = Timer2;/* 100Hz Timer2 */<br />if (n) Timer2 = --n;<br />}[/syntax]<br /><br /><br />Skorzystałem z plików dla tworzenia menu od kolegi Lukasz89<br /> <br />plik menu.h<br />[syntax=c]/*<br /> * menu.h<br /> *<br /> *  Created on: 2012-07-24<br /> *      Author: Łukasz<br /> */<br /><br />#ifndef MENU_H_<br />#define MENU_H_<br />#include &lt;avr/pgmspace.h&gt;<br /><br />typedef const char PROGMEM tmenu;<br />typedef struct menu menu;<br />struct menu<br />{// struktura reazlaiujaca menu<br />tmenu *name;//napis wyświetlany na lcd<br /> menu *sub;//wskaźnik do submenu<br /> menu *next;//wskaźnik do następnego manu na tym samym poziomie<br /> menu *parent;//wskaźnik do manu nadrzędnego<br />};<br />//deklaracja elemntów menu<br />extern menu stop;<br /><br />extern menu menu1;<br />extern menu submenu11;<br />extern menu submenu12;<br /><br />extern menu menu2;<br />extern menu submenu2;<br />extern menu menu3;<br /><br />extern menu *menu_flag;<br />extern menu *pozycja;<br /><br />void next(void);  //funkcje do pouszania się po menu<br />void prev(void);<br />void enter(void);<br />void back(void);<br /><br />void lcd_clear(void); //czyszczeni całego ekranu<br />void menu_lcd(void);  // wyswietlanie menu<br /><br /><br />void register_ekran_glowny (void (*callback)()); //rejestracja ekranu głównego<br /><br /><br /><br />#endif /* MENU_H_ */[/syntax]<br /><br />menu.c<br />[syntax=c]/*<br /> * menu.c<br /> *<br /> *  Created on: 2012-07-24<br /> *      Author: Łukasz<br /> */<br /><br />#include &quot;menu.h&quot;<br />#include &quot;../lcd/lcd44780.h&quot;  //lib Mirka do LCD<br /><br />#define LCD_Y 2<br />#define LCD_X 16<br /><br />// napisy na LCD elemntów menu<br />tmenu tmenu1&#91;&#93; = &quot;menu1&quot;;<br />tmenu tmenu2&#91;&#93; = &quot;menu2&quot;;<br />tmenu tmenu3&#91;&#93; = &quot;menu3&quot;;<br />tmenu tsub11&#91;&#93; = &quot;podmenu1&quot;;<br />tmenu tsub12&#91;&#93; = &quot;podmenu2&quot;;<br />tmenu tmenu21&#91;&#93; =&quot;pojedyncze sub&quot;;<br /><br /><br />//deficja elemntów menu<br />menu stop;<br /><br />menu menu1;<br />menu submenu11;<br />menu submenu12;<br /><br />menu menu2;<br />menu submenu2;<br />menu menu3;<br />menu stop = {0,&amp;menu1,&amp;menu1,&amp;stop};<br /><br />menu menu1 = {tmenu1, &amp;submenu11, &amp;menu2, &amp;stop};<br />menu submenu11 = {tsub11, &amp;submenu11, &amp;submenu12, &amp;menu1};<br />menu submenu12= {tsub12, &amp;submenu12 ,&amp;submenu11, &amp;menu1};<br /><br />menu menu2={tmenu2, &amp;submenu2, &amp;menu3, &amp;stop};<br />menu submenu2={tmenu21, &amp;submenu2, &amp;submenu2, &amp;menu2};<br /><br />menu menu3 = {tmenu3, &amp;menu3, &amp;menu1, &amp;stop};<br /><br /><br />uint8_t tab1&#91;&#93;={ 0x08, 0x0C, 0x0E, 0x0F, 0x0E, 0x0C, 0x08, 0x00,};<br /><br />menu *menu_flag=0;<br />menu *pozycja = &amp;stop;<br /><br />static void (*ekran_glowny)();<br />void register_ekran_glowny (void (*callback)()){<br />ekran_glowny=callback;<br />}<br /><br /><br />void next(void)<br />{pozycja = pozycja-&gt;next;<br />}<br /><br />void prev(void)<br />{<br />menu*i;<br />i=(pozycja-&gt;parent)-&gt;sub;<br />if(pozycja != &amp;stop){<br />while(i-&gt;next != pozycja)i=i-&gt;next;}<br />pozycja=i;<br /><br />}<br /><br />void enter(void)<br />{<br />if(pozycja==pozycja-&gt;sub) menu_flag=pozycja;<br />else pozycja = pozycja-&gt;sub;<br />}<br /><br />void back(void)<br />{pozycja=pozycja-&gt;parent;<br />}<br /><br />void lcd_clear(void)<br />{uint8_t i,j;<br />for(j=0;j&lt;=LCD_Y;j++){<br />for(i=0;i&lt;=LCD_X;i++){<br />lcd_locate(j,i);lcd_str(&quot; &quot;);<br />}<br />}}<br /><br />void menu_lcd(void)<br />{ static uint16_t z=0;<br />if(pozycja!=&amp;stop &amp;&amp; menu_flag!=pozycja)<br />{ //wyświetlaj gdy jest w menu i nie w funkcji wyołwanej przez menu<br />lcd_defchar( 0x80, tab1);<br />static uint16_t a=0;<br />menu *i, *j; //lokalne pozycje<br />int8_t b=0,c=1;<br />if(a!=(uint16_t)pozycja)lcd_clear();<br />i=(pozycja-&gt;parent)-&gt;sub;<br />j=(pozycja-&gt;parent)-&gt;sub;<br /><br />while(i!=pozycja) // wyznaczanie liczby pozycji mna obecnym poziomie menu<br />{i=i-&gt;next;<br />c++;<br />}<br />i=(pozycja-&gt;parent)-&gt;sub;<br />if((c-LCD_Y)&gt;0){ //wyświetlanie menu gdy pozycji jest więcej niż wierszy LCD<br />for(b=-(c-LCD_Y);b&lt;=(LCD_Y-1);b++){<br />lcd_locate(b,1);if(b&gt;=0)lcd_str_P(i-&gt;name);<br />if(i==pozycja){lcd_locate(b,0);<br />lcd_str(&quot;\x80&quot;); }<br />i=i-&gt;next;<br />}<br />}<br />else{ // wyświetlanie gdy pozycji menu jest mniej lub tyle samo co wierszy LCD<br />for(b=0;b&lt;=(LCD_Y-1);b++){<br />lcd_locate(b,1);lcd_str_P(i-&gt;name);<br />if(i==pozycja){lcd_locate(b,0);<br />lcd_str(&quot;\x80&quot;);}<br />if(i-&gt;next==j)break;<br />i=i-&gt;next;<br />}<br />}<br /><br />//b=0;c=1;<br /><br />a=(uint16_t)pozycja;z=0;<br />}<br />else if(pozycja==&amp;stop) {//wyświetlanie ekranu głównego - to co jest natywnie na lcd gdy nie jesturuchomione menu<br />if(z==0)lcd_clear();<br />if (ekran_glowny)ekran_glowny();<br />z++;<br />}<br />//koniec funkcji menu_lcd<br />}[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 21 minutach ]</span></strong><br /><br />Założyłem nowy czysty projekt, skopiowałem pliki i ... pomogło.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4502">domelos</a> — 28 lis 2014, o 20:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gardziej]]></name></author>
<updated>2014-11-28T09:10:02+01:00</updated>
<published>2014-11-28T09:10:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106390#p106390</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106390#p106390"/>
<title type="html"><![CDATA[Re: undefined reference to `__eerd_byte_m16']]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106390#p106390"><![CDATA[
Sprawdź jeszcze kolego kolejność includowania bibliotek, czy jest tak jak w książce.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6104">gardziej</a> — 28 lis 2014, o 09:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-11-28T07:24:53+01:00</updated>
<published>2014-11-28T07:24:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106384#p106384</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106384#p106384"/>
<title type="html"><![CDATA[Re: undefined reference to `__eerd_byte_m16']]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106384#p106384"><![CDATA[
ok .... a w takim razie dopytam jeszcze czy zrobiłeś DOKŁADNIE krok po kroku to z tego poradnika ?<br /><br /><!-- m --><a class="postlink" href="http://mirekk36.blogspot.com/2014/11/avr-jak-zaczac-z-eclipse-luna.html" >http://mirekk36.blogspot.com/2014/11/av ... -luna.html</a><!-- m --><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 1 minucie ]</span></strong><br /><br />aha .... i poza tym widzę, że nie odpalasz przykładu z książki tylko sam coś piszesz .... więc pokaż swój plik main.c bo czuję że tam siedzi babol przy definiowaniu znaków w EEPROM. Tak przy okazji po co chcesz tworzyć znaki w EEPROM ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 28 lis 2014, o 07:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[domelos]]></name></author>
<updated>2014-11-28T07:19:43+01:00</updated>
<published>2014-11-28T07:19:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106383#p106383</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106383#p106383"/>
<title type="html"><![CDATA[Re: undefined reference to `__eerd_byte_m16']]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106383#p106383"><![CDATA[
Wszelki próby kompilacji wykonywałem pod Eclipse Luna i ATmel Toolchain 3.4 oraz AVR Plugin 2.41 (<!-- m --><a class="postlink" href="http://www.atnel.pl/download/AtmelPlusPugin.zip" >http://www.atnel.pl/download/AtmelPlusPugin.zip</a><!-- m -->).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4502">domelos</a> — 28 lis 2014, o 07:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-11-27T21:41:00+01:00</updated>
<published>2014-11-27T21:41:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106341#p106341</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106341#p106341"/>
<title type="html"><![CDATA[Re: undefined reference to `__eerd_byte_m16']]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106341#p106341"><![CDATA[
<div class="quotetitle">domelos napisał(a):</div><div class="quotecontent"><br />Podczas kompilacji generuje się taki oto komunikat błędu:<br /></div><br />A ty chociaż napisałeś pod czym ty to kompilujesz ? coś mi się wydaje że nie pod Eclipse tak jak polecam wszędzie a nawet w książce tylko pod kocim Atmel Studio - zgadłem ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 27 lis 2014, o 21:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[domelos]]></name></author>
<updated>2014-11-27T21:16:17+01:00</updated>
<published>2014-11-27T21:16:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106323#p106323</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106323#p106323"/>
<title type="html"><![CDATA[Re: undefined reference to `__eerd_byte_m16']]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106323#p106323"><![CDATA[
AVR Toolchain Atmel v. 3.4.2.1573<br />gcc version 4.7.2 (AVR_8_bit_GNU_Toolchain_3.4.2_939)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4502">domelos</a> — 27 lis 2014, o 21:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Piotrek_P]]></name></author>
<updated>2014-11-27T20:32:42+01:00</updated>
<published>2014-11-27T20:32:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106291#p106291</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106291#p106291"/>
<title type="html"><![CDATA[Re: undefined reference to `__eerd_byte_m16']]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106291#p106291"><![CDATA[
Delete - powyższe. Trochę się pospieszyłem z odpowiedzią, przepraszam. To raczej problem z linkerem. Napisz jakiego kompilatora używasz. WinAVR czy ATMEL Toolchain?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=290">Piotrek_P</a> — 27 lis 2014, o 20:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[domelos]]></name></author>
<updated>2014-11-27T20:17:26+01:00</updated>
<published>2014-11-27T20:17:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106283#p106283</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106283#p106283"/>
<title type="html"><![CDATA[undefined reference to `__eerd_byte_m16']]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9459&amp;p=106283#p106283"><![CDATA[
Podczas kompilacji generuje się taki oto komunikat błędu:<br /><br />avr-gcc -Wl,-Map,menu_przyklad.map -mmcu=atmega8 -o &quot;menu_przyklad.elf&quot;  ./menu/menu.o  ./lcd/lcd44780.o  ./main.o   <br />./lcd/lcd44780.o: In function `lcd_str_E':<br />lcd44780.c:(.text+0xba): undefined reference to `__eerd_byte_m16'<br />./lcd/lcd44780.o: In function `lcd_defchar_E':<br />lcd44780.c:(.text+0x1dc): undefined reference to `__eerd_byte_m16'<br />collect2.exe: error: ld returned 1 exit status<br />make: *** [menu_przyklad.elf] Błąd 1<br /><br />Biblioteki do lcd z bluebooka.<br />Jako mocno początkujący proszę o wskazówki gdzie może tkwić błąd.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4502">domelos</a> — 27 lis 2014, o 20:17</p><hr />
]]></content>
</entry>
</feed>