A privát üzenet rendszerben karbantartásokat végzünk. Lassulások előfordulhatnak!
Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Azt hittem, hogy a PIC-et már ismered, csak szeretnél magasabb szintű nyelveket használni. Ha még sose programoztál PIC-et, tehát teljesen nullán állsz, akkor inkább a potyo által javasolt asm -el kezdd. Ha erős alapok megvannak, akkor lehet továbblépni C-re, aztán esetleg C++, C#, Java.
Így megy ez... 1 nyelv nem elég.
menyus! Használtad már az FSR regisztert? És az INDF virtuális regisztert? (adatlap, indirekt címzés)
A bejövő adatokat szépen le kell tárolni a memóriába. Ha már letároltad, akkor tudod, hogy a keresett telefonszám kezdete melyik címen található. Ekkor szépen sorban össze tudod hasonlítgatni a bájtokat az általad meghatározott telefonszám értékeivel. ennyi.
SIM300 a modul és a hyperterminallal használom jelenleg.
Nem még nem használtam, de körüljárom a dolgot. Ezt az indirekt címzést már hallottam párszor de nem értettem. Előveszem a 16F628A adatlapját Í(azt használom a projecthez) és átnézem. Köszi az ötletet, én általam létrehozott regiszterekben gondolkodtam.
Tényleg, az a bitenkénti összehasonlítás hogyan működik? (ez lett volna a következő kérdésem..) Melyik utasítással? (XORWF ?) Van egy flag ami jelez ha egyezik a két bit?
A kizáró vagy (xor) úgy működik, hogy ha azonos tartalmú regisztereket "xorolsz" össze, akkor 0 lesz az eredmény. Aki esetleg programozott asm-ben PC-t is, az tudja, hogy ott úgy szoktak regisztert nullázni, hogy pl. xor ax,ax
Ugyebár ez következik a xor igazságtáblázatából. Egyébként a xornak eszméletlen sok felhasználása létezik még, ez a legegyszerűbb.
Köszönöm, most már csak az a kérdés hogy az öszehasonlítás eredménye hol jelenik meg egy PIC esetében? A "Z" bit állapota jelzi?
És még egy láma kérdés..
Olyan összehasonlítási módszer nem létezik amikor NIBBLE ket vagy egy teljes bájtokat hasonlítok össze?
Igen, a Z bit jelzi.
Ezzel bájtokat tudsz hasonlítani. Megjegyzem, hogy ha PIC18-at használsz, ott vannak összehasonlító utasítások is. PIC16-on kizáró vaggyal vagy kivonással lehet összehasonítani. Ez egész bájtot hasonlít, ha bitet akarsz figyelni, akkor btfsc, btfss jó. Ha egy bájtnak csak a felét, vagy tetszőleges részét szeretnéd összehasonítani egy adott értékkel, akkor maszkolni szokás. Pl. ha pl. A alsó 4 bitje érdekel, akkor a felső 4-et pl. kinullázod, (A AND 0x0f) és utána hasonlítod össze.
Amúgy halkan megjegyzem, hogy meglep, hogy GSM modulokat szeretnél birizgálni úgy, hogy ilyen alapok nem mennek. Én is már jó sok éve foglalkozom GSM alapú vezérlésekkel, többek között ilyenek miatt váltottam C-re, elég macerás sok sztringgel dolgozni asmben, főleg ha sokat bennük a változó rész.
Hát, lehet hogy ez a "sokat akar a szarka..." tipikus esete, de én nem sokat szeretnék ezektől a moduloktól. Amit idáig meg akartam velük valósítani azt megoldottam (pl, egygombos "apahívó vésztelefon" az 5 éves fiamnak 3,5 X 3,5 cm es méretben akksistul mindenestül...stb) Most pedig a kapunyitást szeretném CID vel megoldani mivel van valami rádióamatőr a közelben és mindenki szív miatta hogy a 434 es sávon kvartyog általában. Állítólag azt mondta neki ezt lehet, én nem vitatkozom vele, de ezentúl nem akarok kínlódni az ISM sávos távirányítókkal, mikor a GSM is ingyen van. (csengetés alatt azonosít be, nem kell felvegye a hívást, tehát elméletben a hívás pénzbe nem kerül) Feltéve ha összehozom ezt a Caller ID s dolgot a modullal. Egyébként igazad van, rengeteg dolgot tudnak ezek a modulok amiket kihasználni csak jóval nagyobb programozási tudással lehetne mint az én kezdetleges próbálkozásaim. Ezek kész telefonok csak a perifériák hiányoznak mellőlük. De egyszer csak összehozom ezt is, feltéve hogy kapok hozzá elméleti segítséget. Az eddigi kérdéseimre is kaptam nagyon jó megoldásokat amiből rengeteget tanultam, és amit ezúton ismét megköszönök mindenkinek aki segített.
A SIM300-at nem ismerem, tudom, hogy melyik modulról van szó, de még nem volt dolgom ezzel a típussal. Lehet, hogy érdemes lenne utánanézni a doksijában a hívásszűrésnek, mert előfordulhat, hogy a modul megcsinálja a feladatot a pic helyett. Tehát előfordulhat, hogy be lehet úgy állítani a modult, hogy elutasítson minden hívást, ami a SIM kártyán nem szereplő telefonról érkezik. Így egyszerűbb a PIC-es oldal egyszerűsödik. Sőt az újabb modulok képesek Java alkalmazásokat is futattni gyakran, egyre inkább fordul a tekintetem ezek felé.
Hát igen teljesen nullán állok a programozás fojamatába, bár már égettem be programot.
Tehát akkor kezdjem az asm az az asembly nyelvel? (Gondolom erre gondoltok amikor asm-ről beszéltek.) Ha igen akkor tudtok olvasmányt ajánlani ami jó elmagyarázza? Naon kezdő vok!
Igen, asm az gyakran hasznalatos kiterjesztese az assembly forras kodu file-oknak, ezert szoktak / szoktuk "asm" -nem roviditeni az assmebly-t vagy assembler-t (ez utobbi inkabb maga a fordito program, mig az assembly maga a nyelv).
Tudsz ilyen könyvet ajánlani ami jól megtanítana erre a nyelvre?
PIC adatlapja a megfelelő erre. Minden utasítás és infó megvan benne részletesen.
Idézet: „fojamatába” Idézet: „Naon kezdő vok!” Lehet, hogy inkább a magyar nyelvvel kéne kezdened?
Hűha..ez érdekesen hangzik! Ennek feltétlenül utánanézek mert így valóban egyszerűbb lenne megoldani. Ettől függetlenül viszont még mindíg érdekelne az előző módszer is amit még meg kell tanulnom. FSR, INDF regiszterek használata amit Watt említett, XOR olás...stb. Ezeket körüljárom mert nem használtam még ezeket az regisztereket meg utasításokat mivel nem volt még rá szükségem. Most viszont van, és itt az alkalom hogy megtanuljam...feltéve hogy sikerül megértenem.
Naná! Az FSR címzi a ramot, az INDF regiszterbe írt érték (movwf INDF) beteszi az értéket a megcímzett ramra. A movf INDF,w pedig kiveszi az értéket a ram címről. A incf FSR,f növeli egyel az FSR-t stb...
Van rövid példa az adatlapokban is...
Timer0 -val szeretnék 1Hz es megszakítást 20Mhz es quartzal. Elvileg kiszámoltam mindent, szemre jól is villog a led, de valaki le tudná ellenőrizni a gondolatmenetem ?
Orajel : 20000000 orajel/4: 5000000 prescaler: 64 eddig 78125Hz. namost ugye a timer alapból 8bit tulcsordulásakor csinál irq-t. De 255 ig számolással sehogy sem jön ki kerekre 1Hz, ezért én 131 ról indtitom mindig a TMR0 regisztert. Ezáltal 125 öt számol míg tulcsordul. Ez így 625 Hz kereken. Ezt meg már egy 16 bites számmal leszámolom, és megvan az 1Hz-em. A kérdés az lenne, hogy nincs e valami hiba a számításomban ? Pl mikor elkezdődik az irq feldolgozása, közben már megy tovább a számláló 0 ról nem ? Akkor végülis mennyire kéne állítani a TMR0 -t az irq kezelőben ? Hi-Tech PicC ben csinálom amúgy. Vagy meg kéne nézni az asm forrást, megnézni mennyi utasítás mig eljut a TMR0 értékadásig és azt kivonni ?
Ne oltsá le! Kicsit diszleksziás vagyok!
De azért kösz a segítséget!
Első kérdés, hogy mire akarod használni az 1Hz-et? Mert ha időmérésre kell, akkor eleve bukott ötlet az olyan megoldás, amelyben a prescaler nem 1:1 arányra van állítva. Azért, mert amikor a TMR0 regisztert módosítod, akkor a prescaler nullázódik. Viszont a törlés előtt nem tudod, mi volt a prescalerben, tehát ezzel elbuktad a pontosságot. Vagyis az kell, hogy a Timer 1:1 arányú prescalerrel menjen, ha a TMR0 tartalmát módosítani kell.
A másik, hogy az nem jó, hogy fixen állítod be a TMR0-t hatra, mert megintcsak nem tudod, hogy meddig ért már el, amikor hatra állítod. Pl. épp a megszakítási rutinban van, amikor a TMR0 túlcsordult, ekkor kilép a megszakítási rutinból, majd ismét be, ez a programtól függően elfoglal minimum 6, de lehet hogy 20 utasítást, és közben a TMR0 szépen számol. Tehát az kell, hogy hozzá kell adni hatot a TMR0-hoz. Tehát a pontos módszer valahogy így néz ki. A Timer0 nyolc bites, tehát maximum 256 lépés után okoz megszakítást. Mivel 5000000/256 nem egész számra jön ki, így célszerűbb úgy csinálni, hogy a TMR0 regiszterhez hatot hozzáadunk, mert akkor 5000000/250=20000, tehát minden 10000 megszakítás után kell megcserélni a led állapotát. Tehát valami ilyesmi lenne a kód:
Úgy tudod formázni szépre, hogy bekattintod a Kód gombbal az egészet, majd felül módosítod így: {code=c}, természetesen szögletes zárójelekkel.
Ez nem diszlekszia, ez hanyagság és menősködés. De erről szokj le, nem szeretjük itt az oldalon. Itt komoly szakmai dolgokról folyik eszmecsere, ez nem ovodások csetelése.
Még annyit, hogy ez 1Hz-el villogtatja a ledet, de nem 1Hz-el okoz megszakítást, hanem 20kHz-el.
Én nem akarok senkit megbántani de ha azt mondom hogy diszleksziám van akkor az van! Ja és ha ismernél akkor tudnád hogy én nem szoktam "menősködni"!
kód gombot használtam, de erről az =c ről nem tudtam. valmi help, vagy fejlesztés jó lenne ide. pl C-kód, asm-kód gomb külön-külön Köszi hogy a ronda törés ellenére kihámoztad. Sejtettem én hogy nem ilyen egyszerű a megoldás Amúgy nem feltétlenül órára kell, csak ismerkedem még a megszakításokkal, de persze lehetőleg pontosat szeretne az ember. Még egy elvetemült ötlet: TMR0 modositgatás nélkül, 256os osztoval 305.1757813 Hz enkent van irq. Namost 1 / 305.1757813 = 0.0032768 -at adogatva egy static float tipusu valtozohoz, majd azt visszakonvertálva egésszé is lehetne másodperceket számlálni. ( amúgy milyen "ismerős" szám ez a 32768. hmm. )
Amit számoltál, az 1:64 prescaler esetén jön ki, nem 1:256-nál. Az a kérdés, hogy mekkora pontosságot csinál a float tipusú változó? Mert ha nem eleget, akkor ugrott az 1Hz pontossága. Valamint az a kérdés is felvetődik, hogy nem igényel-e több időt összességében a processzor részéről a float-os mutatvány, mint az egész számos?
illetve 64-es osztoval 305Hz, bocsi. :bummafejbe:
Na mire észreveszem a hibát, addigra te is válaszoltál. Mára ennyi elég lesz a pic -ből, fáradok már. A szép és pontos megszakításos időmérődért megszavazok neked pontot.
Most vettem észre egy hibát, ezt írtam:
és ez kell:
Tehát a hiba az, hogy az egy darab egyenlőségjel az értékadást jelent és nem összehasonlítást.
Én is béna vagyok, ezért ha nem tudom hogy kell írni, beírom a word-be! A törekvés fontosabb...
potyo-ra meg ne haragudj, igaza van a szakmai fórummal kapcsolatban, és azzal, hogy nem való ide a "vok" és társai! (Ami nem öl meg, az erősít... ) |
Bejelentkezés
Hirdetés |