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   755 / 1216
(#) Pali79 válasza Tomi111 hozzászólására (») Feb 25, 2016 /
 
Ahogy kissi is kifejtette már nem arra használod a SET direktívát amire való. Itt egy jó anyag az assembly programozás alapjairól.
(#) Tomi111 válasza kissi hozzászólására (») Feb 25, 2016 /
 
Üdv!
Először így próbáltam a változók megadását:
Idézet:
„_I1 EQU 0x30
_I2 EQU 0x31
_I3 EQU 0x32
_I4 EQU 0x33
_B1 EQU 0x34
_B2 EQU 0x35
_B3 EQU 0x36
_B4 EQU 0x37”

Az értékek beírását: (a négy _B változót módosítja)
Idézet:
„CALL kiiras
MOVLW B'11111111'
MOVWF _B1
MOVLW B'01001100'
MOVWF _B2
MOVLW B'00100101'
MOVWF _B3
MOVLW B'01100100'
MOVWF _B4
CALL kiiras”

Majd a kiírását a PORTB-re:
Idézet:
„kiir1: MOVLW _B1 ;első digit
MOVWF PORTB
MOVLW B'11111101'
MOVWF PORTA
CALL ido2
MOVLW B'11111111'
MOVWF PORTB
MOVLW B'11111111'
MOVWF PORTA ;első digit
MOVLW _B2 ;második digit
MOVWF PORTB
MOVLW B'11101111' ;11101111
MOVWF PORTA
CALL ido2
MOVLW B'11111111'
MOVWF PORTB
MOVLW B'11111111'
MOVWF PORTA ;második digit”

... ez csak az első két rész. A _B változót beírja PORTB-re, ill az itt megadott értéket PORTA-ba. Na ez valahogy nem működik. Ahogy nézem lényegében ugyanúgy csináltam. Utána próbáltam a _B valtozóknál az EQU-t átírni SET-re. Így sem működött. Viszont ha a kiírás résznél a _B változó helyére közvetlenül beírom az értéket, akkor azt kiírja helyesen. Na megpróbálom újra.
Szimulátor már használtam, igaz most nem. Azt hogy oldjátok meg, ha szimuláltok, hogy pl egy időzítést ne kelljen lépésenként kivárni? Addig átírjátok rövidebbre? PL. ilyet:
Idézet:
„ido2: MOVLW .160
MOVWF _I1
MOVLW .150
MOVWF _I2
NOP
DECFSZ _I2,1
GOTO $-2
DECFSZ _I1,1
GOTO $-6
RETURN”
(#) kissi válasza Tomi111 hozzászólására (») Feb 25, 2016 /
 
Idézet:
„MOVLW _B1 ;első digit
MOVWF PORTB”

Erre írtam, hogy NEM JÓ ! Ez nem a _B1 tartalmát teszi W-be, hanem a címét!!

Idézet:
„Azt hogy oldjátok meg, ha szimuláltok, hogy pl egy időzítést ne kelljen lépésenként kivárni? Addig átírjátok rövidebbre?”


Úgy is lehet, de a tiéd nem olyan hosszú , valamint akkor nem tudsz korrekt időket mérni a StopWatch-al !

A késleltetést célszerű szubrutinban megírni ( CALL KESL ) és akkor F8-al "egy lépésben" megcsinálja vagy használj a te megoldásod mellett BreakPointot ( az adott soron dupla kattintás az egérrle !), tedd a késleltetés végére és akkor normál futtatás mellett ott megáll !
(#) Tomi111 válasza Pali79 hozzászólására (») Feb 25, 2016 /
 
Üdv! Köszi a leírást, lementettem, átnézem.
(#) Tomi111 válasza kissi hozzászólására (») Feb 25, 2016 /
 
Üdv!
Már értelek!!
Akkor a MOVLW _B1 helyett kell a MOVF _B1,W. Így a _B1 értéke kerül a W-be, nem a címe. Akkor működött a programom, ezért írt összevissza szegmenseket állandóan. Folyamatosan a _B változók címe volt kiírva, hiába változtattam az értéküket.
Kipróbálom a szimulátor is, az időzítések szubrutinban vannak.
Köszi a segítséget! Jó, hogy van ez a fórum!!! Üdv! Tomi
(#) kissi válasza Tomi111 hozzászólására (») Feb 25, 2016 /
 
Idézet:
„Folyamatosan a _B változók címe volt kiírva, hiába változtattam az értéküket.”
A hozzászólás módosítva: Feb 25, 2016
(#) Pali79 hozzászólása Feb 25, 2016 /
 
Sziasztok!
Egy PIC16F1507-tel dolgozok. Már a CONFIG megadásánál megakadtam. Itt 2 config van és az általam ismert konfigurációs megadásokat nem fogadja el a fordító. Sikerült egyet úgy megcsinálnom, hogy a fordító elfogadja, de visszaolvasva a PIC-ből, nem azt adja vissza amit kellene. Meg tudná valami mondani, hogy miként kell megadni a konfigot neki?
(#) Pali79 válasza Pali79 hozzászólására (») Feb 25, 2016 /
 
Megoldottam...
(#) Csirkefej hozzászólása Feb 26, 2016 /
 
K150v2 USB égetőröl mondanátok véleményt?

Csak 12F508/509 és esetleg 12F675-öt akarok égetni.
2-3000 forint még nem vág földhöz.

Esetleg ha valakinek van felesleges, akkor BP-en meg is venném. Jobban bízom a fórumtagokban, mint vakera és társaiban.
(#) Tomi111 válasza kissi hozzászólására (») Feb 26, 2016 /
 
Üdv! Feltöltöttem egy videót a működéséről. Rossz a minősége, telefonos( régi nokia) , el is van forgatva, de a működése azért látszik. Elöl, hátul egy hegesztőpajzs plexi között van távtartókkal a nyák. Oldalt nyitott.
(#) apromax hozzászólása Feb 27, 2016 /
 
C ben mit kell érteni az aláhúzással kezdődő értékadáskor, illetve miben különbözik az SFR jelölt bitje szerinti beállítástól?

Például:
_SI2C1IE = 1;

IEC1bits.SI2C1IE = 1;
(#) icserny válasza apromax hozzászólására (») Feb 27, 2016 / 1
 
Ennek nem sok köze van C nyelvhez, csupán annyi, hogy a mikrovezérlő xxx.h fejléc állományában definiált a gyártó ilyen rövidített (ál) neveket:
  1. #define _SI2C1IE IEC1bits.SI2C1IE
(#) apromax válasza icserny hozzászólására (») Feb 27, 2016 /
 
Így érthető, ezek szerint tetszőlegesen lehet bármelyiket használni.
Köszönöm a választ.
(#) c27 hozzászólása Feb 28, 2016 /
 
Sziasztok!

Teljesen elakadtam egy pár soros primitív programmal. Egyszerűen nem működik megfelelően és nem tudok rájönni mi az oka:

#include "config.h"

#define SW1 LATCbits.LATC0 //SWITCH 1 RC0 INPUT
#define SW2 LATCbits.LATC1 //SWITCH 2 RC1
#define LED1 LATDbits.LATD0 //LED 1 RD0 OUTPUT
#define LED2 LATDbits.LATD1 //LED 2 RD1

void main(void) {
PORTA=0;
TRISA = 0XFF;
PORTC = 0x00;
TRISC = 0XFF;
PORTD = 0x00;
TRISD = 0X00;
PORTB=0;
TRISB = 0XFF;

while(1){
while(LATBbits.LATB0){
LED1=1;
}
LED2=1;
LED1=0;
if (LATBbits.LATB1==1){
LATDbits.LATD2=1;
}
}
}

Az RD1 kimenete állandóan 5V, a B0 kapcsoló helyzetétől függetlenül, a B1 pedig fix 5V-ra van kötve, mégis 0 a D2 kimenete. (Proteusban tesztelem nem élesben.) Becsatoltam a configot is.
Egyszerűen nem bírok rájönni mi a hiba, ha még egyszerűbbet írok az sem jó, ha csak egy if van benne úgy sem.
A hozzászólás módosítva: Feb 28, 2016

config.txt
    
(#) kissi válasza c27 hozzászólására (») Feb 28, 2016 /
 
Szerintem az analóg bemeneteket nem kapcsoltad át digitálisra !
(#) c27 válasza kissi hozzászólására (») Feb 28, 2016 /
 
Elvileg be van állítva minden a TRIS-el, de egyébként az analógra pont nincs kötve semmi.
(#) zenetom válasza c27 hozzászólására (») Feb 28, 2016 /
 
Szia!
Van egy-két malőr a kódban. Az analóg perifériát valóban illendő kikapcsolni (és abban nem a TRIS, hanem általában valamilyen ANSEL, ADCON, ANCON..stb regiszterek játszanak szerepet), de itt ez most azért nem lényeges, mert a PORTB-n nincs analóg bemenet.
A hiba inkább annak az aranyszabály megszegésében keresendő, hogy a bemenetet mindig a PORTx regiszterből, és nem a LATx regiszterről olvasunk. Ennek oka itt olvasható: Bővebben: Link.
Maga a program kicsit furán néz ki, de a lényeg, hogy ha egy lábat akarsz vizsgálni, akkor PORTBbits.RB0 néven (vagy PORTBbits.PORTB0, vagy valami ilyesmi...) kell rá hivatkozni, a fenti linkelt oldalon olvasható okok miatt.
(#) zenetom válasza c27 hozzászólására (») Feb 28, 2016 /
 
Na még kiegészítve az előző hsz-t.
A while(1) ciklust cseréld le erre:
  1. while(1)
  2. {
  3.         if (PORTBbits.RB0==1)
  4.         {
  5.                 LED1=1;
  6.         }
  7.         else
  8.         {
  9.                 LED1=0;
  10.         }
  11. }

Ha ez működik, akkor mehetsz tovább...
(#) c27 válasza zenetom hozzászólására (») Feb 28, 2016 /
 
Hát igen már ezért érdemes volt felkelni, kösz. Valahogy azon a részen átsiklottam, pedig így már érthető miért viselkedett "hibása".
Kösz a segítséget!
(#) Zso839 hozzászólása Feb 29, 2016 /
 
Sziasztok!

SourceBoost V7.30-al irtam a programot. Eleinte nem is volt vele gond,mikor kisebb módosításokat végeztem a programban. Viszont az utóbbi pár alkalommal már nem tetszik neki a program. Szerintetek miért írja ki a következő hibaüzenetet (lásd:melléklet)?
Segítségeteket előre is köszönöm!

Zsolt
(#) zenetom válasza Zso839 hozzászólására (») Feb 29, 2016 /
 
Szia!
Biztos így kell definiálni a függvényt? Vagy ez még nincs sehol megírva, most akarod megírni? Esetleg a jelzett sorban a 2. "unsigned char" elhagyható, hisz egyszer már leirtad. De ez csak egy próba-ötlet.
(#) c27 válasza zenetom hozzászólására (») Feb 29, 2016 /
 
Helló!

Sajnos megint elakadtam most az adc-vel. Azt szeretném, ha megnyomok egy nyomógombot a program beolvassa az An0 aktuális értékét és kipakolja a D portra, legalább is most ezt szeretném. (Csak a lényegi részét másoltam be, deígy is próbáltam, lehet rosszul értelmeztem volna az adc beállításait?)

#define SW1 PORTCbits.RC0 //SWITCH 1 RC0 INPUT

void main(void) {

unsigned int POT1=0;

PORTA=0;
TRISA=0X03;
ANSEL0 = 0b00000000; //AN0, AN1 ANALOG OTHERS DIGITAL
ANSEL1 = 0X00;
ADCON0 = 0X00; //SINGLE CHANNEL
ADCON1 = 0X00;
ADCON2 = 0b00011010; //32Tosc 6TAD
ADCON3 = 0b11000000; //ADC INTERRUPT DISABLED
//PORTA = 0;
//TRISA = 0X00;

//PORTD INITIAL
PORTD = 0x00; //PORTD OUTPUT cleared
TRISD = 0X00; //RD0-RD7 OUTPUT

while(1){
if(SW1==0){
ADCHS = 0b11111100; //AN0 SELECTED
ADCON0bits.ADON = 1; //ADC ENEABLE
ADCON0bits.GODONE = 1; //ADC START
while(ADCON0bits.GODONE);
POT1 = ADRESH;
ADCON0bits.ADON = 0;
PORTD=POT1;
}
else{
PORTD=0;
}
}
}
A hozzászólás módosítva: Feb 29, 2016
(#) Zso839 válasza zenetom hozzászólására (») Feb 29, 2016 /
 
Szia Zenetom!

Igen, így van az eredeti programban is. Csak azért furcsa, mert - ahogy írtam is - eleinte nem volt gond vele. Meg azért nem értem a hibaüzenetet ( kevés angol tudásomnál fogva: hiányzó jobb zárójel), mert ott van a zárójel.
Az eredeti programban lefut hiba nélkül.

Zsolt
(#) janikukac hozzászólása Feb 29, 2016 /
 
Sziasztok!
Mi a véleményetek erről? Elképzelhető, hogy a kevés alkatrész ellenére stabil és pontos? Ha igen, akkor belelehetne rakni másik kontrollerbe a programot? Van pl. 16F627, 628, 84A itthon.
(#) mrobi válasza janikukac hozzászólására (») Feb 29, 2016 /
 
Szia!
Az általad felsorolt mikróvezérlőkben nincs ADC. Régebben kisérleteztem LM35-ökkel, igaz, hogy adruino alatt, de eléggé stabilak. Hátrányuk, hogy feszültség kimenetük van, így túl messzire nem lehet elvinni őket. Mostanában én is szemezgettem velük. Hőmérsékletet kellene mérnem 30 és 60m távolságban is. Így ezeket direktben nem lehet használni. Az adatlapon találtam egy olyan kapcsolást, ami 4-20mA-t ad vissza. Az jó lesz ekkora távolságra, kérdés, hogy mennyre lesz pontos. Biztos hogy egy kalibrálást el kell majd végezni.
(#) ktamas66 válasza c27 hozzászólására (») Feb 29, 2016 /
 
Az ANSEL regiszterek törlése digitálisra állít minden bemenetet. Én kerülném a "Reserved" és "Unimplemented" beállításokat.
(#) c27 válasza ktamas66 hozzászólására (») Feb 29, 2016 /
 
Igen az rosszul lett ide bemásolva, de egyébként 2db 1-es van a végén, így sajnos nem az a hiba. Mi az a reserved és unimplemented beállítások?
Egyébként így volt legutóbb:

PORTA=0;
TRISA=0X03;
ANSEL0 = 0b00000011; //AN0, AN1 ANALOG OTHERS DIGITAL
ANSEL1 = 0X00;
ADCON0 = 0X00; //SINGLE CHANNEL
ADCON1 = 0X00;
ADCON2 = 0b00110010; //32Tosc 6TAD
ADCON3 = 0b11000000; //ADC INTERRUPT DISABLED
....

Közbe figyeli a nyomógombot és ha meg van nyomva akkor ezt végrehajtja:

ADCHS = 0b11111100; //AN0 SELECTED
ADCON0bits.ADON = 1; //ADC ENEABLE
Delay1KTCYx(1);
ADCON0bits.GODONE = 1; //ADC START
while(ADCON0bits.GODONE);
POT1 = ADRESH;
ADCON0bits.ADON = 0;

Majd kiírná a D portba az eredményt (elég a felső 8 bit). Lefordulni lefordul, csak az ADRESH szerintem mindig 0.

Próbáltam az adc.h betöltésével így:
OpenADC(ADC_FOSC_32 & ADC_6_TAD & ADC_INT_OFF);
Delay10TCYx(5);
SetChanADC( ADC_CH0 );
ConvertADC();
while ( BusyADC() );
POT1=ReadADC();
CloseADC();

Ha kiveszem s SetChanADC-t akkor is hibát ír ki a fordító(c18), persze azt nem hogy mi a hiba.
(#) apromax hozzászólása Feb 29, 2016 /
 
dsPIC33 illetve PIC24 et szeretnék égetni PK2 vel.
Nagyon nem értem mi történhet, 2 dsPIC és egy P24 is ugyanúgy működik e tekintetben.
A PK2 azonnal felismeri Auto Device Select módban a rá kapcsolt eszközt. Eddig jó.
Ezután program írásakor hibát jelez a PK2:
Downloading Programming Executive....FAILED!
Érdekes, de van olyan is mikor látszólag helyesen éget. Ilyenkor sem tökéletes a programozás, mert a Verify utasítás hibát talál.
Verification of Program Memory Failed.
Tapasztalatom szerint az égetés sikerességét jelentősen elősegíti a memória előzetes törlése.
Ugyanakkor a látszólag beégetett program sem olvasható a Read utasítással sem, arra is hiát ad vissza.
Van esetleg ötlet mi lehet a probléma?
(A panelre nem gyanakszom, van két független áramköröm. A PIC quarz mindig elindul, és 3 processzor nem lehet hibás. Próbáltam Fast Programming módot és a normát, egyik sem hozott javulást. Megcsináltam a PK2 Kalibrációját is.)
Ezek a PIC ek érzékenyebbek? Szívesen vennék ötleteket mi tévő legyek.
A hozzászólás módosítva: Feb 29, 2016
(#) bbalazs_ válasza apromax hozzászólására (») Feb 29, 2016 /
 
Milyen hosszu a vezeteked?
A programozo parok kozul melyiket hasznalod es masra hasznalod-e azokat a labakat, hova vannak bekotve?
A feszultseget is a programozo adja? Merj ra, hogy tenyleg annyi-e amennyi be van allitva.
(#) apromax válasza bbalazs_ hozzászólására (») Feb 29, 2016 /
 
A vezetékek nem hosszúak. Ráadásul éppen ma cseréltem le őket a lehető legrövidebbre egy - egy lengő vezetékre. A Core kapacitást is kicseréltem egy másik Low ESR -re, mert ez volt még közös a két panelon. (IC DIP típus, és foglalatban van, így könnyebb a tesztelés)
Más lényegében nincs is a kapcsolásban, illetve néhány Port lábon előtéttel egy - egy LED.
A program lábakat (PGED2, PGEC2) másra nem használom.
A tápot külön soros Ref IC adja, az mérve rendben van. Természetesen ott a puffer kondi és a PIC táp lábhoz nagyon közel a 100 nF kerámia (SMD kivitelben)

.
Következő: »»   755 / 1216
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