Stránka 1 z 1
Přesměrování funkce printf
Napsal: 20 bře 2014, 18:23
od KarelIV
Zdravím vývojáře.
Chci se zeptat, zda někdo nevíte, jak se přesměruje funkce fprintf (AVR Studio) na LCD displej. Nejde mně o samotný kod funkce, která již obsluhuje konkrétní piny procesoru (tu si samozřejmě napíšu), ale potřeboval bych zjistit, kterou funkci funkce fprintf (případně makro printf) automaticky volá (do té pak zapíšu svůj kód), případně jako knihovnu musím do C vložit. Googlil jsem, nějaký zdroják jsem i našel, ale moc nepochopil.
Díky za odpědi, Karel.
Napsal: 21 bře 2014, 07:26
od Galileo
Použij funkci sprintf která ti zformátuje řetězec a ten potom pošli na display,
dělám v codevisionu tam je to lcd_puts(....), v avr studiu to bude podobné.
Nevím o tom že by šla funkce printf přesměrovat jinam než na uart.
Napsal: 21 bře 2014, 07:50
od AB1
Zkus toto
Kód: Vybrat vše
#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#include "lcd.h"
int outlcd(char c, FILE *stream)
{
lcd_putc(c); //funkce z lcd.h pro zápis jednoho znaku
return 0;
}
FILE mystdout = FDEV_SETUP_STREAM(outlcd, NULL, _FDEV_SETUP_WRITE);
char c;
int main(void)
{
lcd_init();
stdout = &mystdout;
printf("Hello World!!");
_delay_ms(1000);
c='A';
while(1)
{
lcd_clr();
printf("%c",c);
c++;
_delay_ms(500);
}
}
Napsal: 21 bře 2014, 19:03
od KarelIV
Díky za odpovědi, pro AB1, tento kod jsem našel, ale když to porovnám, byly tam chyby. Chci se zeptat, věděl byste popsat, co znamená
FILE mystdout = FDEV_SETUP_STREAM(outlcd, NULL, _FDEV_SETUP_WRITE); ?
Ještě pár "otravných" otázek, nemám rád, když jen mechanicky opisuji kód a nevím, co to vlastrně dělá. Omlouvám se, tohle je pro mne nové:-)
1.
Pochopil jsem tedy správně, že printf() zavolá outlcd(), v té se volá lcd_putc() a do této funkce napíšu svůj zdroják pro ovládání pinů LCD?
2.
Funkce outlcd je tedy uživatelsky definovaná, není součástí knihovny stdio?
Napsal: 21 bře 2014, 21:46
od AB1
Kód: Vybrat vše
FILE mystdout = FDEV_SETUP_STREAM (put, get, rwflag);
vytvoří stream "mystdout".
put - funkce pro zápis jednoho znaku
get - funkce pro čtení jednoho znaku (nepoužijeme, píšeme NULL)
rwflag - určuje zápis/čtení
Funkce printf() zapisuje do streamu stdout.
Proto přesměrujeme náš stream do stdout.
stdout = &mystdout
Možná to není přesný popis, do detailu jsem se tím nezabýval.
Pro praxi stačí vytvořit funkci put() pro zápis jednoho znaku do Lcd, uart, nebo třeba SPI.
Zbytek zůstává stejný.
http://nongnu.org/avr-libc/user-manual/ ... 271b7227fb
http://cs.wikipedia.org/wiki/Standardn%C3%AD_proudy
Pochopil jsem tedy správně, že printf() zavolá outlcd(), v té se volá lcd_putc() a do této funkce napíšu svůj zdroják pro ovládání pinů LCD?
V outlcd() nemusí být žádná další funkce. Může tam být přímo kód pro odeslání znaku.