Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   647 / 1319
(#) jdani válasza watt hozzászólására (») Jan 22, 2010 /
 
bocs, azt hittem, hogy egyszerű ez a program, csip-csap meglenne, de nembaj
(#) icserny válasza Doncso hozzászólására (») Jan 22, 2010 /
 
Hogyne lehetne! Az van a PICkit2 Starter Kit-ben (a Low Pin Count demókártyán). Lásd itt is...
(#) icserny válasza watt hozzászólására (») Jan 22, 2010 /
 
Ebben a cikkben és a hasonló nevű topikban használnak infra távirányítót, esetleg érdemes megnézni/érdeklődni. Azt is tisztázni kell, hogy a távirányítód (gondolom, az már megvan) milyen kódolást/időzítést használ.
(#) fillx hozzászólása Jan 22, 2010 /
 
Sziasztok!

Először is a tapasztaltabb programozó kollégák segítségét szeretném kérni.
Amit el szeretnék érni: 24 poti állásának beolvasása és ezek értékeinek továbbítása.
Ehhez 3 db Analóg Multipexert(CD4051) akarok használni melyek kimenetét AN0, AN1, AN2 portokon olvasnék be, a vezérlést pedig RE0, RE1, RE2 portokon küldeném.
Tudomásom szerint a PIC18F4550 A/D konvertere 10bit-es azaz 0 és 1023 között ad értéket a poti állásáról.
Viszont nekem csak 0 és 127 közötti értékekre lenne szükségem, amit csak akkor küld el ha az érték változott.
Írtam is rá egy programot, melynek egy részletét lentebb beilleszem.
A kapcsolási rajzot is cstolom.

Az lenne a kérdésem, hogy ez így működőképes-e?
Milyen javaslatotok van hogyan működne ez jobban?

A programrészlet:
  1. unsigned char newpotbuff[24];
  2. unsigned char oldpotbuff[24];
  3.  
  4. void initADC(void);
  5. unsigned char doADConvert(unsigned char chan);
  6. unsigned char readADCMuxed(void);
  7.  
  8. void main(void)
  9. {
  10.         initADC(void);
  11.         initButtonMatrix(void);
  12.        
  13.         while(1)
  14.     {
  15.                 newpotbuff = readADCMuxed();                    // 24 poti állásának beolvasása
  16.                
  17.                 for(i = 0; i < 24; i++)
  18.                 {
  19.                         if(oldpotbuff[i] != newpotbuff[i])      // Ha az érték a régihez képest változott
  20.                         {
  21.                                 sendPotValue(i, newpotbuff[i]); // Érték küldése
  22.                         }
  23.                 }
  24.                
  25.                 oldpotbuff = newpotbuff;
  26.                
  27.                 readButtonMatrix();
  28.         }
  29. }
  30.  
  31. void initADC(void)
  32. {
  33.         // ADC beállítás
  34.         TRISA = 0x07;                                   // 00000111 RA0, RA1, RA2 be többi kimenet
  35.  
  36.         ADCON1 = 0x0C                                   // 00001100 Ref.fesz: Vss, Vdd * AN0, AN1, AN2
  37.         ADCON2 = 0xBC                                   // 10111100 Jobbra siftelt * 20 TAD * Fosc/4
  38.        
  39.         // CD4051 vezérlése
  40.         TRISE = 0x00;                                   // kimenetek RE0, RE1, RE2 * A, B, C
  41.         LATE = 0x00;
  42. }
  43.  
  44. unsigned char doADConvert(unsigned char chan)
  45. {
  46.         unsigned int result;
  47.        
  48.         ADCON0 = chan;                                  // Csatorna beállítása
  49.         ADCON0bits.ADON = 1;                    // ADC bekapcs
  50.        
  51.         ADCON0bits.GO = 1;                              // ADC indít
  52.         while(ADCON0bits.NOT_DONE);             // Várj míg konvertál
  53.         result = (ADRESH <<= 8) | ADRESL;       // 10bit-es eredmény
  54.         result = (result / 1024) * 128; // Eredmény
  55.        
  56.         return result;
  57. }
  58.  
  59. unsigned char readADCMuxed(void)
  60. {
  61.         unsigned char a, b, c, d;
  62.         unsigned char ADC_result[24];
  63.        
  64.         c = 0
  65.         for (a = 0; a < 8 ; a++)
  66.         {
  67.                 LATE = a;                                       // MUX vezérlés
  68.                
  69.                 for(b = 0; b < 3; b++)
  70.                 {
  71.                         d = b;
  72.                         d <<= 2;
  73.                         ADC_result[c] = doADConvert(d);
  74.                         c++;
  75.                 }
  76.         }
  77.        
  78.         return ADC_result;
  79. }
  80.  
  81. void initButtonMatrix(void)
  82. {
  83.         TRISB = 0xF0;                                   // 11110000 * RB7-RB4 bemenet RB3-RB0 kimenet
  84.         LATB = 0x00;
  85. }


Üdv. fillx

madpic.gif
    
(#) smrtln hozzászólása Jan 22, 2010 /
 
Sziasztok!
Írtam egy LED váltogató programot és egy késleltető ciklust hozzá és az lenne a kérdésem, hogy alábbi program részlet működne-e így, 10MHz-es kristállyal és PIC16F877-tel:

MOVLW b'00010000'
MOVWF PORTB ;RB4

CALL DELAY

GOTO MAIN

DELAY ;1s-os késleltetés

MOVLW 0X0D ;W=13
MOVWF DELAY1 ;DELAY1=13
MOVLW 0XBB ;W=187
MOVWF DELAY2 ;DELAY2=187
MOVLW 0XAA ;W=170
MOVWF DELAY3 ;DELAY3=170

DELAY_1

DECFSZ DELAY1,F
GOTO DELAY_1

DELAY_2

DECFSZ DELAY2,F
GOTO DELAY_2

DELAY_3

DECFSZ DELAY3,F
GOTO DELAY_3

RETURN

smrtln
(#) kissi válasza smrtln hozzászólására (») Jan 22, 2010 /
 
Szia!

A ciklusokat egymásba kell ágyazni, mert így nagyon messze leszel az 1s-tól ( szimuláld le!!) !

Steve
(#) smrtln hozzászólása Jan 22, 2010 /
 
Szia!

Mivel tudnám leszimulálni?

smrtln
(#) kissi válasza smrtln hozzászólására (») Jan 22, 2010 /
 
Az MPLAB-ban van MPLAB SIM ( Debugger menüpont) !

Steve
(#) Doncso válasza icserny hozzászólására (») Jan 22, 2010 /
 
Szuper, köszönöm.
(#) smrtln hozzászólása Jan 22, 2010 / 1
 
és az hogy működik eltudnád mondani
(#) kissi válasza smrtln hozzászólására (») Jan 22, 2010 /
 
View menüpont Watch-ban kiválasztod, hogy melyik regisztereket akarod vizsgálni, Debugger Stopwatch és az F7, F8 billentyűk!

Próbálgass!

Steve
(#) Hp41C válasza fillx hozzászólására (») Jan 22, 2010 /
 
Szia!

Egy két észrevétel a programmal kapcsolatban:
- Az A/D modult elég egyszer bekapcsolni - tedd át az initADC -be. Be kell állítani a formátumot is ADCON2 regiszterben az ADFM bittel, és az időzítését is a ACQT1.0 bitekkel. Ezen bitek értéke a csatorna kiválasztásnál maradjon meg.
- A stabil érték beállásához a csatorna kiválsztás után várni kell: ld. adatlap 21.1 .
- Az 54. sor szerintem: result = (ADRESH << 8) | ADRESL;
- 55.sor: Mivel a result int, a result/1024 mindig 0.
- Ha csak 7 bites eredmény kell, akkor az 54. - 55. sor helyett : result = (ADRESL >> 1);

Szia
(#) smrtln hozzászólása Jan 22, 2010 /
 
Szia!

Hát nem a kellő 1s-ot kaptam de most már tudom hogy működik a SIM, majd átírom a programom késleltető ciklusát.

Köszi szépen a segítséget!

smrtln
(#) kissi válasza smrtln hozzászólására (») Jan 22, 2010 /
 
OK!

A válaszoknál használd a "Válasz" lehetőséget, hogy aki nézi a fórumot, tudja, hogy mi mihez tartozik!

Jó munkát!

Steve
(#) watt válasza smrtln hozzászólására (») Jan 22, 2010 /
 
Valamint ilyen hosszú kódot ne másolj be, azárt van a csatolás lehetősége...
(#) smrtln válasza kissi hozzászólására (») Jan 22, 2010 /
 
oké csak elfelejtetem
(#) fillx válasza Hp41C hozzászólására (») Jan 22, 2010 /
 
Szia!

Mikor csatornát váltok ADCON2 bitjeit is újra be kell állítani?
Meg még egy kérdés az igaz hogy 7 bites eredmény kell, de ha az a/d konverter 10 bites akkor nem lép fel az a hiba hogy egy bizonyos fok után a poti állását nem érzékeli vagy hibásan állítja?

fillx
(#) Hp41C válasza fillx hozzászólására (») Jan 22, 2010 /
 
Szia!

- Az A/D csatorna váltásánál csak az ADON bit maradjon meg: ADCON0 = (ADCON0 & 1) | (chan);
- Az ADFM bit jelentése nincs nagyon megmegyarázva ezen az adatlapon, de a 18F242 adatlapjában benne van az ábra, amit csatoltam. Állítd az ADFM-et 0- ra, ekkor a 8 legmagasabb bit a ADRESH regiszterbe kerül. A számítás ekkor: result = (ADRESH >> 1);

Szia

AD.JPG
    
(#) cszotyi válasza fillx hozzászólására (») Jan 22, 2010 /
 
Helló !
Csak 1 ötlet, az 55. programsorodra :

  1. result = result / 8;    // Eredmény


Mivel az 1024/128 = 8.
Például a potméter feles állásánál az AD eredményed 512
a result értéke így 64,míg teljesen feltekert potinál pedig 127.
Remélem érthető amit írtam, szerintem így rövidebb és gyorsabb lesz a kód.
(#) sucuka hozzászólása Jan 22, 2010 /
 
Tisztelt Urak, és első sorban watt mester

Adott a watt-féle WPB_RS_v2 programozó általam eagle-be "átemelt" és megépített áramkör. A programozó leírása alapján a WPB_F18_4.25b programmal letesztelve a vonalakat és feszültségeket, minden klappol, és sehol nem mértem (és láttam) zárlatot, szakadást az összeépítés során sem.
Ennek ellenére mégsem gömbölyű valami, mert az említett program a 18F4550-est felismeri, a 16F877A-t pedig nem nagyon akarja.
Van ötletetek, hogy ez miért lehet?
Szeretném előkészíteni az IC-ket az ICD2 ill. PICkit2-höz, és jó lenne, ha sikerülne a dolog.
Különben csatoltam egy képet, ilyen lett.
(#) Hp41C válasza sucuka hozzászólására (») Jan 22, 2010 /
 
Szia!

Ha a 18F4550 -et felismeri a program, akkor a 18F2550 -et is fel fogja ismerni. A 18F2550-nel elindítható a PicKit2. Így már a többi típust a PicKit2-vel lehet programozni.

Szia
(#) sucuka válasza Hp41C hozzászólására (») Jan 22, 2010 /
 
igen az jó is lenne, de a PICkit2 még nincs kész.

Igen... Ismét bebizonyosodott, hogy nem figyeltem eléggé. Hiába, már este van.

Benne van a program nevében: WPB_F18!!!
Tehát csak 18-as szériát kezeli. Én marhameg próbálkozok
(#) Doncso válasza sucuka hozzászólására (») Jan 22, 2010 /
 
Wow, sikerült a vasalás?
(#) sucuka válasza Doncso hozzászólására (») Jan 22, 2010 /
 
Szia!

Igen de ez műnyomós. A vinnyettás valahogy nem akar olyan lenni, amit elvárok. Különben én is ráállok a laminálós dologra, már megvan a szerkezet
(#) Doncso hozzászólása Jan 22, 2010 /
 
Kicsit elakadtam, ha tudna valaki megoldást, a 16F690-nél melyik láb megy a PGD - re és a PGC - re ?
A pickiten megvannak ezek a lábak, a a PIC-adatlapján ez nem egyértelmű nekem.
Előre is köszi.
(#) Doncso válasza Doncso hozzászólására (») Jan 22, 2010 /
 
Időközben megoldódott.
(#) trudnai válasza Doncso hozzászólására (») Jan 22, 2010 /
 
Megtalaltad az adatlapot?
[OFF]Mar annyiszor elhangzott, de ez orok tema: A PIC-ezeshez es egyaltalan az elektronikahoz elengedhetetlen az adatlapok tanulmanyozasa...
(#) Doncso válasza trudnai hozzászólására (») Jan 22, 2010 /
 
Persze, megtaláltam az adatlapot elsőre is, azzal nem volt semmi baj, de az adatlapban a lábkiosztásnál nem találtam sehol hogy PGD illetve PGC, annyira nem vagyok pró, legtöbbször ez nem okoz gondot, a 628-asnál és többnyire a legtöbb pic adatlapjába oda van biggyesztve hogy PGD PGC, más jelölést nem ismerek, ennél meg nem találtam meg.

Idézet:
„PIC-ezeshez es egyaltalan az elektronikahoz elengedhetetlen az adatlapok tanulmanyozasa...”


Tudom én ezt nagyon jól, de ha nem használod nap mint nap, nem ismered a jelöléseket, segítséget csak lehet kérni nem?

Egyébként írtam hogy : a PIC-adatlapján ez nem egyértelmű nekem.
(#) trudnai válasza Doncso hozzászólására (») Jan 22, 2010 /
 
OK, bocsanat, en hibam, valoban irtad.
PGD-t es PGC-t nagyon sokszor ICSPDAT ill ICSPCLK neven emlegetik -- Ugyanaz, csak ez utobbi elnevezes (szamomra legalabbis) egyertelmubb, ICSP-rol leven szo (In-Circuit-Serial-Programming).
(#) sucuka válasza sucuka hozzászólására (») Jan 22, 2010 /
 
Na szóval:
Továbbra is problémát okoz a watt-féle COM portos égetővel a 16F877A.
Eddig két programmal is próbáltam, nem akar sikerülni.

Érdekes módon a 18F4550-es simán programozza, többször visszaellenőrizve is minden oké.
Úgy is, hogy egyik programmal feltolom a tartalmat, a másikkal meg visszaellenőrzöm, így sincs hiba.

Az adatlapok szerint a 40 lábú DIP tokok esetén mindkettőnek ugyanott vannak az ICSP lábak, tehát elkötés is kizárt.

Mit csinálok rosszul?
Következő: »»   647 / 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