Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   576 / 1319
(#) bubu válasza icserny hozzászólására (») Szept 21, 2009 /
 
Tettem bele egy kis várakozást is, hogy leolvashato legyen az érték!


  1. while (1)
  2.         {       LATAbits.LATA0 =0;              //CS engedélyezés
  3.                 OpenSPI(SPI_FOSC_4,MODE_01,SMPMID);
  4. //              SSPCON |= SPI_FOSC_64;
  5.                 getsSPI(SPI_Read,5);
  6.                 TC77= ReadSPI();
  7.                 DataRdySPI();
  8.                 CloseSPI();
  9.                 LATAbits.LATA0 =1;              //CS tiltas
  10.                 LATD = TC77;                    //a LED-eken kijelezzük a 8 - 8 bitet
  11.                 for (t=0;t<30000;t++)   //varakozas
  12.                         {
  13.                                 Nop();
  14.                         }
  15.         }
(#) trudnai válasza bubu hozzászólására (») Szept 21, 2009 /
 
Most nincs elottem a doksi, de ugy emlekszem van a C18-ban delay rutin gyujtemeny. Persze semmi gond az ilyen fajta kenyszer varakozasokkal, csak egyszerubb lenne hasznalni a mar meglevo dolgokat.
(#) gulasoft válasza trudnai hozzászólására (») Szept 21, 2009 /
 
A c30-ban nagyon csirke delay van, de a di jasio féle könyvben van egy ugyan ilyen.
(#) bubu válasza trudnai hozzászólására (») Szept 21, 2009 /
 
Jogos az észrevétel, de ez ahoz kellett, hogy tudjak SPI-t kezelni és nem akartam a delay.h-t előkeresni. Amugy abban, ha jol tudom, ms -ban lehet megadni a késleltetést, ami kicsivel profibb megoldás
Amugy szerintetek így jó?
A lassítás miatt az alsó és felső 8 bit leolvasható, de szerintem bitfordítás történt... :S
Erre van valami egyszerű megoldás, vagy oldjam meg okosan?
(#) icserny válasza bubu hozzászólására (») Szept 21, 2009 /
 
Még mindig nem értem, hogy mit csinálsz:
- getsSPI(SPI_Read,5); mit olvas, és minek olvas, ha úgyis eldobod?
- miért olvasás után csinálod a tesztelést, miért nem előtte? Ja, és miért nem vizsgálod a visszakapott állapotot?
(#) mkrobi hozzászólása Szept 21, 2009 /
 

Sziasztok!

Szeretnék időjárás figyelőt készíteni PIC-el úgy , hogy adott hőmérsékleti értéknél SMS-t küldjön.

A problémám az hogy a programozás nagyon távol áll tőlem és abban kérném a segítségeteket, hogy ha valaki vállalna ilyen jellegű munkát kérem jelentkezzen.

Tudom ez nem egy egy munkavállalói oldal,de nincsenek programozói kapcsolataim.....
(#) trudnai válasza mkrobi hozzászólására (») Szept 21, 2009 /
 
Altalaban az ilyen kereseket az apro hirdeteseknel szoktuk feladni. A forum teruleten technikai kerdesek es valaszok hangzanak el inkabb.
(#) frecsko hozzászólása Szept 21, 2009 /
 
Sziasztok.
Terveztem egy kapcsolást pic-kel. Áramot és feszt mérne a kapcsolás. Szerintetek ez így működőképes lesz? Az értékeket ne nézzétek mert egy régi rajzot bontottam szét.
(#) watt válasza frecsko hozzászólására (») Szept 21, 2009 /
 
Az áram mérést hogy is gondoltad? (Bár ez erősen nem PIC téma!)
(#) frecsko válasza watt hozzászólására (») Szept 21, 2009 /
 
Az áramfigyelő ellenálláson átfolyó áramerősség hatására pár milivoltos fesz keletkezik és ezt figyelem.
(#) frecsko válasza frecsko hozzászólására (») Szept 21, 2009 /
 
Bocsánat! Kérdés törölve. Nem azt csináltam amit akartam. Ezt még gyakorolni kell
(#) trudnai válasza frecsko hozzászólására (») Szept 21, 2009 /
 
[OFF]Amugy ha lehet akkor ne PDF-be csatoldd, hanem pl PNG-ben, mert a PDF-et nekem kulon le kell toltenem es megyitnom -- maceras, meg felesleges is mert ugyis csak ugyanaz a kep lesz bele agyazva a PDF formatumba...
(#) bubu válasza icserny hozzászólására (») Szept 21, 2009 /
 
Azt szeretnén csinálni, hogy egy TC77-es IC-vel mérem a hőmérsékletet, és a kapott értéket SPI-n lekérdezem.
Az IC 13 biten mér, ezért ugy gondoltam 16 bitet (int tipust) olvasok ki, és ami fennmarad, azt az elején feltöltöm 0-ákkal.

Majd 8 biten a látvány miatt kijeleztetem.

Ön szerint hogyan kellene ezt megtenni? Vagy hogyan szokták?
getsSPI -vel határozza meg hány byte-ba olvas
Ezt pedig nem értem teljen mire vonatkozik:
Idézet:
„miért olvasás után csinálod a tesztelést, miért nem előtte? Ja, és miért nem vizsgálod a visszakapott állapotot?”

A kód:
  1. #include "p18f45k20.h"
  2. #include "spi.h"
  3.  
  4. unsigned char SPI_Read[2];
  5.  
  6. int TC77=0x00;
  7. int t=0;
  8.  
  9. unsigned char DATARdySPI(void);
  10.  
  11. void getsSPI( unsigned char *rdptr,
  12. unsigned char length);
  13. void OpenSPI( unsigned char sync_mode,
  14. unsigned char bus_mode,
  15. unsigned char smp_phase);
  16. unsigned char ReadSPI (void);
  17. unsigned char getcSPI (void);
  18.  
  19.  
  20.  
  21. void main (void)
  22. {
  23. TRISD = 0b00000000; // port D kimenet-> LED-ek miatt
  24. TRISAbits.TRISA0 = 0; // TRISA0 output
  25.  
  26. while (1)
  27. { LATAbits.LATA0 =0; //CS engedélyezés
  28. OpenSPI(SPI_FOSC_4,MODE_01,SMPMID);
  29. getsSPI(SPI_Read,2);
  30. TC77= ReadSPI();
  31. DataRdySPI();
  32. CloseSPI();
  33. LATAbits.LATA0 =1; //CS tiltas
  34. LATD = TC77; //a LED-eken kijelezzük a 8 - 8 bitet
  35. for (t=0;t<30000;t++) //varakozas
  36. {
  37. Nop();
  38. }
  39. }
  40.  
  41. }
(#) icserny válasza bubu hozzászólására (») Szept 21, 2009 /
 
Én sem tudok mást a témáról, mint amit az spi könyvtár dokumentációjából vagy a forráskódból ki lehet olvasni.
Az alapján a getsSPI() stringet olvas, tehát ide, a hőmérőhöz nem való. (Gondolom, szöveget tároló EEPROM olvasásánál hasznosabb)

A ReadSPI() pedig tudomásom szerint a getcSPI()-hez hasonlóan 1 db bájtot olvas csupán, hiába teszel a baloldalra 16 bites változót. Úgy gondolom, hogy a ReadSPI() függvényt kétszer kellene hívni, és a két bájtost súlyozottan (vagy a magasabb helyiértékű bájtot 8 bittel balra léptetve) összeadni. De a részleteket a dokumentációból vagy a forráskódból kell pontosítani, ami most pillanatnyilag nem áll rendelkezésemre.

A DataRDYSPI() pedig az én értelmezésem szerint arra való, hogy olvasás előtt megnézzük vele, (egy if vagy while utasítás feltételebe rakva)hogy érkezett-e adatbájt. Lehet, hogy ilyen egyszerű esetben nincs rá szükség, de olvasás után rakni biztosan fölösleges.
(#) sany hozzászólása Szept 21, 2009 /
 
Üdv mindenkinek!

Úgy tönkre mehet egy PIC, hogy a benne lévő programot futtata hibátlanul.Aztán kitöröltem belőle a programot.De mindig hibát ír ki ellenőrzésnél, ha új programot akarok beletölteni.

( A program biztos hogy jó amit bele akarok tölteni, mert már többször használtam.)
(#) trudnai válasza sany hozzászólására (») Szept 21, 2009 /
 
Mi a hibauzenet?
(#) sany hozzászólása Szept 21, 2009 /
 
Verify falied at address 0000h!

ICprog 1.06 - os verzióját használom.
(#) trudnai válasza sany hozzászólására (») Szept 21, 2009 /
 
Ellenorizd, hogy a kod vedelm be van-e kapcsolva a PIC-en, ill probaldd meg bulk erase-el torolni. Ellenorizd tovabba a Vdd es Vpp feszultsegeket programozas kozben. Nezd meg ott van-e a PIC laban a Vdd es Vss kozt a 100nF hidegito keramia kondi. Ha tul hosszu a kabeled akkor vedd rovidebre... Most hirtelen ezek jutottak eszembe.

Gondolom JDM-mel programozol?
(#) sany válasza trudnai hozzászólására (») Szept 21, 2009 /
 
Igen JDM - mel programozok. Eddig még soha nem fordult elő ilyen hiba, pedig nem most programozok ezzel az égetővel elsőre. 16F628A típusú PIC-et használok . Ha 16F84A töltöm be a programot , akkor az hibátlanul beletöltődik. Persze átírom a kódot a megfelelő PIC - re.Az nem lehet a gond. A kódvédelem ki van kapcsolva .
(#) robing16 válasza potyo hozzászólására (») Szept 21, 2009 /
 
Hello!

Potyo! nagyon köszönöm, hogy ilyen részletesen írtad le nekem, értem az egészet

Kérdésem az lenne még, hogy elég egy "fototranzisztor"-t betenni, ami veszi az adatot a távirányítóról, vagy TSOP családból kell kiválasztanom egy típust?!

El is mentettem ezt az írást! Köszi mégegyszer
(#) icserny válasza robing16 hozzászólására (») Szept 21, 2009 /
 
Van itt egy egyszerű háromcsatornás IR távvezérlő projekt leírás. Érdemes elolvasni!
(#) bubu válasza icserny hozzászólására (») Szept 21, 2009 /
 
Szerintem, ha jol vettem ki:
DataRDYSPI() van e még hátralévő adat
A többi tényleg 1 bytot olvas, de
void getsSPI( unsigned char *rdptr, unsigned char length); és itt a length-nél hány byte-ot olvasunk azt kell megadni.
Én így értelmeztem a dolgot.

De ha valaki tudja hogy kell az SPI-t azt szivesen veszem, elvégre ez a legegyszerűbb soros kommunikáció.

üdv.: Bubu
(#) icserny válasza bubu hozzászólására (») Szept 21, 2009 /
 
Idézet:
„Szerintem, ha jol vettem ki: DataRDYSPI() van e még hátralévő adat”

Nem, ez honnan is tudhatná? Azt nézi, hogy van-e már beérkezett bájt (az SPSTATUS állapotát nézi). De ha jól látom, a ReadSPI-ben is van/lehet hasonló flag-figyelés...

Idézet:
„void getsSPI( unsigned char *rdptr, unsigned char length); és itt a length-nél hány byte-ot olvasunk azt kell megadni.”

De a "hány bájtot" arra vonatkozik, amit az rdptr-rel megcímzett változóba pakol, nem pedig arra, amit utána a getcSPI vagy ReadSPI-vel olva, mert azok mindig 1 bájtot olvasnak. (Egyébként a getcSPI csal alias név a ReadSPI-hez).

A getsSPI egy ciklusban hivogatja a ReadSPI-t... Mindezek pillanatok alatt kiderülnek, ha belekukkantasz a telepítési könyvtáradban levő forrásfájlokba!
  1. unsigned char DataRdySPI( void )
  2. {
  3.   if ( SSPSTATbits.BF )
  4.     return ( +1 );                // data in SSPBUF register
  5.   else
  6.     return ( 0 );                 // no data in SSPBUF register
  7. }
  8.  
  9. void getsSPI( unsigned char *rdptr, unsigned char length )
  10. {
  11.   while ( length )                // stay in loop until length = 0
  12.   {
  13.     *rdptr++ = getcSPI();         // read a single byte
  14.     length--;                     // reduce string length count by 1
  15.   }
  16. }
  17.  
  18.  
  19. unsigned char ReadSPI( void )
  20. {
  21.   unsigned char TempVar;
  22.   TempVar = SSPBUF;        // Clear BF
  23.   PIR1bits.SSPIF = 0;      // Clear interrupt flag
  24.   SSPBUF = 0x00;                  // initiate bus cycle
  25.   //while ( !SSPSTATbits.BF );                  // wait until cycle complete
  26.   while(!PIR1bits.SSPIF);  // wait until cycle complete
  27.   return ( SSPBUF );              // return with byte read
  28. }


Idézet:
„De ha valaki tudja hogy kell az SPI-t azt szivesen veszem”


''Ki tanyája ez a nyárfás?
Nem hallik be' a kurjantás!
Vagy alusznak, vagy nem hallják,
Vagy talán nem is akarják!''
(#) bubu válasza icserny hozzászólására (») Szept 22, 2009 /
 
Hmm...

Teljesen igaza van! Eléggé félreértelmeztem a dolgot! :S
És az idézet is elgondolkodtató...

Tehát akkor , ha az *rdptr pointer a amire hivatkozni kell?
És mondjuk egy int tipusba hogyan tudom a 13 bitet beshiftelni?
(#) icserny válasza bubu hozzászólására (») Szept 22, 2009 /
 
Idézet:
„És mondjuk egy int tipusba hogyan tudom a 13 bitet beshiftelni?”

Tegnap már írtam: két bájtot kell olvasni egymás után, és megfelelő helyiértéken kezelve össze kell adni.

Lehet union-nal és struct-tal játszani (ebben a topikban az union szóra kell rákeresni), s akkor eleve egy integer változó alsó és felső felébe lehet tölteni a beérkező bájtokat.

Lehet a ReadSPI() függvény forráskódjának mintájára egy új függvényt írni, amelyik eleve két bájtot olvas, és már int típusú a visszatérési értéke - de hadd ne szabjak már korlátokat az alkotó fantáziának!

Ha megoldható, akkor mellőzzük az önözést, itt nem szokás!
(#) icserny hozzászólása Szept 22, 2009 /
 
Megjelent a Microchip Microsolutions magazinjának szeptemberi száma.
(#) spepe hozzászólása Szept 22, 2009 /
 
Hello mindenki!

Egy gyors kérdésem lenne. Szeretném kiírni egy szám értéket LCD kijelzőre. Az értéket az egyik ADC csatornáról olvasom be csak annyi a gond, hogy "címletezni" kéne az értéket mivel máshogy nem tudom megnézni, hogy milyen karaktereket kell kiírnom.

Hogy lehetne ezt megcsinálni? Arra gondoltam, hogy osztással működne a dolog mint ahogyan azt régebben Pascal-ba is meg lehetett csinálni
  1. mennyivel = 1000;
  2.  
  3. szam = ADC_be;
  4. karakter = lekerekítés(szam/mennyivel);
  5. szam = szam-(karakter*mennyivel);
  6. mennyivel = (mennyivel/10);

csak az a gond, hogy valamiért itt mégsem megy. :S MikroC-t használok egyébként...

PIC: 18F4550

Köszönöm a válaszokat előre is!

Bye!
(#) spepe válasza spepe hozzászólására (») Szept 22, 2009 /
 
Közbe rájöttem, hogy nem jól írtam. :S

mennyivel = 1000;

szam = ADC_be;

ismétlés amíg ( mennyivel > 1 ) {

karakter = (szam/mennyivel);
szam = (szam-(karakter*mennyivel));
mennyivel = (mennyivel/10);

}

Bocsi a dupláért.
(#) icserny válasza spepe hozzászólására (») Szept 22, 2009 /
 
Ez nem jó?
  1. const char* itoa(int val, int padding)
  2.        
  3.  
  4. {
  5.   if(padding > 29)
  6.     padding = 29;
  7.   static char buf[30];
  8.   char* ptr = buf+29;
  9.   bool neg = (val < 0);
  10.   if(neg) {
  11.     val = -val;
  12.     --padding;
  13.   }
  14.   *ptr-- = 0;
  15.   do {
  16.     *ptr-- = (val % 10) + '0';
  17.     val /= 10;
  18.     --padding;
  19.   } while(val);
  20.   for(; padding > 0; --padding)
  21.     *ptr-- = '0';
  22.   if(neg)
  23.     *ptr-- = '-';
  24.   return ++ptr;
  25. }


(#) trudnai válasza icserny hozzászólására (») Szept 22, 2009 /
 
Nem kotozkodeskeppen, csak az itoa-nak van egy harmadik parametere ami egy string buffer, ugyanis a hivo felnek kell lefoglalni megfelelo helyet az atalakitott karakterlanc szamara. Ahogy most van ugy a stacken letrejon egy hely, es utana annak pointerevel ter vissza -- de kozben a stackrol a hely felszabadult es lehet masra lett felhasznalva...
Következő: »»   576 / 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