Převod z desítkové do dvojkové soustavy
Moderátor: Moderátoři
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: 2312
- Registrován: 30 říj 2006, 00:00
- Bydliště: Poblíž Zlína
- Kontaktovat uživatele:
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 134 x
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: 2312
- Registrován: 30 říj 2006, 00:00
- Bydliště: Poblíž Zlína
- Kontaktovat uživatele:
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 118 x
-
teplota v terminalu.jpg- (282.97 KiB) Staženo 155 x
-
petrfilipi
- Příspěvky: 2901
- Registrován: 13 zář 2005, 00:00
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
- Významný člen
- Příspěvky: 25519
- Registrován: 21 črc 2006, 00:00
- Bydliště: skoro Brno
- Kontaktovat uživatele:
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[?]
-
petrfilipi
- Příspěvky: 2901
- Registrován: 13 zář 2005, 00:00
- markoni
- Příspěvky: 2312
- Registrován: 30 říj 2006, 00:00
- Bydliště: Poblíž Zlína
- Kontaktovat uživatele:
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
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 121 x
-
fotografie0233.jpg- LCD
- (263.02 KiB) Staženo 129 x
-
petrfilipi
- Příspěvky: 2901
- Registrován: 13 zář 2005, 00:00
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
-
petrfilipi
- Příspěvky: 2901
- Registrován: 13 zář 2005, 00:00
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 172 x
- markoni
- Příspěvky: 2312
- Registrován: 30 říj 2006, 00:00
- Bydliště: Poblíž Zlína
- Kontaktovat uživatele:
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