Používání knihovních funkcí - import knihoven z AVR Studia

Potřeboval bych radu. Jak zacházet s knihovnami ?
Třeba zde jednoduchý program pro blikání:

/* main.c */
#include <avr/io.h> // zde je definovan napr. PORTB
#include <avr/iom168.h> // konstanty pro konkretni typ mikrokontroleru
#include <util/delay.h> // toto potrebuji pro pouziti funkce _delay_ms()

int main (void){ // hlavni funkce programu
  unsigned char a=0; // pomocna promenna
  
  /* init */
  DDRB=0xFF; // Data Direction Register PORTB: kazda nozicka bude vystup
  
  /* hlavni smycka */
  while(1){ // nekonecna smycka
    a++; // timto se zmeni jednicky a nuly na portu B
    PORTB=a; // vystup na nozicky portu B
    _delay_ms(1000); // pockam nejakou postrehnutelnou dobu
  } // konec nekonecne smycky
} // konec main

používám AVR studio
předpokládám správně, že io.h a iom168.h je již umístněn někde v AVR studiu a delay.h musím zkopírovat tam, kde je umístněn projekt ?
AVR studio mi vypisuje F_CPU not definied for <util/delay.h> - delay.h jsem si otevřel, na 2 místa místo 1MHz napsal 16, ale stejně to píše to samé. Kde je chyba ?

Děkuji moc za pomoc, s mikročipi začínám, tak prosím o trpělivost.

:arrow_right: administrator: přejmenováno z "používání knihovních funkcí"

importovat “iom168.h” je zbytečné, dělá to AVR studio dle nastavení projektu. V Project options jen nastavíš tvůj typ mcu a je to. Taky se tam nastavuje frekvence mcu.

Všechny tebou použité knihovny jsou překladači známé a nemusíš je nikam kopírovat a v ŽÁDNÉM případě do nich vrtat. Oprav ji zpátky jak byla.
Buď si o řádek výše než je delay.h vlož “#define F_CPU 1000000UL”, nebo vyplň frekvenci v nastavení projektu.
Ty už jsi vrtal v pojistkách, že píšeš něco o 16MHz? Tovární nastavení mcu je totiž 1MHz (interní RC, krystal netřeba). Na změnu nestačí pouze připojit krystal. Ovšem pochybuji, že to v začátcích potřebuješ měnit.

Doufám, že mcu má na napájení blokovací kondik a případné ledky mají omezující odpory.

Tak jsem to přiupravil dle tvých rad a je to ok, díky.
Jaký blokovací kondík ?
LEDky odpory mají.

A když budu chtít používat knihovnu na lcd s HD44870 stačí napsat
#include <lcd.h> ?

ještě dotaz - jak udělat v avr studiu z kódu v c hex soubor ?

Blokovací kondík je malý kondenzátor (u mcu obvykle 100nF) umístěný co nejblíže napájecím nožkám mcu. V nepájivém poli ho mám zabodnutý nepříč přes mcu :slight_smile:.
HEX se vytváří automaticky při překladu, je v podsložce projektu.

Svoji LCD knihovnu gcc nemá, takže do projektu musíš přidat vlastní. To znamená její soubory zkopírovat do složky projektu, pak je v projectmanageru přidat a potom můžeš použít svůj řádek s include (pokud se hlavičkový soubor knihovny jmenuje “lcd.h”). Ovšem lomené závorky budou nahrazeny uvozovkami (sdělíš tím překladači, že má soubory hledat v adresáři projektu).

Díky,
hex. jsem našel, on se mi tam nějak schovával :slight_smile:
ale teďko mi ještě nějak nejde navázat ta nová knihovna
dám project / configuration options/libraries a co potom ?
jediné tlačítko add object, mohu vybrat soubor lcd.h nebo lcd.c (jaký, oba ?) a dát ok ? Nebo ještě add library ?

To seš na špatnym místě.
V IDE vlevo je sloupec a v něm položky jako “Source files”, “Header files” a další. Tak do Source files přidáš soubory se zdrojákem (.c, tedy lcd.c) a do header files načteš hlavičkový soubory (.h, tedy lcd.h).
To je vše.

a kde najdu to IDE ?

už to vidím :smiley:

:laughing:
IDE(Integrated Development Enviroment) = AVR Studio (v tomto případě)

