mikroC rutina pro LCD s řadičem HDD44780 přip. k PIC16F628A

No vadne cidlo, pokud ho neznicil pokusama bych take nevidel jako duvod nefunkcnosti.

kod pro zahajeni prevodu tam je urcite:

Ow_Write(&PORTA, 2, 0xCC); // Issue command SKIP_ROM Ow_Write(&PORTA, 2, 0x44); // Issue command CONVERT_T

Tak jsem zpozorněl protože taky se seznamuji Isis Proteus jenže v demu nebo dá se to odsimulovat v demu nebo jen v plné verzi? díky

je to tam díky

tak jsem to zkusil a nic. díky

Aku hodnotu odporu na 1-wire mas?

4k4 díky

:arrow_right: administrator: příspěvek byl upraven
Předchozí příspěvky se necitují.

4k4? nepoznam :slight_smile:

pouzi 2k2. Niektore (skoro vsetky,ktore mi presli cez ruky, cca 50-70ks) 18B20 neboli ochotne spravne komunikovat, kym som hodnotu odporu nezmensil na 2k2. A to ani na vzdialenost 2-3cm od mcu.

priebehy na zbernici boli OK , casovanie sedelo ? lebo je tam jedna kriticka cast… zdrojak nedas na ovladanie toho cidla co si pouzil…?

Predpokladam ze ked ma nacitanu hodnotu 85st ce mu to komunikuje…zameral by som sa na spustenie prevodu lebo zdasa ze vysledok prevodu mu cita…

Trefa do černého změna odporu na 2k2 pomohla už to funguje bohužel ne na 100% dnes ráno jsem to vystrčil na mráz a po chvílích to klesalo na “000.0000” … “000.5000”…“001.0000” znaménko “-” nikde tak jsem sevřel do dvou prstů to čidlo a zas přes “000.0000” stoupala teplota v opačném pořadí zas bude chyba ve v této funkci díky.


unsigned temp; 
void Display_Temperature(unsigned int temp2write) {
  const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
  char temp_whole;
  unsigned int temp_fraction;

  // Check if temperature is negative
  if (temp2write & 0x8000) {
     text[0] = '-';
     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] = '0';

  text[1] = (temp_whole/10)%10 + 48;             // Extract tens digit
  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 &= 0x000F;
  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);

V příloze je český překlad datashetu DS18B20.
Datasheet_teplotniho_cidla_DS18B20.doc (277 KB)

Tak to ohledne odporu me prekvapuje, ted jsem pouzival neco kome 20ks a nebyl problem. Jen pro zajimavost, jake napeti jste pro ne pouzivali a v jakem modu jste je meli pripojene k napajeni?

Ja osobne som pouzil napajanie 5V a komunikacny vodic samozrejme zvlast. Vzdialenost od procesora od 2cm, niekedy do 10cm. Zaujimave bolo, ze ak som zobral novy kus, tak na 4k7 komunikovat nechcel. Dal som ho na 2k2, tam komunikoval bez problemov a potom niektore komunikovali aj na tych 4k7. Aj po vypnuti a zapnuti zariadenia. Priebehy som sledoval osciloskopom a boli take ako doporucoval vyrobca ci v casovej tak aj v napatovej oblasti. Pri 4k7 aj pri 2k2. Takze nejakymi parazitnymi kapacitami to byt predpokladam nemohlo. Ale stravil som pri tom hooodne casu. Pod slovom komunikovat treba rozumiet, ze data nechodili bud vobec, alebo casto chodili take nejake spotvorene. Bolo to uz relativne davno, tak presne to uz popisat neviem.

videl som par rutin kde citanie log 1 masterom bolo riesene dost nestastne a to po 15us… a zalezalo od prekladaca ako prelozil presne slucky ci citanie zacalo skor ako preslo 15us. Alebo to bolo na hrane… a obcas to casovo nesedelo… potom vznikaju prave taketo problemy.
Tak ze skontrolovat ci citanie log 1 zacina po viac ako 1us+ doba ustalenia napetia a konci trosku skor ako 15us

Zkusil jsem to upravit, mělo by to zobrazovat záporné znaménko a vynechat zbytečné nuly při zobrazení hodnoty.

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

S odporama jsem měl úplně stejný problém. Stačí snížit hodnotu a problém je vyřešen. Záleží také na délce kabelu k čidlu.
K problému se zápornou hodnotou doporučuji pořádně přočíst datasheet:

…“Znaménkový bit (S) signalizuje, zda je teplota kladná nebo záporná (bit0-6 – značí celou hodnotu bez desetin atd). Pro kladné teploty je S=0, pro záporné teploty je S=1.”…

Presne preto je nestastim programatorskeho sveta pouzivat rozne _delay a podobne nezmysly. Bohuzial zaciatocnici v C casto siahaju po tychto nestastnych a k tomu este aj napilenych barlickach miesto toho aby vsetku casovo zavislu cinnost odvodili od casovaca. Potom nadavaju na prekladac, ale ten za to nemoze. Robi len to co robit ma a presne tak ako bol naprogramovany.

Zdravím
Já bych potřeboval někde tu binární hodnotu s toho čidla zobrazit nejlépe na displeji třeba ve formátu HEX ale nevím jak?díky

A k čemu ti to bude dobré, jen se ptám.