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.
![Rolling Eyes :roll:](./images/smilies/icon_rolleyes.gif)
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
![Very Happy :D](./images/smilies/icon_biggrin.gif)
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
![Question :?:](./images/smilies/icon_question.gif)
pokud jsem měl dobře nastavený ten osciloskop
![Embarassed :oops:](./images/smilies/icon_redface.gif)
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 :cry:](./images/smilies/icon_crying.gif)
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
mě v virtuálním terminálu se zobrazí písmeno F
![Surprised :o](./images/smilies/icon_surprised.gif)
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