ještě bych poprosil o radu:
chci napsat na displej hodnotu neznámé - jak na to ?
(používám tuhle knihovnu na lcd homepage.hispeed.ch/peterfleury/group__pfleury__lcd.html )

pochopil jsme že je vhodné (nebo spíš nutné ?) ji předělat na string.
v mém případě bych rád zobrazil teplotu ve tvaru ±2místa.1místo
takhle mi to nějak nefunguje:
Jak správně v mém případě použít sprintf ?
Díky

[code]
unsigned char buff[5];
double temp;

int main(void)
{
temp=-25.1;
lcd_init(LCD_DISP_ON); //Inicializace LCD
lcd_clrscr(); //vymazani LCD
lcd_gotoxy(0,0); //nastaveni na pozici 0,0
lcd_puts("Set temp: "); //vypsani textu
lcd_gotoxy(0,1);
lcd_puts("Act temp: ");

sprintf(buff,"%3.1f",temp);
lcd_gotoxy(10,1);
lcd_puts(buff);
_delay_ms(500); 

} [/code]

S tím ti neporadím, pracuji zásadně celočíselně. Ještě jsem se na mcu nesetkal s problémem, kde by bylo využití float(pro jeho dynamiku, jiný argument nemá smysl) nezbytné.
Nejsem si jist, ale v určitých případech bylo nutné nějakým parametrem při překladu říct překladači, že má povolit float verze funkcí, mohla by to být i tato situace.

Mimochodem - v gcc na avr neexistuje double (double = float).

Už jsem double přepsal na float a přestalo to vyhazovat nějakou chybu, dále jsem buff [5] dal na buff [33] a nehlásí to žádnou chybu. Ale displej mi ukazuje otazník místo čísla.

Tak já to zkusim udělat nějak bez float. Třeba si číslo rozdělit na char před a za des. tečkou ? Nebo jinak vhodně, třeba vynásobit deseti aby nebyly ty desetiny ? Potřebuji mít kladnou i zápornou teplotu do 99, s jedním desetinným místem. Jak se pracuje s tím sprintf ?
Díky

Vynásob číslo deseti a přetypuj na int. Int převedeš na text pomocí itoa().

tak to pořád nějak nejde
jak přesně udělat z int čísla -251 string -25.1 ?
Díky moc

int temp;
temp = -251; //=teplota -25,1 °C,
char buffer[4];
itoa(k/10, buffer, 10);//takhle asi ne ?
lcd_gotoxy(0,0); //nastaveni na pozici 0,0
lcd_puts(buffer); // výpis na displej cisla pred teckou
//pak napsat desetinnou tečku a za to nějak zbytek ?

Prozatím se pokus vypsat těch -251.
itoa (tmp, buffer, 10);
Každopádně máš malej buffer. -251 jsou 4 znaky. Pokud budeš chtít desetin. tečku, bude to 5 znaků + koncová nula (označuje konec řetězce, nevypisuje se) dá 6 znaků. Ovšem pokud by ses dostal pod -100 (asi není moc pravděpodobné), tak 7 znaků.

Až se ti podaří vypsat celý číslo se znaménkem, dodáme tečku :wink:
Na to stačí najít v řetězci první nulu. Tento a předchozí znak posuneš o index výš a do mezery vložíš ‘.’.

takže celý číslo:

int temp; 
temp = -251; //=teplota -25,1 °C, 
char buffer[6]; 
itoa(temp, buffer, 10);//na co je tam ta 10 ?
lcd_puts(buffer);

To by snad mělo bejt.
“10” znamená, že vytvořený text bude v desítkové soustavě. Jako základ soustavy může být číslo <2; 36>

To by ses samozřejmě dočetl v manuálu překladače.

takže něco jako:

strchr(temp, ´0´);// vrátí pozici znaku 0

a pak for cyklus ?

To by nešlo nějak jednodušeji ?
Jinak já bych se rád časem dopracoval k změření teploty teploměrem (na desetinu) a její zobrazení + možnost nastavení teploty na desetinu a z toho regulace topení. Nemá cenu to dělat raděj ve float ?

V tom, abys to dělal ve float ti nikdo nebrání :slight_smile:.
“strchr” lze použít také pokud se vyznáš v pointerech a pointerové aritmetice. Ovšem potom už nepotřebuješ cyklus, když požadovaná akce zabere 3 řádky :wink:.