Hej, piszac posta napotkalem kolejny problem :/, wiec chcialbym podzielic na 2 czesci:
[1] mam pot. podpiety pod ADC0, wynikiem jest wartosc od 0-1024. Chcialem wyswietlic na LCD takze wartosc w % (0-1024 odpowiada 0-100.0%) z 1 cyfra po przecinku, aby to zrobic przeskalowywuje (innej metody nie znam) wartosc 0-1024 na 0-1000 i wyswietlam jako string przesuwajac przecinek w lewo o 1 pole. Niestety Kalkulujac:
proc = pot*125/128 //wariant_1
proc = (pot*25/128)*25 //wariant_2
gubie po drodze dokladnosc (zwlaszcza wariant_1) :/ ...jak tego uniknac ? czy sa inne metody kalkulacji niz rozbijanie ulamka i kombinowanie (jak np w wariant_2)?
[2] Nie wiem dlaczego zmienna "zm1" zachowuje sie jako signed int po przekroczeniu 32767 zaczyna od -32768, natomiast w poz (6,1) wartosc wyswietlana jest jako unsigned int (leci powyzej 32767).
[1] mam pot. podpiety pod ADC0, wynikiem jest wartosc od 0-1024. Chcialem wyswietlic na LCD takze wartosc w % (0-1024 odpowiada 0-100.0%) z 1 cyfra po przecinku, aby to zrobic przeskalowywuje (innej metody nie znam) wartosc 0-1024 na 0-1000 i wyswietlam jako string przesuwajac przecinek w lewo o 1 pole. Niestety Kalkulujac:
proc = pot*125/128 //wariant_1
proc = (pot*25/128)*25 //wariant_2
gubie po drodze dokladnosc (zwlaszcza wariant_1) :/ ...jak tego uniknac ? czy sa inne metody kalkulacji niz rozbijanie ulamka i kombinowanie (jak np w wariant_2)?
[2] Nie wiem dlaczego zmienna "zm1" zachowuje sie jako signed int po przekroczeniu 32767 zaczyna od -32768, natomiast w poz (6,1) wartosc wyswietlana jest jako unsigned int (leci powyzej 32767).
#include <util/delay.h>
#include <stdlib.h>
#include "ADC.h"
#include "HD44780.h"
//
int main(void)
{
char str[7];
char tmp[7];
int pot;
unsigned int zm1;
DDRD = 0xF0;
DDRC = 0x00;
ADC_Init();
LCD_Init();
do{
LCD_Clear();
pot = getADC(0);
LCD_GoTo(0,0);
LCD_WriteText(itoa(pot,str,10));
zm1=(pot*100);
LCD_GoTo(6,0);
LCD_WriteText(itoa(zm1,str,10));
LCD_GoTo(6,1);
dtostrf(zm1,1,1,tmp);
LCD_WriteText(tmp);
_delay_ms(100);
}
while(1);
return 0;
}