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
Lapozás: OK   196 / 1319
(#) NickE válasza ledesgyerek hozzászólására (») Ápr 28, 2008 /
 
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.
(#) watt válasza menyus hozzászólására (») Ápr 28, 2008 /
 
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.
(#) menyus válasza NickE hozzászólására (») Ápr 28, 2008 /
 
SIM300 a modul és a hyperterminallal használom jelenleg.
(#) menyus válasza watt hozzászólására (») Ápr 28, 2008 /
 
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.
(#) menyus válasza watt hozzászólására (») Ápr 28, 2008 /
 
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?
(#) NickE válasza menyus hozzászólására (») Ápr 28, 2008 /
 
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.
(#) menyus válasza NickE hozzászólására (») Ápr 28, 2008 /
 
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?
(#) menyus válasza menyus hozzászólására (») Ápr 28, 2008 /
 
É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?
(#) NickE válasza menyus hozzászólására (») Ápr 28, 2008 /
 
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.
(#) NickE válasza menyus hozzászólására (») Ápr 28, 2008 /
 
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.
(#) menyus válasza NickE hozzászólására (») Ápr 28, 2008 /
 
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.
(#) NickE válasza menyus hozzászólására (») Ápr 28, 2008 /
 
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é.
(#) ledesgyerek válasza NickE hozzászólására (») Ápr 28, 2008 /
 
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!
(#) trudnai válasza ledesgyerek hozzászólására (») Ápr 28, 2008 /
 
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).
(#) ledesgyerek válasza trudnai hozzászólására (») Ápr 28, 2008 /
 
Tudsz ilyen könyvet ajánlani ami jól megtanítana erre a nyelvre?
(#) watt válasza ledesgyerek hozzászólására (») Ápr 28, 2008 /
 
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?
(#) trudnai válasza ledesgyerek hozzászólására (») Ápr 28, 2008 /
 
(#) menyus válasza NickE hozzászólására (») Ápr 28, 2008 /
 
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.
(#) watt válasza menyus hozzászólására (») Ápr 28, 2008 /
 
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...
(#) lidi hozzászólása Ápr 28, 2008 /
 
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 ?



  1. void interrupt tc_int(void)
  2. {
  3.         if (T0IE && T0IF)
  4.         {
  5.         T0IF=0;
  6.         TMR0=131;
  7.         count0++;
  8.         if (count0==625) count0=0;                     
  9.        
  10.         if (count0<312)
  11.                 {
  12.                         asm ("bsf _PORTB,4");
  13.                        
  14.                 }
  15.         else
  16.                 {
  17.                         asm ("bcf _PORTB,4");
  18.                        
  19.                 }
  20.         }
  21.  
  22.        
  23.         if (PEIE==1)
  24.         {
  25.         if (RCIE && RCIF)
  26.                 {
  27.                 olv=RCREG;
  28.                 CCPR1L=olv;  // set pwm
  29.                 vjel=1;
  30.                 }
  31.         }
  32. }
(#) ledesgyerek válasza watt hozzászólására (») Ápr 28, 2008 /
 
Ne oltsá le! Kicsit diszleksziás vagyok!

De azért kösz a segítséget!
(#) potyo válasza lidi hozzászólására (») Ápr 28, 2008 /
 
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:

  1. void interrupt tc_int(void)
  2. {  
  3.         static unsigned count0=0;       //azért static, mert így a változó megtartja az értékét a két függvényhívás között, viszont csak a függvényből érhető el, tehát nem igazi globális, a fordító hibát jelez, ha máshonnan akarsz hozzáférni
  4.        
  5.         if (T0IE && T0IF)
  6.         {
  7.                 T0IF=0;
  8.                 TMR0+=6;        //ide vagy a szimulátorban meg kell nézni, hogy biztos hogy a 6 lenne-e a jó érték, vagy alaposan átnézni az adatlapban, hogy a TMR0 regiszter módosításakor nem hagy-e ki egy számlálást. Én a szimulátorban nézném meg, az a biztos
  9.                 count0++;
  10.                 if (count0<10000)
  11.                 {
  12.                         RB4=1//szerintem valami ilyesminek kell lennie, hülyén néz ki, hogy egy láb beállításához asm rutint kell beszúrni
  13.                 }
  14.                 else
  15.                 {
  16.                         RB4=0;
  17.                 }
  18.                 if (count0=20000)
  19.                         count0=0;
  20.         }
  21.        
  22.         if (PEIE==1)
  23.         {
  24.                 if (RCIE && RCIF)
  25.                 {
  26.                         olv=RCREG;
  27.                         CCPR1L=olv;  // set pwm
  28.                         vjel=1;
  29.                 }
  30.         }
  31. }


Ú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.
(#) potyo válasza ledesgyerek hozzászólására (») Ápr 28, 2008 /
 
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.
(#) potyo válasza potyo hozzászólására (») Ápr 28, 2008 /
 
Még annyit, hogy ez 1Hz-el villogtatja a ledet, de nem 1Hz-el okoz megszakítást, hanem 20kHz-el.
(#) ledesgyerek válasza potyo hozzászólására (») Ápr 28, 2008 /
 
É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"!
(#) lidi válasza potyo hozzászólására (») Ápr 28, 2008 /
 

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. )
(#) potyo válasza lidi hozzászólására (») Ápr 28, 2008 /
 
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?
(#) lidi hozzászólása Ápr 28, 2008 /
 
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.
(#) potyo válasza potyo hozzászólására (») Ápr 28, 2008 /
 
Most vettem észre egy hibát, ezt írtam:
  1. if (count0=20000)
  2. count0=0;

és ez kell:
  1. if (count0==20000)
  2. count0=0;

Tehát a hiba az, hogy az egy darab egyenlőségjel az értékadást jelent és nem összehasonlítást.
(#) watt válasza ledesgyerek hozzászólására (») Ápr 28, 2008 /
 
É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... )
Következő: »»   196 / 1319
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