logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega16][język C] Przesyłanie informacji UART -> PC

don_kovalos 20 Lis 2010 16:51 2049 4
  • #1 8767620
    don_kovalos
    Poziom 11  
    witam mam problem z kompilacją kodu na atmege16, Program służy do wysyłania znaków z atmegi16 przez UART na komputer z użyciem standardowych funkcji typu puts, printf itd. Kompilator avr-gcc (WinAVR 20100110) 4.3.3

    //---------------------------harddef.h
    #ifndef HARDDEF_H_INCLUDED
    #define HARDDEF_H_INCLUDED
    
    #define DEF_BAUD 4800
    
    #endif //HARDDEF_H_INCLUDED
    

    //---------------------------rs.h
    #ifndef RS_H_INCLUDED
    #define RS_H_INCLUDED
    
    #define RS_MAKE_UBRR(baud) (F_CPU/(baud*16l)-1)
    #define RS_SET_BAUD(baud) \
    	{UBRRH = (uint8_t)(RS_MAKE_UBRR(baud)>>8); \
    	 UBRRL = (uint8_t)RS_MAKE_UBRR(baud); }
    
    int uart_putc(char, FILE *);
    int uart_getc(FILE *);
    
    #endif // RS_H_INCLUDED


    //---------------------------rs.c
    #include <avr\io.h>
    #include "rs.h"
    
    int uart_putc(char znak, FILE *unused)
    {
    	// oczekiwanie aż bufor nadajnika jest pusty
    	while(!(1<<UDRE & UCSRA)) {}	// UDRE -znacznik gotowości UDR Empty
    	UDR = znak; 	// UDR-bufor danych
    	return 0;
    }
    
    int uart_getc(FILE *unused)
    {
    	char znak;
    	// oczekiwanie na pojawinie sie danej
    	while(!(1<<RXC & UCSRA)) {}
    	znak = UDR;
    	return znak;
    }


    //---------------------------main.c
    #include <avr\io.h>
    #include <stdio.h>
    
    #include "rs.h"
    #include "harddef.h"
    FILE uart_str = FDEV_SETUP_STREAM(uart_putc, uart_getc, _FDEV_SETUP_RW);
    
    int main(void)
    {
    	//inicjacja portu szeregowego
    	RS_SET_BAUD(DEF_BAUD);
    	UCSRC = 1<<URSEL | 1<<UCSZ1 | 1<<UCSZ0;		// URSEL-modyfikacja rejestru, UCSZ(0,1,2)-dł. słowa 
    	UCSRB = 1<<RXEN | 1<<TXEN;		// włącz nadajnik i odbiornik
    	UCSRA = 0;
    	
    	// inicjacja funkcji domyslnych strumieni
    	stdin = &uart_str; 
        stdout = &uart_str;
    	
    	puts("Text UART");
    
    }


    Oto błędy jakie wyrzuca kompilator:
    In file included from rs.c:2:
    rs.h:9: error: expected declaration specifiers or '...' before 'FILE'
    rs.h:10: error: expected ')' before '*' token
    rs.c:4: error: expected declaration specifiers or '...' before 'FILE'
    rs.c:12: error: expected ')' before '*' token

    Proszę o pomoc
  • #2 8767644
    gaskoin
    Poziom 38  
    wypadało by dołączyć stdio.h do pliku
  • #3 8768367
    namlooc
    Poziom 15  
    don_kovalos napisał:
    witam mam problem z kompilacją kodu na atmege16, Program służy do wysyłania znaków z atmegi16 przez UART na komputer z użyciem standardowych funkcji typu puts, printf itd.


    Wkleje ci dzialajacy kod na printf'ie porownaj ze swoim:

    #include <avr/io.h>
    #define baud ((F_CPU/(predkosc*16UL))-1)
    #define predkosc 2400
    #define F_CPU 16000000UL
    #include <stdio.h>
    
    void usart_init()                     //(unsigned int baud)
    {
    UBRR0H = (unsigned char) (baud>>8);  // ustawiamy predkosc transmisji
    UBRR0L = (unsigned char) baud;       //
    UCSR0B = (1<<RXEN0) | (1<<TXEN0);    // WLANCZA ODBIORNIK I NADAJNIK
    UCSR0C = (1<<USBS0) | (3<<UCSZ00);
    }
    
    static int usart_transmit(unsigned char data, FILE *stream)
    {
    while (!(UCSR0A & (1<<UDRE0))); //czekamy na pusty bufor nadawania
    UDR0= data;
    return 0;
    }
    
    static FILE mystdout = FDEV_SETUP_STREAM(usart_transmit, NULL, _FDEV_SETUP_WRITE);
    
    int main (void)
    {
    stdout = &mystdout;
    usart_init();
    while(1) {printf("test uart");}
    }
    
    *atmega644p
  • #4 8769481
    don_kovalos
    Poziom 11  
    gaskoin
    <stdio.h> jest dołączony do main.c :)
  • #5 8769576
    tmf
    VIP Zasłużony dla elektroda
    No to w main.c definicje typu FILE są znane, co nie znaczy, że są też znane w rs.h i rs.c. Musisz tam stdio również dołączyć.
REKLAMA