Teplotní alarm s přenosem teploty po UART

Zdravím
Podařilo se mi vykuchat a upravit ze starého projektu z mikroC PRO for PIC který mi zobrazoval teplotu na LCD displeji teplotu s čidla DS18B20 mimochodem tady jsem to řešil vis mikroC rutina pro LCD s řadičem HDD44780 přip. k PIC16F628A
toto !!

[code]
unsigned temp,tempi;
char szNumber[20];
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

//— 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;

// If data is ready, read it:
// If data is ready, read it:
//tempi =temp;
//sprintl(szNumber, “%i”, tempi);
UART1_Write(temp);

//UART1_Read_Text(temp);
//--- Format and display result on Lcd
  //Sound_Play(980,1000);
if (temp == 80) {
 Sound_Play(980,1000);
 }
// if (temp == 128){
 //Sound_Play(100,1000);
 //}
Delay_ms(500);

} while (1);

}[/code]

Při dosažení teploty 69 stupňů začne to pískat vyzkoušeno zatím v Proteus 8 Professional už to mám nahráno v PIC 16F628A musím to otestovat v reálu chci to ještě dotáhnout aby ta teplota se vysílala přes UART při eventuálním připojení v k PC aby bylo v terminálu vidět teplota.Potřeboval bych převést teplotu která je dec číslo na string a pak to poslat po UART funkci sprintl nemohu pro náročnost na flash paměť v PIC16F628A prostě se to tam nevleze. konfigurační slovo 3F78 4MHz
teplomer1.rar (18.3 KB)
teplomer1.rar (18.3 KB)

Pěkný, a co máš vlastně přesně za problém?

Nemusíš nic převádět a posílat nějakou zběsilou funkcí, 16F628A má HW UART, tak to prostě nasyp pomocí cyklu do TXREG a fertig.

V příloze mám přoložený hex a projekt pro proteus , a v terminálu se vypisuje písmeno “P” při nastavené teplotĕ 69 stupnů ,používám funkci UAR1 _WRITE v tom IDE asi není nebo nevím o funkci TXREG

S PICama sice nedělám a MikroC taky nepoužívám, ale počítám, že TXREG nebude funkce, ale registr procesoru a nakonfigurovat UART a napsat odesílací funkci si budeš muset sám. Ono by to chtělo taky občas číst datasheety a nespoléhat se slepě na to, co je v knihovně nebo co kde stáhneš. To pak neprogramuješ, ale slepuješ cizí kódy. Nic víc.

@Meloun1: kdyz mi reknes proc ti to vypisuje “P” tak ti poradim

@MiloPS3: protože jsem používal tuto špatnou funkci UART1_Write(temp) místo tohoto
**Bytetostr(temp,szNumber);
UART1_Write_text(szNumber);
**
ale pořád nemohu dojít k očekávanému výstupu, ten převod je s byte na string která operuje jen 8 bity ale to čidlo posílá 16 bitů.Další v proeteru nastavená teplota na čidlu DS18B20 69 stupňů ve virtuálním terminálu se zobrazí 80 to je jasný nesoulad a když kliknu v proeterovi na čidlo abych zvýšil teplotu o jeden stupeň tak v virtuálním terminálu se zobrazí 96 .Já vím že mám “hokej” DS18B20 ale kdyby někdo měl přeložený datashet do češtiny tak pochopím ,ale překlad v google translátoru to je zmatečný díky

funkce IntToStr nefunguje

Počítám, že počet datasheetů v čestině se bude limitně blížit k nule. S angličtinou se prostě musíš smířit.
Pro kladná čísla stačí když z DS18B20 vyčtené 16-bitové číslo vydělíš 16, dostaneš teplotu ve °C.
Pro záporná si to odvoď sám.

A proč to tak je si vyčti z datasheetu.

prosim… (priloha)

najdi si → conversions_library.htm ← ve vyhledavaci
Datasheet_teplotniho_cidla_DS18B20.doc (159 KB)

Já už nevím napadá mi jestli nedělám chybu TEMP_RESOLUTION protože nevím jak nastavit na 9 defaultně je 12.
Tento zdroják mi funguje

// 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);
}[/code]
já jsem z něho vyrval jen tu část která by měla vyčíst teplotu s toho čidla, 
zakomentovaná proměnná ahoj to je zkouška převodu čísla na string a poslaní  na UART1   to funguje .
Ale teplota kterou si nastavím na čidle 69 stupňů v terminálu ukazuje 80 :blush:  :blush: 
[code] unsigned int temp,tempi;
 //unsigned ahoj;
  char   szNumber[4];

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);
//tempi = temp;
    //temp = (Ow_Read(&PORTA, 2) << 8) + temp;
   // If data is ready, read it:
    // If data is ready, read it:
    //tempi =temp;
   
    tempi= temp / 16;
    Bytetostr(temp,szNumber);
    
    UART1_Write_text(szNumber);

    //UART1_Read_Text(temp);
    //--- Format and display result on Lcd
      //Sound_Play(980,1000);
    if (temp == 80) {
     Sound_Play(980,1000);
     }
    // if (temp == 128){
     //Sound_Play(100,1000);
     //}
 Delay_ms(500);
  } while (1);

jinak děkuji za ten přeložený dataset
prosím o shovívavost …

To prosíš marně, resp. prosíš jen sám sebe, protože když děláš něco bez toho, abys vůbec tušil co děláš a aniž bys k tomu měl ty správné informace, tak tím okrádáš o čas především sám sebe - ostatní se s tebou mazat nebudou když na první pohled vidí, že jsou porušeny prakticky všechny zásady, které se ve fóru (a nejen tomto) dodržují a neustále dokola probírají a jsou z nich prakticky nepsaná pravidla.

Máš datasheet od PIC16F628A (nebo pro co to píšeš)? Četl jsi ho jako první?
Máš datasheet od DS18B20? Četl jsi ho celý pořádně před tím, než jsi vůbec začal něco tvořit?

Jestli ne, nemůžeš nic takového dělat, tzn. bez angličtiny (aspoň přes Google translator) jsi v koncích dřív, než vůbec začneš.

I číňani se dokázali naučit anglicky, dokážeš to taky.