Převod s desítové do dvojkové soustavy v mikroC PRO for PIC – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Převod s desítové do dvojkové soustavy v mikroC PRO for PIC – C / C++ – Fórum – Programujte.comPřevod s desítové do dvojkové soustavy v mikroC PRO for PIC – C / C++ – Fórum – Programujte.com

 
Hledat
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno
Pergoly a střechy Brno

visk0
Newbie
24. 2. 2017   #1
-
0
-

Zdravím

Potřebuji číslo 65535 převést na "1111111111111111" v architektuře pro mikroC PRO for PIC čili 16 bitové slovo,.U 8 bitového byte- číslo 255 ="11111111" mám takovou funkci  ta   mi funguje 

void byte_to_bin(unsigned char a, char *str)
{
   char b;

   for (b = 0b10000000; b > 0; b >>= 1) {
      *str++ = a & b ? '1' : '0';
   }
   str = '\0';
}

void main(void)
{

   unsigned char a;
   char str[9];

   a = 253;
   byte_to_bin(a, str);
   printf(str); 

Druhá věc potřeboval bych v 16 bitovém slově zamaskovat první a poslední 4 bity nebo jinými slovy vybrat 8 bitů co je mezi nimi názorně  "1111" - toto zamaskovat  "11111111"- toto potřebuji "1111" -toto zamaskovat  díky za pomoc

Nahlásit jako SPAM
IP: 188.246.111.–
Jerry
~ Anonymní uživatel
462 příspěvků
24. 2. 2017   #2
-
0
-

#1 visk
http://www.techcrashcourse.com/2015/08/c-program-to-convert-decimal-number-binary.html

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:201a:...–
visk0
Newbie
24. 2. 2017   #3
-
0
-

#2 Jerry
Ale já jsem omezený architekturou PIC procesoru díky

Nahlásit jako SPAM
IP: 188.246.111.–
24. 2. 2017   #4
-
0
-

To číslo je v paměti uloženo jako dvojkové, předpokládám, že 16 bitů je typ unsigned int. Takže ten unsigned int čtu po bitech od MSB po LSB a hodnotu bitu zapíšu na konec řetězce.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
visk0
Newbie
24. 2. 2017   #5
-
0
-

#4 hlucheucho
Ale jakou funkcí ? potřeboval byh názorný příklad .předem dík 

Nahlásit jako SPAM
IP: 188.246.111.–
24. 2. 2017   #6
-
0
-

Asi je to 8-bitový jednočip a tak by se mohlo vyplatit pracovat s jednotlivými Byty. Vezmu Byte na pozici MSB a projdu ho zleva od MSb.  Totéž pak pro LSB.

unsigned int cislo = 65535;
unsigned char b;
char s[17];
int i;

b = cislo>>8;  //ziskam MSB
for(i=0; i<8; i++)
{
   if(b&0x80)  //bitovy soucin ziska bit MSb
     s[i]='1'; //na pozici MSb je 1
   else
     s[i]='0'; //na pozici MSb je 0
   b = b<<1;   //na pozici MSb vysunu sousedni bit a celou cinnost opakuji
}

b = cislo & 0x0f;   //ziskam LSB
for(i=8; i<16; i++)
{
   if(b&0x80)  //bitovy soucin ziska bit MSb
     s[i]='1'; //na pozici MSb je 1
   else
     s[i]='0'; //na pozici MSb je 0
   b = b<<1;   //na pozici MSb vysunu sousedni bit a celou cinnost opakuji
}
s[17] = 0;  //ukoncim retezec

Jen nástřel, není to učesaný, odzkoušený. Pokud věříš optimalizaci od překladače, můžeš to udělat v jednom cyklu a pracovat s celým číslem najednou.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
24. 2. 2017   #7
-
0
-

Ještě pozn: uvedené získání MSB ( cislo>>8 ) a LSB ( cislo & 0x0f ) je nezávislé na endianitě. Všechny překladače se kterými jsem pracoval neprováděly bitový posun a bitový součin, ale přímo instrukcí přesunu vzaly příslušný byte.

Celé je to podobné přístupu na 8051 v assembleru. Tam bych použil RLC A a JC. R0 by adresoval znaky v poli

hu

Nahlásit jako SPAM
IP: 195.178.67.–
visk0
Newbie
24. 2. 2017   #8
-
0
-

   

Připojen obrázek.


je to na dobré cestě ale je  tam někde chyba    a ještě bych potřeboval udělat to jako funkci do které bych vložil číslo a výstup by byl něco jako  

UART1_Write_text(prevod)

přiznávám že v Céčku hodně plavu díky za schovývavost

Nahlásit jako SPAM
IP: 188.246.111.–
visk0
Newbie
24. 2. 2017   #9
-
0
-

#7 hlucheucho
chyba ostraněna  

b = cislo & 0x0f;   //ziskam LSB
opraveno 
b = cislo & 0xff;   //ziskam LSB
Nahlásit jako SPAM
IP: 188.246.111.–
24. 2. 2017   #10
-
0
-

#9 visk
no vidíš, už si našel a opravil chybu :). Jinak jako funkce by to bylo lepší oddělit převod a odesílání. Odesílání pak řídit přerušením. Fukce pro převod by mohla mít prototyp void uintToString(unsigned int cislo, char* s); Z kódu vynecháš deklarace pro cislo a s a zbytek kódu vložíš do těla funkce. Pro vysílání potřebuješ nastavit UART (stačí provést jen jednou po resetu jednočipu) a pak zahájit vysílání odesláním prvního znaku. Při obsluze přerušení odeslat další znak. Na konci řetězce je znak s hodnotou 0x00, ten by mohl být řídícím znakem pro konec vysílání.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
visk0
Newbie
24. 2. 2017   #11
-
0
-

