Převod z desítkové do dvojkové soustavy

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
markoni
Příspěvky: 2310
Registrován: 30 říj 2006, 01:00
Bydliště: Poblíž Zlína
Kontaktovat uživatele:

#46 Příspěvek od markoni »

FHonza píše:Protože 70 je ASCII hodnota písmena F. Použij nějakou funkci která převede číslo na text. Třeba itoa
To nemohu použít protože mikroC to nezná a vůbec jsou takové funkce náročné na paměť a taková architektura jako je PIC 16F628A to nejde dohromady

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#47 Příspěvek od mtajovsky »

Není to zvlášť optimalizované, nicméně pro 8 bitové hodnoty můžete použít následující:

Kód: Vybrat vše

char* si8toa(signed char value, char* str)
{
    if(value < 0)
    {
        *str++ = '-';
        value *= -1;
    }
    return u8toa(value, str);
}

char* u8toa(unsigned char value, char* str)
{
    *str++ = '0' + value / 100;
    *str++ = '0' + (value / 10) % 10;
    *str++ = '0' + value % 10;
    *str = 0;
    return str;
}

Uživatelský avatar
markoni
Příspěvky: 2310
Registrován: 30 říj 2006, 01:00
Bydliště: Poblíž Zlína
Kontaktovat uživatele:

#48 Příspěvek od markoni »

Já jsem velká lama :wand: a velice se omlouvám tam stačilo místo extrahování jednotlivých číslic použít funkci

Kód: Vybrat vše

IntToStr(temp,str);
   uart1_write_text( str);
Ale nic se nemění na tom že s čidlem to pořád nekomunikuje v reálu v simulátoru jak je vidět v příloze to funguje
diky
Přílohy
vypis na terminál1.jpg
(263.89 KiB) Staženo 91 x

petrfilipi
Příspěvky: 2551
Registrován: 13 zář 2005, 02:00

#49 Příspěvek od petrfilipi »

No já nevím, ale vykašlal bych se na simulátory a virtuální terminály.
Vezmi desku, kde máš PIC a DS18x20. Do PICa nahrej asi takovýto program:

UART_Init (9600);
k1:=50;
k2:=70;
repeat
UART1_Write_Text("Ahoj, posilam 50 a 70");
UART1_write (k1);
UART1_write (k2);
delay_ms (1000);
until false;

Připoj to k PC na COMx a spusť nějaký terminál na tento COM.

Pokud přijmeš v terminálu na PC každou sekundu text "Ahoj ..." a dvě konstanty (50 a 70 nebo 2 a F), tak Ti funguje přenos mezi PICem a PLC.
Teprve pak bych ladil připojení čidla k PICu, jeho nastavení (rozlišení), spuštění konverze a přepočet hodnot z čidla.

Petr

Uživatelský avatar
markoni
Příspěvky: 2310
Registrován: 30 říj 2006, 01:00
Bydliště: Poblíž Zlína
Kontaktovat uživatele:

#50 Příspěvek od markoni »

Tak úkol splněn i když trochu jinak ale šlo o to dokázat nebo se přesvědčit že funguje přenos mezi PICem a PLC. Já myslím že funguje

Kód: Vybrat vše

void main() {
    char str[17];
    unsigned int temp;
    unsigned int temp_s,temp_d,temp_j,zbytek,kons;
    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
    UART1_Write_text("Teplomer v.1 3.2017\n\r");
    // 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

        temp =  Ow_Read(&PORTA, 2);
        temp += Ow_Read(&PORTA, 2)<<8;
        temp= temp /16;
        temp_s = temp / 100;
        zbytek = temp % 100;
        temp_d  = zbytek / 10;
        temp_j = zbytek % 10;
        IntToStr(temp,str);
         uart1_write_text( str);
         uart1_write_text("  Teplota  ");
        kons = 70+50;      // ******konstanta*****
        IntToStr(kons,str);
        // word_to_bin(tempi, str);
         //Uart1_write_text(str);
         uart1_write(temp_s+48);
         uart1_write(temp_d+48);
         uart1_write(temp_j+48);
         uart1_write_text(" Soucet 70+50 = ");
         uart1_write_text( str);

        //UART1_Write_text(str);
        UART1_Write_text("\n\r");

        if (temp == 40) 
            Sound_Play(980,1000);
        }

        Delay_ms(500);

    } while (1);
}
i když se ukázalo že s proměnné temp leze hodnota "4095" i když je tam čidlo je nebo není :?: díky
Přílohy
Hyperterminal1.jpg
(249.98 KiB) Staženo 93 x

petrfilipi
Příspěvky: 2551
Registrován: 13 zář 2005, 02:00

#51 Příspěvek od petrfilipi »

