Fórum témák
- • Sárga Kazettás Piaci Nintendo (8bit)
- • Lézer érzékelő
- • Napelem alkalmazása a lakás energia ellátásában
- • Hűtőgép probléma
- • Erősítő mindig és mindig
- • Transzformátor készítés, méretezés
- • Kutya macska (vad) riasztó
- • Fejhallgató erősítő
- • Rendelés külföldről (eBay - Paypal)
- • FET vezérlése
- • Muzeális készülékek-alkatrészek restaurálása
- • Oszcilloszkóp, avagy hogyan kell használni?
- • Toroid transzformátor
- • LCD TV probléma
- • Elektromos távirányítós kapunyitó
- • Videomagnó problémák
- • SMD forrasztás profin
- • Érdekességek
- • CNC építése házi alkatrészekből az alapoktól
- • Ki hol gyártatja a NYÁK-ot ?
- • Felajánlás, azaz ingyen elvihető
- • Kazettás magnó (deck) javítása
- • HESTORE.hu
- • Szobatermosztát bekötése
- • Hibrid erősítő
- • Borhűtő vezérlő panel
- • Karácsonyi fényfüzérek
- • Mosogatógép hiba
- • PC táp átalakítás
- • LED-es világítás
- • Kombikazán működési hiba
- • Áramlökés határoló lágyindító
- • Rádió adó építése
- • Akkus lámpa javítás
- • Villanyszerelés
- • Elektromos tolókapu
- • Villanypásztor
- • Li-Po - Li-ion akkumulátor és töltője
- • Gondolkodó ház avagy házautomatizálás
- • Mikrohullámú sütő javítás, magnetron csere, stb.
- • Kapcsolási rajzot keresek
- • Klíma beszerelése, fűtés-hűtés házilag
- • Műhelyünk felszerelése, szerszámai
- • Rádióamatőrök topikja
- • Villanymotor mi a hiba?
- • Eredményjelző
- • Számítógép tápegység
- • Porszívó javítás
- • ARM CPU assembler programozás
- • Autórádió (fejegység) problémák, kérdések, válaszok
- • Számítógép hiba, de mi a probléma?
- • 433 MHz adóvevő modul tapasztalatok
- • Labortápegység készítése
- • Zajos transzformátor
- • Klíma szervizelés, javítás
» Több friss téma
|
- 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.
Heló!
Arra van lehetőség, hogy egy 16 bites PIC B portjának (16 bit) csak a felső 8 bitjét írjuk?
Köszi!
És elárulod hogy hogyan?
Itt nem a maszkolásokra, meg az egyenkénti értékadásokra gondolok, hanem hogy kezelhető e "független" 8 bites portként a felső (vagy esetleg az alsó) 8 bit. A hozzászólás módosítva: Márc 13, 2019
16-bit MCU and DSC Programmer’s Reference Manual
Idézet: „4.4 BYTE OPERATIONS
Since the data memory is byte addressable, most of the base instructions may operate in ither
Byte mode or Word mode.”
Példák:
Sample Byte Move Operations
Note: Instructions that operate in Byte mode must use the “.b” or “.B” instruction
extension to specify a byte instruction.
For example, the following two instructions
are valid forms of a byte clear operation:
CLR.b W0
CLR.B W0
MOV.B #0x30, W0 ; move the literal byte 0x30 to W0
Before Instruction:
W0 = 0x5555
After Instruction:
W0 = 0x5530
MOV.B 0x1000, W0 ; move the byte at 0x1000 to W0
Before Instruction:
W0 = 0x5555
Data Memory 0x1000 = 0x1234
After Instruction:
W0 = 0x5534
Data Memory 0x1000 = 0x1234
MOV.B W0, 0x1001 ; byte move W0 to address 0x1001
Before Instruction:
W0 = 0x1234
Data Memory 0x1000 = 0x5555
After Instruction:
W0 = 0x1234
Data Memory 0x1000 = 0x3455
MOV.B W0, [W1++] ; byte move W0 to [W1], then post-inc W1
Before Instruction:
W0 = 0x1234
W1 = 0x1001
Data Memory 0x1000 = 0x5555
After Instruction:
W0 = 0x1234
W1 = 0x1002
Data Memory 0x1000 = 0x3455
A felső byte a páratlan címen érhető el.
Sőt:
mov.b [W1++],[W2--] ;; a W1 -et növeli 1 -gyel, a W2 -t pedig csökkenti 1 -gyel.
de
mov.w [W1++],[W2--] ;; a W1 -et növeli 2 -vel, a W2 -t pedig csökkenti 2 -vel.
Azért nem árt olvasni az Errata -kat is:
pl: dsPIC33CK Errata
24. pont Idézet: „Upper byte of the destination register may not be persistent” A hozzászólás módosítva: Márc 14, 2019
Idézet: „Persze vannak már ettől légyegesen modernebb, kétirányú digitális kommunikációval működő rendszerek is, de az már nem amatőr/hobbi szint.”
Miért ne. Nem is rossz ötlet! Igen piciben összedobható egyPIC10F322-essel egy áramkőr, amit el lehetne helyezni a mozgásérzékelőben, egyedi azonosító kóddal ellátni, és egy 1-Wire kapcsolattal csatlakozik a központhoz. Ezt is lehetne zónánként más-más bemenetre kötni, így még zárlat esetén sem válik az egész rendszer működésképtelenné.
Köszönöm!
Leírom, hogy pontosan miért is kérdeztem.
A mellékletben lévő lábkiosztással össze szeretnék hozni egy olyan áramkört ami mindenfélét csinál egyszerre, (csak gyakorlásképp) a 7 szegmenses kijelzőn pl. 0-F-ig számol (1s delay-el) közben villog egy led, meg csipog egy csipogó bizonyos esetekben. Plusz a nyomógomb is csinál valamit.
Ezeket a PORTB re kötöttem, (tudom hogy ha az A-ra kötném a kijelzőn kívül a többit akkor könnyebb dolgom lenne!  ) Tehát ha mongjuk kiíratom a PORT B-re hogy 0xFC00 (ami a kijelzőn 0-ként jelenik meg) akkor az alsó 8 bitet 0-ra állítja, így beleszólva pl a LED villogásába, vagy a csipogó csipogásába.
Ezért gondoltam, hogy a felső 8 bitet külön kellene kezelni.
A PORTA használatán vagy a külön bitként kezelésen kívül ez megoldható másképp is? A hozzászólás módosítva: Márc 14, 2019
Ilyenen én is gondolkodtam pár éve, de RS485-el.
Idézet: „Ezt is lehetne zónánként más-más bemenetre kötni, így még zárlat esetén sem válik az egész rendszer működésképtelenné.” Gyárilag ez úgy van megoldva, hogy a működéshez szükséges feszültséget is a központi egység biztosítja és ha valami gubanc van akkor egyszerűen leválasztja magáról a hibás eszközt. Ahogy a hiba megoldódik, automatikusan helyreáll.
János barátom haragszik a "gyári" kommunikációs megoldásokra...
Nincs ezzel baj, mi megértjük a másságát.
Kissé bonyolultabb, de hatékony. Ahogy Pali barátom írta, nem kedvelem túlzottan a "gyári" kommunikációs megoldásokat, de az RS485 konkrétan tetszik azon tulajdonsága miatt, hogy akár 1000m távolságot is képes áthidalni. De ez a szerkezeti felépítésének, nem pedig a protokolljának köszönhető. Egyébként a saját 1-Wire rendszerem is más felépítésű, mint a standard.
Na igen, mert te tudsz programozni. Én csak megcsinálom a hardvert és veregetem a vállam.
Nézd meg a képet.
A C nyelű sor azokat a biteket állítja be az új értékre, amelyeknél a maszkban (az & utáni számban) a neki megfelelő helyen 1 áll. Jelen esetben az alsó 8 bitet módosítja.
Az inline asm sorokban van, amit kerestél.
Az asm("mov.b WREG,LATB"); sor csak az alsó 8 bitet állítja, az asm("mov.b WREG,LATB+1"); pedig csak a felsőket. -- Ha az errata mást nem ír. --
Miért nem próbálod ki? Én most STM32-n kipróbáltam, és arra jutottam, hogy olvasni lehet a PORT-ot bájtonként, írni viszont nem. Ezzel a programmal csináltam (kis módosítással átírható PIC-re is, az ODR a LAT regiszternek felel meg) :
char c;
volatile char* p = (char *)&GPIOA->ODR;
unsigned int i;
GPIOA->ODR = 0x2345;
printf("GPIOA_ODR_32_WRITE (0x2345)\r\n");
i = GPIOA->ODR;
printf("GPIOA_ODR_32 = 0x%X\r\n", i);
c = *p;
printf("GPIOA_ODR_LO = 0x%X\r\n", c);
c = *(p + 1);
printf("GPIOA_ODR_HI = 0x%X\r\n", c);
*(char *)p = 0xA5;
printf("GPIOA_ODR_LO_WRITE (0xA5)\r\n");
i = GPIOA->ODR;
printf("GPIOA_ODR_32 = 0x%X\r\n", i);
GPIOA->ODR = 0x2345;
printf("GPIOA_ODR_32_WRITE (0x2345)\r\n");
i = GPIOA->ODR;
printf("GPIOA_ODR_32 = 0x%X\r\n", i);
*(char *)(p + 1) = 0x5A;
printf("GPIOA_ODR_HI_WRITE (0x5A)\r\n");
i = GPIOA->ODR;
printf("GPIOA_ODR_32 = 0x%X\r\n", i);
A printf eredmények pedig ezek lettek:
GPIOA_ODR_32_WRITE (0x2345)
GPIOA_ODR_32 = 0x2345
GPIOA_ODR_LO = 0x45
GPIOA_ODR_HI = 0x23
GPIOA_ODR_LO_WRITE (0xA5)
GPIOA_ODR_32 = 0xA5A5
GPIOA_ODR_32_WRITE (0x2345)
GPIOA_ODR_32 = 0x2345
GPIOA_ODR_HI_WRITE (0x5A)
GPIOA_ODR_32 = 0x5A5A
Ez ugyan 32bites vezérlő, de az ODR regiszternek csak az alsó 16bitje van használatban. A hozzászólás módosítva: Márc 14, 2019
Köszi a választ!
Kicsit elírtam az előző hozzászólást.
Idézet: „A PORTA használatán vagy a külön bitként kezelésen kívül ez megoldható másképp is?” Itt inkább az volt a kérddés, hogy nincs e valami utasítás C-ben. (csak siettem mikor írtam! Nem figyeltem.) Mert az ASM-et nem ismerem. De az utolsó hozzászólásod alapján menni fog szerintem, Köszi!
@ benjamin Neked is köszi!
Sziasztok!
Nekem egy olyan problémám lenne, hogy sikeresen használok 3db timer2-t, de még szükségem lenne egy timer0-ra is. Amit akárhogy állítok nem akar működni. MPLABX-ben néztem szimulátorban.
PIC16F18456.
Ez a timer beállítása:
void __TMR0_init_1ms(void)
{
T0CON1bits.T0CS = 0b010; // TMR0 órajel forrás Fosc/4 = 1MHz
T0CON1bits.T0ASYNC = 0; // Szinkronizálva Fosc/4-hez.
T0CON1bits.T0CKPS = 0b0010; // Prescaler 1:4
T0CON0bits.T0OUTPS = 0; // Postscaler 1:1
T0CON0bits.T016BIT = 0; // TMR0 8bit-es módban.
TMR0H = 0xFF;
TMR0L = 5;
PIR0bits.TMR0IF = 0;
PIE0bits.TMR0IE = 1;
T0CON0bits.EN = 1; // TMR0 engedélyezve.
}
Elméletileg 8bit-es módban ha TMR0L megegyezik TMR0H-val akkor lesz megszakítás. A megszakításban egyenlőre csak a flag bit-et törlöm.
Hali!
Nem megy nálam sem, szerintem bugos. Próbáld ki hardveren. Ha ott megy, jelents be a Microchip-nél. Én is nemrég találtam egy bogarat és foglalkoznak is vele.
Kipróbáltam debug módban 18F18857-en, ott működik. Szerintem tényleg a szimulátorral lesz a baj.
Helyesbítek! Azzal szimulátorban is működik. A hozzászólás módosítva: Márc 15, 2019
Köszi, hogy megnézted. Már mindenhogy próbáltam. 16bit-es módban is. Nem megy...
Kicseréltem egy timer1-re, az gond nélkül működik.
Holnap kipróbálom élesben is.
Kipróbáltam HW-en. Működik a TMR0...
Hi,
Ismét elakadtam  Egy egyszerű PWM-es LED villogtatást szeretnék csinálni a PIC16LF18456-on.
Beállítottam a TMR2-t utána a PWM-et és a PPS-be kiválasztottam az RA2-t PWM kimenetnek.
Tudom, nem túl elegáns megoldás. Nem is működik  Próbáltam a CCP modult is, az sem működik. Nem tudom hol lehet a baj.
Ez a kód:
void __TMR2_init_10ms(void) // TMR2 NORMÁL módban
{
T2CLKCONbits.CS = 0b0001; // TMR2 órajel forrás Fosc/4 = 1MHz
T2CONbits.CKPS = 0b010; // TMR2 prescaler 1:4
T2CONbits.OUTPS = 0b1001; // TMR2 postcaler 1:10
T2HLTbits.PSYNC = 1; // TMR2 prescaler kimenete szinkronizált Fosc/4-hez.
T2HLTbits.CKPOL = 0; // TMR2 polaritás: felfutóél.
T2HLTbits.CKSYNC = 1; // ON bit szinkronizálva a timer clk-hoz. Az ON bit, beállítása után két órajel ciklust követöen kerül engedélyezésre.
T2HLTbits.MODE = 0; // Normál mód.
T2PR = 250; // TMR2 periód regiszter beállítva 10ms-os idözítésre. f=100Hz
PIR4bits.TMR2IF = 0; // TMR2 megszakítás flag törölve.
PIE4bits.TMR2IE = 1; // TMR2 megszakítás engedélyezve.
T2CONbits.ON = 1; // TMR2 engedélyezve.
}
void PWM_init(void)
{
RA2PPS = 0x0D; // RA2 PWM6out
CCPTMRS1 = 0b00000100; // timer2 hozzárendelve.
PWM6CONbits.POL = 0; // nem invertált mód.
TRISAbits.TRISA2 = 0;
PWM6CONbits.EN = 1;
}
for(DUTY = 0; DUTY < 1000; DUTY++)
{
PWM6DC = DUTY; // Kitöltés növelése
__delay_us(300);
}
for(DUTY = 1000; DUTY > 0; DUTY--)
{
PWM6DC = DUTY; // Kitöltés csökkentése
__delay_ms(1);
Szimulátoron nem működik vagy hardveren?
Estét! x értéke 0 - 0xFFFF -ig terjedhet. A modulo kiváltására van valamilyen kevésbé időigényes függvény?
Előre is!
Csak akkor váltható ki a modulo egyszerűbb műveletekkel, ha az osztó 2 valamelyik hatványa. Ekkor egyszerű and művelet lesz belőle.
Osztás - modulo assembly rutinok
Az a rész (AND függvény) megvan. Nem találtam MOD-ra helyettesítést, úgy tűnik, nem véletlen.
Egész véletlenül nem BCD -re szeretnél konvertálni egy számot?
Arra egész jó, kevés utasításból álló rutin van a belinkelt oldalon:
;******************************************************************
; Convert 32-bit binary number at <bin> into a bcd number
; at <bcd>. Uses Mike Keitz's procedure for handling bcd
; adjust; Modified Microchip AN526 for 32-bits.
b2bcd movlw 32 ; 32-bits
movwf ii ; make cycle counter
clrf bcd ; clear result area
clrf bcd+1
clrf bcd+2
clrf bcd+3
clrf bcd+4
b2bcd2 movlw bcd ; make pointer
movwf fsr
movlw 5
movwf cnt
; Mike's routine:
b2bcd3 movlw 0x33
addwf indf,f ; add to both nybbles
btfsc indf,3 ; test if low result > 7
andlw 0xf0 ; low result >7 so take the 3 out
btfsc indf,7 ; test if high result > 7
andlw 0x0f ; high result > 7 so ok
subwf indf,f ; any results <= 7, subtract back
incf fsr,f ; point to next
decfsz cnt
goto b2bcd3
rlf bin+3,f ; get another bit
rlf bin+2,f
rlf bin+1,f
rlf bin+0,f
rlf bcd+4,f ; put it into bcd
rlf bcd+3,f
rlf bcd+2,f
rlf bcd+1,f
rlf bcd+0,f
decfsz ii,f ; all done?
goto b2bcd2 ; no, loop
return ; yes
end
Jó az ötlet! Igazábol nem BCD kell, hanem egy nagyobb szám (pl. 134 445) számjegyei, viszont így is bőven jó.
Köszönöm!
Szia,
Hardveren. Az MPLAB X szimulátora eléggé kiakaszt, az még hagyján, hogy nem működik a TMR0, de a watchdog-ot sem képes szimulálni  Hardveren megy az is szépen...
Azért kérdem mert még sosem néztem. Ennyire időigényes a modulo? Mennyi az annyi? A hozzászólás módosítva: Márc 23, 2019
|
|