Неявное объявление функции и конфликтующего типа — AVR

Это моя первая программа для AVR. При сборке код показывает ошибку:
конфликтующие типы для ‘Encode’
неявное объявление Encode

Я написал следующий код:

#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>

#define SegDataPort PORTC
#define SegDataPin PINC
#define SegDataDDR DDRC

#define SegCntrlPort PORTD
#define SegCntrlPin PIND
#define SegCntrlDDR DDRD

int main(void)
{
SegDataDDR = 0xFF;
SegCntrlDDR = 0xF3;
SegCntrlPort = 0xF3;
SegDataPort = 0x00;
unsigned char adc_value;
float volt = adc_value/1023;
int temp = floor(volt*10 + 0.5);

SegDataPort = Encode(temp1%10);

//^^^^ implicit declaration of 'Encode'

SegCntrlPort = ~0x01;
SegDataPort = Encode((temp1/10)%10);
SegCntrlPort = ~0x02;
SegDataPort = Encode(temp1/100);
SegCntrlPort = ~0x04;
}

unsigned char Encode(int digit)
{
unsigned char val;
switch(digit)
{
case 0 : Val = 0b00111111;
case 1 : val = 0b00000110;

/// so on till case 9
}
return val;
}

Я использую ATmega16 в качестве микроконтроллера. Я также добавил намного больше библиотек, таких как математика для функции пола и другие. Я попытался изменить int на unsigned int, unsigned char и другие, но он все еще не работает и показывает ту же ошибку.
Пожалуйста, помогите мне.

0

Решение

неявное объявление Encode

В C функция должна быть либо объявленный или же определенный прежде чем он был использован (вызван).

Или

  • Переместить определение Encode() функционировать перед main()
  • Добавить предварительную декларацию в Encode() до main(),

Это сказало, floor() является функцией, определенной в math.h и определено в math библиотека. Чтобы использовать это, вам нужно #include <math.h> и связать с -lm во время компиляции.


О программной логике, используемой здесь,

unsigned char adc_value;
float volt = adc_value/1023;
int temp = floor(volt*10 + 0.5);

довольно проблематично, потому что

  1. adc_value используется неинициализированный, что приводит к неопределенное поведение.
  2. adc_value имеет тип char, Разделив его на значение 1023 всегда даст результат 0 как разделение будет происходить как целочисленное деление и не будет производить float результат сам, как ты и ожидал.

Мои предложения, измените этот блок кода на

int adc_value = <some value to initialize>;  //or some input function
float volt = (float)adc_value/1023;          //enforce floating point division
int temp = floor(volt*10 + 0.5);
2

Другие решения

Первая ошибка:

 unsigned char adc_value;
float volt = adc_value/1023;

Вы определяете adc_value как unsigned char и в следующей строке вы пытались разделить его на 1023 и присвоил результат float переменная типа Вы не можете сделать это в C язык. (Более того, вы не назначали никакого значения adc_value! это будет ноль или случайное значение)

Вторая ошибка:

Ваша вторая проблема в том, что вы определили Encode функция после вызова в main(), Вы должны переместить всю функцию до main() функция или просто добавить свой прототип перед main() функция.

то есть добавить unsigned char Encode(int digit); до main()

Жажда ошибки:

Вы пытались присвоить некоторые значения тем переменным, которые вы объявили #define:

#define SegDataPort PORTC
#define SegDataPin PINC
#define SegDataDDR DDRC

#define SegCntrlPort PORTD
#define SegCntrlPin PIND
#define SegCntrlDDR DDRD

int main(void)
{
SegDataDDR = 0xFF;
SegCntrlDDR = 0xF3;
SegCntrlPort = 0xF3;
SegDataPort = 0x00;
.
.
.

Это также незаконно. те переменные, которые определены с #define, являются постоянными, и вы не должны пытаться изменить их в теле программы.

0