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
lesana87
Příspěvky: 3296
Registrován: 20 zář 2014, 02:00

#31 Příspěvek od lesana87 »

Možná kdyby sis o C něco přečetl od základů, ne jen předstíral, že v něm programuješ, neměl bys tak přiblblé dotazy a názory. Aspoň mně přijde přizpůsobení velikosti datových typů konkrétní architektuře jako celkem logické. Ale přečíst si nejdřív manuál holt dneska není kůl a in, to je jen pro lůzry. :roll:

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

#32 Příspěvek od mtajovsky »

markoni píše:Jé já myslel že 16 bitů největší hodnota 65535 dec ,tak jaký datový typ je potřeba?díky ...Tak to mě je to už jasné ,v C plaťí každá ves jiný pes !!!!...
Proto je, zejména u embedded programování, lépe používat pro integrální proměnné explicitní typy, které rovnou říkají velikost a jestli jsou znaménkové. Protože je to platformově závislé, bývá definice takových typů součástí knihoven nebo toolchain překladače nebo je lze pro danou platformu nadefinovat v projektu. Nejčastěji můžeme použít hlavičkový soubor stdint.h, který mj. obsahuje například následující definice integrálních typů:

Kód: Vybrat vše

    typedef signed char int8_t;
    typedef unsigned char uint8_t;
    typedef signed int int16_t;
    typedef unsigned int uint16_t;
    typedef signed long int int32_t;
    typedef unsigned long int uint32_t;
    typedef signed long long int int64_t;
    typedef unsigned long long int uint64_t;

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

#33 Příspěvek od markoni »

Už jsem došel s vydatnou pomocí nejen od kolegů s tohoto fóra až k tomuto kroku kdy chci zobrazit teplotu čidla v hyper terminálu pro Win10 na PC.
Problém je nastavení rychlosti sériové linky.Když dám 9600 tak v logu překladače je nepatrná odchylka od nastavené rychlosti,při nastavení rychlosti 300 překladač nic nenamítá vyzkoušeny všechny varianty vis příloha ale bohužel hyper terminál se zasekne co s tým ? díky
Přílohy
Baud rate.jpg
(245.32 KiB) Staženo 72 x

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

#34 Příspěvek od mtajovsky »

V první řadě bych přestal používat Hyperterminal, protože ten je určen primárně na spolupráci s modemem a otravuje s nastavením telefonního čísla, zvedáním vidlice atd. Pro práci s daty na RS232 COM používám Hercules terminál, který se nezasekává, neotravuje s žádným telefonem a umí i TCP a UDP.

Co to znamená "všechny varianty" - bylo laborováno s počtem stop bitů, paritou a s řízením přes stavové signály RS232?

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

#35 Příspěvek od markoni »

Uart je v pořádku podle mě viz příloha ,ale zatím neví o čidlu že je tam :D a tak krásně mě to v simulátoru fungovalo.Musím se pohrát pull up odporem který je na čidlu doufám že to pomůže.A co se týká té rychlosti napřed jsem v MCU měl Baud 300 a pak jsem přepálil firmware s nastaveným 9600 a zdá se že to funguje .Jinak díky za typ na terminál

Kód: Vybrat vše

void main() {
    char str[17];
    unsigned int temp;
    unsigned char temp_s,temp_d,temp_j,zbytek;
    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;
        //sprintl(bufer,"%i",temp);
        // 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(str);
        UART1_Write_text("\n\r");

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

        Delay_ms(500);

    } while (1);
}
Přílohy
TeplotniAlarm.hex
PIC16F628A configbit 2178 4MHz
(7.06 KiB) Staženo 62 x
teplota v terminalu.jpg
(282.97 KiB) Staženo 85 x

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

#36 Příspěvek od petrfilipi »

Nazdar,

