Převod z desítkové do dvojkové soustavy
Moderátor: Moderátoři
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.
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ů: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 !!!!...
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;
- markoni
- Příspěvky: 2310
- Registrován: 30 říj 2006, 01:00
- Bydliště: Poblíž Zlína
- Kontaktovat uživatele:
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
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
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?
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?
- markoni
- Příspěvky: 2310
- Registrován: 30 říj 2006, 01:00
- Bydliště: Poblíž Zlína
- Kontaktovat uživatele:
Uart je v pořádku podle mě viz příloha ,ale zatím neví o čidlu že je tam 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
-
- Příspěvky: 2551
- Registrován: 13 zář 2005, 02:00
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
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
- ZdenekHQ
- Administrátor
- Příspěvky: 25593
- Registrován: 21 črc 2006, 02:00
- Bydliště: skoro Brno
- Kontaktovat uživatele:
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[?]
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[?]
-
- Příspěvky: 2551
- Registrován: 13 zář 2005, 02:00
- markoni
- Příspěvky: 2310
- Registrován: 30 říj 2006, 01:00
- Bydliště: Poblíž Zlína
- Kontaktovat uživatele:
Bohužel ještě se mi to nepodařilo rozchoditpetrfilipi 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é.
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í
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íkyDESCRIPTION
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
- 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
-
- Příspěvky: 2551
- Registrován: 13 zář 2005, 02:00
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
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
-
- Příspěvky: 2551
- Registrován: 13 zář 2005, 02:00
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
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
- markoni
- Příspěvky: 2310
- Registrován: 30 říj 2006, 01:00
- Bydliště: Poblíž Zlína
- Kontaktovat uživatele:
Ale jakpetrfilipi píše: UART1_Init(9600);
UART1_Write_Text("Ahoj, posilam 50 a 70");
k1 = 50;
k2 = 70;
UART1_write (k1);
UART1_write (k2);
Kód: Vybrat vše
UART1_Write_Text("Ahoj, posilam 50 a 70");
ale nevím jak docílit vypisování nějaké konstanty
příkazem
Kód: Vybrat vše
k2 = 70;
UART1_write (k2);