Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1168 / 1318
(#) szutsgabor hozzászólása Márc 20, 2014 /
 
Halihó

Dolgozok egy motor fordulatszám mérő programon. 1000-3000 RPM-et kéne mérnem. Kicsit elakadtam a szoftverrel (18f874)
  1. CCP1CON = 0x00; //A CCP modul kikapcsolása
  2.     T1CON = 0x30; //A Timer1 modul kikapcsolása, el?osztás 1:8, belsö léptetés, szinkronizáció
  3.     INTCON = 0x00; //Megszakítások tiltása
  4.     TRISCbits.TRISC2 = 1; //PORTC RC2/CCP1 lába bemenet
  5.     PIE1 = 0x00; //A perifériás megszakítások tiltása
  6.     PIR1 = 0x00; //A periféria megszakításkér? jelzöbitek nullázása
  7.  
  8.     TMR1H = 0x00; //Timer1 fels? bájt nullázása
  9.     TMR1L = 0x00; //Timer1 alsó bájt nullázása
  10.  
  11.     CCP1CON = 0x05; //Capture üzemmód indítása, kiolvasás minden fellfutó élre
  12.  
  13.  
  14.     while (1) {
  15.  
  16.         T1CONbits.TMR1ON = 1; //Timer1 léptetésének indítása
  17.         if (!PIR1bits.CCP1IF) //CCP interrupt flag figyelés
  18.         {
  19.             //Üres ciklus
  20.         }
  21.         eredmeny1 = (CCPR1H << 8) + CCPR1L;
  22.         PIR1bits.CCP1IF = 0; //IF nullázása
  23.        
  24.         if (!PIR1bits.CCP1IF) //CCP interrupt flag figyelés
  25.         {
  26.             //Üres ciklus
  27.         }
  28.         eredmeny2 = (CCPR1H << 8) + CCPR1L; //Értékek összeadása
  29.         PIR1bits.CCP1IF = 0; //IF nullázása
  30.         eredmeny = eredmeny2 - eredmeny1;

ez a program részlet végzi a mérést. utána még van egy kis számolgatás meg az eredmény rs232 porton küldése, de az most lényegtelen, mert már annál hamarabb vannak gondok.

a problémám az, hogy az eredmeny1 és eredmeny2 értékei megegyeznek, de időben együtt változnak.
lehet én vagyok már vak hozzá és valami tök hülye hiba van benne amit ti messziről kiszúrtok, de kérlek segítsetek megoldani a problémát.
A hozzászólás módosítva: Márc 20, 2014
(#) ktamas66 válasza szutsgabor hozzászólására (») Márc 21, 2014 /
 
Miért ne lenne ugyanaz. Gyakorlatilag egymás után lemented a CCP1 regiszterek tartalmát az eredmény változókba.
(#) watt válasza szutsgabor hozzászólására (») Márc 21, 2014 /
 
Az if az nem "Üres ciklus"! Egyébként ez a mérési módszer elég fapados (már ha tényleg várakozni akarsz a következő impulzus okozta megszakításig, amit most nem teszel meg a vélt szándékod ellenére, mert a program továbbhalad az if-en mindenféleképpen...) és eleve több sebtől vérzik.
Ha nem várakozni akartál, akkor meg hiányoznak a kapcsolók-jelzők, amik a folyamatot vezérelnék a végtelen ciklus ezen szakaszában. De jobb lenne ezt a megszakításban lekezelni, ahogy az illik egy haladótól!
A hozzászólás módosítva: Márc 21, 2014
(#) icserny válasza watt hozzászólására (») Márc 21, 2014 /
 
Idézet:
„Az if az nem "Üres ciklus"!”

Na ez az! Feltehetőleg while-t akart írni az if helyett.
(#) usane válasza icserny hozzászólására (») Márc 21, 2014 /
 
A while-nak sincs értelme.
A ccp flag-et a ciklus után törli.
Ha beugrik a flag átmenne végtelen várakozásba.
Annak az üres részletnek így abszolut semmi haszna, maximum egy if utasítás ciklusidőre várakozik, de minek?
A hozzászólás módosítva: Márc 21, 2014
(#) watt válasza usane hozzászólására (») Márc 21, 2014 /
 
Szerintem van, mert pont azért kell törölni, hogy akkor menjen tovább a következő részre, ha bejön a megszakítás. De akkor ezen a részen fog ácsingózni a program az idő 99%-ban, ezért ez a módszer nem jó, csak esetleg működik, önmagában.
(#) usane válasza watt hozzászólására (») Márc 21, 2014 /
 
Igazad van, a negációt figyelmen kívül hagytam. Na de mindegy, a mikrokontrollert nem semmittevésre tervezték
A hozzászólás módosítva: Márc 21, 2014
(#) watt válasza usane hozzászólására (») Márc 21, 2014 /
 
Úgyvan!
(#) icserny válasza usane hozzászólására (») Márc 21, 2014 /
 
Idézet:
„a mikrokontrollert nem semmittevésre tervezték”

...hanem alvásra, vagy mélyalvásra.
(#) Attila86 hozzászólása Márc 23, 2014 /
 
Rákötöttem egy D/A-t (MCP4922) és egy A/D-t (MCP3204) egy PIC-re (PIC18F4685) SPI-n keresztül. A D/A működik is gyönyörűen, de az A/D mindig csak nullákat ad vissza. Megméricskéltem, a tápfesze megvan (5,01V), referenciája szintén (4,1V) és a CH0 bemenetén van egy mérendő jel 1,61V személyében. Megnéztem szkóppal hogy mi van az SPI vonalon, ezeket kaptam. A sárga jelalak az órajel, a piros az egyiken az SDI, a másik szkópábrán pedig az SDO vonalat mutatja. Ahogy látszik, az SDO-n semmi nem jön ki a D/A-ból. Miért? Szerintem mindent jól csináltam...
(#) Hp41C válasza Attila86 hozzászólására (») Márc 23, 2014 /
 
Az MCP4922 melyik lábán méred az SDO -t? Az adatlapja szerint nincs neki ilyen lába...
(#) Attila86 válasza Hp41C hozzászólására (») Márc 23, 2014 /
 
Igen, az adatlap DOUT-nak nevezi. A 10-es láb.
(#) Hp41C válasza Attila86 hozzászólására (») Márc 23, 2014 /
 
DS22250A-page 1 -en látható ábra szerint a 10. láb a VoutB, a 2. csatorna analóg kimenete.
(#) Saggitarius válasza Attila86 hozzászólására (») Márc 23, 2014 /
 
"Igen, az adatlap DOUT-nak nevezi. A 10-es láb." ez a 3204-re vonatkozik, es Te a 4922-re szeretned latni, es igazat adok Hp41C-nek, mert en sem latok SDO-t ill data out-ot.

4922.jpg
    
(#) Attila86 válasza Hp41C hozzászólására (») Márc 23, 2014 /
 
Ja bocsi, félreolvastam a hozzászólásod! Reflexből azt gondoltam hogy az A/D-t kérdezted hiszen az a problémás.
A D/A, azaz az MCP4922 teljesen jól működik, azzal nincs semmi probléma. És neki nincs is SDO lába hiszen egy D/A-nak minek is legyen...
(#) Saggitarius válasza Hp41C hozzászólására (») Márc 23, 2014 /
 
Az analog kimenet, mivel a 4922-es egy D/A konverter. Viszont az SDO az digitalis jel.
(#) Saggitarius válasza Attila86 hozzászólására (») Márc 23, 2014 /
 
Akkor felrefogalmaztal: "Ahogy látszik, az SDO-n semmi nem jön ki a D/A-ból." "az A/D-t kérdezted hiszen az a problémás"
A hozzászólás módosítva: Márc 23, 2014
(#) Attila86 válasza Saggitarius hozzászólására (») Márc 23, 2014 /
 
Opsz, valóban! Elnézést, A/D-t akartam írni.
(#) Saggitarius válasza Hp41C hozzászólására (») Márc 23, 2014 /
 
Esetleg koze lehet az egesznek ehhez? " SPI serial interface (modes 0,0 and 1,1)" Mit takar a 0,0 illetve 1,1 mode?
(#) Saggitarius válasza Attila86 hozzászólására (») Márc 23, 2014 /
 
Figured out
(#) Hp41C válasza Attila86 hozzászólására (») Márc 23, 2014 /
 
Idézet:
„A D/A, azaz az MCP4922 teljesen jól működik, azzal nincs semmi probléma. És neki nincs is SDO lába hiszen egy D/A-nak minek is legyen...”

Láncbafűzéshez... Ha amúgyis van 3 nem bekötött lába...
A/D: A legelső adatbittel kellene elindítani. Szerintem bitsorrend hiba...
(#) Attila86 válasza Hp41C hozzászólására (») Márc 23, 2014 /
 
Nem hiszem hogy fordítva kellene küldeni a biteket, szerintem ez a mellékelt ábrán látszik. Már csak a START bit elhelyezkedése miatt is pont rossz lenne ha fordítva küldeném. Bár mondjuk nem tart semeddig, megpróbálom mindjárt...
A hozzászólás módosítva: Márc 23, 2014

mcp3204.png
    
(#) Attila86 válasza Attila86 hozzászólására (») Márc 23, 2014 /
 
Igen, fordítva küldve sem történt semmi. Viszont most megnéztem a CS vonalat is hátha esetleg az nem jó, de működik az is szépen; alapból 5V van rajta és ha meghívom az MCP3204-et kezelő szubrutint akkor 0V-ra vált majd a végén vissza 5V-ra. Szóval elvileg minden stimmel.
Még azt is megnéztem hogy nem-e rontottam el esetleg az Eagle-ben az MCP3204 makróját, azaz nincsenek-e felcserélve a nyákterven a lábaik de mind jó helyre van kötve.
(#) Saggitarius válasza Attila86 hozzászólására (») Márc 23, 2014 /
 
A megfelelo bemenet van kivalasztva a 4-bol?
(#) Attila86 válasza Saggitarius hozzászólására (») Márc 23, 2014 /
 
Igen. A mellékelt táblázatból kiolvasható hogy hogyan kell beállítani a biteket a CH0-on való méréshez. Az előző oldalon lévő hozzászólásomban feltöltött szkópábrán pedig látszik hogy azt is küldöm ki. És meg is mértem közvetlen az MCP3204 1-es lábán (az a CH0) hogy ott van-e a mérőjel és ott van (1,61V).

Egyébként ezt küldöm ki:
0000 0110
0000 0001
0000 0001
Ez látszik a szkópábrán is.

mcp3204_2.png
    
(#) Attila86 válasza Attila86 hozzászólására (») Márc 23, 2014 /
 
De most próbaképp meghívtam egymás után mind a négy mintavételező szubrutinomat (CH0-CH3) és mind h'0000'-al tért vissza. A szkópot átállítottam hogy ne az órajelre hanem az MCP3204 DOUT-jára triggereljen és nem kapott el semmit szóval abszolúte semmit nem hajlandó kiadni magából az A/D, mintha ott se lenne. Pedig szerintem mindent jól csináltam... tápfesz, órajel, bemenő jel, referencia és mérendő jel rendben, lábkiosztás stimmel, a frekvencia 2000-szer lassabb mint amekkora lehetne stb. Már csak arra tudok gyanakodni hogy rossz az A/D.
(#) Hp41C válasza Attila86 hozzászólására (») Márc 23, 2014 /
 
CS -t vezérled?
(#) Attila86 válasza Hp41C hozzászólására (») Márc 23, 2014 /
 
Persze, ezt is írtam egy korábbi hozzászólásomban.
(#) ktamas66 válasza Attila86 hozzászólására (») Márc 23, 2014 /
 
Mekkora az órajel frekvenciája? A 6.2 pontban van minimum követelmény (min 10kHz).
A hozzászólás módosítva: Márc 23, 2014
(#) Attila86 válasza ktamas66 hozzászólására (») Márc 23, 2014 /
 
A szkópábrámról ez is nagyjából leolvasható.
Kereken 1kHz.

Igazad lehet! Én csak azt néztem hogy a táblázatban csak maximum érték van írva, ami az 5V-os tápfesznél 2MHz. Bár most nézem ott van mellette hogy "Note3" ami a 6.2-es szekcióhoz vezet és ott tényleg ír egy minimum 10kHz-es frekvenciát!

Átírom 20kHz körülire vagy valami hasonlóra. Csak az a baj hogy azt a timert használom másra is úgyhogy más dolgokat is át kell variálnom. Na mindjárt megnézzük...
Következő: »»   1168 / 1318
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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