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   1078 / 1203
(#) szucsistvan123 hozzászólása Márc 13, 2019 /
 
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!
(#) lóri válasza szucsistvan123 hozzászólására (») Márc 13, 2019 /
 
Miért ne lehetne?
(#) szucsistvan123 válasza lóri hozzászólására (») Márc 13, 2019 /
 
És elárulod hogy hogyan?
(#) szucsistvan123 válasza szucsistvan123 hozzászólására (») Márc 13, 2019 /
 
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
(#) Hp41C válasza szucsistvan123 hozzászólására (») Márc 14, 2019 / 1
 
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:
  1. Sample Byte Move Operations
  2. Note:   Instructions  that  operate  in Byte  mode  must  use  the  “.b”  or  “.B”  instruction
  3. extension to specify a byte instruction.
  4.  
  5. For example, the following two instructions
  6. are valid forms of a byte clear operation:
  7.          CLR.b  W0
  8.          CLR.B  W0
  9.  
  10. MOV.B   #0x30, W0      ; move the literal byte 0x30 to W0
  11. Before Instruction:
  12. W0 = 0x5555
  13. After Instruction:
  14. W0 = 0x5530
  15. MOV.B   0x1000, W0     ; move the byte at 0x1000 to W0
  16. Before Instruction:
  17. W0 = 0x5555
  18. Data Memory 0x1000 = 0x1234
  19. After Instruction:
  20. W0 = 0x5534
  21. Data Memory 0x1000 = 0x1234
  22. MOV.B   W0, 0x1001     ; byte move W0 to address 0x1001
  23. Before Instruction:
  24. W0 = 0x1234
  25. Data Memory 0x1000 = 0x5555
  26. After Instruction:
  27. W0 = 0x1234
  28. Data Memory 0x1000 = 0x3455
  29. MOV.B   W0, [W1++]     ; byte move W0 to [W1], then post-inc W1
  30. Before Instruction:
  31. W0 = 0x1234
  32. W1 = 0x1001
  33. Data Memory 0x1000 = 0x5555
  34. After Instruction:
  35. W0 = 0x1234
  36. W1 = 0x1002
  37. Data Memory 0x1000 = 0x3455


A felső byte a páratlan címen érhető el.
Sőt:
  1. mov.b [W1++],[W2--] ;; a W1 -et növeli 1 -gyel, a W2 -t pedig csökkenti 1 -gyel.

de
  1. 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
(#) sonajkniz válasza Pali79 hozzászólására (») 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é.
(#) szucsistvan123 válasza Hp41C hozzászólására (») Márc 14, 2019 /
 
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

pinout.png
    
(#) lóri válasza sonajkniz hozzászólására (») Márc 14, 2019 /
 
Ilyenen én is gondolkodtam pár éve, de RS485-el.
(#) Pali79 válasza sonajkniz hozzászólására (») Márc 14, 2019 /
 
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.
(#) Pali79 válasza lóri hozzászólására (») Márc 14, 2019 /
 
János barátom haragszik a "gyári" kommunikációs megoldásokra...
(#) lóri válasza Pali79 hozzászólására (») Márc 14, 2019 /
 
Nincs ezzel baj, mi megértjük a másságát.
(#) sonajkniz válasza lóri hozzászólására (») Márc 14, 2019 /
 
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.
(#) lóri válasza sonajkniz hozzászólására (») Márc 14, 2019 /
 
Na igen, mert te tudsz programozni. Én csak megcsinálom a hardvert és veregetem a vállam.
(#) Hp41C válasza szucsistvan123 hozzászólására (») Márc 14, 2019 / 1
 
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. --
(#) benjami válasza szucsistvan123 hozzászólására (») Márc 14, 2019 / 1
 
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) :
  1. char  c;
  2.   volatile char* p = (char *)&GPIOA->ODR;
  3.   unsigned int   i;
  4.  
  5.   GPIOA->ODR = 0x2345;
  6.   printf("GPIOA_ODR_32_WRITE (0x2345)\r\n");
  7.  
  8.   i = GPIOA->ODR;
  9.   printf("GPIOA_ODR_32 = 0x%X\r\n", i);
  10.  
  11.   c = *p;
  12.   printf("GPIOA_ODR_LO = 0x%X\r\n", c);
  13.   c = *(p + 1);
  14.   printf("GPIOA_ODR_HI = 0x%X\r\n", c);
  15.  
  16.   *(char *)p = 0xA5;
  17.   printf("GPIOA_ODR_LO_WRITE (0xA5)\r\n");
  18.  
  19.   i = GPIOA->ODR;
  20.   printf("GPIOA_ODR_32 = 0x%X\r\n", i);
  21.  
  22.   GPIOA->ODR = 0x2345;
  23.   printf("GPIOA_ODR_32_WRITE (0x2345)\r\n");
  24.  
  25.   i = GPIOA->ODR;
  26.   printf("GPIOA_ODR_32 = 0x%X\r\n", i);
  27.  
  28.   *(char *)(p + 1) = 0x5A;
  29.   printf("GPIOA_ODR_HI_WRITE (0x5A)\r\n");
  30.  
  31.   i = GPIOA->ODR;
  32.   printf("GPIOA_ODR_32 = 0x%X\r\n", i);

A printf eredmények pedig ezek lettek:
  1. GPIOA_ODR_32_WRITE (0x2345)
  2. GPIOA_ODR_32 = 0x2345
  3. GPIOA_ODR_LO = 0x45
  4. GPIOA_ODR_HI = 0x23
  5. GPIOA_ODR_LO_WRITE (0xA5)
  6. GPIOA_ODR_32 = 0xA5A5
  7. GPIOA_ODR_32_WRITE (0x2345)
  8. GPIOA_ODR_32 = 0x2345
  9. GPIOA_ODR_HI_WRITE (0x5A)
  10. 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
(#) szucsistvan123 válasza Hp41C hozzászólására (») 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!
(#) slimcolt hozzászólása Márc 15, 2019 /
 
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:

  1. void __TMR0_init_1ms(void)
  2. {
  3.     T0CON1bits.T0CS = 0b010; // TMR0 órajel forrás Fosc/4 = 1MHz
  4.     T0CON1bits.T0ASYNC = 0; // Szinkronizálva Fosc/4-hez.
  5.     T0CON1bits.T0CKPS = 0b0010; // Prescaler 1:4
  6.     T0CON0bits.T0OUTPS = 0; // Postscaler 1:1
  7.     T0CON0bits.T016BIT = 0; // TMR0 8bit-es módban.
  8.     TMR0H = 0xFF;
  9.     TMR0L = 5;
  10.     PIR0bits.TMR0IF = 0;
  11.     PIE0bits.TMR0IE = 1;
  12.     T0CON0bits.EN = 1; // TMR0 engedélyezve.
  13. }


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.
(#) eSDi válasza slimcolt hozzászólására (») Márc 15, 2019 /
 
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.
(#) eSDi válasza slimcolt hozzászólására (») Márc 15, 2019 /
 
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
(#) slimcolt válasza eSDi hozzászólására (») 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.
(#) slimcolt válasza eSDi hozzászólására (») Márc 17, 2019 /
 
Kipróbáltam HW-en. Működik a TMR0...
(#) slimcolt hozzászólása Márc 17, 2019 /
 
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:

  1. void __TMR2_init_10ms(void) // TMR2 NORMÁL módban
  2. {
  3.     T2CLKCONbits.CS = 0b0001; // TMR2 órajel forrás Fosc/4 = 1MHz
  4.     T2CONbits.CKPS = 0b010; // TMR2 prescaler 1:4
  5.     T2CONbits.OUTPS = 0b1001; // TMR2 postcaler 1:10
  6.     T2HLTbits.PSYNC = 1; // TMR2 prescaler kimenete szinkronizált Fosc/4-hez.
  7.     T2HLTbits.CKPOL = 0; // TMR2 polaritás: felfutóél.
  8.     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.
  9.     T2HLTbits.MODE = 0; // Normál mód.
  10.     T2PR = 250; // TMR2 periód regiszter beállítva 10ms-os idözítésre. f=100Hz
  11.     PIR4bits.TMR2IF = 0; // TMR2 megszakítás flag törölve.
  12.     PIE4bits.TMR2IE = 1; // TMR2 megszakítás engedélyezve.
  13.     T2CONbits.ON = 1; // TMR2 engedélyezve.
  14. }
  15.  
  16. void PWM_init(void)
  17. {
  18.     RA2PPS = 0x0D; // RA2 PWM6out
  19.     CCPTMRS1 = 0b00000100; // timer2 hozzárendelve.
  20.     PWM6CONbits.POL = 0; // nem invertált mód.
  21.     TRISAbits.TRISA2 = 0;
  22.     PWM6CONbits.EN = 1;
  23. }
  24.  
  25. for(DUTY = 0; DUTY < 1000; DUTY++)
  26.             {
  27.              
  28.                 PWM6DC = DUTY; // Kitöltés növelése
  29.                 __delay_us(300);
  30.                                
  31.             }
  32.                
  33.             for(DUTY = 1000; DUTY > 0; DUTY--)
  34.             {
  35.            
  36.                 PWM6DC = DUTY; // Kitöltés csökkentése
  37.                 __delay_ms(1);
(#) usane válasza slimcolt hozzászólására (») Márc 19, 2019 /
 
Szimulátoron nem működik vagy hardveren?
(#) Bakman hozzászólása Márc 22, 2019 /
 
Estét!
  1. y=x MOD 10
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!
(#) Hp41C válasza Bakman hozzászólására (») Márc 22, 2019 /
 
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
(#) Bakman válasza Hp41C hozzászólására (») Márc 22, 2019 /
 
Az a rész (AND függvény) megvan. Nem találtam MOD-ra helyettesítést, úgy tűnik, nem véletlen.
(#) Hp41C válasza Bakman hozzászólására (») Márc 22, 2019 / 1
 
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:
  1. ;******************************************************************
  2. ; Convert 32-bit binary number at <bin> into a bcd number
  3. ; at <bcd>. Uses Mike Keitz's procedure for handling bcd
  4. ; adjust; Modified Microchip AN526 for 32-bits.
  5.  
  6. b2bcd   movlw   32              ; 32-bits
  7.         movwf   ii              ; make cycle counter
  8.         clrf    bcd             ; clear result area
  9.         clrf    bcd+1
  10.         clrf    bcd+2
  11.         clrf    bcd+3
  12.         clrf    bcd+4
  13.        
  14. b2bcd2  movlw   bcd             ; make pointer
  15.         movwf   fsr
  16.         movlw   5
  17.         movwf   cnt
  18.  
  19. ; Mike's routine:
  20.  
  21. b2bcd3  movlw   0x33           
  22.         addwf   indf,f          ; add to both nybbles
  23.         btfsc   indf,3          ; test if low result > 7
  24.         andlw   0xf0            ; low result >7 so take the 3 out
  25.         btfsc   indf,7          ; test if high result > 7
  26.         andlw   0x0f            ; high result > 7 so ok
  27.         subwf   indf,f          ; any results <= 7, subtract back
  28.         incf    fsr,f           ; point to next
  29.         decfsz  cnt
  30.         goto    b2bcd3
  31.        
  32.         rlf     bin+3,f         ; get another bit
  33.         rlf     bin+2,f
  34.         rlf     bin+1,f
  35.         rlf     bin+0,f
  36.         rlf     bcd+4,f         ; put it into bcd
  37.         rlf     bcd+3,f
  38.         rlf     bcd+2,f
  39.         rlf     bcd+1,f
  40.         rlf     bcd+0,f
  41.         decfsz  ii,f            ; all done?
  42.         goto    b2bcd2          ; no, loop
  43.         return                  ; yes
  44.  
  45.         end
(#) Bakman válasza Hp41C hozzászólására (») Márc 22, 2019 /
 
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!
(#) slimcolt válasza usane hozzászólására (») Márc 22, 2019 /
 
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...
(#) usane válasza Bakman hozzászólására (») Márc 23, 2019 /
 
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
Következő: »»   1078 / 1203
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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