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   382 / 1210
(#) icserny válasza hepi02 hozzászólására (») Márc 13, 2013 /
 
Idézet:
„Eredetileg én is timerekkel álltam neki, csak nem boldogulok vele.”
Azért adtam meg a linket a honlapomhoz, mert ott minden szükséges információt megtalálsz. Három jel egyidejű számlálása a legpontosabban úgy végezhető, ha teszel a PIC elé egy kapuzó áramkört, ami (egy kimenet billegtetésével) egyidejűleg tiltja vagy engedélyezi a bemeneteket.
ha néhány utasításciklusnyi eltérés nem zavar, akkor erre nincs szükség.
Idézet:
„Privátban megkereshetlek esetleg?”
Nem. A felmerülő problémákat itt érdemes tisztázni, hogy más is okuljon belőle.
(#) hepi02 válasza icserny hozzászólására (») Márc 13, 2013 /
 
Rendben van, átolvasom az oldalad, de így első ránézésre ez ágyúval verébre. Nekem egy jóval egyszerűbb felépítésű MCU is bőven megtenné.

A privátra pedig azért gondoltam, mert már többször fel lett vetve a problémám, de megoldás még nem született rá, így gondoltam nem szemetelném a topicot tovább azzal, hogy újra és újra felteszem ugyan azt a kérdést.

Köszönöm, hogy foglalkozol a problémámmal. Az eredeti problémám, amire még nem érkezett válasz az alábbi:

PIC16F628A MCU-t használok és Hitech-C-vel kódolok c nyelven.

A program:
  1. #include <htc.h>
  2. #include "pic.h"
  3. #include "lcd.h"
  4.  
  5. #define _XTAL_FREQ 4000000      //4MHz
  6.  
  7. __CONFIG(XT & WDTDIS & PWRTDIS & BORDIS & LVPDIS & UNPROTECT & MCLREN);
  8. unsigned short i, DD0, DD1, DD2, DD3;
  9.                
  10. unsigned int FM2;                    
  11.  
  12. void wait(int i);
  13. char lookup(int numb);
  14.  
  15. void main()
  16. {
  17.         T1CON  = 0b00000011;          
  18.         TRISB  = 0b01000000;          
  19.         PORTB  = 0x00;      
  20.         CMCON  = 7 ;                
  21.         OPTION = 0b00111000;          
  22.         lcd_init();                              
  23.         lcd_clear();                  
  24.         while(1)                                              
  25.         {                                                
  26.                 TMR1L   = 0;              
  27.                 wait(5);                                      
  28.                 FM2 = TMR1L;              
  29.  
  30.  
  31.                DD0 = FM2%10;            
  32.                FM2 = FM2/10;      
  33.                DD1 = FM2%10;      
  34.                FM2 = FM2/10;      
  35.                DD2 = FM2%10;      
  36.                DD3 = FM2/10;      
  37.                ch1 = lookup(DD3);            
  38.                ch2 = lookup(DD2);
  39.                ch3 = lookup(DD1);
  40.                ch4 = lookup(DD0);
  41.                lcd_goto(0x40);                        
  42.                lcd_putch(ch1);            
  43.                lcd_putch(ch2);
  44.                lcd_putch(ch3);
  45.                lcd_putch(ch4);
  46.                lcd_puts(" FM2");
  47.         }
  48. }
  49.  
  50. void wait(int i)
  51. {
  52.         for(int z=0; z<i; z++)
  53.                 __delay_ms(100);                      
  54.  
  55. }
  56.  
  57. char lookup(int numb)
  58. {
  59.     char cha;
  60.     switch (numb) {
  61.         case 0: cha = '0';break;
  62.         case 1: cha = '1';break;
  63.         case 2: cha = '2';break;
  64.         case 3: cha = '3';break;
  65.         case 4: cha = '4';break;
  66.         case 5: cha = '5';break;
  67.         case 6: cha = '6';break;
  68.         case 7: cha = '7';break;
  69.         case 8: cha = '8';break;
  70.         case 9: cha = '9';break;
  71.                 default: cha = '0';break;
  72.     }
  73.     return cha;
  74. }


Kapcsolás: Bővebben: Link
Használt szenzor: Bővebben: Link
Pickit2 Logic tool: http://www.hobbielektronika.hu/forum/topic_post_1402208.html

A problémám az, hogy a pic az 555-ös négyszögjeleit megszámolja és ki is írja a kijelzőre, de a szenzor jelét már nem. Ha a szenzor felhúzó ellenállását a gyárilag megadott méretről lecsökkentem 51 Ohm-ra, akkor kezd el reagálni a csip a szenzor jelére:
elkezdi számolni a jelét, de bizonytalanul és a kijelző is hullámzik a szenzor frekijére.

Ha TMR0-t használok, akkor tökéletesen megszámolja a szenzor jelét és megjeleníti azt a kijelzőn. A csip nem hibás, a szenzor nem hibás.
(#) kissi válasza hepi02 hozzászólására (») Márc 13, 2013 /
 
Szia!
Ez pl. adódhat abból, hogy a TMR0 ST-es bemenet, ha jól láttam, míg az adott láb, amelyiken nézed, nem ( nem láttam, hogy melyik másik lábat használod egyébként, ha az is az RA4, akkor nem ez a gond !) !
(#) valaki2 hozzászólása Márc 13, 2013 /
 
Tudna valaki segiteni a max. baud rate kiszámitásában?
Adatlapoban nem találtam a max. értéket.

Képlet:
UART baud rate = UART module clock / (16 × (SBR[12:0] + BRFD))

SBR: UART Baud Rate Bits
BRFD: Baud Rate Fractional Divisor


A 13-bit modulus counter and a 5-bit fractional fine-adjust counter in the baud rate
generator derive

SBR + BRFD = 18 bit
2^18=262144

UART module clock lehet 120Mhz illetve 60Mhz.

min. baudrate = 120 000 000 / (16*262144) = kb. 28 Baud

max. baudrate = 120 000 000 / (16*1) = kb.7,5 Mega Baud

Lehetséges ez? 7,5 Mega Baud nekem sokank tünik..
(#) hepi02 válasza kissi hozzászólására (») Márc 13, 2013 /
 
RA4(T0CKI) lábat használom a TMR0-hoz és az RB6(T1CKI) lábat a TMR1-hez.
(#) NgLovi hozzászólása Márc 13, 2013 /
 
Üdv!
Olyan rendszert kell építsek, ahol egy számítógép program feladatot ad az ic-nek, hogy az egyik lábán váltson állapotot, 1 tizedmásodperc múlva újra, 3 másodperc múlva újra, fél másodperc múlva újra, és így tovább, mindezt nagyjából 10 lábbal, egymástól függetlenül. Úgy kell elképzelni, mintha egy PWM lenne, ahol minden egyes magas és 0 között én szabom meg az eltelt időt.
Ez idáig egyszerű feladat, abban kéne segíteni, hogy mindezt előre el kell tároltatni a PICkel és később ez alapján végzi el a feladatot. Ezek a feladatok akár 4-5 Mb-osak is lehetnek. Szóval amit tudni szeretnék: Milyen módon célszerű a feladatot továbbítani (USB, LAN, egyéb)? Milyen eszközön tároljak el ilyen mennyiségű adatot (EEPROM, SD kártya, stb)? Hogyan tároljam el, figyelem bevéve azt, hogy pic-et kíméljem az utólagos feldolgozástól, vagyis egyből végrehajtható legyen a beolvasott adat.
(#) ferkoo válasza hepi02 hozzászólására (») Márc 13, 2013 /
 
Üdv
Ebben találsz egykis segítséget PICmicro™
Mid-Range MCU Family
Reference ManualBővebben: Link
(#) hepi02 válasza ferkoo hozzászólására (») Márc 13, 2013 /
 
Köszönöm. Viszont nem találtam benne a megoldást(korábban is átolvastam már és most is megtettem, hátha csak átsiklottam felette). Ugyan az van leírva ebben is, mint az MCU doksijában. Csak itt van 1-2 asm példa(amivel sajna nem tudok mit kezdeni). Az zavar a legjobban, hogy az 555-ös jelére megfelelően működik, de a szenzor jelére nem. Szkóppal pedig ugyan úgy néz ki a jele(amennyire hihetek az ősrégi orosz szkópomnak).
(#) watt válasza NgLovi hozzászólására (») Márc 13, 2013 /
 
A PWM periódusideje fix. Neked is fix ez az idő és mind a 10 kimeneten szinkronban van csak a kitöltésük változik egyedileg?
Ha minden idő más és változik a periódus is folyamatosan, akkor az nem PWM, megtévesztő a hivatkozásod a PWM-re.
Ha fix a periódus, akkor periódusonként elég egy számot letárolni, ami arányos a kitöltéssel.
Ha mégsem PWM a jeled, akkor minden időhöz egy olyan számot kell letárolni, ami kielégítő felbontást ad. Ha tized másodperc a legkisebb idő, akkor egy érték egy tizedet fog jelenteni. Két bájton 65535 tizedsec, azaz 109 perc időt tudsz eltárolni leghosszabbat. Ha elég 25 sec maximális idő, akkor egy bájtot elég letárolni ezen a felbontáson.

Ha ez megvan, akkor kell egy timer megszakítás, ami 1tizedenként megszakít. Ekkor vizsgálod az adott lábakhoz tartozó számlálót, hogy egyenlő-e az adott lépéshez tartozó beállított idővel. Ha igen, akkor bekapcsolod a lábat, betöltöd az új időt, stb.

Tényleg 5 millió ilyen lépés lesz egymás után?
Ha igen, akkor SD kártya a megoldás, amit SPI protokollal lehet kezelni könnyen.
A hozzászólás módosítva: Márc 13, 2013
(#) NgLovi válasza watt hozzászólására (») Márc 13, 2013 /
 
A periódusidő nem fix, a jelszint váltások között eltelt időt kell átküldjem, eltároljam és feldolgozzam a pickel.
Köszönöm a segítséget, minden kérdésemre választ kaptam. 1 bájtot kell használjak, ahogy írod SD kártyán lesz tárolva. Köszönöm a segítséget!
(#) Hp41C válasza hepi02 hozzászólására (») Márc 13, 2013 /
 
Szia!

Ebben csak 6 osztás és egy idétlen függvényhívas van. Hiába adja vissza a C -beli osztás a maradékot is, a fordító még egyszer oszt és akkor veszi csak elő a maradékot. Ha majd ezt a rutint általánosítod 16, 32 bitre, akkor más számottevő lesz a futási idő.
Nem lenne egyszerűbb 8 léptetéssel és max 8 összeadással megoldani???
A '0' .. '9' karakterek ASCII kódja, amit az LCD -nek kell küldeni: 0x30 + n (0 <= n <= 9)!

Ez ugyan 32 bites, de le lehet csökkenteni 8 bitre.
;******************************************************************
  1. ; Convert 32-bit binary number at <bin> into a bcd number
  2. ; at <bcd>. Uses Mike Keitz's procedure for handling bcd
  3. ; adjust; Modified Microchip AN526 for 32-bits.
  4.  
  5. b2bcd   movlw   32              ; 32-bits
  6.         movwf   ii              ; make cycle counter
  7.         clrf    bcd             ; clear result area
  8.         clrf    bcd+1
  9.         clrf    bcd+2
  10.         clrf    bcd+3
  11.         clrf    bcd+4
  12.        
  13. b2bcd2  movlw   bcd             ; make pointer
  14.         movwf   fsr
  15.         movlw   5
  16.         movwf   cnt
  17.  
  18. ; Mike's routine:
  19.  
  20. b2bcd3  movlw   0x33           
  21.         addwf   indf,f          ; add to both nybbles
  22.         btfsc   indf,3          ; test if low result > 7
  23.         andlw   0xf0            ; low result >7 so take the 3 out
  24.         btfsc   indf,7          ; test if high result > 7
  25.         andlw   0x0f            ; high result > 7 so ok
  26.         subwf   indf,f          ; any results <= 7, subtract back
  27.         incf    fsr,f           ; point to next
  28.         decfsz  cnt
  29.         goto    b2bcd3
  30.        
  31.         rlf     bin+3,f         ; get another bit
  32.         rlf     bin+2,f
  33.         rlf     bin+1,f
  34.         rlf     bin+0,f
  35.         rlf     bcd+4,f         ; put it into bcd
  36.         rlf     bcd+3,f
  37.         rlf     bcd+2,f
  38.         rlf     bcd+1,f
  39.         rlf     bcd+0,f
  40.         decfsz  ii,f            ; all done?
  41.         goto    b2bcd2          ; no, loop
  42.         return                  ; yes
  43.         end
A hozzászólás módosítva: Márc 13, 2013
(#) mps hozzászólása Márc 13, 2013 /
 
Sziasztok! Olyan kérdésem lenne, hogy miért kapok figyelmeztetés a következőre:
  1. BANKSEL (OPTION_REG)    ;bank1
  2.         CLRF    OPTION_REG
  3.         CLRF    TRISB
  4.         MOVLW   0x20
  5.         MOVWF   TRISA
  6.         MOVLW   0xFC
  7.         MOVWF   PR2

Az üzenet:
...ini_16f628.c; 37. truncation of operand value (0x92) to 7 bits

Azt értem, hogy csonkolja az értéket, de miért mikor egy 8bites regiszterbe szeretnék egy 8 bites értéket bepakolni. Ezt az üzit a fenti részen minden olyan sorra megkapom ahol regiszter szerepel, akkor is ha törölni akarom. A 0-ás bankban nem motyog nekem ilyeneket.
A kód amúgy működik, viszont az ok érdekel.
Vagy arra céloz, hogy a regiszter címéből szedett le egy bitet?
A hozzászólás módosítva: Márc 13, 2013
(#) icserny válasza mps hozzászólására (») Márc 13, 2013 /
 
Nem az van, hogy nem az értéket, hanem a regiszter címét csonkolja? Hiszen a 0x92 cím valójában a 0x12 offset címen érhető el a bankon belül.
(#) mps válasza icserny hozzászólására (») Márc 13, 2013 /
 
Csak az lehet. Legalábbis működni működik Tulajdon képpen most próbálom közelebbről megismerni a PIC asm-et, eddig csak elég felületesen foglalkoztam vele, de illene már. Amúgy is már nagyon régen volt dolgom assemblyvel akkor is Z80, 8051 és társaival. Lehet nem a legjobb módszerrel, de egy c programom írom át.
(#) hepi02 válasza Hp41C hozzászólására (») Márc 14, 2013 /
 
Köszi szépen, bár még nem tartok ott, hogy optimalizáljam a kódot. Első körben be akarok indítani minden perifériát és csak ezután állok neki finomítani. Hely van még dögivel, és erőforrás is, így jelenleg nem indokolt.

Ha végre működésre tudnám fogni az RB6 lábon is a szenzort, akkor optimalizálnék.
(#) sherlock válasza hepi02 hozzászólására (») Márc 14, 2013 /
 
Hát szerintem nincs amiért ne lehessen majdnem egyidőben. Megindítasz egy timert, és bekapcsolsz három IOC lábat. Minden IOC flagnél ellenőrzöd, melyik lábon jött élváltás, és mented a timer értékét a neki megfelelő változóba.
Arra figyelj, hogy a megszakításkezelés végén olvasd ki a PORTB regisztert, hogy a 'mismatch condition' törlődjön.

Mondjuk pontatlanságok lehet lesznek, ahogy lekérdezed szép sorjában, hogy melyik lábon jött interrupt-on-change, de nem vészes szerintem, mert mindig ugyanannyi időbe kerül,s offsetként levonhatod külön-külön mindegyikből.
(#) hepi02 válasza sherlock hozzászólására (») Márc 14, 2013 /
 
Az a baj, hogy ennek az eszköznek kritikus pontja lesz a pontosság. Két szenzor lesz ugyebár rákötve, amik minimálisan eltérő, közel azonos impulzust fognak generálni. Viszont azt a minimális eltérést szeretném majd mérni. Ha nem lenne olyan fontos a pontosság, akkor 1 timerrel mérném mind a két szenzor. Fél másodpercig az egyiket, fél másodpercig a másikat. és minden sokkal egyszerűbb lenne. Viszont kulcsszempont az egy időben való mérés ezért akarok két timert használni.
(#) Vadlaz hozzászólása Márc 15, 2013 /
 
Sziasztok!

Segítsen valaki, pls! MPlab-ban, assemblyben programozok. Megírom a szoftvert egy .s file-ban, de sok a szubrutinom és hosszúak is, és szeparálni szeretném őket, h ne legyen a fő programfile olyan hosszú. Hogy lehet azt megcsinálni, hogy áttenni egy másik file-ba, és megadni a fő programfile-nak, hogy ott találja őket? Próbáltam egy másik .s-t csinálni, include-olni, de nem vezetett sikerre.
Mi a megoldás? Köszi előre is!
(#) bbalazs_ válasza Vadlaz hozzászólására (») Márc 15, 2013 /
 
Hat, en ugy tudom, hogy az assembly file kiterjesztese .asm
Az include file pedig .inc
Es az elso filebe beirod a sor elejere, hogy include masikfile.inc
(#) Vadlaz válasza bbalazs_ hozzászólására (») Márc 15, 2013 /
 
Köszi! Értem. És az inc file-nak vannak formai követelményei? vagy csak simán beteszem, amit kivettem az assembly file-ból, és kész?
(#) Hp41C válasza Vadlaz hozzászólására (») Márc 15, 2013 /
 
Szia!
Milyen kontrollert programozol? 16 és 32 biteseken az assembly forrás állományának kiterjesztése .s .
(#) Vadlaz válasza Hp41C hozzászólására (») Márc 15, 2013 /
 
Hello!

dspic-et. 1010-est. Ez az inc-es dolog nem müxik így hirtelen.
(#) icserny válasza Vadlaz hozzászólására (») Márc 15, 2013 /
 
Idézet:
„dspic-et. 1010-est.”
Nem ártott volna ezzel kezdeni...
Nem csináltam még ilyet, de elvileg egy projektbe több .s állományt is felvehetsz (mint ahogyan .c-t is). Természetesen gondoskodni kell ról, hogy .global direktívákkal a belépési pontokhoz vagy változókhoz a hozzáférést biztosítsd a többi fordítási egység számára.

A "főprogram" pedig az lesz, amelyikben ez van (pontosabban szólva itt fog elindulni a program)

  1. .global __reset          ;The label for the first line of code.
  2. .text                             ;Start of Code section
  3. __reset:


Érdemes szétnézni a Microchip\MPLAB ASM30 Suite\Support\templates\assembly\ könyvtárban!
(#) Vadlaz válasza icserny hozzászólására (») Márc 15, 2013 /
 
Igen, ezt írhattam volna. Az a baj, h a Microchip\... mappát már elég rendesen átböngésztem, de nem találtam meg a választ (vagy nem tudtam értelmezni) Az általad említettet is néztem, ott mindössze ennyi van: tmp6010.s, tmp6010_srt.s, tmp6014.s, tmp6014_srt.s, traps.s, readme.txt. Ezekből nem jöttem rá.
Nekem egyébként a főprogramom így kezdődik, és működik:
"
.equ __30F3011, 1
.include "p30f3011.inc"
.global _wreg_init
.global __reset
.global __ADCInterrupt
.global __T1Interrupt
.global __T2Interrupt


"

Amúgy tudnál segíteni, hogy hol találok egy olyan pdf-et, amiben ezt a kérdéskört kifejtik? Mert elég sokat végigbogarásztam a MC weboldaláról (Getting Started, Programmers Manual, stb), de ezt nem találtam meg. Mint ahogy azt sem, h mire valók az "Object files, Linker script, Other files" a project struktúrában. Köszi!
(#) Vadlaz válasza Vadlaz hozzászólására (») Márc 15, 2013 /
 
Ja, és azt már próbáltam, hogy egyszerűen egy másik .s file-t csinálni, beletenni a szubrutinokat, és a Source Files-be betenni, de nem működött.

Kérek még segítséget!
(#) icserny válasza Vadlaz hozzászólására (») Márc 15, 2013 /
 
Idézet:
„de nem működött.”
Ez elég tág fogalom.

Az elérhető dokumentációról a honlapomon is találsz egy linkgyűjteményt (a Kötelező olvasmányok c. részben).
(#) icserny válasza Vadlaz hozzászólására (») Márc 15, 2013 /
 
Idézet:
„már próbáltam, hogy egyszerűen egy másik .s file-t csinálni, beletenni a szubrutinokat”
Itt egy primitív példaprojekt, ezt próbáld ki!

fibonacci_main.s a főprogram, ez hívja meg a fibo_sf függvényt
fibonacci_sf.s ebben van a veremkeretet használó rekurzív függvény

Az sf itt a Stack Frame (veremkeret) használatára utal.

test.zip
    
(#) Johnny0004 hozzászólása Márc 15, 2013 /
 
Üdv! Amit írtam zavar problémával senki nem találkozott még (Link)? Újabb rejtvényem: van egy Pic16f88, amit ha felprogramozok tökéletesen működik, amíg le nem kapcsolom a tápról, utána már nem indul el többet csak ha megint felprogramozom, ha tápon hagyom felprogramozás után tökéletes, kiolvasásra tökéletes benne a program. Mi sérülhetett meg benne, valami ötlet? Köszönöm!
A hozzászólás módosítva: Márc 15, 2013
(#) icserny válasza Johnny0004 hozzászólására (») Márc 15, 2013 /
 
Hogy állítottad be a konfigurációs biteket?
Ha LVP nincs kikapcsolva, akkor a PGM lábat le kell húzni a programfutáshoz!
Ha a BOR nincs engedélyezve, akkor a program esetleg kikapcsoláskor agyonvághatja magát.
Ha a WDT nincs letiltva, akkor rendszeresen tamagocsizni kell vele, különben RESET-be viszi a vezérlőt.
Ha nem Release módban fordítottad a programot, akkor is érhetnek meglepetések.
(#) Johnny0004 válasza icserny hozzászólására (») Márc 15, 2013 /
 
Nem ilyen probléma van, ugyanaz a program, egy másik Pic-kel működik, de mint írtam ezen is működik minden tökéletesen, amíg meg nem szakítom a tápellátást. Tehát valami a Pic-ben sérült gondolom, de mi lehet az?
Következő: »»   382 / 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