Автор Тема: floating point variables in avr  (Прочетена 774 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3623
floating point variables in avr
« -: 21 Декември 2016, 18:11:05 »
Опитвам се да разделя една десетична стойност на два интиджъра (преди и след запетаята, по идея на брадър кюфт) и след тва да я притна в терминала.

Ся тва работи:

Код: C
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <avr/io.h>
  4. #include <util/delay.h>
  5. #define NUM_READINGS 10
  6. #define USART_BAUDRATE 9600
  7. #define UBRR_VALUE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
  8. #define PORT_ON(port,pin) port |= (1<<pin)
  9. #define PORT_OFF(port,pin) port &= ~(1<<pin)
  10.  
  11.  
  12. float ReadAndReturnAVG(uint8_t *values, uint8_t sizeOfValues);
  13.  
  14. void USART0Init(void)
  15. {
  16. // Set baud rate
  17. UBRR0H = (uint8_t)(UBRR_VALUE>>8);
  18. UBRR0L = (uint8_t)UBRR_VALUE;
  19. // Set frame format to 8 data bits, no parity, 1 stop bit
  20. UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);
  21. //enable transmission and reception
  22. UCSR0B |= (1<<RXEN0)|(1<<TXEN0);
  23. }
  24.  
  25. uint8_t USART0SendByte(char u8Data, FILE *stream)
  26. {
  27.    if(u8Data == '\n')
  28.    {
  29.         USART0SendByte('\r', stream);
  30.    }
  31. //wait while previous byte is completed
  32. while(!(UCSR0A&(1<<UDRE0))){};
  33. // Transmit data
  34. UDR0 = u8Data;
  35.  
  36. }
  37.  
  38. float ReadAndReturnAVG(uint8_t *values, uint8_t sizeOfValues) {
  39.     uint8_t i = 0;
  40.     uint8_t total = 0;
  41.     float average;  
  42.     for (i = 0; i < 17; i++) {
  43.     values[i] = 9;
  44.                                      
  45.     total = total + values[i];
  46.      
  47.     }
  48.  
  49.     average = (float)total / (float)sizeOfValues;
  50.  
  51.     return average;
  52. }
  53.  
  54. //set stream pointer
  55. FILE usart0_str = FDEV_SETUP_STREAM(USART0SendByte, NULL, _FDEV_SETUP_WRITE);
  56.  
  57. int main() {
  58. //Initialize USART0
  59. USART0Init();
  60.  
  61. uint8_t values[NUM_READINGS] = {0};
  62.  
  63. float average = 0.0f;
  64.  
  65. //assign our stream to standard I/O streams
  66. stdout=&usart0_str;
  67.  
  68. while(1) {
  69.    average = ReadAndReturnAVG(values, NUM_READINGS);
  70.    uint8_t d1 = average;
  71.    float f2 = average - d1;
  72.    uint8_t d2 = (uint8_t)(f2 * 100);
  73.    printf("Average: %d.%02d\n", d1, d2);
  74.   _delay_ms(500);
  75.   }
  76. }
  77.  


Код: C
  1. Average: 15.30
  2. Average: 15.30
  3. Average: 15.30
  4. Average: 15.30
  5. Average: 15.30
  6. Average: 15.30
  7. Average: 15.30
  8. Average: 15.30
  9. Average: 15.30
  10. Average: 15.30
  11. Average: 15.30
  12. Average: 15.30
  13. Average: 15.30
  14. Average: 15.30
  15.  


Обаче, ако задам i < 18 да бъде по-малко от 18, 19, 20 и нагоре нищо не се принтва в терминала и идея си нямам защо  ???  Стойноста на числото е 8 bit.

Код: C
  1. for (i = 0; i < 18; i++)
  2.  
« Последна редакция: 21 Декември 2016, 18:14:07 от jazzman »
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3623
Re: floating point variables in avr
« Отговор #1 -: 21 Декември 2016, 18:30:33 »
Направих тест и така работи:

Код: C
  1.    //average = ReadAndReturnAVG(values, NUM_READINGS);
  2.    average = (float)(9*18) / (float)10;
  3.    uint8_t d1 = average;
  4.    float f2 = average - d1;
  5.    uint8_t d2 = (uint8_t)(f2 * 100);
  6.    printf("Average: %d.%02d\n", d1, d2);
  7.  

Обаче през фунцията не ще.

Цитат
Average: 16.20
Average: 16.20
Average: 16.20
Average: 16.20
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: floating point variables in avr
« Отговор #2 -: 22 Декември 2016, 17:02:47 »
Ами щото бараш там дет не трябва  ;D

Какво е това магическо число 17? Или 18? Или какво то и да е по стойност.

Резервираш памет за масив от 10 на брой 8 битови цели числа и после пишеш на място 17 в масива ;)

Код: C
  1.  
  2. #define NUM_READINGS 10
  3.  
  4. int main() {
  5.  
  6.    uint8_t values[NUM_READINGS] = {0};
  7.  
  8. }

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3623
Re: floating point variables in avr
« Отговор #3 -: 22 Декември 2016, 21:14:35 »
Мммммм-даааа, всичко си дойде на мястото ;)
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html