Fórum témák
» Több friss téma |
Sikerült pozitív float szám lcd-re kiírására programot írni. A negatív kiíratásán még gondolkodok. Ha valakit érdekel közzé teszem.
A hozzászólás módosítva: Dec 13, 2017
Nagyon köszönöm a részletes gondolat kifejtést. Így teljesen világos a dolog. Hétvégén, ha időm engedi(gyerek is úgy gondolja), neki ugrok ennek a kódnak, már csak azért is, hogy más irányba is fejlesszem magam. Köszönöm a segítséget.
Sziasztok!
Megint falba ütköztem. DS18B20-al szeretnék hőmérsékletet mérni . Az MP, Pic 18f4520 a mikroc példaprogramját irtam a programba és nem ír ki semmit.
ha a mérés után egy változóbol a mertho-bol adok be adatot azt szépen kiírja az lcd-re, de mérésből nem. Ha a példában megadott 16f887-tel próbálom a hőmérést a példaprogram segítségével megoldni az sem megy.
Felhúzó ellenállás van az adatlábon? Ha jól értelmezem a programrészletet, te csak az első két bájtot olvasod. A többi nem érdekel? Így nem lehet az adatot ellenőrizni (CRC).
Szia!
Van felhúzó ellenállás 4.7K. Piilanatnyilag annyi érdekel, hogy egy ds18b20 hőmérsékletmérés adatát olvassa be a pic és jelenítse meg, de ez sajnos még nem megy.
Szia! nálam ez így működik (16F887)
[sbit LCD_RS at RB4_bit; sbit LCD_EN at RB5_bit; // DS 1820 sbit LCD_D4 at RD4_bit; sbit LCD_D5 at RD5_bit; sbit LCD_D6 at RD6_bit; sbit LCD_D7 at RD7_bit; sbit LCD_RS_Direction at TRISB4_bit; sbit LCD_EN_Direction at TRISB5_bit; sbit LCD_D4_Direction at TRISD4_bit; sbit LCD_D5_Direction at TRISD5_bit; sbit LCD_D6_Direction at TRISD6_bit; sbit LCD_D7_Direction at TRISD7_bit; const unsigned short TEMP_RESOLUTION = 9; char *text = "000.0000"; unsigned temp; void Display_Temperature(unsigned int temp2write) { const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8; char temp_whole; unsigned int temp_fraction; if (temp2write & 0x8000) { text[0] = '-'; temp2write = ~temp2write + 1; } temp_whole = temp2write >> RES_SHIFT ; if (temp_whole/100) text[0] = temp_whole/100 + 48; else text[0] = '0'; text[1] = (temp_whole/10)%10 + 48; // Extract tens digit text[2] = temp_whole%10 + 48; // Extract ones digit temp_fraction = temp2write << (4-RES_SHIFT); temp_fraction &= 0x000F; temp_fraction *= 625; text[4] = temp_fraction/1000 + 48; // Extract thousands digit text[5] = (temp_fraction/100)%10 + 48; // Extract hundreds digit text[6] = (temp_fraction/10)%10 + 48; // Extract tens digit text[7] = temp_fraction%10 + 48; // Extract ones digit Lcd_Out(2, 5, text); } void main() { ANSEL = 0; ANSELH = 0; C1ON_bit = 0; C2ON_bit = 0; Lcd_Init(); Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_CURSOR_OFF); Lcd_Out(1, 1, " Temperature: "); Lcd_Chr(2,13,223); Lcd_Chr(2,14,'C'); do { Ow_Reset(&PORTE, 2); // Onewire reset signal Ow_Write(&PORTE, 2, 0xCC); // Issue command SKIP_ROM Ow_Write(&PORTE, 2, 0x44); // Issue command CONVERT_T Delay_us(120); Ow_Reset(&PORTE, 2); Ow_Write(&PORTE, 2, 0xCC); // Issue command SKIP_ROM Ow_Write(&PORTE, 2, 0xBE); // Issue command READ_SCRATCHPAD temp = Ow_Read(&PORTE, 2); temp = (Ow_Read(&PORTE, 2) << 8) + temp; Display_Temperature(temp); Delay_ms(500); } while (1); }][/code]
Ja,és persze, a "One_Wire" könyvtár kell hozzá..
Szia!
Nekem még mindíg nem.
Ha a Display_Temperature(temp); előtt temp-nek értéket adok azt kiírja, tehát az olvasással van a büge. A hozzászólás módosítva: Dec 17, 2017
A 89. sorban lévő Delay_us(120); nem kevés egy kicsit? Ha 12 bites felbontás van kiválasztva, akkor a konverzió az IC-ben eltarthat akár 750 ms ideig is.
Szia!
Ez van a példaprogramban is. De javítottam 750ms-ra, de még mindíg semmi.
Az LCD kijelző nem, de a OneWire protokoll nagyon is érzékeny az időzítésre. A kontroller konfigurációja jól van megadva mindenhol?
Nálam ez a program tényleg működik, belső oszcillátor,8mhz
Szia!
Ezek a beállítások. A szenzor jó mert máshol kipróbáltam.
Szia!
A pic saját tápjáról kapja a tápot.
Sziasztok!
Még mindíg küzdök az onewire DS18B20 hőméréssel. A az onewirw help a mérés idejére letiltatja a megszakításokat. Ha tiltom a megszakításokat nem ír ki adatot. Ha nem tiltom le a megszakítást véletlenszerűen írja ki a mért hőt. Tehát nincs meghatározható logika a kiírások között.
Sziasztok,
Most kezdtem el mikroc-vel illetve a c programozással foglalkozni. Eddig asm-ben programoztam de már váltani akarok ![]() Mi a különbség a kettő között:
A végén a 8-as az a hosszúságát jelentené a változónak? Illetve előtte a * az mi? ![]()
Sziasztok!
![]() MikroC-ben szeretnék programozni PIC18F2455-t (korábban programoztam már 18F4550-t). Rögtön az elején problémám akadt, ugyanis a pic csak belső órajelről működik. Ha a HS oscillator van kiválasztva, a PICen lévő program nem indul el. A panelon egy 20Mhz-s kristály van, 15 pF-os kondenzátorokkal (egyik-egyik lábuk a kristályon, másik GND-n, ahogy az adatlapon is szerepel). Sima 20Mhz-es órajellel szeretném meghajtani a mikrokontrollert. Mi lehet a probléma? Hardveresen vagy szoftveresen kéne megoldanom? Mellékelve küldöm a config biteket, mert szerintem ott lehet a gond. Segítségeteket előre is köszönöm! ![]() (Elnézést, hogy alapkérdéssel jövök, de kipróbáltam már mindent, amit én tudok.)
Ha az órajel a 96MHz-es PLL kimenetéről megy, használj HSPLL beállítást.
Sajnos úgy sem indul el a program.
Rossz lehet a panelom? ![]() A hozzászólás módosítva: Feb 9, 2018
Tegyél fel kapcsolási rajzot és fényképet!
Szia!
Nagyon köszönöm a gyors válaszaid, közben kiderült, hogy a panelon egy szakadás volt. ![]() További szép napot! ![]()
Sziasztok!
Még csak most ismerkedem a PIC-es világgal, így igencsak kezdőnek vallom magam. Kezdőként a mikroC fejlesztőkörnyezetre esett a választásom, ebben írtam néhány egyszerű, de legalább működő programot. Most, egy erősítőhöz írtam egy vezérlő programot. 4 nyomógomb: Ki/be kapcsolás, MUTE, MONO/STEREO, illetve bemenetválasztó 4 csatornára. -Értelemszerűen a KI/BE kapcsoló egy relét kapcsol, viszont az összes többi funkció is csak akkor működik, ha ha a reléhez tartozó port aktív, tehát nem nulla(a programban így szerepel leírva). -A MONO/STEREO gombnyomásra kapcsol egy relét, újabb gombnyomásra kikapcsolja azt. -A bemenetválasztó ugyan ez, csak lépteti a portokat, a végén pedig visszaáll az elejére, és kezdődik ellőről. -A MUTE szintén egy relét kapcsol ki és be, úgy mint a MONO. Viszont a program végére ehhez még beszúrtam egy IF-et, aminek a feltétele az, hogy a H változó kisebb legyen mint 1. Mikor ez a feltétel igaz, belép az IF-be, a H-t rögtön 2-re változtatja, hogy az már többször ne lehessen igaz a program futása során. Ezzel egyidejűleg bekapcsolja a MUTE relét, valamint a MUTE LED-jét fél másodpercenként villogtatja. Ez for ciklusba van rendezve, így 30x lejátszva, fél percig csinálja ezt, majd kiolvassa az EEPROM-ból a MUTE legutolsó állapotát(ha elmegy a villany, vagy kikapcsolom a készüléket). Kikapcsolás után a H változó nullázódik. -Ez így működik is, az egyetlen bajom vele az, hogy amíg ez a némító ciklus tart, addig semelyik gomb nem reagál. (Értelemszerű, mert épp egy ciklussal van elfoglalva.) Azt kéne megoldani, hogy amíg a MUTE ciklus tart, addig lehessen ugyan úgy bemenetet választani, ki/be kapcsolni a készüléket, illetve MONO/STEREO-ba kapcsolni. A MUTE gombot ilyenkor értelemszerűen nem kell figyelni. Olvastam itt TIMER0-ról meg INTERUPT-ról, próbáltam utána nézni, találtam is róla sok-sok leírást, de kimondottan erre a fejlesztőkörnyezetre alig van valami. Ha lenne legalább egy hasonló programkód, amivel lehet játszani (kísérletezni, átírkálni), látnám hogyan működik a gyakorlatban, megérteném a működését, és a későbbiekben is tudnám alkalmazni. Jelen esetben PIC16F628A-t használtam, belső, 4MHz-es oszcillátorral. A programot alul csatoltam.
Mikro C példaprogramok között akadtam erre, hátha segít:
Lényege a dolognak, hogy a delay függvény felejtős, mert megakasztja a programot, helyette a timer 1 interruptban növel egy számlálót, ezt a számlálót vizsgálja a főciklusban, és ha elér egy értéket akkor végrehajt valamit ...
Szia! Köszönöm!
Áhá! Szóval akkor nekem ezt elvileg a Delay helyett kellene használnom? És akkor ez egy olyan számláló, ami lényegében fut a háttérben, és nem akasztja meg a programot ha benne van? Ez eddig jónak tűnik, viszont a FOR ciklus az megfogja szakítani a programot, ha belefut?
Íme, egy kódrészlet, amire alkalmazni kéne, de eddig nem sikerült.
Ez egy újabb vezérlő, ebben már LCD is van. 1 másodpercenként villogtatja a "HEATiNG TUBES !" feliratot. Mindezt 15x teszi meg. (15x2sec = 30sec) A hozzászólás módosítva: Márc 13, 2018
Bocs, MikroC-t nem használok, csak az elvet tudom mondani.
A számlálót be lehet állítani, hogy milyen sűrűn okozzon megszakítást, amikor ez bekövetkezik akkor megszakítja a fő program futását, de csak annyi időre még növeli a számláló értékét ( az előző példánál maradva). Te a főprogramodban figyeled ennek a változónak az értékét, ha eléri a megadott értéket bekapcsolod a LED-et, számlálót törlöd, és mondjuk egy másik változóban letárolod, hogy már egyszer bekapcsoltad. Amikor megint eléri a számláló a megadott értéket akkor ha be van kapcsolva a LED kikapcsolod! ... Így nem kell for ciklus, csak az a számlálókat figyelni.
Köszönöm a segítséget, sikerült -véres verejtékkel- megérteni nagyjából, beállítani a Timer0-t és alkalmazni. Eddig sikeres a projekt. Most annyi az észrevételem, hogy miután lefutott ez a program ami a LED-et villogtatja, a nyomógombjaim nehézkesen reagálnak. Gondolom ez meg azért van így, mert folyton generálja a megszakítást. Gondolom ezt is lehet orvosolni az osztó beállítással.
Szerintem a timer megszakításának lefutását nem veszed észre ...
Látatlanba inkább arra gondolok hogy prellezik a nyomógomb, ezért tűnik úgy hogy nem reagál ... feltételezve hogy a programban valami olyasmi van, hogy megnyomom a gombot bekapcsol valamit, még egyszer megnyomom kikapcsolja. Ha ez a helyzet lehet softveres, vagy hardveres pergésmentesítést haszálni, utóbbi egy 100nF kondi párhuzamosan a nyomógombbal, előbbi hogy figyeled mennyi ideig van lenyomva a gomb, és csak pl a 0.1s nál hosszabb lenyomás a lenyomás! pl úgy hogy a timert beállítod hogy 10ms-ként okozzon megszakítást, ott növeled egy változó értékét, ha meg van nyomva a gomb, ha nincs akkor nullázod ... ha elér egy bizonyos értéket akkor hajtja végre amit kell....
Pergésmentesítés az van, szoftveres, a következőképp:
nyg1 maga a nyomógomb, gomb1 pedig egy BIT változó 0 kezdőértékkel felvéve. |
Bejelentkezés
Hirdetés |