já namísto čekání 1s používám smyčku, kterou kontroluji 1 na vstupu - indikuje dokončený převod t/data v čidlu:
j1 := 0;
Repeat // end of conversion cycle is
j1 := ow_read(porte,2); // indicated by a non-zero
Until j1 > 0;

ale to je asi jedno, zdali použiješ 1s nebo smyčku. Výhoda sekundy je v tom, že když čidlo chybí, tak se to nezastaví.
Pokud by Ti to stále nefungovalo tak zkus posílat na UART byty přímo z čidla, něco jako:
j1 := ow_read(porte,2); // get Low Byte result
j2 := ow_read(porte,2); // get High byte result
uart1_write(j1);
uart1_write(j2);

kombinuji můj Pascal a Tvoje céčko, tak si to přizpůsob.

Petr

Uživatelský avatar
ZdenekHQ
Administrátor
Administrátor
Příspěvky: 25593
Registrován: 21 črc 2006, 02:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#37 Příspěvek od ZdenekHQ »

Herkules je super, ale na klasický textový výpisy přes port stačí i Tera Term (běhá i na starším železe s WIN98). Já občas používám oba naráz na jednom PC - Herkules přes WIFI posílá data a na Tera Termu je na "vzdáleném" zařízení loguju.
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]

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

#38 Příspěvek od markoni »

Mě dělá starosti spíž to čidlo zkoušel jsem změnit pull up rezistor 4k7 na 2k7 a nic, na výstupu čidla na osciloskopu tesla BM370 téměř žádný průběh akorát asi za jednu sekundu jeden zákmit :?: pokud jsem měl dobře nastavený ten osciloskop :oops: díky

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

#39 Příspěvek od petrfilipi »

Já mám ve vývojové desce EasyPIC4 pull-up rezistor o velikosti 10 kOhmů.

Ještě mě napadlo, pokud to stále nefunguje - existuje více typů čidel 1820 - 18B20, 1820, 18S20 atd. a nevím, zdali jsou všechny stejné.

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

#40 Příspěvek od markoni »

petrfilipi píše:Já mám ve vývojové desce EasyPIC4 pull-up rezistor o velikosti 10 kOhmů.

Ještě mě napadlo, pokud to stále nefunguje - existuje více typů čidel 1820 - 18B20, 1820, 18S20 atd. a nevím, zdali jsou všechny stejné.
Bohužel ještě se mi to nepodařilo rozchodit :cry:
V zapojení na fotografie0233 je výchozí zapojení které mám už delší dobu a pull up rezistor na čidle je 2k7 délka kabelu k čidlu je asi 1.5 metru, mimochodem to čidlo je stejný kus jako je v zapojení které se pokouším rozchodit přenos po sériové lince viz příloha fotografije233.Algoritmus čtení s čidla je stejné - okopírováno,možná je chyba v nastavení rozlišení
DESCRIPTION
The DS18B20 Digital Thermometer provides 9 to 12–b
it centigrade temperature measurements and has
an alarm function with nonvolatile
user-programmable upper and lower trigger points. The DS18B20
communicates over a 1-Wire bus th
at by definition requires only one data line (and ground) for
communication with a central microprocessor. It ha
s an operating temperature range of –55°C to +125°C
and is accurate to

0.5

C over the range of –10°C to +85°C. In
addition, the DS18B
20 can derive power
directly from the data line (“parasite power”), e
liminating the need for an external power supply
v tom zapojení co zobrazuje teplotu na LCD tam je nastaveno ale v zapojení UART nevím jak to nastavit.Kdyby byla chyba tam tak by se ukazovaly nesmysly ale mě zaráží že tomu zapojení UART je šum a fuk jestli je tam nebo není čidlo díky
Přílohy
fotografije233.jpg
UART červená šipka ukazuje na čidlo
(143.79 KiB) Staženo 57 x
fotografie0233.jpg
LCD
(263.02 KiB) Staženo 71 x

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

#41 Příspěvek od petrfilipi »

