Fórum témák
» Több friss téma |
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.
Ü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” 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ú ![]() 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 !
Üdv! Köszi a leírást, lementettem, átnézem.
Ü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 ![]() 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
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?
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.
Ü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.
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;
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:
Így érthető, ezek szerint tetszőlegesen lehet bármelyiket használni.
Köszönöm a választ.
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
Szerintem az analóg bemeneteket nem kapcsoltad át digitálisra
![]()
Elvileg be van állítva minden a TRIS-el, de egyébként az analógra pont nincs kötve semmi.
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.
Na még kiegészítve az előző hsz-t.
A while(1) ciklust cseréld le erre:
Ha ez működik, akkor mehetsz tovább...
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!
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
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.
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
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
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.
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.
Az ANSEL regiszterek törlése digitálisra állít minden bemenetet. Én kerülném a "Reserved" és "Unimplemented" beállításokat.
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.
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
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.
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) . |
Bejelentkezés
Hirdetés |