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   143 / 1210
(#) KroWka008 hozzászólása Okt 13, 2011 /
 
Sziasztok!

Végre elkészült teljesen a Pickit2 klónom. "Pöccre" indult is, és a Testekben sem volt hiba. A VDD n magas szinten 5v helyett 4.88 at tudtam mérni, ez nem tudom, hogy megfelelő-e..!? Valamint mikor csatlakoztattam , nem csak azt írta a progi ki, hogy: Pickit2 connected. hanem ezt is: "ID = OIHoss" ! Nos ez valójában nem tudom , hogy mit jelent de remélem semmi rosszat. Egyébként a szilva félét építettem után..
(#) peze hozzászólása Okt 13, 2011 /
 
Sziasztok!

Már egy hete boldog tulajdonosa vagyok egy PICkit2
Debug Express-nek,melyhez ugye egy PIC16F887 tartozik.Mivel az assemblerrel is csak azóta kezdtem el foglalkozni,nagy igényeim egyelőre nincsenek.Egy nyomorult led-et szeretnék bekapcsolni gombnyomásra.
A led az RD0-ás lábon,a nyomógomb az RB0-án van.
Eddig ezt a programot sikerült össze szenvedni,de persze nem működik.. Igaz az MPLAB tesztjén át megy:

#include
__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V

ORG 0000
GOTO Beallitasok


Beallitasok

BANKSEL TRISB
BSF TRISB,0
BCF TRISD,0
BANKSEL PORTB

Main

BTFSS PORTB,0
GOTO Main

IDE1

BTFSC PORTB,0
GOTO IDE1
BSF PORTD,0

IDE2

BTFSS PORTB,0
GOTO IDE2

IDE3

BTFSC PORTB,0
GOTO IDE3
BCF PORTD,0
GOTO Main

END

Szóval,ha esetleg valaki rá tudna nézni,mert már vörösek a szemeim..

Előre is köszönöm!

PZ
(#) Poostmaster válasza peze hozzászólására (») Okt 13, 2011 /
 
Valóban több sebből vérzik.
Gondolom a
LIST P=16F887
#INCLUDE 'P16F887.INC' ;ezt lehet, hogy a fórum motorja vette ki.
sorok megvannak, mert a listádban nem látom.

A portokat a program elején töröld.

A PORTB alaphelyzetben analóg bemenet, azt át kell állítanod digitálisra az ANSELH állításával.

A TRIS állítása nem szerencsés bitenként, inkább az egészet állítsad egyszerre (b'00000001')

Ami viszont az egészet meglövi, hogy sehova nem tettél egy várakozó ciklust, tehát lehet, hogy működik, csak te nem látod.
(#) Poostmaster válasza vicsys hozzászólására (») Okt 13, 2011 /
 
A próbapanelemben 20 megás van. ASM-ben próbálkoznék.
(#) Poostmaster válasza Hp41C hozzászólására (») Okt 13, 2011 /
 
Egyelőre nem számít a fogyasztás, a lényeg, hogy működjön nekem. Tesztpanelen dugaszról fog menni.
Gondoltam rá, hogy a legjobb a 32768-as kő lenne, de nem akarnám kicserélni a benne levő 20 megásat ezért.
A cél csak az óra lenne, majd ha sikeresen megírtam, akkor már lehet cicomázni a dolgot. Azért választottam ezt, mert úgy gondolom, az időzítő használatát ezen tudnám elsajátítani legjobban. nekem bármelyik jó a 3-ból. Az említetteket átnézem, de most azért kértem csak egy irányvonalat, hogy más forrás átírása nélkül, saját fejből csináljam.
(#) peze hozzászólása Okt 13, 2011 /
 
Köszönöm,kár,hogy ez még nagyon kínai nekem.
Persze próbálkozok,az időzítést még figyelmen kívül hagyom akkor,csak elméletben működjön..
(#) watt válasza Poostmaster hozzászólására (») Okt 13, 2011 /
 
Ha ragaszkodsz a 20MHz-hez, akkor a korábbi ajánlások szerint készítesz egy órajelet, amiből ki tudsz indulni, bár a Timer2-vel nem lehet kerek értékre osztani: (20MHz/4/16/195/16=100,1602564Hz).
Más Timerekkel pedig bonyolultabb a korrekt időzítést megoldani. Ha neked csak az óra elvének megértése a fontos, akkor ez is jó.
Ha az órajel megvan, már csak náhány számlálót kell készítened regiszterekből. Először a másodperceket kell előállítani a Timer megszakításokban növelt számlálóval. Ha a másodperc ütemjel megvan, akkor már csak az óra számlálóit kell létrehoznod, ezek 60, 60, 24 értékeknél fognak nullázódni, illetve neked kell nulláznod őket és a következő helyiértéket növelned stb.
A kijelzés külön történet, mert nem írtad mivel akarod. pl. LCD, LED, soros port a PC-re stb.
Tehát nézegesd a Timer 2-t és tedd fel a kérdéseket, ha megfogalmazódtak.
(#) Poostmaster válasza peze hozzászólására (») Okt 13, 2011 /
 
Semmiképp se hagyd ki a várakoztatást. Az egyik leggyakrabban használt rutin. Enélkül sosem látod, hogy mit csinálsz. Oda a sikerélmény.

Itt:piclist.com/techref/piclist/codegen/delay.htm
A beállított adatokkal csinál neked egy ciklust, amit a programod végére másolsz, és CALL-al meghívod amikor kell.
Előtte a program elején deklarálod a változókat
cblock 0x20
t1
t2
t3
endc
Az ANSELH a 3-as bankban van.
bsf status, rp0
bsf status, rp1
clrf ANSELH
bcf status, rp0
bcf status, rp1

Olvassad az adatlapot, ott is sok példa van az alkalmazásra.
(#) Hp41C válasza watt hozzászólására (») Okt 13, 2011 /
 
Én máskép osztanám le: (20MHz/4/4/250/1= 5kHz ~ 200uS) avagy (20MHz/4/4/250/5= 1kHz ~ 1mS) avagy (20MHz/16/4/250/5= 250Hz ~ 4mS) és máris kerek a frekvencia...
(#) Poostmaster válasza watt hozzászólására (») Okt 13, 2011 /
 
Úgy látszik, máris gondom van az osztóval.
A beállításoknál leírt állapotok összegezhetők?
Úgy értem, ha több osztó bitet beállítok, akkor hogyan is jön össze? Mert mindjárt szemet szúrt a te sorodban a 195 ami ugye nem 2 hatványa.
(#) Hp41C válasza Poostmaster hozzászólására (») Okt 13, 2011 /
 
Szia!

A pic járhat 20MHz -ről, ha a timer1 a saját oszcilátoráról megy mondjuk 32.768 kHz -es frekvenciáról. Külső órajelet, aszinkron számlálót kell konfigurálni. Figyelembe kell venni a timer 1 errata előírásait...
(#) Hp41C válasza Poostmaster hozzászólására (») Okt 13, 2011 /
 
A timer2 módusa a PR2 regiszter értékével (8 bit) állítható...
(#) icserny válasza Poostmaster hozzászólására (») Okt 13, 2011 /
 
Idézet:
„Gondoltam rá, hogy a legjobb a 32768-as kő lenne, de nem akarnám kicserélni a benne levő 20 megásat ezért.”
Nem kell kicserélni. A 32 kHz-es kvarcot a Timer1-re kell kötni (másodlagos oszcillátor).
(#) doup hozzászólása Okt 13, 2011 /
 
LCD kijezőt szeretnék működésre bírni de sajna nem ír ki semmit és sejtelmem sincs miért.
1 pin: GND
2 pin: 5V
RS: RB4
R/W: GND
E: RB5
D0: GND
D1: GND
D2: GND
D3: GND
D4: RB0
D5: RB1
D6: RB2
D7: RB3
LED+: 5V
LED-: GND

A forrás pedig a követklező ami 16F818 ba van égetve
  1. /*Header******************************************************/
  2.  
  3. // LCD module connections
  4. sbit LCD_RS at RB4_bit;
  5. sbit LCD_EN at RB5_bit;
  6. sbit LCD_D4 at RB0_bit;
  7. sbit LCD_D5 at RB1_bit;
  8. sbit LCD_D6 at RB2_bit;
  9. sbit LCD_D7 at RB3_bit;
  10. sbit LCD_RS_Direction at TRISB4_bit;
  11. sbit LCD_EN_Direction at TRISB5_bit;
  12. sbit LCD_D4_Direction at TRISB0_bit;
  13. sbit LCD_D5_Direction at TRISB1_bit;
  14. sbit LCD_D6_Direction at TRISB2_bit;
  15. sbit LCD_D7_Direction at TRISB3_bit;
  16. // End LCD module connections
  17.                          //
  18. long tlong;                          //
  19.  
  20.  
  21. void InitMain() {
  22.   OSCCON=0x72; // set int-osc 8 Mhz
  23.   while ((OSCCON & 0x4)!=0x4); // wait for clock stable
  24.   delay_ms (500);
  25. }
  26.  
  27. void main() {
  28.     InitMain();
  29.     adcon1 = 0x06;
  30.     porta = 0x00; //A PORTA kimenetre állítom
  31.     portb = 0x00; //A PORTB kimenetre állítom
  32.     Lcd_Init();   // Initialize LCD
  33.     Lcd_Cmd(_LCD_CLEAR);      // Clear LCD
  34.     Lcd_Cmd(_LCD_CURSOR_OFF); // Turn the cursor off
  35.     Lcd_Out(1, 1, " Temperature: ");
  36.  
  37.     // Print degree character, 'C' for Centigrades
  38.     Lcd_Chr(2,13,223);        // different LCD displays have different char code for degree
  39.     // if you see greek alpha letter try typing 178 instead of 223
  40.  
  41.     Lcd_Chr(2,14,'C');
  42. }


Remélem valaki tud segíteni!
(#) peze válasza Poostmaster hozzászólására (») Okt 13, 2011 /
 
Köszönöm a türelmedet..
Egy kicsit már át is alakítottam:

LIST P=16F887
#include
__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
cblock 0x20
t1
t2
t3
endc
org 0

Beallitasok

BSF STATUS,RP0
BCF STATUS,RP1
CLRF ANSELH

MOVLWB'00000001'
MOVWF TRISB

Main

BTFSS PORTB,0
GOTO Main

IDE1

BTFSC PORTB,0
GOTO IDE1
BSF PORTD,0

IDE2

BTFSS PORTB,0
GOTO IDE2

IDE3

BTFSC PORTB,0
GOTO IDE3
BCF PORTD,0
CALL DELAY
GOTO Main

DELAY
MOVLWd'100'
MOVWFT1
DEL
MOVLWd'255'
MOVWFT2
DEL1
MOVLWd'20'
MOVWFT3
DEL2
NOP
NOP
NOP
NOP
NOP
NOP
DECFSZT3,f
GOTODEL2
DECFSZT2,f
GOTODEL1
DECFSZT1,f
GOTODEL
RETURN

END
(#) Poostmaster válasza peze hozzászólására (») Okt 13, 2011 /
 
Alakul.
Ez a teljes program? Mert akkor van még mit javítani.
Mint mondtam, az ANSELH a 3. bankban van. (alaphelyzet a 0.)
Ennek megfelelően a STATUS regiszter RP0, ÉS RP1 bitjét is be kell állítani (adatlap 24-es oldal)
Utána visszalépsz a TRIS bankjába, ami az 1.bankban van. Ezt elég úgy is, ha törlöd az RP1-et.
Alaphelyzetben minden port input, tehát a D-t is át kell állítanod. Ezt törölted belőle?
A késleltetést mindig meg kell hívnod, amikor a led állapota változik.
Bekapcsolod, vársz, hogy megpillanthasd, kikapcsolod, vársz, hogy lásd elaludni.
Ha ez megvan, akkor már csak arról kell gondoskodnod, hogy a nyomógomb érintkezői ne pattogjanak egymáson, ki-be kapcsolva.
Nyugalom, én is így kezdtem nemrég.
(#) peze válasza Poostmaster hozzászólására (») Okt 13, 2011 /
 
Háát,közben már dobtam egy Hubit,mert ezt nehéz idegekkel bírni...
Így már ahhoz is lett elég bátorságom,hogy eláruljam,fogalmam sincs,hogy mit jelent az,hogy "3.bank".Nekem csak két hitelem van..
Igaz,csak egy hete foglalkozom az egésszel,de arra jutottam,hogy egy kisebb összeget megérne,ha valaki egy gyorstalpalót tartana nekem...
Mert persze van már több száz oldal kinyomtatott jegyzetem,de az alap kérdéseimre szeretnék választ kapni...Még szerencse,hogy a kitartásom legendás...
(#) Hp41C válasza peze hozzászólására (») Okt 13, 2011 /
 
Nem kell tudnod fejből a bankokat (ha van elég hely még a programtárban)... A banksel makró segít neked... Azt azért kell tudni, mikor kell beírni. A memória kiosztás felyezetben szokott lenni egy táblázat a SFR -erköl..

Ha az ANSEL regiszterbe akarsz írni 0 -t:
  1. banksel ANSEL
  2. clrf ANSEL
(#) Poostmaster válasza peze hozzászólására (») Okt 13, 2011 /
 
Ebben az esetben azt mondanám, ne írj még programot.
Tanulmányozd a hozzá adott mintákat. Ezen a fórumon segítünk, nem leckét adunk. Ajánlom a http://www.freeweb.hu/t-t/elokep/pic/felhkk.htm
oldalt, itt nagyon részletesen le vannak írva az alapok. Ha van némi számítástechnikai alapod, akkor pár fejezetet át is ugorhatsz. Az alapok nélkül viszont semmire nem fogsz jutni. Az adatlapod megvan a PIC-hez?
(#) watt válasza Hp41C hozzászólására (») Okt 13, 2011 /
 
Valóban.
(#) peze válasza Poostmaster hozzászólására (») Okt 13, 2011 /
 
Igen,igen,meg van.
És már meg is néztem a fent említett 24.oldalt.
Már kezd derengeni,hogy miről is beszéltetek...
Kár,hogy mi még csak érintettük a Z80-as processzort a
suliban.Már több mint 20 éve végeztem elektronikai műszerészként,de igen lelkes vagyok...
A CHIPCAD-hez szeretnék elmenni majd tanfolyamra.
Csak sajnos tudom,hogy sokszor sokkal többet ér a gyakorlat,és egy hozzá értő ember életszagúbb magyarázata...
(#) peze válasza Poostmaster hozzászólására (») Okt 14, 2011 /
 
Szia! Megnéznéd,hogy ez már hasonlít-e egy működőképes megoldáshoz?
És már bújom az adatlapot..

LIST P=16F887
#include
__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
cblock 0x20
d1
d2
d3
endc
org 0

start

Beallitasok

bsf STATUS,RP0
bcf STATUS,RP1

banksel ANSELH
clrf ANSELH
banksel PORTD
movlw B'00011111'
movwf PORTD
bcf STATUS,RP1

Main

bsf TRISB,0
btfss PORTB,B'00000000'
goto Main
bcf PORTD,0
call Delay
goto Main

Delay

movlw0x23
movwfd1
movlw0xB9
movwfd2
movlw0x09
movwfd3

Delay_0

decfszd1, f
goto$+2
decfszd2, f
goto$+2
decfszd3, f
gotoDelay_0
goto$+1
goto$+1
goto$+1
return

END

Előre is köszönöm!
(#) dickheadz hozzászólása Okt 14, 2011 /
 
Sziasztok,
Szembekerültem egy 18F25K80 -as PIC-kel. Keresek olyan embert, aki Sz.fehérváron vagy a közvetlen környéken vállalna program beégetést. Csak 1 darabról lenne szó. Sajna későn néztem, h a PICKIT2 nem kezeli...
Egyúttal kíváncsi lennék arra is, h ez a típus az eltérő égetőfeszültség miatt nem kompatibilis a "régiekkel"? Ha jól tudom, ennek csak 9V kell.
(#) nedudgi válasza dickheadz hozzászólására (») Okt 14, 2011 /
 
Holnap délelőtt felmegyek Budapestre, kedd délutántól megint Agárdon vagyok.
(#) doup hozzászólása Okt 15, 2011 /
 
Sziasztok, van egy numerikus kontrollom ami egy 3X4 mátrix és van rajta 7 db kivezetés. PL. ha az egyes gombot lenyomom akkor a (2, 5) láb van zárva és így tovább. Sejtelmem sincs hogy ezt hogy lehetne a PIC lábaira rákötni bemenetként. Ha valaki csinált már ilyet akkor kérném a segítségét.
(#) kissi válasza doup hozzászólására (») Okt 15, 2011 /
 
Ez a mátrix billentyűzet... az a lényege, hogy Neked van 3 sorod és 4 oszlopod. Az első sorra adsz pl. egy '0' szintet és megnézed, hogy melyik oszlopon jön vissza ( természetesen csak akkor jön vissza, ha lenyomtak egy gombot! ). Egy sornak és egy oszlopnak csak egy közös pontja van, ezért lehet tudni. hogy az ott lévő gombot nyomtad le, amit ezután lekezelsz a szoftverből. Ha ezt folyamatosan kezeled a három sorra vonatkozóan, akkor tudod érzékelni a gomb lenyomását!
Ez természetesen terheli a processzort, ezért vagy megszakítással kell elkészíteni vagy a lekérdezést kell megfelelően időzíteni.
Ha átolvadod, akkor látod, hogy a sorokat kimenetként kezeled, az oszlopokat meg bemenetként!

Steve
(#) doup hozzászólása Okt 15, 2011 /
 
Sziasztok, vettem egy dallas 18b20 hőmérséklet érzékelőt . Ezzel szeretnék egy ventillátort kapcsolni bizonyos hőmérséklet felett. A baj hogy meg sem mozdul.
A bekötése

1: = GND
2: = DQ plusz vcc-re ráhozva 1k ellenállással.
3: = VCC

  1. /*Header******************************************************/
  2. int temp;
  3.  
  4. void main() {
  5.     //--- main loop
  6.     while (1){
  7.         //--- perform temperature reading
  8.         Ow_Reset(&PORTB, 4);       // Onewire reset signal
  9.         Ow_Write(&PORTB, 4, 0xCC); // Issue command SKIP_ROM
  10.         Ow_Write(&PORTB, 4, 0x44); // Issue command CONVERT_T
  11.         Delay_us(120);
  12.         Ow_Reset(&PORTB, 4);
  13.         Ow_Write(&PORTB, 4, 0xCC); // Issue command SKIP_ROM
  14.         Ow_Write(&PORTB, 4, 0xBE); // Issue command READ_SCRATCHPAD
  15.         temp = Ow_Read(&PORTB, 4);
  16.         temp = (Ow_Read(&PORTB, 4) << 8) + temp;
  17.         if(temp < 12)
  18.         {
  19.              PORTA.B0 = 1;
  20.              Delay_ms(100);
  21.         }
  22.         if(temp > 12)
  23.         {
  24.             PORTA.B0 = 1;
  25.             Delay_ms(100);
  26.         }
  27.     }
  28. }
(#) potyo válasza doup hozzászólására (») Okt 15, 2011 /
 
120us túl kevés a mérés indítása és a kiolvasás között. Adatlapból nézd ki, hogy a DS18B20-nál legalább mennyit kell várni. A DS18S20-nál tudom, hogy 750ms-ot kellett.

Az 1k felhúzó lehet, hogy túl kicsi, inkább 4k7-el próbálkozz.
(#) doup válasza potyo hozzászólására (») Okt 15, 2011 /
 
Köszi a gyors választ megnézem amiket mondtál
(#) doup válasza doup hozzászólására (») Okt 15, 2011 /
 
Megnéztem de sajna így sem megy egyébként tényleg 750 ms a kiolvasás!

De azt nem értem hogy miért nem kapcsol be a ventillátor mikor a két if feltétel lehetővé teszi hogy ha nagyobb a temp változó ha kisebb mint 12 akkor így is úgy is be kellene kapcsolnia vagy nem?
  1. if(temp < 12)
  2.         {
  3.              PORTA.B0 = 1;
  4.              Delay_ms(100);
  5.         }
  6. if(temp > 12)
  7.         {
  8.             PORTA.B0 = 1;
  9.             Delay_ms(100);
  10.         }
Következő: »»   143 / 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