Pokud je zařízení "šumafuk", zdali tam čidlo je nebo ne, tak zkus celou část program, která se stará o vyčítání čidla, vyhodit a místo ní dej dvě konstanty, které budeš přenášet do PC. Něco jako:

UART1_Init(9600);
UART1_Write_Text("Ahoj, posilam 50 a 70");
k1 = 50;
k2 = 70;
UART1_write (k1);
UART1_write (k2);

Dokud Ti tohle nebude chodit, tak nemá smysl měnit pull-up odpor.
Co se týče použitých příkazů tak jsem si je z hlavy jen tak vymyslel, přizpůsob to syntaxi Céčka a MikroC.

Nastavení rozlišení provádím v MikroPascalu takto:
Procedure Initialize;
Begin
adcon1 := 255; // configure RA5 pin as digital I/O
TRISE : = 255;

{ $4E Write to RAM dummy $FF to TH & TL, $7F to ctrl reg for 12-bit}
ow_reset(porte,2); // onewire reset signal
ow_write(porte,2,$CC); // issue command to DS1820
ow_write(porte,2,$4E); // issue command to DS1820
ow_write(porte,2,$FF); // issue command to DS1820
ow_write(porte,2,$FF); // issue command to DS1820
ow_write(porte,2,$1F); // Set for 12 bit output 7F=12 bit=0,0625°C, 5F=11bit=0,125°C, 3F=10bit=0,25°C, 1F=9bit=0,5°C
End;


Petr

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

#42 Příspěvek od markoni »

Tak s toho jsem pochopil rozlišiní 9 =0.5 C se nastavuje konstantou 0x1F !!! .A co mĕ nejde do hlavy tak jak se nastavuje patřičný regist do kterého se ta konstanta posílá ? to musí mít nĕjaký registr?

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

#43 Příspěvek od petrfilipi »

Stáhni si anglický originální datasheet k 18B20, tam je na straně 12 vývojový diagram, kde zjištíš, jak nastavit rozlišení (zápisem do konfiguračního registru) a najdeš tam i to, že defaultní rozlišení je 12 bitů.

Třeba vyčtení výrobního čísla jsem musel dělat opravdu přesně podle vývojového diagramu.

Sekvence pro zápis do konfiguračního registru je následující:
CC (skip ROM, tzn. další příkazy se vysílají pro všechna připojená čidla)
4E (= informace pro čidlo že následují 3 byty, které zapíše do "scratchpadu")
FF (neboli cokoli - pokud nepoužíváš termostat v 18B20, můžeš toto místo použít jako univerzální registr) - ale něco tam prostě poslat musíš
FF (jako předcházející byte)
1F (konfigurační registr, na místě 5. a 6. bitu je info o požadovaném rozlišení převodníku)


Český popis 18B20 je třeba v bakalářské práci tady: https://support.dce.felk.cvut.cz/mediaw ... martin.pdf
V příloze posílám i kompletnější překlad datasheetu k 18B20, ale nejsem jeho autorem.

Petr
Přílohy
Datasheet 18B20-CZ.pdf
(251.2 KiB) Staženo 87 x

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

#44 Příspěvek od markoni »

petrfilipi píše: UART1_Init(9600);
UART1_Write_Text("Ahoj, posilam 50 a 70");
k1 = 50;
k2 = 70;
UART1_write (k1);
UART1_write (k2);
Ale jak

Kód: Vybrat vše

 UART1_Write_Text("Ahoj, posilam 50 a 70");
toto je ok
ale nevím jak docílit vypisování nějaké konstanty
příkazem

Kód: Vybrat vše

k2 = 70;
UART1_write (k2);
mě v virtuálním terminálu se zobrazí písmeno F :o

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#45 Příspěvek od FHonza »

Protože 70 je ASCII hodnota písmena F. Použij nějakou funkci která převede číslo na text. Třeba itoa

Odpovědět

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