Toto mám postaveno na nepájivém  poli  na displeji mi to ukazuje teplotu  dobře .Tak jsem si chtěl upravit tak že vynechám LCD displej a při dosažené určité teploty zazní alarm a protože jsem potřeboval při úpravě vypisovat určité proměnné tak jsem dostal nápad že to zkusím přes virtualní  terminál a od toho nápadu je jen krok zobrazovat teplotu pomoci terminálu v PC převodník TLL na RS-232 mám v PC seriál mám.Ta úprava se mi pořád nedaří ,pokud vím tak to čidlo DS18b20 dává 16 bitovou hodnotu tak že první horní 4 bity je znaménko kladná přestavuje 1111 dalších 8 bitů je vlastní teplota a poslední 4 bity je 0.5,0.005 Ten převod je jen abych si mohl udělat obrázek co s toho čidla vlastně leze bohužel se ukázalo že něco je špatně protože když nastavuji teplotu na čidle tak se mění jen horní 4 bity dolního byte   

// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections

//  Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
//  18S20: 9  (default setting; can be 9,10,11,or 12)
//  18B20: 12
const unsigned short TEMP_RESOLUTION = 9;//9;
char *text = "000.0000";
unsigned temp,tempi;    // -původní deklarace
//unsigned int temp;
void Display_Temperature(unsigned int temp2write) {
  const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
  char temp_whole;
  unsigned int temp_fraction;
  unsigned char Znak;
  Znak = 1;    //Hodnota 1 při kladné teplotě

  // Check if temperature is negative
  if (temp2write & 0x8000)
    {
     Znak = 0;  //Hodnota nula při záporné teplotě
     temp2write = ~temp2write + 1;
    }

  // Extract temp_whole
  temp_whole = temp2write >> RES_SHIFT ;

  // Convert temp_whole to characters
  if (temp_whole/100)
     text[0] = temp_whole/100  + 48;
  else
     text[0] = ' ';

  text[1] = (temp_whole/10)%10 + 48;             // Extract tens digit
 //Potlačení zobrazení zbytečných nul
  if ((text[0]) == ' ')
    {
     if ((text[1]) == 48)
      {
        text[1] = ' ';
      }
    }
 //Zobrazení záporného znaménka
  if (Znak == 0)
    {
      text[0] = '-';
    }

  text[2] =  temp_whole%10 + 48;             // Extract ones digit

  // Extract temp_fraction and convert it to unsigned int
  temp_fraction  = temp2write << (4-RES_SHIFT);
  temp_fraction &= 0x0F;
  temp_fraction *= 625;

  // Convert temp_fraction to characters
  text[4] =  temp_fraction/1000    + 48;         // Extract thousands digit
  text[5] = (temp_fraction/100)%10 + 48;         // Extract hundreds digit
  text[6] = (temp_fraction/10)%10  + 48;         // Extract tens digit
  text[7] =  temp_fraction%10      + 48;         // Extract ones digit

  // Print temperature on LCD
  Lcd_Out(2, 5, text);
}

