To nemohu použít protože mikroC to nezná a vůbec jsou takové funkce náročné na paměť a taková architektura jako je PIC 16F628A to nejde dohromadyFHonza píše:Protože 70 je ASCII hodnota písmena F. Použij nějakou funkci která převede číslo na text. Třeba itoa
Převod z desítkové do dvojkové soustavy
Moderátor: Moderátoři
Není to zvlášť optimalizované, nicméně pro 8 bitové hodnoty můžete použít následující:
Kód: Vybrat vše
char* si8toa(signed char value, char* str)
{
if(value < 0)
{
*str++ = '-';
value *= -1;
}
return u8toa(value, str);
}
char* u8toa(unsigned char value, char* str)
{
*str++ = '0' + value / 100;
*str++ = '0' + (value / 10) % 10;
*str++ = '0' + value % 10;
*str = 0;
return str;
}
- markoni
- Příspěvky: 2310
- Registrován: 30 říj 2006, 01:00
- Bydliště: Poblíž Zlína
- Kontaktovat uživatele:
Já jsem velká lama
a velice se omlouvám tam stačilo místo extrahování jednotlivých číslic použít funkci
Ale nic se nemění na tom že s čidlem to pořád nekomunikuje v reálu v simulátoru jak je vidět v příloze to funguje
diky
![Vozeďbouch :wand:](./images/smilies/icon_wand.gif)
Kód: Vybrat vše
IntToStr(temp,str);
uart1_write_text( str);
diky
- Přílohy
-
- vypis na terminál1.jpg
- (263.89 KiB) Staženo 91 x
-
- Příspěvky: 2551
- Registrován: 13 zář 2005, 02:00
No já nevím, ale vykašlal bych se na simulátory a virtuální terminály.
Vezmi desku, kde máš PIC a DS18x20. Do PICa nahrej asi takovýto program:
UART_Init (9600);
k1:=50;
k2:=70;
repeat
UART1_Write_Text("Ahoj, posilam 50 a 70");
UART1_write (k1);
UART1_write (k2);
delay_ms (1000);
until false;
Připoj to k PC na COMx a spusť nějaký terminál na tento COM.
Pokud přijmeš v terminálu na PC každou sekundu text "Ahoj ..." a dvě konstanty (50 a 70 nebo 2 a F), tak Ti funguje přenos mezi PICem a PLC.
Teprve pak bych ladil připojení čidla k PICu, jeho nastavení (rozlišení), spuštění konverze a přepočet hodnot z čidla.
Petr
Vezmi desku, kde máš PIC a DS18x20. Do PICa nahrej asi takovýto program:
UART_Init (9600);
k1:=50;
k2:=70;
repeat
UART1_Write_Text("Ahoj, posilam 50 a 70");
UART1_write (k1);
UART1_write (k2);
delay_ms (1000);
until false;
Připoj to k PC na COMx a spusť nějaký terminál na tento COM.
Pokud přijmeš v terminálu na PC každou sekundu text "Ahoj ..." a dvě konstanty (50 a 70 nebo 2 a F), tak Ti funguje přenos mezi PICem a PLC.
Teprve pak bych ladil připojení čidla k PICu, jeho nastavení (rozlišení), spuštění konverze a přepočet hodnot z čidla.
Petr
- markoni
- Příspěvky: 2310
- Registrován: 30 říj 2006, 01:00
- Bydliště: Poblíž Zlína
- Kontaktovat uživatele:
Tak úkol splněn i když trochu jinak ale šlo o to dokázat nebo se přesvědčit že funguje přenos mezi PICem a PLC. Já myslím že funguje
i když se ukázalo že s proměnné temp leze hodnota "4095" i když je tam čidlo je nebo není
díky
Kód: Vybrat vše
void main() {
char str[17];
unsigned int temp;
unsigned int temp_s,temp_d,temp_j,zbytek,kons;
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;
IntToStr(temp,str);
uart1_write_text( str);
uart1_write_text(" Teplota ");
kons = 70+50; // ******konstanta*****
IntToStr(kons,str);
// 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(" Soucet 70+50 = ");
uart1_write_text( str);
//UART1_Write_text(str);
UART1_Write_text("\n\r");
if (temp == 40)
Sound_Play(980,1000);
}
Delay_ms(500);
} while (1);
}
![Question :?:](./images/smilies/icon_question.gif)
- Přílohy
-
- Hyperterminal1.jpg
- (249.98 KiB) Staženo 93 x
-
- Příspěvky: 2551
- Registrován: 13 zář 2005, 02:00
Jaký používáš procesor ? 16F628A?
Zkus ještě toto:
**********************
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
j1 := 0; //j1 je prom. typu byte
Repeat // end of conversion cycle is
j1 := ow_read(porta,2); // indicated by a non-zero
Until j1 > 0; // output to polling
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
temp1 = Ow_Read(&PORTA, 2);
temp2 = Ow_Read(&PORTA, 2);
IntToStr(temp1,str);
uart1_write_text( str);
IntToStr(temp2,str);
uart1_write_text( str);
**********************
Prostě pošli do PC surovou teplotu z 18B20 a zkus čidlo přitom trochu zahřát, zdali se bude údaj, přenesený do PC, měnit.
Pak bych (ale možná je to blbost), zkusil nastavit na začátku port A jako vstupní (TRISA=255). Ale možná je to nastaveno po restartu automaticky, fakt nevím.
Namísto pevně nastavené doby je ve výše zmíněném kódu čekací smyčka, kdy se vyhodnocuje vývod, kde je čidlo. Po provedení konverze je tam něco mimo nuly. Pokud by se Ti na PC nic neobjevilo tak by to znamenalo, že nedojde k ukončení konverze v čidle a program se točí stále dokola na testování portu A.2 na rozdílnost od nuly.
Petr
Zkus ještě toto:
**********************
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
j1 := 0; //j1 je prom. typu byte
Repeat // end of conversion cycle is
j1 := ow_read(porta,2); // indicated by a non-zero
Until j1 > 0; // output to polling
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
temp1 = Ow_Read(&PORTA, 2);
temp2 = Ow_Read(&PORTA, 2);
IntToStr(temp1,str);
uart1_write_text( str);
IntToStr(temp2,str);
uart1_write_text( str);
**********************
Prostě pošli do PC surovou teplotu z 18B20 a zkus čidlo přitom trochu zahřát, zdali se bude údaj, přenesený do PC, měnit.
Pak bych (ale možná je to blbost), zkusil nastavit na začátku port A jako vstupní (TRISA=255). Ale možná je to nastaveno po restartu automaticky, fakt nevím.
Namísto pevně nastavené doby je ve výše zmíněném kódu čekací smyčka, kdy se vyhodnocuje vývod, kde je čidlo. Po provedení konverze je tam něco mimo nuly. Pokud by se Ti na PC nic neobjevilo tak by to znamenalo, že nedojde k ukončení konverze v čidle a program se točí stále dokola na testování portu A.2 na rozdílnost od nuly.
Petr
- markoni
- Příspěvky: 2310
- Registrován: 30 říj 2006, 01:00
- Bydliště: Poblíž Zlína
- Kontaktovat uživatele:
Tak že výsledek je takový viz příloha v simulátoru je to jiné procák je PIC16F628A
- Přílohy
-
- vypis na terminál2.jpg
- (213.62 KiB) Staženo 147 x
-
- simulátor.jpg
- (187.05 KiB) Staženo 119 x
-
- 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:
Udělal jsem všechno co bylo třeba a schéma je tam taky viz příloha, obávám se že ty nuly v terminálu PC nevěští nic dobrého
nebo se mýlím ? díky
![Question :?:](./images/smilies/icon_question.gif)
- Přílohy
-
- vypis na terminál3.jpg
- (284.85 KiB) Staženo 142 x
-
- Příspěvky: 2551
- Registrován: 13 zář 2005, 02:00
Tak to nevím. Jedině vadné čidlo (i když je divné, jak jsi psal, že v zapojení s displejem funguje) nebo je špatně zapojené.
Zkus ještě jednu věc. Do smyčky, kde je podmínkou změna hodnoty j1, vlož delay_ms(1) a přičítej jedničku do nějaké proměnné. Tím se dozvíš, jak dlouho se musí čekat na převod v čidle. Převod by měl trvat:
pro 9 bitů: 93,75ms; pro 10 bitů 187,5ms; pro 11 bitů 375 ms a pro 12 bitů 750ms.
No a pak tuto proměnnou převeď do stringu a pošli ji do PC. Jo - nezapomeň proměnnou po odeslání do PC vynulovat.
Taky můžeš jednotlivé byty, posílané do PC, oddělit nějakým řetezcem (B1 pro první byte z čidla, B2 pro druhý byte a CK pro čas konverze), ať je jasné, co je co.
Taky mě zaráží, že ve fyzickém terminálu dostaneš nuly, ale v SW terminálu máš 5/80 a 5/176.
Taky můžeš zkusit použít jiný vstup - nejlépe z portu B.
Pokud najdu stejný procesor, tak bych mohl večer zkusit nainstalovat MikroC a zkusit to ve své vývojové desce.
Edit - ještě mě napadlo podívat se na tabulku pro převod teploty do 0/1. Teplota 85°C, což je výchozí teplota, je právě 5/80. TAkže to vypadá, že ve Tvém případě ještě neproběhla žádná konverze. Ale je otázka, co si simulátorový terminál vymyslí. Spíše bych věřil tomu Hyperterminálu.
A taky můžeš zkusit jinou věc - odpojit čidlo. Když to uděláš, neměl bys do terminálu dostat žádnou hodnotu, neboť by se proměnná j1 nikdy neměla dostat nad nulu.
Petr
Zkus ještě jednu věc. Do smyčky, kde je podmínkou změna hodnoty j1, vlož delay_ms(1) a přičítej jedničku do nějaké proměnné. Tím se dozvíš, jak dlouho se musí čekat na převod v čidle. Převod by měl trvat:
pro 9 bitů: 93,75ms; pro 10 bitů 187,5ms; pro 11 bitů 375 ms a pro 12 bitů 750ms.
No a pak tuto proměnnou převeď do stringu a pošli ji do PC. Jo - nezapomeň proměnnou po odeslání do PC vynulovat.
Taky můžeš jednotlivé byty, posílané do PC, oddělit nějakým řetezcem (B1 pro první byte z čidla, B2 pro druhý byte a CK pro čas konverze), ať je jasné, co je co.
Taky mě zaráží, že ve fyzickém terminálu dostaneš nuly, ale v SW terminálu máš 5/80 a 5/176.
Taky můžeš zkusit použít jiný vstup - nejlépe z portu B.
Pokud najdu stejný procesor, tak bych mohl večer zkusit nainstalovat MikroC a zkusit to ve své vývojové desce.
Edit - ještě mě napadlo podívat se na tabulku pro převod teploty do 0/1. Teplota 85°C, což je výchozí teplota, je právě 5/80. TAkže to vypadá, že ve Tvém případě ještě neproběhla žádná konverze. Ale je otázka, co si simulátorový terminál vymyslí. Spíše bych věřil tomu Hyperterminálu.
A taky můžeš zkusit jinou věc - odpojit čidlo. Když to uděláš, neměl bys do terminálu dostat žádnou hodnotu, neboť by se proměnná j1 nikdy neměla dostat nad nulu.
Petr
- Přílohy
-
- 18B20 teplota.png
- (89.17 KiB) Staženo 116 x
-
- Příspěvky: 2551
- Registrován: 13 zář 2005, 02:00
Tak jsem to nakonec dal dohromady, ale že mi to dalo zabrat. Už jsem myslel, že Tvůj výstup 5/80 je virový a já jsem to chytil taky. Nakonec se ukázalo, že je to vadným čidlem (resp. několika čidly). Naštěstí jsem našel ještě jedno a s tím to funguje. Ale kam mi zase doma dali těch 50 čidel z Číny, to fakt nevím. Ale když se zeptám, dostanu klasickou odpověď "No já jsem nic neuklízela".
V příloze posílám svůj program (v Pascalu
) a sken hyperterminálu.
Je zajímavé, že i bez čidla program na kontrole proměnné j1 neskončí v nekonečné smyčce, ale bez čidla je čas konverze 1 smyčka. S čidlem a nastaveným převodem 12b (7F) je doba převodu okolo 523 cyklů. Při nastavení 9b (1F) je doba převodu 66 cyklů.
Abych nezapomněl - procesor mám 16F874A, čidlo 18B20 a je připojeno vstup E2 va vývojové desce EasyPIC4 (přikládám i částečné schéma zapojení).
Petr
V příloze posílám svůj program (v Pascalu
![Sad :-(](./images/smilies/icon_sad.gif)
Je zajímavé, že i bez čidla program na kontrole proměnné j1 neskončí v nekonečné smyčce, ale bez čidla je čas konverze 1 smyčka. S čidlem a nastaveným převodem 12b (7F) je doba převodu okolo 523 cyklů. Při nastavení 9b (1F) je doba převodu 66 cyklů.
Abych nezapomněl - procesor mám 16F874A, čidlo 18B20 a je připojeno vstup E2 va vývojové desce EasyPIC4 (přikládám i částečné schéma zapojení).
Petr
- Přílohy
-
- Kontrola.jpg
- (219.77 KiB) Staženo 87 x
-
- Program2.jpg
- (287.54 KiB) Staženo 105 x
-
- 18B20 EPIC4.jpg
- (40.53 KiB) Staženo 115 x
- markoni
- Příspěvky: 2310
- Registrován: 30 říj 2006, 01:00
- Bydliště: Poblíž Zlína
- Kontaktovat uživatele:
Tady jsem našel na PIC12F629 http://pandatron.cz/?566&teplotni_cidlo ... _pic12f629 hotové řešení i ze zdrojákem ba i přeložený hex soubor, podporuje to programátor MPLAB IDC2 kterého klon mám a používám.Nic méně mě to nedá proč to moje zapojení které tady řeším nefunguje kde dělám chybu?.Zapojení s LCD které mám na nepajivém poli a které mi de facto to pole obsazuje a na které se dlouhou dobu prášilo tím chci říct že si na podrobnosti nepamatuji to funguje ,a dokonce mám zdrojový kód v prostředí mikroC PRO for PIC ale bohužel si nevzpomínám jestli jsem v tom něco změnil nebo ne, zdrojový kód je v příloze .Samotný procesor PIC16F628A mám druhý kus v tom co zkouším teplotu zobrazovat na terminálu, jestli je v něm problém to mi se zdá nepravděpodobné. díky
edit
Ještě malá poznámka : co mě funguje to zapojení s tím displejem tak to čidlo je DS1820místo jak jsem se domníval DS18B20 po změně v zapojení s displejem tak na displeji to ukazovalo 200 stupňů mělo to tendenci snižování.Ale pořád platí že i když zkusmo jsem změnil čidlo na terminál zapojení DS1820 tak se to chová stejně pořád samé nuly
edit
Ještě malá poznámka : co mě funguje to zapojení s tím displejem tak to čidlo je DS1820místo jak jsem se domníval DS18B20 po změně v zapojení s displejem tak na displeji to ukazovalo 200 stupňů mělo to tendenci snižování.Ale pořád platí že i když zkusmo jsem změnil čidlo na terminál zapojení DS1820 tak se to chová stejně pořád samé nuly
- Přílohy
-
- LCDDS18B20.pdf
- (233.09 KiB) Staženo 115 x
-
- Příspěvky: 2551
- Registrován: 13 zář 2005, 02:00
Popis rozdílů 1820 a 18B20 (18S20)je tady: https://www.maximintegrated.com/en/app- ... vp/id/4377
Tady je něco o tom, že mají jinak zapojené registry s teplotou: http://www.picaxeforum.co.uk/showthread ... 0-v-DS1820
A tady je fórum Mikroelektroniky a výsledek je takový, že když tazatel vyměnil čidlo 1820 za 18B20, tak mu to funguje: https://forum.mikroe.com/viewtopic.php?f=88&t=49931
Petr
Tady je něco o tom, že mají jinak zapojené registry s teplotou: http://www.picaxeforum.co.uk/showthread ... 0-v-DS1820
A tady je fórum Mikroelektroniky a výsledek je takový, že když tazatel vyměnil čidlo 1820 za 18B20, tak mu to funguje: https://forum.mikroe.com/viewtopic.php?f=88&t=49931
Petr
- markoni
- Příspěvky: 2310
- Registrován: 30 říj 2006, 01:00
- Bydliště: Poblíž Zlína
- Kontaktovat uživatele:
Už mě to funguje já jsem se úplně pos***** víš kde jsem udělal chybu
to je pro mně na zamyšlení ,čidlo jsem zapojoval obráceně plus na minus a mínus na plus samozřejmě jsem jedno poslal do křemíkových lovišť
![Question :?:](./images/smilies/icon_question.gif)
![Vozeďbouch :wand:](./images/smilies/icon_wand.gif)
- Přílohy
-
- teplota v terminalu1.jpg
- (273.1 KiB) Staženo 117 x