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.
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.
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 .
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
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.
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: ");
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
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
Na to stačí najít v řetězci první nulu. Tento a předchozí znak posuneš o index výš a do mezery vložíš ‘.’.
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í .
“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 .