Fórum témák
» Több friss téma |
Sziasztok.
Két problémával fordulok hozzátok. Első.: Segítséget szeretnék kérni a mutatók megértésében. Egyszerűen nem megy a fejembe, hogy hogy működik. Már több könyvet (PIC prog. C ny., A C prog nyelv...) és weboldalt (pl. Icserny oldala) átnéztem, de még mindig nem értem. Pl. egy mutató, honnan tudja, hogy egy több dimenziós tömbből melyik értéket szeretném kiolvasni......... Ha esetleg valaki szánna rám egy kis időt, és konyhanyelven leírná pár sorba a mutatók működését, nagyon megköszönném. Második.: Kaptam egy jó csomó, mindenféle IC-t (CMOS, TTL stb..) Találtam az egyik "sínben" 2db ENC28j60-as Ethernet vezérlőt, és ezért elkezdtem foglalkozni ezzel az IC-vel. Első körben megpróbáltam egy MSP430f5510-el meghajtani, de mivel még nem foglalkoztam az 5510-el inkább félreraktam. Most egy g2553-al próbálkozom, kisebb-nagyobb sikerrel, Duncan Frost blogjában leírtak alapján. Közben láttam, hogy Icserny fórumtársunk is foglalkozott már ezzel az Ethernet vezérlővel. A ledek villogtatása nekem is sikerült, az ARP nem, igaz azt se tudom, hogy mi az az ARP, és meg is tudtam pingelni. De ha beírom az IP címet, a böngésző nem éri el a vezérlőt. Mivel még ilyesmivel nem foglalkoztam, nem tudom, hogy az említett programmal ez egyáltalán lehetséges? Vagy egyáltalán, hogy működik ez az Ethernet vezérlő + MCU?
Nem írtam kommentet, de nézd át, és kérdezz, ha valami nem tiszta. Ez egy energia pazarló megoldás, de mindjárt csökkentünk a fogyasztáson.
Köszönöm!
Kérdés az lesz, csak elaltatom a gyereket! ![]()
Én most küzdök vele, hogy menjen fürdeni
![]() Egy potit tettem az ADC bemenetre, és így, az alábbi kiegészítéssel 0,3mA az áramkör áramfelvétele. Ez már jobb, mert a módosítás nélkül 2,1mA-t mértem.
Az ADC kikapcsolásában nem voltam biztos, de úgy nézem működik.
A mutató az indirekt címzéshez kell, ha használtál assemblyt, akkor talán így könnyebb !? Az a lényeg, hogy az adatokat a memóriában egymás után tárolod le és ha tudod a típusát ( byte, int ), akkor tudod, hogy egy-egy adatod hány cellában van. Ha a mutatót ráállítod a kezdő memóriacímre, akkor indirekt címzéssel abban a cellában ( vagy az ahhoz tartozókban ! ) fogsz "matatni"
![]() Idézet: A mutató ezt nem fogja tudni, Neked kell a megfelelő adatra pozicionálnod !!„egy mutató, honnan tudja, hogy egy több dimenziós tömbből melyik értéket szeretném kiolvasni” Remélem segítettem egy kicsit ![]() A hozzászólás módosítva: Ápr 20, 2013
Igen programoztam/ok assembly-ben (PIC-et).
Azt már megértettem, hogy indirekt címzéshez kell, csak egyenlőre felfogni nem tudom a menetét. Igaz a statikus változókat is, vagy 5x el kellett olvasnom, hogy megértsem, és ott írtam egy példát magamnak a teljes megértéshez. A mutatóknál, viszont a példaprogramjaim mind-mind hibába futnak, vagy nem azt csinálják amit kéne, ill. amit elképzelek. Köszönöm!
int tomb[3]={0,1,2); // def. tömb
int temp; // változó int *pointer; // def. mutató pointer=&tomb; // ráállítom a mutatót a tömb kezdőcímére temp= *pointer; // temp = tomb [0] pointer+=2; // a tömb második elemére pozícionál temp= *pointer; // temp = tomb[2]
Na elaludt!
A
A többi elsőre világosnak tűnik, mindjárt tesztelem!
Majdnem jó, de erre is hiba jött. De ha innen "pointer=&tomb;" kiveszem a "&" akkor jó. Így, hogy van egy működő mutatóm, a disasm-ben már látom, hogy mi is történik. Így már lassssan megértem.
Köszönöm szépen! ![]()
Igen, mert "elbambultam"
![]() Ha PIC-et programoztál, akkor FSR és INDF a kulcsszavak !
A tömb igazából bűvészkedés a mutatókkal, így ha a tömböt érted, akkor igazából a mutatókat is, csak még nem tudsz róla.
Amikor azt mondod, hogy a tömb 0. eleme, akkor valamitől 0 távolságra lévő értékről beszélsz. Amikor azt mondod, hogy a tömb 2. eleme, akkor valamitől 2 távolságra lévő értékről beszélsz. Ez a valami a tömb elejére mutató mutató. Sőt, a tömb neve, az önmagában egy mutató.
azaz
A két (vagy több) dimenziós tömb mutatóra fordítása sem fekete mágia, egyszerűen a fordító csal:
Azaz a fordító minden lekérdezésnél visszanyúl a deklarációhoz, megnézi, hogy egy "sor" milyen hosszú, ugrik annyit ahányadik sorban van (+i*3) és még lép annyit ahányadik oszlopban (+j). A valóságban a tömbben tárolt változók típusa miatt nem ilyen egyszerű a dolog, hanem bele kell számolni a változó szélességét is.
Ha ezt végiggondolod, megérted, miért is 0. indexelődik a tömb, miért kell deklarációnál legalább a tömb szélességét megadni és miért lehet egy több dimenziós tömböt bármikor úgy kezelni, mintha csak egydimenziós lenne, illetve miért lehet könnyen "túlcímezni" egy tömböt. A hozzászólás módosítva: Ápr 20, 2013
Nagyon köszönöm mindkettőtöknek.
![]() Egy programot írok, ahol 4db PCF8574-es portbővítőt használok, amik 11db külső eszközt kezelnek. Egy 4x4-es bill. mátrixtól kapott érték alapján kell állítani a portbővítők kimenetét, és ezt most a mutatók ismeretével sokkal könnyebben meg tudom valósítani, arról nem is beszélve, hogy a program fele annyi memóriát foglal. Tehát még egyszer köszi a segítséget! Már csak az Ethernet kérdésemre keresem a választ. Idézet: Az E-mail címedre tegnap küldtem választ, nem kaptad meg? „Már csak az Ethernet kérdésemre keresem a választ.”
De........, köszönöm.
Berakta a Spam-ek közé, és az Outlook a spam-ket nem tölti le, és még értesítést sem kapok róluk. A google html felületén, meg nem szoktam nézni az emaileket.
Sziasztok!
Az lenne a kérdésem, hogy hogyan tudok az információs memóriába írni? Szeretnék csinálni egy számkódolós zárat, és azt akarom, hogy a beállított jelszót megőrizze a tápfeszültség elvétele után is. Köszönöm!
Konstans értékként írd be, vagy statikusan adj egy értéket a kódban. Így ha újra indul a program valami oknál fogva, akkor is ismét elérhető lesz az adott érték.
Parancsolj.:
Írás előtt mindenképp törölni kell azt a szegmenst, amibe írni akarsz.
Köszi szépen!
Jól látom, hogy a memória itt nem byte, hanem szószervezésű lesz (int-re mutató mutató)? És ha én csak egyetlen szó tartalmát akarom változtatni, akkor is ki kell törölnöm a teljes szegmenst (64 byte)? Ez azt jelenti, hogy ha egyet is módosítani akarok, akkor előtte ki kell mentenem a RAM-ba az adatokat, a szegmensből, majd a törlés után után visszaírni? Csak mert így fölöslegesen használódik a többi cella is. Hány írást bírnak elviselni ezek? Köszönöm szépen!
Sajnos ennyire egyszerűen a kontroller nem engedi meg, hogy a flash-ben nyúlkáljon az ember.
![]()
Lehet hogy félre értettem a kérdés lényegiségét,félrevezető nem akrtam lenni. Bocsánat érte
![]() A hozzászólás módosítva: Ápr 25, 2013
Idézet: „Jól látom, hogy a memória itt nem byte, hanem szószervezésű” Igen, de egy bájtot is tudsz írni bele. (Az más kérdés, hogy van-e értelme.) Ha jól emlékszem, csak akkor kell törölni a szegmens tartalmát, ha egy, már beírt adatot akarsz felülírni/módosítani. Tehát, pl: 0x1000h (D szegmens) címtől berakod a 0x1234h-t, (pl:flash_write(0x1000, 0x1234, 0) és ezt meg akarod változtatni, akkor előtte törölni kell, de ha folytatod az írást, (pl:flash_write(0x1000, 0x1234, 1) akkor nem kell törölni. Szerintem nem feltétlenül kell kiírni a módosítani kívánt adatot egy változóba, hisz a módosított adat is "valahol" szerepel. Azt, hogy hány írást visel el az info.mem, az adatlap megmondja (kb. 1 1/2 év írtam egy programot amiben heti használatban van a flash mem. Még nem szólt, hogy baj lenne.). Azt még hozzá kell tegyem, hogy a függvényeket én eddig csak a g2553-al használtam, de több infót találsz a FUG-ban ahol minden részletesen le van írva. A hozzászólás módosítva: Ápr 25, 2013
Köszönöm szépen.
Ha jól látom, valóban csak a módosításnál kell a blokkot törölni. Üres rekesz írásánál nem. Akkor lehet, hogy érdemes úgy megírnom a programot, hogy minden módosításnál új címbe mentsen, és mindig csak a legújabb adatot használom. És ha betelt, akkor törlöm a használt szegmenseket. (Tudom, az A szegmensre vigyázni kell. ![]() A kimentést arra értettem, hogy ha az adott szegmensben más adatot is tárolok, de az egyiket módosítani akarom, akkor előtte ki kell mentenem a többi adatot is, mert az egész szegmenst ki kell törölnöm, majd az összes adatot visszaírni. Amúgy én is g2553-at használok. Idézet: „akkor előtte ki kell mentenem a többi adatot is” Ha nem sok adat van, pl. egy szegmensnyi, akkor nem biztos. Ha jól emlékszem, (nekem kéne egy kis memória...) akkor a példaprogramok között van példa a szegmensek közötti másolásra. Ha ki lehet hagyni a módosítani kívánt adatot a másolásból, akkor csak át kell másolni másik szegmensbe, így nem kell külső változó. De ennek utána kell nézni!!
Sziasztok!
Egy kicsit elakadtam programozás terén, és szeretnék segítséget kérni. Egy befecskendező rendszert tervezek, amit a gyári rendszer mellé lehet telepíteni. Beolvassa a motor szenzorainak adatait és az alapján kiszámolja a befecskendezési időt. Minden fordulat alatt egyszer fecskendez, a megfelelő jelet az injektoroktól vagy gyújtásjeladótól kapja. Ez a beérkező jel a programban generál egy interruptot, lenullázza a timert, és az egyik kimenetet a kiszámított időre bekapcsolja, ezzel nyitva az injektort. Ez szép és jó, de mi van, ha leállítom az autót, de a gyújtás rajta marad. Ekkor ugye nem érkezik interrupt, azaz nem is kellene befecskendezni. De a számláló egy idő után túlcsordul és kezdi előről a számolást, ezzel újra bekapcsolva a kimenetet. Ezt a problémát nem tudom hogy oldjam meg. Most ugye Set/reset módban használom a timert. Nincs valami olyan mód, ami set, aztán kikapcsol a következő resetig? Vagy esetleg programozás ügyileg nincs valakinek erre valami ötlete? Köszönöm
Csak egy ötlet. Ha nincs beérkező jel, gondolok itt a "injektoroktól vagy gyújtásjeladótól" érkező jelre, akkor tiltsd le a Timer-t. Ha észleli a beérkező jelet, elindítod a Timert, és a megszakításban törlöd.
Szia,
Egy filléres külső eeprom nem lenne egyszerűbb? Csak egy ötlet........
Nincs több szabad lába a kontrollernek. Meg plussz hely lenne a NYÁK-on. Meg úgy simán minek, ha van beépítve?
Sziasztok.
Két kérdésem lenne. Összeállítottam egy billentyű mátrix kezelő programocskát (csatolva). Az első kérdésem, hogy lehet megoldani szoftveresen a prellt? A "Key_Scan" rutinba beraktam egy várakozó ciklust, mely megvárja a billentyű felengedését, de ez a tesztek alapján kevésnek bizonyult. A második kérdésem, hogy tudnám ezt az egész rutint megszakításban kezelni? Igazából nem sok dolga lenne a mikrovezérlőnek, ezért az ideje döntő többségét mély alvással (LPM4 módban) töltené, ezért szeretném megszakításban lekezelni a rutin. |
Bejelentkezés
Hirdetés |