Stránka 3 z 5

Napsal: 23 úno 2017, 21:29
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:

Napsal: 25 úno 2017, 14:44
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;

Napsal: 01 bře 2017, 16:43
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

Napsal: 02 bře 2017, 15:49
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?

Napsal: 02 bře 2017, 17:39
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);
}

Napsal: 03 bře 2017, 08:50
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

Napsal: 03 bře 2017, 15:30
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.

Napsal: 03 bře 2017, 16:44
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

Napsal: 03 bře 2017, 17:16
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é.

Napsal: 06 bře 2017, 11:01
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

Napsal: 06 bře 2017, 12:06
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

Napsal: 06 bře 2017, 13:10
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?

Napsal: 06 bře 2017, 14:13
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

Napsal: 09 bře 2017, 12:05
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

Napsal: 09 bře 2017, 12:18
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