Jaký používáš procesor ? 16F628A?
Zkus ještě toto:

**********************
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

j1 := 0; //j1 je prom. typu byte
Repeat // end of conversion cycle is
j1 := ow_read(porta,2); // indicated by a non-zero
Until j1 > 0; // output to polling

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

temp1 = Ow_Read(&PORTA, 2);
temp2 = Ow_Read(&PORTA, 2);

IntToStr(temp1,str);
uart1_write_text( str);
IntToStr(temp2,str);
uart1_write_text( str);

**********************

Prostě pošli do PC surovou teplotu z 18B20 a zkus čidlo přitom trochu zahřát, zdali se bude údaj, přenesený do PC, měnit.
Pak bych (ale možná je to blbost), zkusil nastavit na začátku port A jako vstupní (TRISA=255). Ale možná je to nastaveno po restartu automaticky, fakt nevím.
Namísto pevně nastavené doby je ve výše zmíněném kódu čekací smyčka, kdy se vyhodnocuje vývod, kde je čidlo. Po provedení konverze je tam něco mimo nuly. Pokud by se Ti na PC nic neobjevilo tak by to znamenalo, že nedojde k ukončení konverze v čidle a program se točí stále dokola na testování portu A.2 na rozdílnost od nuly.

Petr

Uživatelský avatar
markoni
Příspěvky: 2310
Registrován: 30 říj 2006, 01:00
Bydliště: Poblíž Zlína
Kontaktovat uživatele:

#52 Příspěvek od markoni »

Tak že výsledek je takový viz příloha v simulátoru je to jiné procák je PIC16F628A
Přílohy
vypis na terminál2.jpg
(213.62 KiB) Staženo 147 x
simulátor.jpg
(187.05 KiB) Staženo 119 x

petrfilipi
Příspěvky: 2551
Registrován: 13 zář 2005, 02:00

#53 Příspěvek od petrfilipi »

OK, celý kód zapoj ještě do nekonečné smyčky a dej se schéma zapojení.
Tohle by fungovat mělo.

Petr

Uživatelský avatar
markoni
Příspěvky: 2310
Registrován: 30 říj 2006, 01:00
Bydliště: Poblíž Zlína
Kontaktovat uživatele:

#54 Příspěvek od markoni »

Udělal jsem všechno co bylo třeba a schéma je tam taky viz příloha, obávám se že ty nuly v terminálu PC nevěští nic dobrého :?: nebo se mýlím ? díky
Přílohy
vypis na terminál3.jpg
(284.85 KiB) Staženo 142 x

petrfilipi
Příspěvky: 2551
Registrován: 13 zář 2005, 02:00

#55 Příspěvek od petrfilipi »

Tak to nevím. Jedině vadné čidlo (i když je divné, jak jsi psal, že v zapojení s displejem funguje) nebo je špatně zapojené.

Zkus ještě jednu věc. Do smyčky, kde je podmínkou změna hodnoty j1, vlož delay_ms(1) a přičítej jedničku do nějaké proměnné. Tím se dozvíš, jak dlouho se musí čekat na převod v čidle. Převod by měl trvat:
pro 9 bitů: 93,75ms; pro 10 bitů 187,5ms; pro 11 bitů 375 ms a pro 12 bitů 750ms.
No a pak tuto proměnnou převeď do stringu a pošli ji do PC. Jo - nezapomeň proměnnou po odeslání do PC vynulovat.
Taky můžeš jednotlivé byty, posílané do PC, oddělit nějakým řetezcem (B1 pro první byte z čidla, B2 pro druhý byte a CK pro čas konverze), ať je jasné, co je co.

Taky mě zaráží, že ve fyzickém terminálu dostaneš nuly, ale v SW terminálu máš 5/80 a 5/176.

Taky můžeš zkusit použít jiný vstup - nejlépe z portu B.

Pokud najdu stejný procesor, tak bych mohl večer zkusit nainstalovat MikroC a zkusit to ve své vývojové desce.

Edit - ještě mě napadlo podívat se na tabulku pro převod teploty do 0/1. Teplota 85°C, což je výchozí teplota, je právě 5/80. TAkže to vypadá, že ve Tvém případě ještě neproběhla žádná konverze. Ale je otázka, co si simulátorový terminál vymyslí. Spíše bych věřil tomu Hyperterminálu.

A taky můžeš zkusit jinou věc - odpojit čidlo. Když to uděláš, neměl bys do terminálu dostat žádnou hodnotu, neboť by se proměnná j1 nikdy neměla dostat nad nulu.

Petr
Přílohy
18B20 teplota.png
(89.17 KiB) Staženo 116 x

petrfilipi
Příspěvky: 2551
Registrován: 13 zář 2005, 02:00