display(unsigned int temp2write) {
unsigned int i,x;
 x=0;
 //temp << 1;
 for ( i = 16; i > 0; i--) {
 //Lcd_Chr(1,x++,'0');
 if((temp & (1<< i)) == 0)Lcd_Chr(1,x++,'0'); else Lcd_Chr(1,x++, '1');
 }
 }


void main() {
  //ANSEL  = 0;                                    // Configure AN pins as digital I/O
  //ANSELH = 0;
  //C1ON_bit = 0;                                  // Disable comparators
  //C2ON_bit = 0;
  TRISA1_bit = 1;                                 //uprava tlacitko
  CMCON = 0x07;
  Lcd_Init();                                    // Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);                           // Clear LCD
  Lcd_Cmd(_LCD_CURSOR_OFF);                      // Turn cursor off
  Lcd_Out(1, 1, " Temperature:   ");
  // Print degree character, 'C' for Centigrades
  Sound_Init(&PORTA, 0);
  Sound_Play(980, 1000);
  Lcd_Chr(2,13,223);                             // Different LCD displays have different char code for degree
                                                 // If you see greek alpha letter try typing 178 instead of 223

  Lcd_Chr(2,14,'C');

  //--- Main loop
  do {
    //--- Perform temperature reading
    Ow_Reset(&PORTA, 2);                         // Onewire reset signal
    Ow_Write(&PORTA, 2, 0xCC);                   // Issue command SKIP_ROM
    Ow_Write(&PORTA, 2, 0x44);                   // Issue command CONVERT_T
    Delay_ms(1000);//Delay_us(10000);             puvodne 120

    Ow_Reset(&PORTA, 2);
    Ow_Write(&PORTA, 2, 0xCC);                   // Issue command SKIP_ROM
    Ow_Write(&PORTA, 2, 0xBE);                   // Issue command READ_SCRATCHPAD

    temp =  Ow_Read(&PORTA, 2);
    tempi = temp;
    temp = (Ow_Read(&PORTA, 2) << 8) + temp;

    //--- Format and display result on Lcd
    if (Button(&PORTA, 1, 1, 1)){
    display(tempi);
    }
    Display_Temperature(temp);
    Delay_ms(500);
  } while (1);

moje úprava je tato  

 unsigned int temp,tempi,prevod;
     unsigned int cislo;
unsigned char b;
char s[17];
int i;

  long de;
 unsigned  ahoj,d;
  char   szNumber[4];
  char ch[22];
   int mask;
   unsigned char str[16];
 void getBin(unsigned int num, unsigned int *str)
{
  *(str) = '\0';
   mask = 0x10 << 1;
  while(mask >>= 1)
    *str++ = !!(mask & num) + '0';
}
  void byte_to_bin(unsigned int a, unsigned int*str)
{
   unsigned  int b;

   for (b = 0b10000000; b > 0; b >>= 1) {
      *str++ = a & b ? '1' : '0';
   }
   *str = '\0';
}
void unsigned slovo()
{
unsigned int cislo = 65535;
unsigned char ba;
char s[17];
int i;

ba = cislo >> 8;  //ziskam MSB
for(i=0; i<8; i++)
{
   if(ba&0x80)  //bitovy soucin ziska bit MSb
     s[i]='1'; //na pozici MSb je 1
   else
     s[i]='0'; //na pozici MSb je 0
   b = b<<1;   //na pozici MSb vysunu sousedni bit a celou cinnost opakuji
}

ba = cislo & 0x0f;   //ziskam LSB
for(i=8; i<16; i++)
{
   if(ba&0x80)  //bitovy soucin ziska bit MSb
     s[i]='1'; //na pozici MSb je 1
   else
     s[i]='0'; //na pozici MSb je 0
   b = b<<1;   //na pozici MSb vysunu sousedni bit a celou cinnost opakuji
}
s[17] = 0;  //ukoncim retezec
 }
    void dd(unsigned char a)
{

    do
    {
        if((a & (1<<b))!= 0)
        {
        UART1_Write_text("1");
        }
        else
        {
        UART1_Write_text("0");
        }
    }while(b-- != 0);
    }
    
void main() {

  //ANSEL  = 0;                                    // Configure AN pins as digital I/O
  //ANSELH = 0;
  //C1ON_bit = 0;                                  // Disable comparators
  //C2ON_bit = 0;
  TRISA1_bit = 1;                                 //uprava tlacitko
  CMCON = 0x07;
  //Lcd_Init();                                    // Initialize LCD
  //Lcd_Cmd(_LCD_CLEAR);                           // Clear LCD
  //Lcd_Cmd(_LCD_CURSOR_OFF);                      // Turn cursor off
  //Lcd_Out(1, 1, " Temperature:   ");
  // Print degree character, 'C' for Centigrades
 Sound_Init(&PORTA, 0);
 Sound_Play(500, 1000);
  //Lcd_Chr(2,13,223);                             // Different LCD displays have different char code for degree
   UART1_Init(9600);                                              // If you see greek alpha letter try typing 178 instead of 223
    //ahoj = 100 ;
  //--- Main loop
  do {
    //--- Perform temperature reading
    Ow_Reset(&PORTA, 2);                         // Onewire reset signal
    Ow_Write(&PORTA, 2, 0xCC);                   // Issue command SKIP_ROM
    Ow_Write(&PORTA, 2, 0x44);                   // Issue command CONVERT_T
    Delay_ms(1000);//Delay_us(10000);             puvodne 120

    Ow_Reset(&PORTA, 2);
    Ow_Write(&PORTA, 2, 0xCC);                   // Issue command SKIP_ROM
    Ow_Write(&PORTA, 2, 0xBE);                   // Issue command READ_SCRATCHPAD

    temp =  Ow_Read(&PORTA, 2);
    prevod =temp;
    cislo = temp;
b = cislo>>8;  //ziskam MSB
for(i=0; i<8; i++)
{
   if(b&0x80)  //bitovy soucin ziska bit MSb
     s[i]='1'; //na pozici MSb je 1
   else
     s[i]='0'; //na pozici MSb je 0
   b = b<<1;   //na pozici MSb vysunu sousedni bit a celou cinnost opakuji
}

b = cislo & 0xff;   //ziskam LSB
for(i=8; i<16; i++)
{
   if(b&0x80)  //bitovy soucin ziska bit MSb
     s[i]='1'; //na pozici MSb je 1
   else
     s[i]='0'; //na pozici MSb je 0
   b = b<<1;   //na pozici MSb vysunu sousedni bit a celou cinnost opakuji
}
s[17] = 0;  //ukoncim retezec
    de= 256;
    getBin(65535,str);
   // byte_to_bin(65535,ch);
    //tempi = temp;
    //temp = (Ow_Read(&PORTA, 2) << 8) + temp;
    ahoj = 10 * temp +1000;
   // If data is ready, read it:
    // If data is ready, read it:
    //tempi =temp;
    //sprintl(szNumber, "%i", tempi);
    //tempi= temp / 16;
     d = strlen(ch);
    bytetostr(ch ,szNumber);
    //inttostr(ahoj,szNumber);
    UART1_Write_text(s);
     //dd(temp);
     UART1_Write_text("\n\r");
    //UART1_Read_Text(temp);
    //--- Format and display result on Lcd
      //Sound_Play(980,1000);
    if (temp == 160) {
     Sound_Play(980,1000);
     }
    // if (temp == 128){
     //Sound_Play(100,1000);
     //}
    Delay_ms(500);
  } while (1);
  }
Nahlásit jako SPAM
IP: 188.246.111.–
KIIV
~ Moderátor
+43
God of flame
24. 2. 2017   #12
-
0
-

#11 visk
jak v tom muzes neco vubec precist.

Lekce #1 v jakemkoliv programovacim jazyce: ODSAZOVANI. Je to sice volitelne, ale je to zatracene nutne, pokud v tom chces jeste nekdy neco vubec najit!!!

#2 retezec potrebuje o jeden znak vice, aby se tam dal ulozit jeste ukoncovaci znak. Nicmene, pokud tam mas s o velikosti 17, tak posledni znak je na 17. pozici, coz je index 16!!

No kazdopadne jsem to trochu procistil od nepouzivaneho kodu, nepouzivanych promennych, zakomentovaneho kodu. Pridal  prevod  word_to_bin a zbavil se globalnich promennych (tady jsou uplne zbytecne)

void word_to_bin(unsigned int a, char * str)
{
   unsigned int b = 0x8000U;
   for (; b > 0; b >>= 1)
   {
      *str++ = a & b ? '1' : '0';
   }
   *str = '\0';
}

void main() {
    char str[17];
    
    TRISA1_bit = 1;         //uprava tlacitko
    CMCON      = 0x07;

    Sound_Init(&PORTA, 0);
    Sound_Play(500, 1000);
    UART1_Init(9600);       // If you see greek alpha letter try typing 178 instead of 223

    // main loop - in the  
    do {
        //--- Perform temperature reading
        Ow_Reset(&PORTA, 2);          // Onewire reset signal
        Ow_Write(&PORTA, 2, 0xCC);    // Issue command SKIP_ROM
        Ow_Write(&PORTA, 2, 0x44);    // Issue command CONVERT_T
        Delay_ms(1000);               // puvodne 120

        Ow_Reset(&PORTA, 2);          // Onewire reset signal
        Ow_Write(&PORTA, 2, 0xCC);    // Issue command SKIP_ROM
        Ow_Write(&PORTA, 2, 0xBE);    // Issue command READ_SCRATCHPAD

        unsigned int temp =  Ow_Read(&PORTA, 2);

        word_to_bin(temp, str);
        UART1_Write_text(str);
        UART1_Write_text("\n\r");

        if (temp == 160) { // proc vlastne vydavat zvuk jen pri presne teplote?
            Sound_Play(980,1000);
        }
        
        Delay_ms(500);

    } while (1);
}
Nahlásit jako SPAM
IP: 94.113.99.–
Program vždy dělá to co naprogramujete, ne to co chcete...
24. 2. 2017   #13
-
0
-

#12 KIIV
tu chybu s indexem 17 jsem udělal já a on to opsal. Hlavně, že každýmu radím aby si dal na to pozor. A že je to zápis, tak je to rpůser dvojnásob. Přiznám se - udělal jsem dvě chyby.

Jinak by mne zajímalo, jak to překladač optimalizoval, zejména bitový posun 16-bitového čísla. Postněte sem asm (děkuji), který je výsledkem práce překladače. Že jsem ke schopnostem překladače přistupoval s despektem, rozdělil jsem to na zpracování po Bytech.

hu

Nahlásit jako SPAM
IP: 193.86.81.–
visk0
Newbie
24. 2. 2017   #14
-
0
-

#12 KIIV
Já uznávám že jsem ve štábní kultuře  bordelář. Jinak  musel jsem  deklaraci proměnné temp přesunout pod deklaraci   char str[17]; bohužel to funguje jak před tím při nastavení teploty v simulátoru jsou pouze  změněny 4 vyšší bity nižšího byte  "xxxxxxxx1111xxxx" díky     
 

Nahlásit jako SPAM
IP: 188.246.111.–
KIIV
~ Moderátor
+43
God of flame
24. 2. 2017   #15
-
0
-

#14 visk
tak to by mohlo byt napriklad tim, ze OW_Read pouziva datovy typ unsigned short pro navratovou hodnotu, coz je to same jako unsigned char - 0..255. Tim padem asi budes muset precist i druhy byte (coz je MSB)

unsigned int temp =  Ow_Read(&PORTA, 2);       // temperature LSB
temp += ((unsigned int)Ow_Read(&PORTA, 2))<<8; // temperature MSB

Kazdopadne simulatory jsou dosti zname tim, ze obcas trochu simuluji blbe

Nahlásit jako SPAM
IP: 94.113.99.–
Program vždy dělá to co naprogramujete, ne to co chcete...
visk0
Newbie
25. 2. 2017   #16
-
0
-

#15 KIIV
Pomohlo to velice moc díky.Je mi stydno ale potřebuji další věc jak vypreparovat s proměnné temp hodnotu teploty? čili  první a poslední 4 bity zahodit !!   ještě jednou díky 

Nahlásit jako SPAM
IP: 188.246.111.–
KIIV
~ Moderátor
+43
God of flame
25. 2. 2017   #17
-
0
-

#16 visk
no nejvyssich 5 bitu je "znamenko", takze spis preved na int a vydel 16. Melo by to pak vyjit v celych stupnich. Pokud chces i dalsi mista, tak muzes scitat konstanty do nejake dalsi promenne, pro kazdy z tech nejnizsich bitu (nez to pak vydelis tou 16)

Nahlásit jako SPAM
IP: 94.113.99.–
Program vždy dělá to co naprogramujete, ne to co chcete...
visk0
Newbie
26. 2. 2017   #18
-
0
-

#17 KIIV

Pomohlo proměnnou temp vydělit 16 a správná teplota v binárním zobrazením byla na světě!! díky za radu. 
Ale teď jsem narazil asi na tvrdý oříšek jak zobrazit hodnotu proměnné unsigned int temp  ve virtuálním terminálu potažmo v PC terminálu ? funkci sprintl na převod temp na string nemohu z důvodu asi nedostatku paměti v PIC16F628A použít nebo s funkcí sprintl neumím pracovat uf jak na to?   

Nahlásit jako SPAM
IP: 188.246.111.–
KIIV
~ Moderátor
+43
God of flame
26. 2. 2017   #19
-
0
-

#18 visk
jaky tvrdy orisek? Znas zaklady ciselnych soustav (hlavne pozicnich - kde kazda pozice ma svoji vahu)? Hlavne prevody mezi napriklad dvojkovou a desitkovou (ale v tomto pripade se to bude spis tvarit jako DEC do DEC :D)

Nahlásit jako SPAM
IP: 94.113.99.–
Program vždy dělá to co naprogramujete, ne to co chcete...
visk0
Newbie
27. 2. 2017   #20
-
0
-

#19 KIIV
Pořád nemohu s tím hnout já když  

UART1_Write_text(80);

tak se v terminálu nic neukáže a když dám

UART1_Write(80);


tak se zobrazí "P" čili znak v ASCII Chart který má hodnotu 80 .

Zkoušel jsem nějak rozdělit to 8 bitové číslo na dvě půlky nějak takto

temp/8 +48 

abych dosáhl v tabulce ASCII Chart požadovaný znak ,jde to nějak divně když například na čidle nastavuji teplotu v rozmezí 46..56 se mi zobrazí v terminálu 5 je tam nějaká chyba díky za pomoc

Nahlásit jako SPAM
IP: 188.246.111.–
27. 2. 2017   #21
-
0
-

V ASCII mají cifry hodnotu 0x30 až 0x39 pro 0 až 9 a 0x41 až 0x46 pro A až F. Ve dvojkové soustavě odpovídají 4 cifry jedné cifře v soustavě hexadecimální. Takže z 0x0 až 0x9 musíš udělat 0x30 až 0x39 např pomocí přičetní 0x30 a pro rozsah 0xA až 0xF musíš udělat 0x41 až 0x46 např přičtením 0x37. Platí to ale jen v případě, že číslo je binární. Je možné (nedíval jsem se jaký výstup má tebou použité čidlo, je třeba se podívat do datasheetu), že každé 4 bity čísla vyjadřují dvojkově jednu dekadickou cifru, pak pokud trváš na hexadecimálním vyjádření by byl nutný převod dec - hex.

temp/8 je jako bitový posun vpravo o 3 bity. K rozdělení 8 bitového čísla "na poloviny" bys potřeboval temp>>4 neboli temp/16 pro horní 4 bity a 0x0f & temp pro dolní 4 bity. Bitové posuny bývají rychlejší než aritmetika.

Domněnky: UART1_Write_text slouží k odeslání řetězce a UART1_Write k odeslání znaku. Nebo je to jinak?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
visk0
Newbie
27. 2. 2017   #22
-
0
-

#21 hlucheucho
Domněnky: UART1_Write_text slouží k odeslání řetězce a UART1_Write k odeslání znaku. Nebo je to jinak?

Je tomu tak 

hex 0x30 = dec 48

pak pokud trváš na hexadecimálním vyjádření

Já bych potřeboval aby v terminálu byla zobrazena teplota v desítkové soustavě ???

Připojen obrázek.

Nahlásit jako SPAM
IP: 188.246.111.–
27. 2. 2017   #23
-
0
-

V podstatě stačí číslo dělit stem výsledek dělení zapsat jako cifru a zbytek po dělení dělit deseti a výsledek zapsat jako další cifru a zbytek pak jako třetí cifru. Pokud je číslo 4-ciferné, dělit tisícem, výsledek jako cifru a zbytek dělit stem ... Předpokládám pevnou des. čárku, tu vypíšeš jako znak mezi cifry tak kam patří. Jen mi uniká, proč to mělo být dvojkové číslo jako řetězec.

hu

Nahlásit jako SPAM
IP: 193.86.81.–
visk0
Newbie
28. 2. 2017   #24
-
0
-

#23 hlucheucho
Jen mi uniká, proč to mělo být dvojkové číslo jako řetězec.

To já mám jako pomocnou berličku abych věděl co s toho čidla jeze.

Možná budu ti připadat jako totální trubka ale jak získám zbytek po dělení  

unsigned char temp_d = temp /10 
uart1_write(temp_d+48);

na terminálu se zobrazí správná desítková hodnota ale nevím jak získat jednotky díky

Nahlásit jako SPAM
IP: 188.246.111.–
28. 2. 2017   #25
-
0
-

modulo. Alternativně odečíst celočíselný podíl od dělence.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
visk0
Newbie
28. 2. 2017   #26
-
0
-

#25 hlucheucho
Jaká je správná syntaxe v této verzi Céčka? potřeboval bych příklad na 3 cifry : stovky, desítky a jednotky  díky moc

Nahlásit jako SPAM
IP: 188.246.111.–
28. 2. 2017   #27
-
0
-

algoritmus jsem už popisoval.... 

int cislo = 258;
int sta, desitky, jednotky, zbytek;

sta = cislo / 100;
zbytek = cislo % 100;
desitky = zbytek / 10;
jednotky = zbytek % 10

hu

Nahlásit jako SPAM
IP: 195.178.67.–
visk0
Newbie
28. 2. 2017   #28
-
0
-

#27 hlucheucho


Paráda jsi  jednička!!!! škoda že tady není smajlík který by vystihoval.

Tys mě dokopal ke zdaru, ještě aby to fungovalo i fyzickém švábu nejen v simulátoru.Až budu mít chvíli tak to napálím do MCu používám k tomu MPLAB IDE v8.63 s klonem SCPD 2 viz příloha

Připojen obrázek.

S takovým znakem jako je "%" jsem se ještě nesetkal  To výš  v Céčku jsem nebyl vychováván    

Nahlásit jako SPAM
IP: 188.246.111.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 22 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032021 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý