извините, не реализовано: нетривиальные инициализаторы не поддерживаются - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь настроить АЦП на ATMEGA328 с C, и я попадаю на эту строку:

FILE usart0_str = FDEV_SETUP_STREAM(USART0SendByte, NULL, _FDEV_SETUP_WRITE);

Следующая ошибка:

sorry, unimplemented: non-trivial designated initializers not supported FILE usart0_str = FDEV_SETUP_STREAM(USART0SendByte, NULL, _FDEV_SETUP_WRITE); ^

Я действительно не понимаю ошибку, я пытался найти ее в Google, но не нашел ничего подобного, и я уверен, что это происходит, потому что я не понимаю эту ошибку.

Вот весь код:

#ifndef F_CPU
#define F_CPU 16000000UL
#endif

#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>
#define USART_BAUDRATE 9600
#define UBRR_VALUE ( ( ( F_CPU / ( USART_BAUDRATE * 16UL ) ) ) - 1 )
#define VREF 5
#define POT 10000

void initADC( void );
uint16_t readADC( uint8_t ADCchannel );
void USART0Init(void);
int USART0SendByte( char u8Data, FILE *stream );
void setUpLED ( void );

FILE usart0_str = FDEV_SETUP_STREAM( USART0SendByte, NULL, _FDEV_SETUP_WRITE );

int main( void )
{
    double vbg, potval;

    initADC();
    USART0Init();

    stdout = &usart0_str;
    setUpLED ();

    while ( 1 )
    {
        potval = (double)POT / 1024 * readADC(0);
        printf("Potentiometer value = %u Ohm\n", (uint16_t)potval);

        vbg = (double)VREF / 1024 * readADC(14);
        printf("Vbg = %4.2fV\n", vbg);

        _delay_ms(1000);
    }
}

void setUpLED ( void )
{
    DDRB  |= ( 1 << PB0 );
    PORTB |= ( 1 << PB0 );
}

void initADC( void )
{
    ADMUX  |= ( 1 << REFS0 );
    ADCSRA |= ( 1 << ADPS2 ) | ( 1 << ADPS1 ) | ( 1 << ADPS0 ); ///16000000/128=125kHz
    ADCSRA |= ( 1 << ADEN );
}

uint16_t readADC( uint8_t ADCchannel )
{
    ADMUX = ( ADMUX & 0xF0 ) | ( ADCchannel & 0x0F );
    ADCSRA |= ( 1 << ADSC );
    while ( ADCSRA & ( 1 << ADSC ) );
    return ADC;
}

int USART0SendByte( char u8Data, FILE *stream )
{
    if ( u8Data == '\n' )
    {
        USART0SendByte( '\r', stream );
    }

    while ( !( UCSR0A & ( 1 << UDRE0 ) ) ) { };
    UDR0 = u8Data;
    return 0;
}

void USART0Init(void)
{
    UBRR0H = (uint8_t)(UBRR_VALUE >> 8);
    UBRR0L = (uint8_t)UBRR_VALUE;

    UCSR0C |= (1 << UCSZ01) | (1 << UCSZ00);
    UCSR0B |= (1 << RXEN0) | (1 << TXEN0);
}`

Если я скомпилирую его с codeblocks, то все будет нормально, но я использую плату Arduino в качестве программиста и IDE Arduino.

Почему я получаю эту ошибку?

...