forum.mcontrollers.com - hlavní stránka forum.mcontrollers.com - fórum

 

.: fórum - hlavní stránka :.
Technology Stronghold by Rudolf Vesely
How to build Microsoft System Center hosted cloud series
FAQFAQ HledatHledat Seznam uživatelůSeznam uživatelů Uživatelské skupinyUživatelské skupiny RegistraceRegistrace
ProfilProfil StatistikaStatistika Soukromé zprávySoukromé zprávy PřihlášeníPřihlášení

 
Teplotní alarm s přenosem teploty po UART

 
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> Microchip
 
Meloun1
Přispěvatel
Přispěvatel


Založen: 24.12.2015
Příspěvky: 29
Bydliště: Poblíž Zlína

PříspěvekZaslal: 14 únor 2017, 18:28    Předmět: Teplotní alarm s přenosem teploty po UART Citovat

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 http://forum.mcontrollers.com/viewtopic.php?t=2028&highlight=
toto !!

kód:

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);

}


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
 Komentář:

Stáhnout
 Soubor:  teplomer1.rar
 Velikost:  18.3 kB
 Staženo:  21 krát


teplomer1.rar
 Komentář:

Stáhnout
 Soubor:  teplomer1.rar
 Velikost:  18.3 kB
 Staženo:  21 krát


_________________
Čím víc se učím tak tým víc si uvědomuji že nic nevím meloun a Meloun1 je tatáž osoba
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Mahoney
Profesionál
Profesionál


Založen: 26.12.2013
Příspěvky: 104

PříspěvekZaslal: 14 únor 2017, 19:33    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Meloun1
Přispěvatel
Přispěvatel


Založen: 24.12.2015
Příspěvky: 29
Bydliště: Poblíž Zlína

PříspěvekZaslal: 14 únor 2017, 20:55    Předmět: Citovat

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
_________________
Čím víc se učím tak tým víc si uvědomuji že nic nevím meloun a Meloun1 je tatáž osoba
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Balů
Profesionál
Profesionál


Založen: 29.10.2012
Příspěvky: 713

PříspěvekZaslal: 14 únor 2017, 21:31    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
MiloPS3
Profesionál
Profesionál


Založen: 24.12.2008
Příspěvky: 887
Bydliště: LAZNE KYNZVART

PříspěvekZaslal: 15 únor 2017, 14:50    Předmět: Citovat

@Meloun1: kdyz mi reknes proc ti to vypisuje "P" tak ti poradim
_________________
PIC,ASM / C , Mplab + CCS C Compiler
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
 

 
Meloun1
Přispěvatel
Přispěvatel


Založen: 24.12.2015
Příspěvky: 29
Bydliště: Poblíž Zlína

PříspěvekZaslal: 16 únor 2017, 13:07    Předmět: Citovat

@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

_________________
Čím víc se učím tak tým víc si uvědomuji že nic nevím meloun a Meloun1 je tatáž osoba
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Balů
Profesionál
Profesionál


Založen: 29.10.2012
Příspěvky: 713

PříspěvekZaslal: 16 únor 2017, 13:35    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
MiloPS3
Profesionál
Profesionál


Založen: 24.12.2008
Příspěvky: 887
Bydliště: LAZNE KYNZVART

PříspěvekZaslal: 16 únor 2017, 14:37    Předmět: Citovat

citace:
kdyby někdo měl přeložený datashet do češtiny tak pochopím

prosim... (priloha)

citace:
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ů

najdi si -> conversions_library.htm <- ve vyhledavaci



Datasheet_teplotniho_cidla_DS18B20.doc
 Komentář:

Stáhnout
 Soubor:  Datasheet_teplotniho_cidla_DS18B20.doc
 Velikost:  159 kB
 Staženo:  35 krát


_________________
PIC,ASM / C , Mplab + CCS C Compiler
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
 

 
Meloun1
Přispěvatel
Přispěvatel


Založen: 24.12.2015
Příspěvky: 29
Bydliště: Poblíž Zlína

PříspěvekZaslal: 16 únor 2017, 18:23    Předmět: Citovat

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
kód:

// 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);
}

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 Embarassed Embarassed
kód:
 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 ....

_________________
Čím víc se učím tak tým víc si uvědomuji že nic nevím meloun a Meloun1 je tatáž osoba
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Mahoney
Profesionál
Profesionál


Založen: 26.12.2013
Příspěvky: 104

PříspěvekZaslal: 16 únor 2017, 20:34    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

Zobrazit příspěvky z předchozích:   
Zobrazit předchozí téma :: Zobrazit následující téma  
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> Microchip Časy uváděny v GMT + 2 hodiny
 
Strana 1 z 1
Přejdi na:  
Můžete přidat nové téma do tohoto fóra.
Můžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Můžete k příspěvkům připojovat soubory
Můžete stahovat a prohlížet přiložené soubory
 



Num Lock Holder - app to hold Numlock
Copyright © 2017 Rudolf Veselý, mcontrollers.com.
Je zakázáno používat části tohoto webu bez souhlasu autora. || Powered by phpBB © 2001, 2002 phpBB Group - with RedSquare DoubleJ(Jan Jaap)