Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Lapozás: OK   629 / 1210
(#) Gery78 válasza Hp41C hozzászólására (») Feb 2, 2015 /
 
Igen egy ilyen tippem nekem is volt, hogy a szkópszonda kapacitása beterheli az oszcillátor lábakat. 1:10-es osztásban mértem, így 10MOhmos a a szonda bemenete, és a kapacitása 10-20pF körül van. Ez gondolom bőven elég, hogy elhangolja az oszcillátort. Tehát hogyha alvó állapotban van a PIC, akkor nem megy az oszcillátor sem. Akkor nem is biztos, hogy rossz az a PIC. Közben megnéztem a PIC adatlapját, a timer 1-nél van egy olyan funkció, hogy tiltható az oszcillátor működése. Lehet hogy a program tiltja, és gondolom az INT lábon jövő valamilyen jel felébreszti a PIC-et.
(#) Balagemann2031 hozzászólása Feb 3, 2015 /
 
Sziasztok! Mitől lehet az, hogy meghívok egy rutint, és nem a meghívás helyére tér vissza, hanem a program elejére? Vagy a 24-
  1. .include "p24HJ128GP502.inc"
  2.  
  3. .global __reset              
  4.  
  5.         .bss
  6. var1:   .space 2
  7. var2:   .space 2
  8.  
  9. .text                          
  10. __reset:
  11.        
  12. START:
  13.     clr         TRISA
  14.         nop                              
  15.         clr             LATA
  16. main:
  17.         clr                     LATA
  18.         nop
  19.         call            ido
  20.         bset            LATA,#0
  21.         nop
  22.         call            ido
  23.         goto            main
  24.  
  25. ido:
  26.         mov             #1,w1
  27.         mov             w1,var1
  28. egy:
  29.         mov             #1,w1
  30.         mov             w1,var2
  31. ketto:
  32.         nop
  33.         dec             var2
  34.         bra             nz,ketto
  35.         dec             var1
  36.         bra             nz,egy
  37.         return
  38.            
  39. .end
es családban ez nem ilyen egyszerű?
A hozzászólás módosítva: Feb 3, 2015
(#) killbill válasza Balagemann2031 hozzászólására (») Feb 3, 2015 / 1
 
stackpointer-t ki inicializalja?
(#) Balagemann2031 válasza killbill hozzászólására (») Feb 3, 2015 /
 
Ja, hogy azt külön kell?? :O Nem semmi... Köszi!
(#) don_peter válasza spgabor hozzászólására (») Feb 3, 2015 / 1
 
Ez a sor egy makró függvény.
Funkciója gyakorlatilag az, hogy a már behelyettesített adatot lépteti bitenként.
Külön ezt a sort nem nézheted illetve nem értelmezhető, mert szoros együttműködésben áll a következőkkel:
Maga a makró ami bitenkénti siftel, léptet..
  1. #define readbit(data,bitno) ((data>>bitno)&0x01) // Digit kijelzés makrója

A data változó tárolja azt a 8bites már behelyettesített adatot amit ki kell küldeni a shiftregiszternek.
A bitno pedig azt a bit számot tartalmazza amit gyakorlatilag vissza várunk.
(Tehát, ha mondjuk a 8bites adat 0-adik bitjén tárolt adattal akarunk visszatérni és ez a behelyettesített adat így néz ki: 0b01010101 akkor a visszatérési értéke a makrónak 1-lesz.
De ha az 1-es biten tárolt adattal akarunk visszatérni akkor a visszatérési érték amit a shiftregiszterbe tölt be az 0 lesz.)

A véltozó ami tartalmazza a számok megfelelő bitsorrendjét. Gyakorlatilag ez az adat fog kikerülni a kijlező szegmenseire.
  1. unsigned char Digit[10] = {0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09};

Ez pedig az a ciklus ami a bitenként küldi ki a shiftregiszterbe az adatot.
  1. DATA = readbit(Digit[dignum], i);

A DATA változó a shiftergiszet adat lábához tartozik ez a változó felelős azért, hogy a shiftregisztrbe a megfelelő adat kerüljön. (0 vagy 1)
A readbit() maga a makró ami elvégzi a bitenkénti shiftelést és a megfelelő 1bitel tér vissza.
Digit[] tömb tartalmazza a számokat 0-9-ig, de már abban a formában, hogy mikor a kijelzőre kiküldöd, akkor a kijelzőn a látni kívánt szám szegmenseit gyújtsa ki.
dignum változó tartalmazza azt a normál számot amit ki akarsz íratni.
Az i változó a for() cikluson belüli változó ami implementálódik minden egyes lefutásnál és ez felelős, hogy az adott szám behelyettesített értékének melyik bitjével térjen vissza a makró.
Remélem sikerült érthetően elmagyarázni...
A hozzászólás módosítva: Feb 3, 2015
(#) usane válasza Buvarbeka hozzászólására (») Feb 3, 2015 /
 
Igen, gondolom a táplábakon, de vicsys a MCLR és GND közé mondta, ha figyelmesen elolvasod amit írt.
(#) Buvarbeka válasza usane hozzászólására (») Feb 3, 2015 /
 
Igazad van, nem erre gondoltam! Ki fogom próbálni.
(#) spgabor válasza don_peter hozzászólására (») Feb 3, 2015 /
 
Szia!

Köszönöm, ez így már teljesen világos. Azért csak azt az egy sort írtam, mert a shiftelési részt nem láttam át rendesen.
Viszont az nem képzelhető el, hogy nekem azért a Digit változóban más értékeknek kellene lennie, mivel a multiplexelés miatt kicsit más vezérlést igényel a shift register?
(#) killbill válasza don_peter hozzászólására (») Feb 3, 2015 /
 
Nincs olyan, hogy makro fuggveny. Makro van vagy makro definicio. A data es bitno a fenti peldaban NEM VALTOZOK!!! Ezek makroparameterek, es ezeket a C fordito behelyettesiti a hivatkozasbani szoveggel:

Ez egy definicio:

/* A kisebbiket valasztja */
#define MIN(a,b) ((a) < (b) ? (a) : (b))

Es amikor hivatkozol ra:
now = MIN(64, len);
akkor ezt a sort a C elofeldolgozo kicsereli arra, hogy:
now = ((64) < (len) ? (64) : (len));
Es csak ezutan forditja le a sort. Ezt a behelyettesitest a C elofeldolgozo csinalja, nem is maga a C fordito. Pl. gcc eseten ez ket kulon exe.

Tehat az 'a' es 'b' nem valtozok, csak makroparameterek.
A hozzászólás módosítva: Feb 3, 2015
(#) icserny válasza Balagemann2031 hozzászólására (») Feb 3, 2015 /
 
Mielőtt a vermet használnánk, be kell állítani a veremtár mutató kezdőértékét, és célszerű beállítani az SPLIM nevű regiszterben a veremtár felső határát is. Ha a veremtár mérete túlnőne ezen a határon, akkor kivétel keletkezik, s a felhasználói program futása megszakad.

Az alábbi programban a __reset címke utáni első három utasítással állítjuk be SP (azaz W15) és SPLIM kezdőértékét. Az __SP_init és az __SPLIM_init szimbólumok értékét a linker program állítja elő, s ha másképp nem definiáltuk, a linker a lehetséges maximumot állítja be.

  1. ; Verem használata: Example 4-13 from
  2. ; dsPIC30F/33F Programmer’s Reference Manual
  3. ; © 2005 Microchip Technology Inc.
  4.  
  5.         .include "p24Hxxxx.inc"
  6.     .global __reset        
  7.  
  8.          .text        
  9. __reset:  
  10.      mov #__SP_init, W15  ;Veremmutató inicializálása
  11.      mov #__SPLIM_init,W0 ;Verem túlcsordulás
  12.      mov W0, SPLIM        ;határának beállítása
  13.  
  14.      MOV #0x5A5A, W0      ;W0 = 0x5A5A
  15.      MOV #0x3636, W1      ;W1 = 0x3636
  16.      PUSH W0              ;Push W0 -> TOS
  17.      PUSH W1              ;Push W1 -> TOS
  18.      POP  W3              ;Pop TOS -> W3
  19. vege:
  20.      goto    vege         ;végtelen ciklus
  21. .end                      ;Forráskód vége


A fenti programban a W0 és W1 regiszterekbe tetszőleges számokat írva vizsgáljuk a PUSH és a POP utasítások hatására történő adatmozgásokat.
(#) killbill válasza icserny hozzászólására (») Feb 3, 2015 /
 
Idézet:
„akkor kivétel keletkezik”
Ez igy nagyon eroltetett es nincs is semmi ertelme. Ha mindenaron magyaritani kell (bar nem ertem, hogy miert kell minden arva szakkifejezest magyaritani), akkor mar inkabb kizaras.
(#) don_peter válasza spgabor hozzászólására (») Feb 3, 2015 /
 
Nem hinném, főleg azért mert neked a multiplexelést nem egy kijelző belső szegmensei közt kell megoldanod hanem a kijelzők közt.
Amúgy a lábkiosztás számít szóval, elképzelhető az is, hogy nem jó a digitek kódja...
Érdemes sokszor átolvasni amit írunk mert, ha első olvasatra nem is egyértelmű sokadjára biztosan az lesz.
Neked a multiplexelésnél a megfelelő kijelzőkre küldött adatok gyors küldését és a kijelzők meghajtását kell értened.
Nem emlékszem a meghajtásra de talán 1-3, 2-4 vagy is, ha így van aminek mondom most nem néztem utána, akkor elsőnek az 1-es és a 3-as kijelzőre kerülő adatot kel kiküldened majd a 2-esre és 4-esre eső adatot. Ezeket minél gyorsabban egészen addig ameddig már számodra állóképet nem kapsz.

killbill: köszi a fogalmak helyre igazítását...
A hozzászólás módosítva: Feb 3, 2015
(#) spgabor válasza don_peter hozzászólására (») Feb 3, 2015 /
 
Igen, úgy vannak kötve a kijelzők, hogy 1-3, 2-4.
Hát elméletben értem, de még mindig nem tiszta. Vagyis kiküldöm, hogy az 1-3 kijelző legyen aktív (Q1 tranzisztor) és a két szám értéket egymás után, majd fordítva. Viszont itt megint felvetődik egy kérdésem, hogy azt hogy az egyesen vagy a hármason jelenjen meg, azt hogy tudom szabályozni? Meg léptetni oda-vissza a tranzisztorok nyitását?
Átolvasom az egészet újra, meg megnézek pár minta kódot, mert bár azt hittem az elején, hogy egyszerű lesz, mára teljesen elvesztem benne.
A hozzászólás módosítva: Feb 3, 2015
(#) mark.budai hozzászólása Feb 3, 2015 /
 
Sziasztok!
Próbálkoztam a CCS C Compiler programjával. A Device editorban lehet létrehozni új eszközöket, pontosabban csak lehetne. Ha valami műveletet akarok végrehajtani, akkor "File access denied" hibaüzenetet kapok. Mit tudnék vele csinálni? Vagy Ti miben fejlesztitek a programjaitokat? Azért tetszik ez a Compiler, mert az elején a varázslóval rengeteg mindent be lehet állítani, és nem kell begépelni, és ellenőrzi is a kész programot, nem mellesleg nagyon jó felülete van, kiválóan kezelhető. De nekem így sajnos használhatatlan. De a legjobb lenne megoldást találni rá, hogy tudok bele új eszközt tenni. Nagyon fontos lenne!
A hozzászólás módosítva: Feb 3, 2015
(#) don_peter válasza spgabor hozzászólására (») Feb 3, 2015 /
 
Figyelj csak..
Változtasd meg a Digit tömböt erre:
  1. unsigned char Digit[1] = {0xff};

Aztán keresd meg a DATA = readbit(...) ; sort és erre helyettesítsd:
  1. DATA = readbit(Digit[0], i);

Az összes szegmensnek világítania kell, ha nem világít, akkor valami gond van a kapcsolással.
A hozzászólás módosítva: Feb 3, 2015
(#) spgabor válasza don_peter hozzászólására (») Feb 3, 2015 /
 
A harmadik kijelző felső szegmense világít csak. Akkor elképzelhető, hogy az shift register odavan, vagy megint a dugdosós panel szórakozik.
(#) killbill válasza don_peter hozzászólására (») Feb 3, 2015 /
 
Ez a sor eleve nem jo, mert ha a Digit nevu tomb 1 elemu, akkor annak csak a [0]-s elemehez lehet hozzaferni. Amugy egyszerubb lenne egybol azt irni az egesz readbit(...) helyett, hogy 1.
(#) spgabor válasza killbill hozzászólására (») Feb 3, 2015 /
 
  1. void digit_display(int dignum){
  2.     ENABLE = 1;
  3.     CLK=1;
  4.     for(int i = 0; i < 8; i++){
  5.         //DATA = readbit(Digit[dignum], i);
  6.         DATA = 1;
  7.         CLK = 1;
  8.         CLK = 0;
  9.     }
  10.     __delay_ms(10);
  11.     ENABLE = 0;
  12. }


Így gondoltad? Mert így meg sem nyekken a kijelző.
(#) don_peter válasza spgabor hozzászólására (») Feb 3, 2015 /
 
Igen így jó lesz..
Már én is belekeveredek..
Ennek így mennie kellene, az összes szegmensnek világítani kellene..
Ha nem akkor a shiftregiszterrel vagy az egyéb kapcsolással nem stimmel valami...

Esetleg a CLK-t változtasd meg hogy előbb alacsony majd magas szintre kerüljön, hátha nem jó a beállítás...
A hozzászólás módosítva: Feb 3, 2015
(#) spgabor válasza don_peter hozzászólására (») Feb 3, 2015 /
 
de, mégis jó, nem elsőre, csak harmadszorra írta ki mindegyik szegmensre a 8-ast.
(#) mark.budai válasza mark.budai hozzászólására (») Feb 3, 2015 /
 
Fejlemény: Külföldi oldalon írták, hogy adminisztrátorként kell futtatni a chipedit.exe-t. Ezt megtettem, most már tudok újat létrehozni. Az egyikről lemásoltam az adatokat, és megkapta a 16F1705 nevet. Majd a Devices könyvtárban kicseréltem a header file-ját az eredetire. Így ott van a sorban, és használható, sőt utána magától létrehozta az LF-es verziót is.
Most viszont ha nekiállok vele egy egyszerű, mondjuk led villogtatós programnak, mert azt gyorsan begépelem, a Compile gomb megnyomás után kijön egy csomó hibaüzenet, és mind a PIC header fájl-jára mutat. Ennyire különbözne a két verzió, hogy ez már nem tudja értelmezni az új pic headerét?
A hozzászólás módosítva: Feb 3, 2015
(#) don_peter válasza spgabor hozzászólására (») Feb 3, 2015 /
 
Na akkor az jó, most mehet az amit elsőnek írtam és írjál ki mondjuk mindegyikre 1-eseket vagy bármilyen számot 0-9 közt..
  1. unsigned char Digit[1] = {0x03};

  1. DATA = readbit(Digit[0], i);

Ez csak azt a számot fogja kiírni amit te adsz...
Ha nem azt látod amit ki akarsz íratni akkor neked nem lesz jó a megadott Digit sorozat.
(vagy még esetleg lehet elkötés is)
A hozzászólás módosítva: Feb 3, 2015
(#) spgabor válasza don_peter hozzászólására (») Feb 3, 2015 /
 
erre csak az első kijelzőn kettő és a harmadik kijelzőn egy szegmenst kapcsol fel
(#) don_peter válasza spgabor hozzászólására (») Feb 3, 2015 /
 
Akkor itt már valami gond van.
8 bites ez a shiftregiszter?

Közben nézem az adatlapját, és ez 16bites... Nem csoda ha nem megy...
A hozzászólás módosítva: Feb 3, 2015
(#) spgabor válasza don_peter hozzászólására (») Feb 3, 2015 /
 
16 bites

sda2131.pdf
    
(#) don_peter válasza spgabor hozzászólására (») Feb 3, 2015 /
 
Igen közben vissza lapoztam a topik-ot..
Nos az egyik gond az lehet, hogy 8bitet adtunk csak neki a 16bit helyett.
Az első amit ki kellene próbálni, hogy 16bitet küldünk ki és nem csak 8-at és megnézzük mit csinál..
Valahogy így:
  1. void digit_display(int dignum){
  2.         ENABLE = 1;
  3.         CLK=1;
  4.         for(int i = 0; i < 8; i++){
  5.             DATA = readbit(Digit[0], i);
  6.             CLK = 1;
  7.             CLK = 0;
  8.         }
  9. for(int i = 0; i < 8; i++){
  10.             DATA = readbit(Digit[0], i);
  11.             CLK = 1;
  12.             CLK = 0;
  13.         }
  14.         __delay_ms(10);
  15.         ENABLE = 0;
  16.     }

Csak tesztelésre, ezt persze lehet finomítani...
Most elvileg mind 2 kijelzőn ugyan azt kell látnod..
A hozzászólás módosítva: Feb 3, 2015
(#) killbill válasza spgabor hozzászólására (») Feb 3, 2015 / 1
 
Ez a dolog tobb ponton is hibas. Eloszor is, tul gyors az orajel. Azon felul a az ENABLE=1 utani CLK=1 sor nem kell.
A CLK=1 es CLK=0 sorok koze kell legalabb 1us warakozas, es a CLK=0 utan meg legalabb 2us. Nem tudom, hogy ezt a piceden hogyan lehet megoldani, de enelkul nem lesz jo.
Es igen, nem nyolc, hanem 16 bitet kellene beleshiftelni.

  1. void ketdigit(uint16_t adatok)
  2. {
  3. int  i;
  4.  
  5.   ENABLE = 1;
  6.   __delay_us(1);
  7.  
  8.   for(i = 0; i < 16; ++i, adatok >>= 1){
  9.     DATA = adatok & 1;
  10.     CLK = 1;
  11.     __delay_us(1);
  12.     CLK = 0;
  13.     __delay_us(2);
  14.   }
  15.   ENABLE = 0;
  16. }
A hozzászólás módosítva: Feb 3, 2015
(#) icserny válasza killbill hozzászólására (») Feb 3, 2015 /
 
Erre csak azt tudom mondani, hogy az "exception" hivatalos magyar megfelelője a magyar szakirodalomban a "kivétel". Bővebben: Link Nem én találtam, ki, csak tartom magam hozzá, ha már van ilyen bevált (bár szerintem is vitatható) fogalom.

Magyarra fordítani pedig azért kell, mert magyarok vagyunk és azt szeretnénk, hogy az anyanyelvünk ne sorvadjon el. Semmiképp sem szeretnék olyan "magyar" leírásokat olvasni, mint az informatika hajnalán a magyar gyártmányú miniszámítógép gépkönyvében: "A switch regiszteren beloadoljuk a Start Address-t".
(#) killbill válasza icserny hozzászólására (») Feb 3, 2015 /
 
Idézet:
„Erre csak azt tudom mondani, hogy az "exception" hivatalos magyar megfelelője a magyar szakirodalomban a "kivétel".”
Ertem, nem vitatom. De attol meg nagyon furcsa.

Szerintem az anyanyelvunk nem attol sorvad el, hogy egy szakmai szovegben idegen eredetu szakkifejezeseket hasznalunk, hanem inkabb attol, hogy minden i-re vegzodik (tali, telcsi, burgi, foki), meg attol, hogy egyenlore, muszaly, nah, jah es tarsai, irasjelek hibas vagy hianyos hasznalata, kozpontozas, stb. Az ekezet nelkuli iras is biztosan idetartozik. Ez is csak lustasagbol es 30 eves megszokasbol fakad. Angol billentyűzet, linux, fvwm, ezért körülményes az ékezetek használata.
(#) zlanczky hozzászólása Feb 3, 2015 /
 
Sziasztok, kezdő vagyok elektronika dolgokban... Hogy kell 5V-os processzorral 3.3V-os csipet meghajtani? Mi a level shifter magyarul? Mivel lehet helyettesiteni? Itt a HE oldalakon nem találtam, talán rosszul kerestem.
Udv lz
Következő: »»   629 / 1210
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