Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   964 / 1319
(#) Peti989 hozzászólása Máj 4, 2011 /
 
Üdvözlet mindenkinek!

Az lenne a kérdésem hogy PIC-el hogy lehet le és felfutó éleket érzékelni?

A problémám a következö van egy jelem ami az egyik állapotában 4,5V tehát "1" és a másik állapotában 0-4,5V közötti négyszögjel. Ez a négyszögjel 364Hz-es. Tehát a feladat az hogy külömbséget tudjak tenni ez a két jel között.
(#) Hp41C válasza tamitsrob hozzászólására (») Máj 4, 2011 /
 
Szia!

A call és a rcall a következő utasítás címét elmenti a stack -ra, és aztán ugrik - egy return / retlw utasítással vissza lehet rérni a call / racall utáni utasításra.
(#) icserny válasza Peti989 hozzászólására (») Máj 4, 2011 /
 
Idézet:
„Az lenne a kérdésem hogy PIC-el hogy lehet le és felfutó éleket érzékelni?”
1. Milyen PIC?
2. Legegyszerűbben a bemeneti szint megváltozását jelző megszakítással. Valamivel bonyolultabban: a CCP (vagy ECCP) egység Input Capture (TRudnai kolléga leleményes elnevezése szerint: jelrögzítő) üzemmódjával. De a célszerű megoldás attól is függ, hogy mit kell csinálnia közben a (melyik?) PIC mikrovezérlőnek.
(#) Peti989 válasza icserny hozzászólására (») Máj 4, 2011 /
 
Hello

Egy PIC16F84-es mikrovezérlőről lenne szó.

Alap esetben folyamatosan érkezik be a négyszög jel és ezt kéne vizsgálni hogy ez mikor lesz folyamatos stabill '1'-es állapot. Tehát folyamatosan vizsgálni az adott lábat hogy ha már nem a négyszögjel jön akkor a program tovább ugorhason.

Olyasmi elvre gondolok mint a BTFSS parancs hogy ugye akkor ugrik tovább ha egyes a vizsgált bit.

Ha a jel váltott a négyszögjelről folyamatosra és tovább ugrott a programban, azután már nem lenne fontos hogy most a jel vissza állt-e négyszögre vagy sem.


Remélem azért érthető amit írtam
(#) pako válasza Peti989 hozzászólására (») Máj 4, 2011 / 1
 
Üdv!

Egy periféria-pazarló ötletem lenne: a 364Hz periódus ideje ~2.7ms. A Timer0 számlálót kellene úgy beállítani, hogy >= 2.8ms-enként okozzon megszakítást. A négyszögjeled az RB0 interrupt lábra menne, lefutó élre kérne megszakítást, ekkor nullázná a számlálót. Tehát van két esemény: lefutó él, és a túlcsordulás. Ha Int0 kéri a megszakítást, akkor négyszögjeled van a bemeneten; ha a Tmr0, akkor pedig DC.
(#) Peti989 válasza pako hozzászólására (») Máj 4, 2011 /
 
értem hogy mit mondasz.

arra gondolsz akkor hogy elkell inddítani egy számlálót ami 2.7msec hosszabb.

Az RB0 lábon van a jel és akár hányszor jön lefutó él a számlálot ujra indítja és a számláló csak akkor fog tudni tulcsordulni ha nincs lefutó él tehát nincs újra indítás.
(#) Peti989 válasza (Felhasználó 15355) hozzászólására (») Máj 4, 2011 /
 
a frekvenciája az 364Hz és a kitöltése olyan 70%körüli. pontosan nem mértem le.
(#) Peti989 válasza (Felhasználó 15355) hozzászólására (») Máj 4, 2011 /
 
persze tudom. De nem akarok még plusz alkatrészeket ha meglehet oldani szoftveresen is.

Mert már megcsináltam ezt egy retriggerelhető monostabil áramkörrel. hogy ha jött lefutó él akkor az ujra indította a monostabil áramkört és ha nem akkro pedig át billent a másik állapotba.
(#) Peti989 hozzászólása Máj 5, 2011 /
 
köszönöm a segítségeteket. sikerült megoldani a problémát és nagyszerüen fut a program

Köszönet pako-nak a nagyszerü ötletért.
(#) n_yálastrubadúr válasza watt hozzászólására (») Máj 5, 2011 /
 
Hello!
A WPB_F18_F16_F12_v1.29b-t használom. De most építettem egy Tait- féle égetőt leválasztóval, állítható Vpp feszültséggel (ha sok vagy kevés lenne). UV led íráskor. 2 teljes napomba került, de 5,00 Vdd és 12.5 Vpp gombnyomásra leválaszt vagy, ha írja. Ha kész már próbálhatom is. Így most tényleg vakarózás nélkül koncentrálhatok a szoftverre. A programod ezzel is felismeri a 16f887-et meg a 16F616-ot is. De visszaolvasva 4db 3FFF-es mezővel arrébb csúszva mutatja. Hp41C mondott valamit tároló különbségekről, hogy 4 meg 8-as. Ez nem tudom mit jelent, de neked hátha segít. Most a PBrennerNG programot használom. Teljesen működik mind a 2.
(#) watt válasza n_yálastrubadúr hozzászólására (») Máj 5, 2011 /
 
Úgy emlékszem egyszer már írtam hogy ne ezt használd, hanem a 1.30b-t! Bővebben: Link

Ha a Vpp 12V az minden PIC-hez megfelel(már amelyiknek nagyobb a Vpp-je, mint a Vdd!)...
(#) adamhollos hozzászólása Máj 5, 2011 /
 
Sziasztok

Azt, szeretném kérdezni van e-PIC USB/digitális converter perifériával?
(#) watt válasza adamhollos hozzászólására (») Máj 5, 2011 /
 
Az micsoda?
(#) adamhollos válasza watt hozzászólására (») Máj 5, 2011 /
 
csak csatlakoztatni kell a megfelelő lábakra az usb kábeleket és automatikusan küld illetve fogad jeleket USB-n a pic

ami USB-n bejön azt beírja egy regiszter(ek)be
(#) icserny válasza adamhollos hozzászólására (») Máj 5, 2011 / 1
 
A PIC csak azt csinálja, amit a futó program (a firmware) előír számára. Ha veszel egy USB illesztővel rendelkező PIC mikrovezérlőt, és olyan programot töltesz bele, ami kezeli az USB kapcsolatot, akkor küldhet és fogadhat adatokat. De ha ugyanabba a mikrovezérlőbe csak egy ledvillogtató programot töltesz, akkor nagy ívben tesz az USB-re.

Nézz szét a honlapomon a PICCOLO projekt-ben, abból talán világosabban láthatók az összefüggések!
(#) adamhollos válasza icserny hozzászólására (») Máj 5, 2011 /
 
köszi
(#) Sanyi806 hozzászólása Máj 5, 2011 /
 
Sziasztok!

Szeretném ismét a segítségeteket kérni, egy MCP4728 DAC ic-vel kapcsolatban. Szeretnék adni neki új "hardware" címet, de ő I2C buszon és *LDAC lábon várja az adatokat, és sehogysem tudom megcsinálni.
  1. void writeAddress(int oldAddress, int newAddress) {
  2.  Output_High(DAC_LDAC);
  3.  i2c_Start();
  4.  i2c_Write(0B11000000 | (oldAddress << 1));
  5.  i2c_Start();
  6. Output_Bit(DAC_LDAC, 0B01100001 | (oldAddress << 2)); // modified command for LDAC pin latch
  7.   i2c_write(0B01100010 | (newAddress << 2));
  8.   i2c_write(0B01100011 | (newAddress << 2));
  9.   i2c_stop();
  10. }
  11. // használat
  12. writeAddress(0,1); //régi cím: 000  új cím: 001

Az Arduino fórumon találtam példát de nem tudom CCS-re fordítani, úgy, hogy működjön is. A fenti kód a fordítás, itt az eredeti:
  1. //Original library is from fat16lib , http://forums.adafruit.com/viewtopic.php?f=25&t=13722
  2.  
  3. void readAddress() {
  4.   digitalWrite(LDACpin, HIGH);
  5.   i2c.start(0B00000000);
  6.   i2c.ldacwrite(0B00001100, LDACpin); // modified command for LDAC pin latch
  7.   i2c.restart(0B11000001);
  8.   uint8_t address = i2c.read(true);
  9.   i2c.stop();
  10.   int scanedAddress = (address & 0B00001110) >> 1;
  11.   Serial.print("Scaned Address = ");
  12.   Serial.print(scanedAddress,DEC);
  13.   Serial.print("(");
  14.   Serial.print(scanedAddress,BIN);
  15.   Serial.println(")");
  16. }
  17.  
  18. void writeAddress(int oldAddress, int newAddress) {
  19.   digitalWrite(LDACpin, HIGH);
  20.   i2c.start(0B11000000 | (oldAddress << 1));
  21.   i2c.ldacwrite(0B01100001 | (oldAddress << 2), LDACpin); // modified command for LDAC pin latch
  22.   i2c.write(0B01100010 | (newAddress << 2));
  23.   i2c.write(0B01100011 | (newAddress << 2));
  24.   i2c.stop();
  25. }

i2c.ldacwrite(..); ez mi lehet? -én Output_Bit(..); -nek fordítottam. Az ic dokumentuma itt található. A 42.oldalon (is) van ábra és leírás erről.
Előre is köszönöm a segítségeket! Jó éjt! Sanyi
(#) vilmosd válasza Sanyi806 hozzászólására (») Máj 5, 2011 /
 
Idézet:
„ő I2C buszon és *LDAC lábon várja az adatokat”
A SDA labon varja az adatokat, a LDAC lab a beirt adatokat irja at a DAC regiszterebe.
(#) Sanyi806 válasza vilmosd hozzászólására (») Máj 6, 2011 /
 
Szia!
Tudom, hogy az SDA-n várja az adatot, ott is küldöm, csak még nem találkoztam ilyen megoldással, és tegnap kicsit késő volt már; és a fogalmazásgátló is úrrá lett rajtam a fáradsággal együt. A gond már ott kezdődik, hogy nem értem ilyen esetben hogyan "szólítsam" meg, mert a dokumentum szerint, ha jól értelmezem, a general call hívást kell használni, de akkor most azzal hívom, vagy a "hagyományos" address byte-al amit az ábrán mutat? -egyikkel sem működött nekem, vagy nem jól "rángatom" az *LDAC-t? Vezérelni nagyjából tudom az ic-t; SDA-SCL 10K VDD; *LDAC csak PIC-re nincs felhúzva. Remélem valaki tud segíteni benne.
Köszönöm!
(#) icserny válasza Sanyi806 hozzászólására (») Máj 6, 2011 /
 
Az adatlapban az áll, hogy a cím megváltoztatható az EEPROM átprogramozásával. Ha ismeretlen az eredeti cím, akkor "általános hívással" ki kell olvasni a címet (lásd 5.4.4 ábra), majd ezt a címet használva lehet beállítani az új címet (5.6.8 szekció), vagy a kiolvasott címet kell használni a továbbiakban.

Egyébként vásárláskor/rendeléskor a típusjelzés utáni A0, A1, Ax jelzi, hogy mi az alapértelmezett 7 bites cím alsó három bitje (a felső 4 bit pedig mindig 0b1100).
(#) Hp41C válasza Sanyi806 hozzászólására (») Máj 6, 2011 /
 
Szia!

A LDAC jelnek nincs köze az alap I2C kommunikációhoz, arra való, hogy a bemeneti regiszterekben előkészített értékeket egyszerre írja át a kimenetiekbe, azaz ne legyen közöttük időbeli csúszás. Be kell állítani a csatornákhoz tartozó új értékeket, aztán a LDAC alacsony szintre kell vinni, ekkor egyszerre átíródnak az adatok. A kommunikációban van egy lehetőség (Fig. 5.8) az adat átírásáraaz UDAC bittel - csatornánként lehet csak beírni...
A másik megoldás az LDAC állandó alacsony szintje, ekkor a beírás után automatikusan átmásolódik az adat a csatorna kimeneti regiszterébe.

Milyen értéket állítasz be a referencia kiválsztása (Ref Select) és a mód (Power-Down Select) bitekre?
Megkapja a külső referencia feszültséget?
(#) Sanyi806 válasza Hp41C hozzászólására (») Máj 6, 2011 /
 
Sziasztok!
Köszönöm a hozzászólásokat! -de félreértettétek a problémám. Vezérelni tudom, és működik is (szerencsére):
  1. #ifndef DAC_SDA
  2.  #define DAC_SDA   PIN_C1
  3.  #define DAC_SCL   PIN_C0
  4.  #define DAC_LDAC  PIN_C2
  5. #endif
  6.  
  7. #use I2c(Master, Sda=DAC_SDA, Scl=DAC_SCL)
  8.  
  9. #define SingleWrite 0b01011000
  10. #define A_Ch 0b00
  11. #define B_Ch 0b01
  12. #define C_Ch 0b10
  13. #define D_Ch 0b11
  14.  
  15. #define MSBi12(Var) (Var >> 8)
  16. #define LSBi12(Var) (Var & 0xFF)
  17.  
  18. Struct Mcp4728__Data{
  19.  Unsigned Int1  Vref;      // Vref = 0; Vref = Vdd; -->> Gain 1x
  20.  Unsigned Int8  PowerDown; // Power Down = 0;
  21.  Unsigned Int8  Gain;      // Gain 1x = 0; -->> Vref = Vdd
  22.  Unsigned Int1  UDAC;      // Update Output = 0;
  23.  Unsigned Int8  Channel;   // A_Ch...D_Ch
  24.  Unsigned Int16 Data;      // Analog Output: 0...4095
  25. }Mcp4728_Data;
  26.  
  27. Void Mcp4728_Write(){
  28.  I2c_Start();
  29.  I2c_Write(0b11000000);  // 1100 Fix  000 Address és 0 R/*W
  30.  I2c_Write(SingleWrite | (Mcp4728_Data.Channel << 1) | Mcp4728_Data.UDAC);
  31.  I2c_Write(Mcp4728_Data.Vref << 7 | Mcp4728_Data.PowerDown << 5 |
  32.            Mcp4728_Data.Gain << 4 | MSBi12(Mcp4728_Data.Data));
  33.  I2c_Write(LSBi12(Mcp4728_Data.Data));
  34.  I2c_Stop();
  35.  Output_Low(DAC_LDAC); // UPDATE CHANNEL
  36. }
  37.  
  38. // A hívás pedig:
  39.  
  40. Mcp4728_Data.Vref = 0;
  41. Mcp4728_Data.PowerDown = 0;
  42. Mcp4728_Data.Gain = 0;
  43. Mcp4728_Data.UDAC = 0;
  44. Mcp4728_Data.Channel = A_Ch;
  45. Mcp4728_Data.Data = 3500;    // fél fényel világít a led
  46. Mcp4728_Write();

Nem ez a baj, tudom a gyári I2C address-t is, A2=0; A1=0; A0=0; de pont ezeket szeretném megváltoztatni, hogy 4db-ot tudjak egy I2C buszra kötni, de itt software-esen kell átírni a címet és az nem megy; sem a cím kiolvasása, sem az átírása, mert közben elvileg "rángatni" kellene az *LDAC lábat, de nem tudom hogyan/hányszor és mikor. Ebben kérném a segítségeteket. Köszönöm!
(#) Hp41C válasza Sanyi806 hozzászólására (») Máj 6, 2011 /
 
Szia!

Ahhoz egy szinttel lejebb kell menni az I2C kezelésében, mert a general call 2. adat bájtjának utolsó bitjének elküldése és az ACK között kell a LDAC jelet magasból alacsonyra állítani...
(#) Sanyi806 válasza Hp41C hozzászólására (») Máj 6, 2011 /
 
Szia!
Hát igen, ez a gondom nekem is...
Ugye az egy szinttel lejebb-menésnél nem ASM-re gondolsz?-mert arról fogalmam sincs...
(#) Hp41C válasza Sanyi806 hozzászólására (») Máj 6, 2011 /
 
Szia!

Nem, a gyári C eljárás is rész eljárásokból áll. Ha hozzáférhető a forrása, annek alapján lehet írni egy módosított I2Cwrite_LDAC írásai eljárást. Ha nem, akkor meg kellene írni.
(#) Sanyi806 válasza Hp41C hozzászólására (») Máj 6, 2011 /
 
Szia!
Sajnos CCS-ben nincs forrás, csak pár funkció. A Microchip HI-TECH C PRO for the PIC18 MCU programban elérhető az I2C forrása? Előre is köszönöm!
(#) Hp41C válasza Sanyi806 hozzászólására (») Máj 6, 2011 /
 
Szia!

Egy kis assembly betét ?? Persze ezt is kell még módosítani...
(#) vilmosd hozzászólása Máj 6, 2011 /
 
Hali
Megtort a jeg a Mchp hazatajan: MPLAB X linux-ra es MacOS-re.
(#) trudnai válasza vilmosd hozzászólására (») Máj 6, 2011 /
 
Igen, ez egy Java alapu cucc, Netbeans-en alapszik amugy. Anno a betat nezegettem, eleg baratsagos, mint fejlesztoi kornyezet, de azert erezni, hogy nem nativ kod. Szereny velemenyem szerint egy .NET-el hjobban jartak volna (nem mintha az nativ kod lenne, de valahogy az megis gyorsabb, mint a Java).
(#) Sanyi806 válasza Hp41C hozzászólására (») Máj 6, 2011 /
 
Szia!
ASM-ről sajnos fogalmam sincs...de próbálkoztam.
Ha valaki megtenné, hogy a megnézi a csatolt kódomat, esetleg kijavítja/útbaigazít, nagyon szépen megköszönném!

DAC.c
    
Következő: »»   964 / 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