Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   87 / 1320
(#) menyus hozzászólása Okt 26, 2007 /
 
Még annyi kérdésem lenne, hogy a megszakítások prioritását hol lehet állítani? Kéne a kütyübe egy BATTLO jelzés, és ennek a megszakításnak előnye kell legyen az ADC megszakítással szemben, mivel csak 2 X 8 karakteres az LCD.

Köszi
(#) watt válasza menyus hozzászólására (») Okt 26, 2007 /
 
Ha jól emlékszem egy 16F-et használsz, annak nincs csak egy megszakítási pontja. Így ha az ADC megszakít, azt nem tudod megszakítani. De mivel ez nem annyira fontos, nem is kell megszakításból kezelni. Lehet, hogy dugába dől a jó terved. De ne keseredj el, ez velünk is pont így megtörténik, ha nem godnoljuk át az egész program vázát előre. Ilyenkor előről kezdjük!
(#) MPi-c válasza menyus hozzászólására (») Okt 26, 2007 /
 
Idézet:
„Még annyi kérdésem lenne, hogy a megszakítások prioritását hol lehet állítani?”
A programban. Úgy láttam, hogy 16f690-es volt az MPLAB-ban kiválasztva. Emlékeim szerint ebben egyszintű a megszakítás. A prioritást a megszakítások kiszolgálásának sorrendje határozza meg. Tehát az ISR-ben a fontosság sorrendjében ellenörzöd le a megszakítást jelző flag-eket és így azt a rutint hajtatod végre előbb, ami a fontosabb.
A 18-as pic-ekben a megszakítás már több szintű, ott kell különböző regiszterekben beállítani azt.
(#) gulasoft válasza MPi-c hozzászólására (») Okt 26, 2007 /
 
Ajánljatok már egy 16f877-hez hasonló 18-as ic-t mert a megszakítási szintek elég fontosak.
(#) bbalazs_ válasza gulasoft hozzászólására (») Okt 26, 2007 /
 
En a 18F4525-ost tudnam javasolni.
(#) menyus válasza watt hozzászólására (») Okt 27, 2007 /
 
bummm. Ez pofára esés... Nem baj, újabb "házi feladat...". Leckének nem volt rossz (és könnyű sem, de megérte ) Nem Te javasoltad az LCD frissítést megszakításból... ? Igaz akkor még a battlo jelzésről szó sem volt. Szóval holnap átírom. Köszi
(#) menyus válasza MPi-c hozzászólására (») Okt 27, 2007 /
 
Köszönöm, de ezek szerint nem is kell 2 megszakítást kezelnem.

Azért köszi az infót.
(#) potyo válasza gulasoft hozzászólására (») Okt 27, 2007 /
 
18F452 vagy 18F4520. Talán ez utóbbi olcsóbb is, és valamivel többet is tud, mindenesetre mindkettő tudja azt, amit a 16F877.
(#) gulasoft hozzászólása Okt 27, 2007 /
 
Köszi a tippeket, nem is drága 1000Ft a chipcad árlistáján
(#) watt válasza menyus hozzászólására (») Okt 27, 2007 /
 
Igen én javasoltam, de ennek több módja is van. Érekelne, hogy milyen más megszakításos ütemezéses ötleted van a jelenlegin kívül!
(#) watt válasza MPi-c hozzászólására (») Okt 27, 2007 /
 
Amit írsz igaz, de a prioritást csak részben határozhatja meg a lekezelés sorrendje. Azzal nem tudsz mit kezdeni, ha egy megszakítás lekezelése közben egy újabb jön, ami fontosabb. Meg kell várd, míg lekezelődik az előző! A 18F-es megszakítás megoldása ennél kifinomultabb, ott a high megszakítja a low-t. Persze ezzel vége is, több prioritás nincs.
(#) gulasoft hozzászólása Okt 27, 2007 /
 
Egyszer már volt róla szó, hogy miben különbözik pl. egy 16f84 meg egy 16f84a, de akkor csak annyi derült ki, hogy az utoprogramozása kicsit más.
Én elolvastam már 2 magyar leírást az pic ic-k programozásáról, de ott nem találtam ilyen utalásokat, és az utasításkészletben sem láttam különbséget.
Kérdés:
Miként lesz egy 16f84-re irt asm-ből 16f84A hex file?
(#) szabi_o válasza gulasoft hozzászólására (») Okt 27, 2007 /
 
(#) gulasoft válasza szabi_o hozzászólására (») Okt 27, 2007 /
 
Ahha. Akkor ha jól vettem ki a doksiból, akkor a programon semmit nem kell faragni, az időzítésen sem ha ugyan azzal az oszcillátorral van meghajtva, csak az A sorozat tud 20Mhz felett is ketyegni valamennyivel, míg a sima csak 10Mhz felett valamivel.
Csak akkor most nem értem, hogy a Potyó féle icd2-es égetőhöz miért volt külön A-s és Sima hex file is, bár lehet hogy a 877-ben más különbségek is vannak.
Köszi a linket.
(#) potyo válasza gulasoft hozzászólására (») Okt 27, 2007 /
 
Idézet:
„Csak akkor most nem értem, hogy a Potyó féle icd2-es égetőhöz miért volt külön A-s és Sima hex file is”


Látod, magad megis válaszoltad:
Idézet:
„a 877-ben más különbségek is vannak”


Az A jelzés csak azt jelenti, hogy van valami eltérés. Nem jelent konkrét eltérést!
(#) gulasoft válasza potyo hozzászólására (») Okt 27, 2007 /
 
Akkor most már ezt is tudom. Mindegy a ponghoz 16f84-et irnak, nekem meg 16f84A-m van, de az jó lesz, aztán ha a 877-est már kivűlről fújom, akkor veszek egy 18F4525-öst.
Viszont azért azon padlót fogtam, hogy a 24-es sorozat 1000 lábú ic-i is csak 1200Ft-ba kerülnek, szóval ez baromi olcsó.
(#) watt válasza gulasoft hozzászólására (») Okt 27, 2007 /
 
Így van, olcsó! Ajánlom figyelmedbe a 18F4620-at is! Ha C-ben nyomod, van bőven memória. Igaz a 4525-ös is elegendő, de 200Ft-on ne múljon, hogy nem fér bele a sokadik éves fejlesztés!
(#) gyengus hozzászólása Okt 27, 2007 /
 
Próbálkoztam a timerrel.
Timer0-t használok, 8bites regiszterrel és 4-es előosztóval. Betettem 1 LED negálást a másodpercek növeléséhez.
Először a segédváltozó 46875-ös (48M/8/256) értékénél növeltem a másodperceket, ekkor a LED kb 5 másodpercig világított. Erre elosztottam a 46875-öt 5-el, majd a TMR0L-be 4-et raktam kezdőértéknek, mert 4 C-s utasítást számoltam a segédváltozó növelése előtt. Így a LED villogás stimmelni látszik, 1 másodpercig világít. Viszont 1 óra alatt összeszedett kb 5 perc késést. Ezért nem akartam próbálgatni. Ezt, hogy lehet korrigálni?
Próbáltam MPLAB SIM-el debuggolni a progit, de elakadt az _asm goto _startup _endasm utasításnál (bootloadert használok).
Közben elkezdtem foglalkozni a hőmérsékletkijelzéssel, mert azt is szeretnék. Softveres I2C-t használok, mert a hardveresnek az egyik vezetékén van a bootgomb. A hőérzékelő DS1621. Először a PICC fordítóban található ds1621.c-t írtam át a súgója és az MCC18 Library doksi alapján. Mivel ez nem vezetett eredményre (folyamatosan 795-öt kaptam, ha jól emléxem), újrakezdtem a ds1621 adatlapja alapján. Így se lett az igazi, vmiért 255-öt ír ki. Az sw_i2c.h-ban átírtam a konstansokat a megfelelőekre, hozzáadtam a projekthez az i2c forrásfájlokat. Fordításnál a projekt könyvtárában létrejönnek a .o-k. A ds1621 adatlapja alapján egyszerűnek tűnik, viszont az MCC18 Libraryban lévő példa már bonyolultabb. Mellékelem a ds1621.c-t, remélem vki tud segíteni.
Jó lenne végre 1 kis sikerélmén .
Előre is köszönöm mindenkinek a segítséget!

DS1621.C
    
(#) gyengus válasza gyengus hozzászólására (») Okt 27, 2007 /
 
Jut eszembe: a ds1621 bekötésében nem vagyok biztos. Itt az oldalon van 1 óra projekt, abból szedtem ki. A 2 SDA-t összekötöttem, a 2 SCL-t is és úgy mennek a PIC-re. Máshol 4,7k-s ellenállásokat láttam.
Jó így?
(#) watt válasza gyengus hozzászólására (») Okt 27, 2007 /
 
Ez így jó!

Idézet:
„A 2 SDA-t összekötöttem, a 2 SCL-t is és úgy mennek a PIC-re.”

Ezt a mondatodat nem értem, mit kötöttél össze? Két hőmérőd van?
(#) watt válasza gyengus hozzászólására (») Okt 27, 2007 /
 
A sok kérdés miatt egyelőre csak egy részt vegyünk:

Idézet:
„(48M/8/256)”

A Timer0 bemenetére nem a FOSC 1/4-e megy? Nézz utána az adatlapban 11-1 ábra!(csak hogy szokd meg, annak mindig nyitva kell lennie, és nem nekünk kell benne a kérdéseid után böngészni, ugyanis mi sem vagyunk káptalanok! )
(#) gyengus válasza watt hozzászólására (») Okt 27, 2007 /
 
A mellékelt rajzon 2 SDA van, ezeket kötöttem össze, ugyanígy tettem az SCL-el is. Egy hőmérő van.
Az ábrán Fosc/4 megy, de van mellette T0SE is, nem teljesen világos. A szövegben nem találtam utalást a Fosc-ra. Lehet, h láma kérdés, de ez mi, az órajel?
(#) potyo válasza gyengus hozzászólására (») Okt 27, 2007 /
 
A T0SE az a Timer0 Source Edge bit a T0CON regiszterben. Számodra jelentéktelen itt. Az Fosc az oszcillátorfrekvencia.

Ha a szimulátor valahol, a szimuláció számára lényegtelen résznél akad el, akkor ideiglenesen dobd ki belőle azt. A szimulátorral pontosan be lehet lőni az időzítésekek, csak egy kicsit kisérletezni kell az értékekkel.
(#) benjami válasza watt hozzászólására (») Okt 27, 2007 /
 
Én ugyan nem menyus vagyok, de én ugy csináltam az LCD kiirást hogy a megszakitásbol csak egy 32 byte-os tömbbe tettem a szöveget (2x16-os LCD) és egy jelzöbittel közöltem hogy lehet frissiteni a kijelzö tartalmát. Ezt viszonylag gyorsan meg lehet csinálni mert semmilyen eszközre nem kell várakozni.
A föprogram végtelen hurkában pedig figyelem a jelzöbitet. Ha jelzés van akkor ráküldöm az LCD frissités rutinra ami buta módon a teljes 32 bájtos tömböt kiirja az LCD-re. Itt nem számit hogy mennyit kell várni az LCD-re mert ugye bármikor meg lehet szakitani a folyamatot.
A jelzőbitet a kiiro rutin elején törlöm, hátha már a kiirás alatt valymelyik megszakitásban futo rutin modositja az LCD szövegét.
(#) gyengus válasza potyo hozzászólására (») Okt 27, 2007 /
 
Megjegyzésbe raktam a vector remapping részt, igaz, h így is belemegy 1 addFP.asm-be, de legalább nem ragad bele, run-ra továbbmegy.
Programozónak tanulok, használtam már debuggert, de ezt a simet nem vágom, h lesz jó pontosítani az időzítéseket, ha lépésenként futtatom?
A disassembly listing ablak alapján próbáltam megszámolni az utasításokat a megszakításkezelőben, de bekerül 1 ciklusba, ha az az aktív ablak léptetéskor. C-s kódnál nem, meg nincs is ott ciklus.
(#) potyo válasza gyengus hozzászólására (») Okt 27, 2007 /
 
Van egy olyan, hogy Stopwatch. Ott lesz két-két számláló. Az egyik mutatja, hány utasításciklus futott le a reset óta, a másikat meg kézzel nullázhatod. Ha megadod az oszcillátor frekvenciáját, akkor az eltelt időt is látod mindkettő mellett.
(#) MPi-c válasza gyengus hozzászólására (») Okt 27, 2007 /
 
A felhúzó ellenállások 10k helyett inkább 4,7 k-sak legyenek, nálam 10 k-val nem ment a ds 1621. Az I2C specifikációról van magyar nyelvű leírás is, talán www.tavir.hu oldalon.
(#) MPi-c válasza gyengus hozzászólására (») Okt 27, 2007 /
 
Ugyan nem MCC18-ban, hanem PICC CCS-ben a működő, kipróbált ds1621-et kezelő kódom így néz ki. Gondolom kommentek nélkül is érthető és rögtön észreveszed, hogy az init-ben a konverzió indítása (0xee) megelőzi a konfigurálást (0xac)!
  1. //      s_ds1621.c
  2. void init_1621()
  3. {
  4.         i2c_start();
  5.         i2c_write(0x90);                       
  6.         i2c_write(0xee);                       
  7.         i2c_stop();
  8.         i2c_start();
  9.         i2c_write(0x90);
  10.         i2c_write(0xac);
  11.         i2c_write(8);
  12.         i2c_stop();
  13. }
  14.  
  15. int16 read_temp()
  16. {
  17.         int8 temph,templ;
  18.        
  19.         i2c_start();
  20.         i2c_write(0x90);
  21.         i2c_write(0xaa);
  22.         i2c_start();
  23.         i2c_write(0x91);
  24.         temph =i2c_read();
  25.         templ =i2c_read(0);
  26.         i2c_stop();
  27.        
  28.         return ((int16)temph<<8|templ);
  29. }


Az LCD-re írás pedig így néz ki:
  1. //Hömérséklet kiolvasása, kiírása LCD-re
  2. void temp_kiiras()  
  3. {
  4.         int8 datal,datah;
  5.         int16 temp=0;
  6.         float data;
  7.        
  8.         temp = read_temp();
  9.         datah = (int8)(temp>>8);
  10.         datal = (int8)temp;
  11.                
  12.         data = datah;
  13.        
  14.         if (bit_test(datah,7))
  15.         {       data -= 256;
  16.                 if(bit_test(datal,7)) data -= 0.5;
  17.         }
  18.         else
  19.         {
  20.                 if(bit_test(datal,7)) data += 0.5;
  21.         }
  22.         printf(lcd_putc,"%5.1f°",data);       
  23. }

A printf-ben a formátum megadása után látható fok jelet persze csak akkor jeleníti meg, ha az előtte az LCD-ben saját karakterként definiálva van.
(#) gyengus válasza MPi-c hozzászólására (») Okt 27, 2007 /
 
köszi a tippet, majd csak jövő hétvégén tudom kicserélni az ellenállásokat
nem értettem, hogy miért a config előtt indítja a konvertálást, adatlap se írja, hogy fel kéne cserélni
most felcseréltem, de a helyzet változatlan
a kiírásnál miért kell kivonni a datah-ból 256-ot?
az adatlap alapján abban a hőmérséklet egész része van kette komplemensben
magyar i2c-s leírás ezen az oldalon is van, meg van vmi Kandós jegyzetem, azokat is olvastam
potyo: megtaláltam, 150 utasítást számolt, de ha azt beírom regiszter kezdőértéknek, siet az óra
(#) potyo válasza gyengus hozzászólására (») Okt 27, 2007 /
 
Ne azt nézd, hány utasítás, hanem mennyi idő telik el, amíg ráfut ugyanarra a kódrészletre. Tegyél breakpoint-ot a megszakítást követő első utasításra, indítsd el a progit, amikor ráfutott a breakpoint-ra, akkor megáll. Ekkor a Stopwatch-nál a Zero gombbal nullázod a számlálót, majd ismét elindítod a programot. Ekkor látod, mennyi idő telik el két megszakítás között. Ha ez nem annyi, amennyi kellene, hogy legyen, akkor módosítasz a kezdőértéken. Érdemes erre az időre letiltani az összes többi megszakítást, ne zavarjanak be a szimuláció folyamán.

De ha megmutatod a kódot, vagy legalább azt a részletét, ami az időt kellene, hogy mérje, akkor tudnánk többet mondani.
Következő: »»   87 / 1320
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem