Fórum témák
» Több friss téma |
Sziasztok!
SPI hardver inicializálással kapcsolatban van gondom. PIC18F2321-re XC8-al lefordul, de PIC24F16KA102-nél ezt a hibát kapom: error: 'SPI_FOSC_64' undeclared (first use in this function)
Mit rontok el?
Szia!
Más az SPI órajel előállítása a 24FVxxKA -n. Töltsd be a kontrollerhez tartozó header állományt és ott nézd meg a definiált konstansokat.
Köszönöm, megtaláltam. Azt hiszem lényegesen egyszerűbb bit szinten intézni a konfigot és a kommunikációt, mint ezt a periféria library-t használni.
"A periféria library használata megkönnyíti a hordozhatóságot." Ennyit erről..
A hozzászólás módosítva: Júl 21, 2013
Ez fontos infó volt, helyretette a dolgokat, köszönöm!
Naiv módon azt hittem, nem kell hozzá bitszinten foglalkozni minden részlettel.
Sziasztok. Sejtem hetekig várhatok válaszra de azért megkérdezem ki tudna segíteni abban hogy a mikroc ds18b20 hőmérő programomhoz ami működik miként tudnék beletenni egy olyant hogy ha elér egy bizonyos hőfokot az érzékelő akkor kapcsoljon be egy kimenetet a pic-en 0-ról 5v-ra mind addíg amíg a hőfok nem csökken tehát termosztátnak szeretném használni. Itt a kód : (18f2550)
Van bent sok felesleges más dolog de inkább nem ollózom ki. Kérem aki ért ehhez segítsen vagy egészítse ki a kódot hogy kellene beállítani akkor a szenzort.
A hozzászólás módosítva: Júl 28, 2013
Szia,
PortA.0 lesz a kapcsolt kimenet. 13. sorba ezt írd: unsigned int term_kapcs=30; // Pl. 30°a termosztát érték A 125. sortól ezt szúrnám be:
Így elméletileg 30°alatt bekapcsol (H-szint) lesz a PORTA.0 bitje, a fölött viszont kikapcsol (L-szint). Remélem segítettem.....
A mikroc-t nem ismerem, így csak azt írom, amivel én próbálkoznék.
A 112-es sorban eredményül kapott temp értékét össze kell hasonlítani a beállított hőfokkal. Ha temp kisebb, mint ami kell, akkor be, ha nagyobb, akkor ki kell kapcsolni a fűtést. A Hiszterezis_Fele néhány (tized) fok, a stabilabb működéshez kell. Ilyesmire gondolok (szintaktikai hibák lehetnek benne):
18F-eken van LATA, ahol pedig van, ott azt kell használni PORTA helyett kimeneteknél.
Oké, rendben. Nem tudom hogy mikroC-ben van LATA szintaktikailag?
Érdekes dolgokat lehet találni más fórumokon is...
A forrás még nem volt meg. Akinek kell, itt egy kis segítség a fordításhoz. Rövid teszt alapján: működik.
Sziasztok!
Egy kis segítséget szeretnék kérni PIC + 4x20 karakteres LCD projektben. Szóval az a gondom, hogy néha kihagy egy betűt, szóval nem írja ki. Próbapanelben már olyat is csinált, hogy visszafelé írta ki a szöveget. Azóta csináltam egy nyákot, abban nem jelentkezett. 4 bites üzemmódban használom. Tipikusan ennél a forráskód részletnél akad ki:
ahol az lcd_cim egy 8 elemű tömb:
Itt vannak eltárolva az LCD sor és oszlop címei. Szóval az első for ciklusig minden havaii, második és harmadik for ciklushoz érve kihagyja a 'H' betűt(lásd melléklet). Az LCD szalagkábellel van kivezetve. Táplábon ott a 100nF kondi. Viszont a nem használt lábak nincsenek lekötve GND-re. Ez lehet gond? A hozzászólás módosítva: Aug 17, 2013
Szerintem ez tipikus zajprobléma.
Idézet: „Az LCD szalagkábellel van kivezetve. Táplábon ott a 100nF kondi.” Táp/vezetékezés, ilyesmik. A szalagkábel milyen hosszú? Soros ellenállások vannak-e a vezetékeken?
Kb. 7 cm. Soros ellenállásokat nem tettem.
Egyébként érdekes a dolog, mert ha kiveszem azt a sort, hogy
Akkor lehet, hogy csak nem úgy működik, mint ahogy várod.
Ilyenkor a helyes megoldás az, hogy átrakod egy PC-s C programba, telepakolod debug printf-ekkel, és rájössz, hogy hol nem az történik, mint amit gondoltál.
Ahogy anno az egyetemen a tanárom mondta: A programjaink nem a kívánságainkat, hanem a leírt sorainkat teljesítik.
No még lenne egy kérdésem. Kaptam egy warningot a fordítótól: Idézet: „Warning [1393] D:\Munka\Cseko\cseko_hom_logger_pic_130814\main_x.c; 542. possible hardware stack overflow detected, estimated stack depth: 9” Megpróbáltam megnézni a memóriát és nem értem, de a bank2 full üres. Így megpróbáltam belerakni egy nagyobb változót:
De így is üres maradt. Ez mitől van?
Az nem lehet, hogy a két "whitespace" felülírja a H betűt?
Próbáld meg egy "whitespace"-szel, vagy írj be helyette "xx"-et, hogy lásd, mit, hova ír.
Ez az üzenet arra utal, hogy hívogatod szépen sorban a függvényeket, egyikből a másikat, és a fordító úgy számolja, hogy bizony a függvényhívogatások fája nagyobb mélységű, mint amit a mikrokontroller kezelni tud. A .lst fájlban "stack", meg "call graph" szövegek környékén elemzi a problémát.
De igen, egynél már nem törli le a H-t. Csak érdekes, hogy nem mindenütt törölte le.
Meg a következő ciklus elején úgy is visszaírom, tehát nem értem miért tűnt el.
ÁHÁÁÁ, na akkor koppantam.
Szóval akkor azt kellene valahogy megnéznem, hogy hol van ilyen mély függvényhívás.
Sziasztok!
Megint én vagyok. Abban kérnék egy kis tanácsot, hogy csinálok egy mérőpanelt, amely tartalmaz egy 4x20 karakteres LCD-t, 1 lábon ds18b20-as érzékelőket buszosan felfűzve, illetve egy max485 átalakítót. A feladat az lenne, hogy megmérni a hőket, véleményem szerint leátlagolni, majd ha kész az átlag, akkor kiírni az lcd-re. Mivel az lcd-re 24 hő egyszerre nem fér ki, így nyolcasával vannak megjelenítve, majd 5 másodperc várakozás után a következő 8, majd az utolsó nyolc, majd ismét hőmérés, átlagszámítás, majd kiírás... Na már most az RS485-ről kapott adatok megszakításban vannak lekezelve, amelyben ki van értékelve, hogy mi jött, a protokoll egyenlőre olyan, hogy *+pic címe+parancs. * - figyelem felhívás, pic címe-egyértelmű (ugyanis több ilyen panel lesz) majd parancs, ami lehet: 1 - ez a hőadatok bekérése 2 - ez a ds-ek darabszáma 3 - ez a busz állapota Mind a 3 parancs hatására 1-1 jelzőbit lesz 1-be állítva, ami majd jelez a főprogramnak, hogy mit kell csinálnia. Ez azért van, mert anno nekem úgy tanították, hogy a megszakításban a lehető legrövidebb ideig kell tartózkodni. Így ő csak jelez. Amikor a főprogram odaér (és itt lesz a problémám) akkor megnézni, hogy melyik bit lett 1-es és annak megfelelő feltételt teljesíti, majd a bitet visszaállítja 0-ba, mely jelzi, hogy a feladat elvégezve. A gond az, hogy mondjuk épp ott jár a főprogram, hogy az első 8 hőt írja ki. Jön egy pl. :*71, ami azt jelenti, hogy el kell küldeni a hőadatokat. Igen ám, de ez majd csak a harmadik 8-as után lesz kiértékelve, addíg még van 15 másodperc késleltetés és hát működik szépen, csak ez elég lassú így. Persze ha a harmadik 8-ast írja ki, akkor csak 5 másodpercet kell várni. Na szóval esetleg valaki tudna segíteni, hogy hogyan kellene átszervezni a programot? PIC16f886-ról van szó, hi-tech C-ben írva a kód. Talán az időzítést is valamelyik timerrel kellene megoldani? Jelenleg szoftveres késleltetés van.
Ezt csak megszakítással tudod megoldani ! Kell egy timer, ami pl. 0,1 s-ként jelez, a kiírást addig csinálod, amíg ebből bejön 50 db, de közben tudsz foglalkozni a többi feladattal is a főprogramban... !
Az ugye csúnya dolog lenne, ha globális változókba menteném a hőadatokat, stb. És így a megszakítás is látná, és ott küldeném el őket?
Ezt meg kell tudnod oldani a főprogramból is ( a lényeg a főprogramban sehol ne időzzön / bár a DALLAS kiolvasását nem illik a megszakításnak félbeszakítania ! / ) !
Addíg, míg olvas, a megszakítás ki van kapcsolva. Sőt még egy jó pár helyen is, mert sajnos már tapasztaltam olyat, hogy kiírtam az lcd-re, jött egy megszakítás, és utána nem jól írta ki a maradék szöveget az lcd-re. Vagy pl. átlagszámításnál nem lett jó az átlag.
Szóval akkor inkább használjak egy timert, minden timer megszakításnál növeljek egy statikus változót, pl.
Addíg míg ez pl. kisebb, mint pl. 50, addíg az első 8 hő, ha nagyobb 50, kisebb mint 100, addíg második 50, és így tovább... Közben meg tudna mást is csinálni.
Szia!
Egyszerűen tárold el az előző hőfokértékeket és azokat add át. Nincs jelentősége, hogy az előző kiértékelés időpontjához tartozókat adod át, ha lassú mérés, ha nem. Amikor megvan a következő kör, frissíted a tárolót. A másik észrevételem, hogy a ds-eket egyszerre lehet konvertálásra indítani, majd sorban kiolvasni mindegyiket, ha készen vannak. Így nagyon gyors lesz a hőmérés is. Nem csúnya dolog globális változókat használni, ez nem PC. Persze a memória határt szabhat, de ha kell, akkor kell. Ha a megszakítás ilyen bajt okozott, akkor ott valamit nem jól szerveztél. Persze vannak dolgok, amiket nem lehet megszakítani, de elég kevés, és az LCD vezérlése nem ezek közé tartozik. A hozzászólás módosítva: Aug 22, 2013
Idézet: „a ds-eket egyszerre lehet konvertálásra indítani, majd sorban kiolvasni mindegyiket, ha készen vannak” Ezeket hogyan? Az én programom kicsit más, mivel (úgy látom te vagy watt, úgyhogy tudod miről van szó) itt egy siló hőmérést kell megvalósítani úgyhogy tudni kell, ki hol helyezkedik el a buszon és ezért nekem eepromban le van mentve mindenkinek a címe. Amikor a ds1820_read megkapja az argumentumot akkor azt nézem meg, hogy hol van. Na szóval csatolom a ds1820_read() függvényt:
A lyuk azért kell, mert van egy ds_init függvényem, ami meghívása után kitörli az eepromot, majd egyesével kéri befelé az érzékelőket, és ezt szépen sorban elmenti az eepromba. Na már most, ha nem akarok valamelyik helyre érzékelőt, pl. 13. helyre, akkor oda 0x00-t ír. Ezt vizsgálja az első for ciklus.
Vágom.
Úgy lehet, hogy a konvertálási parancsot nem címzed, hanem kiadod a vonalra SKI ROM [CCh] után, amit mindegyik ds venni fog és elkezd konvertálni. Kivárod míg elkészülnek (pl. vizsgálod az elkészültét egy ds-en(ezt már címezve)), vagy időzíted (750ms alatt kész.) Ezt mindhárom vonalra megteheted egymás után, majd sorban beolvasod az értékeket. Így kb. 1 sec alatt meglesz a 24 hőfokérték. Tehát a kiolvasási rutinodat úgy kell változtatni, hogy kiemeled a konverzió parancsot és külön adod ki, megelőzően a kiolvasásokat.
Na ha jól értelmeztem, akkor nekem kellene 2 függvény, ha már az eredetiket is meg akarom tartani:
Az első valami ilyesmi:
Ez elindítja a mérést az összes ds-sel. A második mondjuk valami ilyesmi:
|
Bejelentkezés
Hirdetés |