#56 Příspěvek od petrfilipi »

Tak jsem to nakonec dal dohromady, ale že mi to dalo zabrat. Už jsem myslel, že Tvůj výstup 5/80 je virový a já jsem to chytil taky. Nakonec se ukázalo, že je to vadným čidlem (resp. několika čidly). Naštěstí jsem našel ještě jedno a s tím to funguje. Ale kam mi zase doma dali těch 50 čidel z Číny, to fakt nevím. Ale když se zeptám, dostanu klasickou odpověď "No já jsem nic neuklízela".
V příloze posílám svůj program (v Pascalu :-() a sken hyperterminálu.
Je zajímavé, že i bez čidla program na kontrole proměnné j1 neskončí v nekonečné smyčce, ale bez čidla je čas konverze 1 smyčka. S čidlem a nastaveným převodem 12b (7F) je doba převodu okolo 523 cyklů. Při nastavení 9b (1F) je doba převodu 66 cyklů.
Abych nezapomněl - procesor mám 16F874A, čidlo 18B20 a je připojeno vstup E2 va vývojové desce EasyPIC4 (přikládám i částečné schéma zapojení).

Petr
Přílohy
Kontrola.jpg
(219.77 KiB) Staženo 87 x
Program2.jpg
(287.54 KiB) Staženo 105 x
18B20 EPIC4.jpg
(40.53 KiB) Staženo 115 x

Uživatelský avatar
markoni
Příspěvky: 2310
Registrován: 30 říj 2006, 01:00
Bydliště: Poblíž Zlína
Kontaktovat uživatele:

#57 Příspěvek od markoni »

Tady jsem našel na PIC12F629 http://pandatron.cz/?566&teplotni_cidlo ... _pic12f629 hotové řešení i ze zdrojákem ba i přeložený hex soubor, podporuje to programátor MPLAB IDC2 kterého klon mám a používám.Nic méně mě to nedá proč to moje zapojení které tady řeším nefunguje kde dělám chybu?.Zapojení s LCD které mám na nepajivém poli a které mi de facto to pole obsazuje a na které se dlouhou dobu prášilo tím chci říct že si na podrobnosti nepamatuji to funguje ,a dokonce mám zdrojový kód v prostředí mikroC PRO for PIC ale bohužel si nevzpomínám jestli jsem v tom něco změnil nebo ne, zdrojový kód je v příloze .Samotný procesor PIC16F628A mám druhý kus v tom co zkouším teplotu zobrazovat na terminálu, jestli je v něm problém to mi se zdá nepravděpodobné. díky
edit
Ještě malá poznámka : co mě funguje to zapojení s tím displejem tak to čidlo je DS1820místo jak jsem se domníval DS18B20 po změně v zapojení s displejem tak na displeji to ukazovalo 200 stupňů mělo to tendenci snižování.Ale pořád platí že i když zkusmo jsem změnil čidlo na terminál zapojení DS1820 tak se to chová stejně pořád samé nuly
Přílohy
LCDDS18B20.pdf
(233.09 KiB) Staženo 115 x

petrfilipi
Příspěvky: 2551
Registrován: 13 zář 2005, 02:00

#58 Příspěvek od petrfilipi »

Popis rozdílů 1820 a 18B20 (18S20)je tady: https://www.maximintegrated.com/en/app- ... vp/id/4377

Tady je něco o tom, že mají jinak zapojené registry s teplotou: http://www.picaxeforum.co.uk/showthread ... 0-v-DS1820

A tady je fórum Mikroelektroniky a výsledek je takový, že když tazatel vyměnil čidlo 1820 za 18B20, tak mu to funguje: https://forum.mikroe.com/viewtopic.php?f=88&t=49931

Petr

Uživatelský avatar
markoni
Příspěvky: 2310
Registrován: 30 říj 2006, 01:00
Bydliště: Poblíž Zlína
Kontaktovat uživatele:

#59 Příspěvek od markoni »

Už mě to funguje já jsem se úplně pos***** víš kde jsem udělal chybu :?: :wand: to je pro mně na zamyšlení ,čidlo jsem zapojoval obráceně plus na minus a mínus na plus samozřejmě jsem jedno poslal do křemíkových lovišť
Přílohy
teplota v terminalu1.jpg
(273.1 KiB) Staženo 117 x

Uživatelský avatar
markoni
Příspěvky: 2310
Registrován: 30 říj 2006, 01:00
Bydliště: Poblíž Zlína
Kontaktovat uživatele:

#60 Příspěvek od markoni »

Ještě taková maličkost jak poslat na uart znak pro stupně ° ? na virtuálním terminálu to napíše nějakou kravinu díky

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“