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   509 / 1222
(#) Pali79 válasza vicsys hozzászólására (») Ápr 3, 2014 /
 
Milyen analóg módszerre gondolsz?
Ha pwm-et használok akkor kell egy kis fet vagy tranyó a pic és a led közé vagy elég az ellenállás is?
A hozzászólás módosítva: Ápr 3, 2014
(#) vicsys válasza Pali79 hozzászólására (») Ápr 3, 2014 /
 
Én tranzisztort használok. (BC817)
(#) Zsora válasza Pali79 hozzászólására (») Ápr 3, 2014 /
 
Idézet:
„Milyen analóg módszerre gondolsz?”

Bár nem engem kérdeztél, de Vicsys már korábban írta: trimmerpotméteres feszültségosztó a Vdd (+5V), Vo (Vlcd) és Vss (GND) lábak közé.
(#) Pali79 válasza Zsora hozzászólására (») Ápr 3, 2014 /
 
Bocsi mindenkitől, kicsit pongyolán fogalmaztam! Programból, pic általi szabályozásra gondoltam. A trimmeres szabályozást ismerem használom, de talán épp Vicsys egyik youtube-os videójában láttam, hogy nyomógombbal volt szabályozva a háttérvilágítás erőssége. Azt hittem a kontraszt is, de ezek szerint tévedtem.
(#) Zsora válasza Pali79 hozzászólására (») Ápr 3, 2014 /
 
Azt is írta.
A háttérvilágítást meg PWM-mel, tehát programból, PIC által.

A kontrasztot nem szokták menet közben változtatni, egyszer belövik és kész. Ha mégis szükséges, akkor azt is lehet PWM-mel szabályozni.
Ha a fényerőnél elég csupán 1-2 fokozat, akkor azt is meglehet oldani analóg módon. Pl. a LED soros korlátozó ellenállásait kapcsolgatod földre a PIC 1-2 kimenetével. (2 lábal 4 fokozat érhető el.)
A hozzászólás módosítva: Ápr 3, 2014
(#) vicsys válasza Pali79 hozzászólására (») Ápr 3, 2014 /
 
Szerintem Attilának volt ilyen videója. Én a kontrasztnak mostanában egy ellenállást és egy diódát teszek, mert a trimmert is sajnálom bele. Nem kell azt PWM-el szabályozni. A háttárvilágítás meg:
PIC I/O->10k->BC tranya, emitter testen, kollektor->100ohm->LCD katód. Az anód meg +5V-on. Ennyi. A szoftver előállítja a PWM jelet és lehet szabályozgatni.
(#) Pali79 válasza vicsys hozzászólására (») Ápr 3, 2014 /
 
Az ellenállás+dióda kombót milyet és, hogy használod pontosan? Fix ellenállást már én is használtam régen és azt sem tudom mekkorát, de a dióda nem rémlik.
(#) cross51 válasza Pali79 hozzászólására (») Ápr 4, 2014 /
 
Ha a nem PWM-el szeretnéd szabályozni a háttér világítást én a képen látható módon oldottam meg, a kontrasztot meg a V0-ra kötött potival. Az értékeknek nem muszáj ekkorának lennie.

HD44780.png
    
(#) Pali79 válasza cross51 hozzászólására (») Ápr 4, 2014 /
 
Köszi ez is jó megoldás, igaz inkább a programból szabályozhatót preferálom, abból tanulok is mire működni fog rendesen.
Kontrasztnak költséghatékonynak tűnik Vicsys ellenállás+dióda megoldása, csak ez még nem tiszta nekem.
(#) vicsys válasza Pali79 hozzászólására (») Ápr 5, 2014 / 1
 
Itt van a rajz amit keresel. A háttérvilágításhoz kell még egy soros 100ohm, ami lemaradt.
Bővebben: Link
(#) Pali79 válasza vicsys hozzászólására (») Ápr 5, 2014 /
 
(#) Bakman válasza vicsys hozzászólására (») Ápr 5, 2014 /
 
A háttérvilágítás előtétjének értéke attól függ, milyen kijelzőről van szó. 5V -os tápfeszültség mellett 6,8 és 330 Ohm a jellemző.
(#) vicsys válasza Bakman hozzászólására (») Ápr 5, 2014 /
 
Kihagytad a PWM vezérlést. Én csak a biztonság kedvéért tettem bele, mert ha átmenne zárlatba a tranyó, akkor se menjen tönkre az LCD. Alapvetően a PWM jelentősen lecsökkenti az átfolyatott áramot és ha jól van kalibrálva, nem is kell. Tehát újabb 2Ft.-ot lehet megspórolni.
(#) Bakman válasza vicsys hozzászólására (») Ápr 5, 2014 /
 
Az előtétet úgy kell meghatározni, hogy 100 %-os PWM mellett teljes fényereje legyen a háttérnek. Vannak olyan LCD kijelzők, amiknek 6,8 Ohm-os előtét kell folyamatos 5 V mellett és vannak olyanok (szemmel láthatóan csak egy db. LED van benne), amelyeknek 330 Ohm.
(#) n_yálastrubadúr hozzászólása Ápr 5, 2014 /
 
Sziasztok!
Hogyan lehetséges olyan ugrást csiánálni Hi-tech c-ben, hogy mint egy tömb, a kapcsos zárójelben lévő értékkel messzebbre ugrik?
  1. goto [x];
  2. #asm;
  3. point1: nop
  4. point2: nop
  5. point3: nop
  6. point4: nop
  7. point5: nop
  8. #endasm;


Valami ilyesmi, csak ez ugye nem jó
(#) n_yálastrubadúr hozzászólása Ápr 5, 2014 /
 
Tehát nem tudom mennyire értehtő. Asm-ben van ilyen, bár ott sem tudom úgy hogy változó legyen.
  1. #asm;
  2.         goto $+10;
  3.         nop;
  4. #endasm;

a 10 helyén egy változót szeretnék és a switch case szerkezet sem az igazi. Ne vizsgálja végig az összeset. Pont ez a lényeg! Nekem olyan kellene mint a számított ugrás, csak nem tér vissza arról a pontról hanem onann fut még meg nem állítom, vagyis a szerkezet végéig. A feladat instrukció szintű pontosságú időzítésre kellene.
(#) Zsora válasza n_yálastrubadúr hozzászólására (») Ápr 5, 2014 /
 
A 16-bites PIC-eknél erre a feladatra a BRA Wn utasítás használható, aholis a Wn regiszter adja meg az ugrás távolságát. A 8-biteseknél viszont (tudtommal) nincs ilyen utasítás, ott az utasításszámlálót kell közvetlenül manipulálni.
(#) Hp41C válasza Zsora hozzászólására (») Ápr 6, 2014 /
 
A 12F1xxx, 16F1xxx rendelkezik braw utasítással.
(#) Zsora válasza Hp41C hozzászólására (») Ápr 6, 2014 /
 
Valóban! A bővített 8-bites utasításkészletben van BRA ill. BRW utasítás is.
Egyébként a 16-biteseknél időzítésre van utasítástakarékosabb módszer is:
REPEAT Wn
NOP
(#) n_yálastrubadúr válasza Hp41C hozzászólására (») Ápr 6, 2014 /
 
Szia!
Hi-tech c-ben használom az asm-et. De a szimulátorban látom, hogy valami nemjó. Nem oda ugrik ahova kéne.
  1. void Width(void) {
  2.  
  3. #asm;
  4.        
  5.         movlw 1
  6.        
  7.         movf _Count,W
  8.         addwf _PCL
  9.  
  10.         nop
  11.         nop
  12.         nop
  13.        
  14. #endasm;
  15. }


Csak egyet kellene ugrania, assemblyben jó. Így néz ki a hívása:
  1. 23:                     Width();
  2.   0CF7    120A     BCF PCLATH, 0x4
  3.   0CF8    158A     BSF PCLATH, 0x3
  4.   0CF9    275C     CALL 0x75c
  5.   0CFA    120A     BCF PCLATH, 0x4
  6.   0CFB    158A     BSF PCLATH, 0x3
(#) n_yálastrubadúr hozzászólása Ápr 6, 2014 /
 
Megcsináltam a hosszú tábla hívást mert szerintem az a baj. De arra meg ezt írja ki:
Idézet:
„Error [1356] D:\Pic\Propeller.c; 173. fixup overflow referencing psect text388 (0x663) into 1 byte at 0xEC0/0x2 -> 0x760 (Propeller_clock.obj 125/0x2E)”


Ez a program:
  1. #asm
  2.        
  3.  
  4.    movlw  high   (TABLE_START)
  5.    movwf  pclath
  6.    movf   _Count,w
  7.    addlw  TABLE_START
  8.    skpnc
  9.    incf  pclath,f
  10.    movwf  pcl
  11. TABLE_START
  12.    nop
  13.  
  14.  
  15.  
  16.  
  17. #endasm
(#) n_yálastrubadúr hozzászólása Ápr 6, 2014 /
 
Ezzel a résszel van baja.
  1. #asm
  2.    movlw  high   (TABLE_START) // <--
  3.    movwf  pclath
  4.    movf   _Count,w
  5.    addlw  TABLE_START           // <--
  6.    skpnc
  7.    incf  pclath,f
  8.    movwf  pcl
  9. TABLE_START                              //     <--
  10.  
  11.         nop
  12.         nop
  13.        
  14. #endasm
(#) Hp41C válasza n_yálastrubadúr hozzászólására (») Ápr 6, 2014 /
 
Egy ötletem van csak: skpnc helyett btfsc STATUS,0
(#) don_peter hozzászólása Ápr 6, 2014 /
 
Srácok segítséget kérnék.
Alacsony szintű megszakításban kísérletezek, de valamiért nem akar váltani a program:
  1. #include <p18f4550.h>
  2. #include <stdio.h>
  3. #include <delays.h>
  4. #include <tesztheader.h>
  5. #include "p18f4550_pindef.h"
  6. #include "lcd.c"
  7.  
  8. volatile char dummy, cFlag = 0;
  9.  
  10. void lo_isr(void);        //előre deklaráljuk a kiszolgáló
  11. void hi_isr(void);        //eljárásokat
  12. void Delay_ms(unsigned int ms); //Várakoztatás
  13.  
  14. /*PIC18F4550 csak a B PORT alsó 4 bitjén tud megszakítást kezelni, külön bit nem választható (RB7...RB4)
  15. */
  16. /** Magas és alacsony prioritású interrupt vektor
  17.     Magas = 0x0008, Alacsony = 0x0018.
  18. */
  19. #pragma code high_vector_addr=0x08
  20. void high_vector(void) {
  21.   _asm GOTO hi_isr _endasm
  22. }
  23. #pragma code low_vector_addr=0x18
  24. void low_vector(void) {
  25.   _asm GOTO lo_isr _endasm
  26. }
  27. #pragma code             //visszatérünk az alapértelmezett kódszekcióba
  28. #pragma interrupt hi_isr
  29. void hi_isr (void) {
  30.   /* Itt történik a magas prioritású megszakítás tényleges kiszolgálása */
  31. }
  32. #pragma interruptlow lo_isr
  33. void lo_isr (void) {
  34.   /* Itt történik az alacsony prioritású megszakítás tényleges kiszolgálása */
  35.     int x = 3;
  36.     while(x--){
  37.         printf("Megszakítás         ");
  38.         lcd_write(0xC0,0,1,1);  
  39.         printf("Visszaszámol 10-től ");
  40.         lcd_write(0x94,0,1,1);
  41.         printf("3. sor              ");
  42.         lcd_write(0xD4,0,1,1);
  43.         printf("Idő: %02i           ", x);
  44.         lcd_write(0x80,0,1,1);
  45.         Delay_ms(600);
  46.         LAT_B0 = !LAT_B0; //led
  47.     }
  48.     cFlag = 1;
  49.     LAT_B1 = !LAT_B1; //led
  50.     dummy = PORTB;                 //PORTB újraolvasása szünteti meg a kiváltó okot
  51.     INTCONbits.RBIF=0;             //az interrupt jelzőbit törlése
  52. }
  53.  
  54. void Delay_ms(unsigned int ms){ //Bemenet*ms várakozás
  55.    unsigned int i=0;
  56.    for (i=0;i<=ms;i++) Delay1KTCYx(2);
  57. }
  58.  
  59. void main (void){
  60.    
  61.     unsigned int count = 300;
  62.    
  63.     /****************************LCD*************************************/
  64.     pin_out3(TRIS_C0,TRIS_C1,TRIS_C2); //C PORT 0,1,2 lába kimentre állítva (LCD-hez kell)
  65.     lcd_init();             // Az LCD modulinicializálása
  66.     lcd_init_cgram();       // Az ékezetes betűk feltöltése
  67.     stdout = _H_USER;       // Az LCD legyen a standard kimenetnt
  68.     /****************************LCD*************************************/
  69.  
  70.     TRISB=0xF0;       //legyen a B port 0...3 lába ki és a többi bemenet
  71.  
  72.     /***MEGSZAKÍTÁSOK BEÁLLÍTÁSA***/
  73.     RCONbits.IPEN=1;         //Kétszintű interrupt mód engedélyezése
  74.     INTCONbits.GIEH=0;       //Magas prioritású megszakítások tiltása
  75.     INTCONbits.GIEL=1;       //Alacsony prioritású megszakítások engedélyezése
  76.     INTCONbits.RBIF=0;         //PORTB Port Change Interrupt FLAG törlése, mert értéke kezdetben ismeretlen
  77.     INTCONbits.RBIE=1;         //PORTB változásjelző interrupt engedélyezése
  78.     INTCON2bits.RBIP=0;     //PORTB Port Change Interrupt alacsony prioritású megszakítás    
  79.     INTCON2bits.RBPU=0;     //legyen B port minden lába felhúzva (ne lebegjen)
  80.     dummy = PORTB;          //PORTB olvasása törli a korábbi beállást
  81.        
  82.     while (count--){
  83.        
  84.         printf("Interrupt - Kezdőlap");
  85.         lcd_write(0xC0,0,1,1);
  86.         printf("2. sor              ");
  87.         lcd_write(0x94,0,1,1);
  88.         printf("3. sor              ");
  89.         lcd_write(0xD4,0,1,1);
  90.         printf("Count: %03i         ", count);
  91.         lcd_write(0x80,0,1,1);
  92.        
  93.         if (cFlag) {              //ha az eseményjelző be van állítva
  94.             LAT_B1 = !LAT_B1; //Led
  95.             Delay_ms(20);        //kivárjuk a kontaktus pergésének megszűnését
  96.             cFlag = 0;           //töröljük az eseményjelzőt
  97.         }
  98.         Delay_ms(20);
  99.     }//While()
  100. }//Main()

Mi lehet a hiba a kódban?
Nem értem miért nem érzékeli illetve billen át, ha lehúzom testre az RB4-et. (470Ohm ellenálláson keresztül kapcsolom a testhez)
Itt gondolom az RB7...RB4 közt mindegyikre billennie kellene, ha lehúzom alacsony szintre, nem?
PICula projekt után értelmeztem és dobtam össze a próba kódom.
Előre is köszi.
(#) SzervízMacska válasza don_peter hozzászólására (») Ápr 7, 2014 /
 
Nem ellenőriztem, de a kódba az van írva, hogy az alsó 4 biten. Feltételezem, hogy a legkisebb helyiérték felől értendő...
(#) don_peter válasza SzervízMacska hozzászólására (») Ápr 7, 2014 /
 
  1. /*PIC18F4550 csak a B PORT alsó 4 bitjén tud megszakítást kezelni, külön bit nem választható (RB7...RB4)

Erre gondolsz?
Mindenki másként mondja, ezért oda is írtam, hogy (RB7...RB4).
Tehát az RB7, RB6, RB5 és RB4-es biteken tud, csak megszakításokat figyelni.
Tehát, elméletileg, ha valamelyik lábon a fentiek közül, változás áll be (jelen program szerint, ha egy alacsony szint) akkor a változást jelző bit 0-ról egyre vált (bedől) és az alacsony szintű megszakításnak kellene lefutni.
Elég sokszor átfutottam a kódom, de nem értem még is miért nem valósul meg a megszakítás.
Természetesen mind a 4 bitet (RB7...RB4) külön-külön és egyben is próbáltam lehúzni alacsony szintre.
(#) ktamas66 válasza don_peter hozzászólására (») Ápr 7, 2014 /
 
Én nem látom a GIE/GIEH bit engedélyezését. A beállítások után engedélyezd az interruptokat.
(#) n_yálastrubadúr válasza Hp41C hozzászólására (») Ápr 7, 2014 /
 
Szia!
Próbáltam úgy is, de végül gyakorlatilag lemásoltam amit c ben írtam és, hogy mit csinál a hosszútáblánál az lst fájlban. Nagynehezen jó lett és most instrukció pontos késleltetéssel az óra hajszál pontos szétszeletelése is megvan.
(#) don_peter válasza ktamas66 hozzászólására (») Ápr 7, 2014 /
 
70. sortól?
  1. TRISB=0xF0;       //legyen a B port 0...3 lába ki és a többi bemenet
  2.  
  3.     /***MEGSZAKÍTÁSOK BEÁLLÍTÁSA***/
  4.     RCONbits.IPEN=1;         //Kétszintű interrupt mód engedélyezése
  5.     INTCONbits.GIEH=0;       //Magas prioritású megszakítások tiltása
  6.     INTCONbits.GIEL=1;       //Alacsony prioritású megszakítások engedélyezése
  7.     INTCONbits.RBIF=0;         //PORTB Port Change Interrupt FLAG törlése, mert értéke kezdetben ismeretlen
  8.     INTCONbits.RBIE=1;         //PORTB változásjelző interrupt engedélyezése
  9.     INTCON2bits.RBIP=0;     //PORTB Port Change Interrupt alacsony prioritású megszakítás  
  10.     INTCON2bits.RBPU=0;     //legyen B port minden lába felhúzva (ne lebegjen)
  11.     dummy = PORTB;          //PORTB olvasása törli a korábbi beállást


Én még talán arra gondolok, hogy digitálisra kellene átállítanom az egész B Portot.
Lehet ez is gond?
A hozzászólás módosítva: Ápr 7, 2014
(#) ktamas66 válasza don_peter hozzászólására (») Ápr 7, 2014 /
 
A digitálisra állítás biztos nem árt , de a GIE/GIEH-t biztos 1 re kell állítani az engedélyezéshez ( rakd be valahova a 81. sor környékére).
Következő: »»   509 / 1222
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