Přesměrování funkce printf

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
KarelIV
Příspěvky: 3
Registrován: 20 bře 2014, 01:00

Přesměrování funkce printf

#1 Příspěvek 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.

Uživatelský avatar
Galileo
Příspěvky: 77
Registrován: 09 lis 2009, 01:00

#2 Příspěvek 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.

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#3 Příspěvek 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);
   }
} 

Uživatelský avatar
KarelIV
Příspěvky: 3
Registrován: 20 bře 2014, 01:00

#4 Příspěvek 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?

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#5 Příspěvek 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.

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“