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   467 / 1211
(#) gaspar_zsolt hozzászólása Dec 9, 2013 /
 
Sziasztok!

Egy 12F683 PIC-hez írtam egy PWM vezérlő programot szervo vezérléshez.
Két gombot használok, egy a programozást és egy az üzemszerű szervo mozgást vezérli.
Kettő potméter állásáról veszi a kezdeti és végállások értékeit, a harmadik a végállások közötti állítás sebességet vezérli.
DE!

Indítás után a szervo kitér az egyik állásba, és ott zümmög. Ez a klasszikus esete, amikor nincs PWM jel.
Aztán egyszer csak gondol egyet és elkezd rendesen menni, a program szerint.

Gondoltam a motor meghúzza a PIC tápját, de ezzel eddig nem volt ilyen gondom.
Próbáltam a WDT-vel megoldani, de az újraindítgatja a PIC-et, így a program nem tud lefutni, mert újra indul.

Milyen irányba kezdjek el keresgélni, mi okoz ilyen program indítási hibát?
Tettem be az inicializáló részbe egy "warm up delay" késleltetést, kb 2 sec időtartamút.
De látszólag ez sem segített...
(#) Kapagerenda hozzászólása Dec 9, 2013 /
 
Hello!
Szeretnék elkezdeni foglalkozni PIC programozással.
A PICKIT-2DE mellet tettem le a voksomat. Van hozzá indító lemez PIC16F887 mikrokontrollerrel. Ez annyit jelent, hogy egy panelra szerelt 16F887 mikrokontrolleren lehet tesztelgetni a megírt programokat és Ledeken vizuálisan lekövetni mi hogy működik? Azaz ez kiadja a próbapanel szerepét, már kivannak alakitva rajta a külső áramkörök amik szükségesek mikrokontroller üzemképes működéséhez?
(#) foxi63 válasza gaspar_zsolt hozzászólására (») Dec 9, 2013 /
 
Szia!
Esetleg ha tennél fel valami kódot, mert ugye a világ végéről nem látunk bele, mit is csináltál. üdv. Foxi
(#) icserny válasza Kapagerenda hozzászólására (») Dec 9, 2013 /
 
Igen. Vásárlás előtt célszerű elolvasni a részletes leírását, úgy könnyebb eldönteni, hogy erre vágysz-e, vagy sem.

Erről a honlapról legfőképpen a 44-Pin Demo Board User's Guide és a PICkit 2 Debug Express Product Overview dokumentumokat ajánlom.
(#) Kapagerenda válasza icserny hozzászólására (») Dec 9, 2013 /
 
Kösz a segítséget, bár nemigazán tudok dönteni a PICKIT-2DE és PICKIT-2SK között.
Melyiket lenne érdemesebb megvásárolni egy abszolút kezdőnek?
(#) nedudgi válasza Kapagerenda hozzászólására (») Dec 9, 2013 /
 
Egy szempontot említek, a Debug Express készletben kapott panellel a DIP foglalatban többféle kontrollert lehet használni.
A hozzászólás módosítva: Dec 9, 2013
(#) icserny válasza nedudgi hozzászólására (») Dec 10, 2013 /
 
Idézet:
„a Debug Express készletben kapott panellel a DIP foglalatban”
Fordítva van: a Starter Kit-ben van DIP foglalat (cserélhető a PIC), a Debug Express-ben pedig fixen beforrasztott PIC található.

További szempontok a kiválasztáshoz: a Debug Express mikrovezérlője alkalmas a hardveres nyomkövetésre (ezért Debug Express a kártya neve), a Starter Kit mikrovezérlője nem.
(#) nedudgi válasza icserny hozzászólására (») Dec 10, 2013 /
 
Elnézést, köszönöm a pontosítást.
Tudom, hogy kinek a pap, kinek a lánya, de én hardveres nyomkövetés nélkül elprogramozgatok pár éve.
A hozzászólás módosítva: Dec 10, 2013
(#) jdani hozzászólása Dec 10, 2013 /
 
Szevasztok. Lenne egy viszonylag egyszerű progi
Módosítani kellene rajta, viszont csak HEX van. A módosítás csak annyiból állna, hogy a kimenetet az IC egyik külön lábáról is lehessen kapcsolni, ne csak távvezérléssel. Nekem elég egykanálos kapcsolás is, így még annyi módosítás kellene rajta, hogy betanításkor ne kérjen két kódot két kanálra, hanem csak egyet. Így felszabadulna egy láb, ami lehet a bemeneti kapcsoló. Lehetséges ez? Természetesen valakit megkérnék ezzel, aki meg tudná csinálni.
(#) gaspar_zsolt válasza foxi63 hozzászólására (») Dec 10, 2013 /
 
Szia Foxi,

ebben teljesen igazad van. A kezdő beállításokat megoszthatom.

A GP3 az MCLR láb és a GP5 L szintre kapcsolnak, 10k-val fel vannak húzva 5V-ra.

Íme a részlet:
  1. list p=12f683
  2.         #include "p12f683.inc"
  3.         __CONFIG _FCMEN_OFF& _IESO_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_OFF & _INTRC_OSC_NOCLKOUT
  4.  
  5.         ERRORLEVEL -302
  6. ;-------------------------------------------------------------------
  7.         CBLOCK  0x0020                  ;változók
  8.         T1
  9.         T2
  10.         T3
  11.         T4
  12.         T5
  13.         T10
  14.         T11
  15.         T12
  16.         POT_START_POZ
  17.         POT_END_POZ
  18.         POT_SPEED
  19.         COUNTER
  20.         ENDC
  21.                
  22.         CONSTANT        LIMIT_END=B'00100011'
  23.         CONSTANT        LIMIT_START=B'00001010'
  24.         CONSTANT        POZ_MIDDLE=B'00010100'
  25.         CONSTANT        SPEED=B'01010000'      
  26. ;-------------------------------------------------------------------
  27.         ORG 0x000                       ;indul a program a beállításokkal.
  28. INIT   
  29. ;Oszcillátor setup
  30.     BSF         STATUS,RP0      ;bank1
  31.     MOVLW       B'01000000'     ;set cpu clock speed to 1MHz, Fosc<2:0>
  32.     MOVWF       OSCCON           ;move contents of the working register into OSCCON
  33.     MOVLW       B'00111011'     ;input:GP0,1,3,4,5, output: GP2
  34.     MOVWF       TRISIO          ;i/o setup
  35. ;----------------------------------------------------------------------
  36. ;Configure the A/D modul
  37.     BCF         STATUS,RP0          ;bank0
  38.     CLRF                GPIO
  39.     MOVLW       B'00000111'
  40.     MOVWF       CMCON0
  41.     BSF         STATUS,RP0          ;bank1
  42.     MOVLW       B'00011011'     ;Fosc/8 speed, AN3,AN1,AN0 analog input, GP2 digital output
  43.     MOVWF       ANSEL
  44. ;----------------------------------------------------------------------    
  45. ;szükség van értékadásra                  
  46.     MOVLW       LIMIT_START                    
  47.     MOVWF       POT_START_POZ              
  48.     MOVLW       LIMIT_END                      
  49.     MOVWF       POT_END_POZ                
  50.     MOVLW       POZ_MIDDLE
  51.     MOVWF       COUNTER
  52.     MOVLW       SPEED
  53.     MOVWF       POT_SPEED
  54. ;----------------------------------------------------------------------
  55. ;Configure the PWM modul
  56.     BCF                 STATUS,RP0           ;Bank0
  57.     MOVLW       B'00001100'         ;PWM mode - single output
  58.     MOVWF       CCP1CON
  59.     BSF         STATUS,RP0          ;bank1
  60.     MOVLW       B'11111111'         ;Frequency at 61Hz.
  61.     MOVWF       PR2                 ;PWM Period = [PR2 + 1]*4*Tosc*T2CKPS=[255+1]*4*(1/1MHz)*1
  62.     BCF         STATUS,RP0          ;bank0
  63.     CLRF                TMR2
  64.     MOVLW       B'00000010'
  65.     MOVWF       T2CON               ;1:1 postscaler and 1:16 prescaler
  66. ;-------------------------------------------------------------------
  67. ;Warm up
  68. START_UP_DELAY
  69.         MOVLW   B'00000011'                     ;3
  70.         MOVWF   T10
  71. DELAY10
  72.         MOVLW   B'11111111'                     ;255
  73.         MOVWF   T11
  74. DELAY11
  75.         MOVLW   B'11111111'                     ;255
  76.         MOVWF   T12
  77. DELAY12
  78.         DECFSZ  T12,F
  79.         GOTO    DELAY12
  80.         DECFSZ  T11,F
  81.         GOTO    DELAY11
  82.         DECFSZ  T10,F
  83.         GOTO    DELAY10
  84.        
  85. ;-------------------------------------------------------------------  
  86. ;ez itt a két kapcsolót figyelő főprogram. Programozunk, vagy zárunk.
  87. MAIN
  88.         BCF             STATUS,RP0
  89.         BTFSC   GPIO,GP3                        ;ha a programkapcsoló lenyomva, akkor a programozási ciklusra megyünk
  90.         GOTO    $+2                                     ;következő gomb vizsgálata
  91.         GOTO    PROG_RUTIN
  92.         BTFSC   GPIO,GP5                        ;ha a kapcsoló zárva, akkor a zárás rutint hívjuk
  93.         GOTO    OPEN_RUTIN
  94.         GOTO    CLOSE_RUTIN
A hozzászólás módosítva: Dec 10, 2013
(#) ktamas66 válasza gaspar_zsolt hozzászólására (») Dec 10, 2013 /
 
Ebben a részletben én nem látom hol állítod a CCPR1L regisztert és mikor állítod a TMR2ON-t.
(#) Vacok hozzászólása Dec 10, 2013 /
 
Sziasztok!
Az első PIC kapcsolásomat szeretném megépíteni, viszont égetőm még nincsen, de nem is akarok még egy komoly égetőbe belevágni. A kérdés az lenne, hogy egy PIC12F675 mikrokontrollert fel lehet programozni egy LPT portos vagy JDM programozóval?
(#) gaspar_zsolt válasza ktamas66 hozzászólására (») Dec 10, 2013 /
 
Hát ez az! Pont az a bajom, hogy még nem jut el a PWM kapcsolásáig sem és máris megy a motor az egyik végállásig.

Ugyanakkor a programozó állásba sem tudom kapcsolni, mert a MAIN nem fut le.

Viszont többszöri újraindításra egyszer csak beindul a program és működik tökéletesen onnantól kezdve!

  1. PROG_RUTIN                                              ;programozzuk a szervo állásokat
  2.         BCF             STATUS,RP0                      ;Bank0
  3.         MOVLW   B'00001100'                     ;PWM mode
  4.         MOVWF   CCP1CON
  5.         CLRF            TMR2
  6.         BSF             T2CON,2                         ;PWM bekapcsolása



Ettől kezdve olvasom ki az AD átalakítókból a potméterek értékeit, tárolom és azt adom meg a PWM végállásainak.

  1. SZERVO_START_POZ
  2.         BCF     STATUS,RP0              ;Bank0
  3.         CLRF     ADRESH
  4.         MOVLW   B'00000001' ;AN0 bemenet leolvasása, left justified, Vref=Vdd, ADON
  5.         MOVWF   ADCON0
  6.         CALL    AD_DELAY
  7.         BSF     ADCON0, GO                      ;konvertálás indul
  8.         BTFSC   ADCON0, GO              ;Ha kész a konvertálás, akkor tovább
  9.         GOTO    $-1     ;egyébként vissza egyet és várjuk a végét
  10.         CALL     DIVIDE                         ;osztjuk a végeredményt      
  11.         MOVF    ADRESH,W
  12.         ADDLW   POZ_MIDDLE
  13.         MOVWF   POT_START_POZ   ;és eltároljuk a változóban
  14.         MOVWF   CCPR1L                  ;PWMDutyCycle=(CCPR1L:CCP1CON<5:4>xToscxTMR2Presc=[W:11]*(1/1MHz)*16

Majd vissza a MAIN rutinba.
A hozzászólás módosítva: Dec 10, 2013
(#) kissi válasza Vacok hozzászólására (») Dec 10, 2013 /
 
Szia!
Nézd meg watt fórumtárs oldalát Bővebben: Link !
(#) ktamas66 válasza gaspar_zsolt hozzászólására (») Dec 10, 2013 / 1
 
Itt a leírás milyen sorrendben kell inicializálni. Ha nem akarod, hogy egyből elinduljon adj neki 0% kitöltést.

19.4.3 SETUP FOR PWM OPERATION
To configure the CCP module for PWM operation,
using CCP4 as an example:
1. Set the PWM period by writing to the PR2
register.
2. Set the PWM duty cycle by writing to the
CCPR4L register and CCP4CON<5:4> bits.
3. Make the CCP4 pin an output by clearing the
appropriate TRIS bit.
4. Set the TMR2 prescale value, then enable
Timer2 by writing to T2CON.
5. Configure the CCP4 module for PWM operation.
(#) gaspar_zsolt válasza ktamas66 hozzászólására (») Dec 11, 2013 /
 
Ez túl egyszerű lenne!
A bajom az, hogy nincs még bekapcsolva a PWM modul és a motor mégis zümmög.
Ha bekapcsol, akkor a motort nem lehet kitéríteni az adott pozícióból, de itt nem ez van.
Érzésem szerint itt egy olyan hiba lehet, ami tápfesz gond.
Előfordul, hogy a PICKIT3-ról elindul simán, aztán máskor meg nem. És ugyanezt megcsinálja a saját tápjával is.
Szóval teljesen világtalan vagyok.

Ha a sorrendem nem lenne jó, akkor nem működne egyáltalán.
Bánatos vagyok.
(#) Buvarruha válasza gaspar_zsolt hozzászólására (») Dec 11, 2013 /
 
Idézet:
„A bajom az, hogy nincs még bekapcsolva a PWM modul és a motor mégis zümmög.”


Nem vagyok járatos a témában, de nem lehet, hogy azért, mert konfigurálás hiányában csak összevissza zümmög?
(#) ktamas66 válasza gaspar_zsolt hozzászólására (») Dec 11, 2013 / 1
 
A PWM modult a CCP1CON kapcsolja be, nem a TMR2 elindítása. Ha előtte nem állítod be a megfelelő regisztereket(pl. CCPR1L), lehet az okozza a problémádat. A leírásban is az van. hogy előbb el kell indítani a TMR2-őt, majd a PWM-et. Te pont fordítva csinálod először elindítod a PWM-et, majd utána bekonfigurálod.
(#) Vacok válasza kissi hozzászólására (») Dec 11, 2013 /
 
Ezt az oldalt megtaláltam, viszont z volt vele a problémám, hogy az égető programok nem támogatták a korábban említett mikrokontrollert, vagy ez nem feltétlenül jelent problémát?
(#) gaspar_zsolt válasza Buvarruha hozzászólására (») Dec 11, 2013 /
 
No igen, ezért keresek PWM-ben jártas embert én is!
(#) gaspar_zsolt válasza ktamas66 hozzászólására (») Dec 11, 2013 /
 
Én meg úgy tudom, hogy a CCP1CON a PWM funkcióra definiálja a kimeneteket.
A PWM indítását pedig a T2CON 2.bit a TMRON indítja. Addig csak be van konfigolva!
A hozzászólás módosítva: Dec 11, 2013
(#) Prendick válasza gaspar_zsolt hozzászólására (») Dec 11, 2013 / 1
 
Nem jól tudod. Ezért megy el a motorod. A CCP1CON azonnal indítja a kimenetet, a TMR2 túlcsordulása fogja majd megállítani. Aztán a TMR2 újabb túlcsordulása indítja el megint a duty beállítása szerint.

Ha előbb kapcsolod be a CCP1CON-al a PWM kimenetét és csak valamikor később birizgálod a TMR2-t, pont az fog történni, ami történt is. Elindul a motor és az első PWM ciklus ideje a TMR2+a késlekedésed.

Ktamas66 már megoldotta a problémádat. Nyugodtan hidd el neki.
(#) kissi válasza Vacok hozzászólására (») Dec 11, 2013 /
 
Ha megnézed a Bővebben: Link
ennek a lapnak az alján a PIC12F675 tesztelés alatt van ( 2011! )! Szerintem, ha gond lett volna vele, akkor már javítva lenne, de akár watt-nak is írhatsz !
(#) gaspar_zsolt válasza Prendick hozzászólására (») Dec 12, 2013 /
 
Ez a program a Microchip tutorial PWM része:

  1. Start:
  2.                                         ;Setup main init
  3.      banksel        OSCCON              ;bank1
  4.      movlw          b'00111000'         ;set cpu clock speed to 500KHz
  5.      movwf          OSCCON              ;move contents of the working register into OSCCON
  6.  
  7.                                         ;Configure the ADC/Potentimator
  8.                                         ;already in bank1
  9.      bsf            TRISA, 4            ;Potentimator is connected to RA4....set as input
  10.      movlw          b'00001101'         ; RA4 as source of ADC and enable the module (carefull, this is actually AN3)
  11.      movwf          ADCON0
  12.      movlw          b'00010000'         ;left justified - Fosc/8 speed - vref is Vdd
  13.      movwf          ADCON1
  14.      banksel        ANSELA              ;bank3
  15.      bsf            ANSELA, 4           ;analog for ADC
  16.  
  17.                                         ;Configure the LEDs
  18.      banksel        TRISC               ;bank1
  19.      clrf           TRISC               ;make all of PORTC an output
  20.      banksel        LATC                ;bank3
  21.      clrf           LATC
  22.  
  23.  
  24.                                         ;Configure the PWM module
  25.      banksel        CCP2CON             ;bank 5 - use CCP2
  26.      movlw          b'00001100'         ;PWM mode - single output
  27.      movwf          CCP2CON
  28.      movlw          b'00000000'         ; timer2 as PWM source
  29.      movwf          CCPTMRS
  30.      banksel        PR2                 ;bank0
  31.      movlw          0xFF                ;Frequency at 488Hz. Anything over ~60Hz will get rid of any flicker
  32.      movwf          PR2                 ;PWM Period = [PR2 + 1]*4*Tosc*T2CKPS = [50 + 1] * 4 * (1 / 500KHz) * 1
  33.      clrf           T2CON               ;1:1 postscaler and 1 prescaler
  34.      bsf            T2CON,TMR2ON        ;start the PWM by setting TMR2ON bit
  35. MainLoop:
  36.     call            A2d                 ;begin the Analog to Digital conversion
  37.  
  38.                                         ;ADRESH and ADRESL are now both full of the ADC result!
  39.                                         ;already in bank0  the banksel inside of A2d
  40.     movf            ADRESH, w           ;Get the top 8 MSbs (remember that the ADC result is LEFT justified!)
  41.     banksel         CCPR2L
  42.     movwf           CCPR2L
  43.    
  44.                                         ;to fill the 10bit PWM registers, these 2 LSBS will be put into the
  45.                                         ;Duty Cycle Bits (DC2B) of the CCP2CON register which are bits 5 and 4.
  46.                                         ;So we need to shift these LSb into place and OR them with CCP2CON
  47.                                         ; in order to save the settings above and fill these last bits in
  48.     banksel         ADRESL
  49.                                         ;ADRESL =  b'xx000000' where 'xx' are the 2 LSBs  the ADC result
  50.     lsrf            ADRESL, f           ;ADRESL = b'0xx00000'
  51.     lsrf            ADRESL, f           ;ADRESL = b'00xx0000'
  52.     movf            ADRESL, w           ;now move into wreg
  53.     banksel         CCP2CON
  54.        
  55.                                         ;move the 2 LSBs into place without disturbing the rest of CCP2CON settings
  56.     xorwf           CCP2CON, w  ;clears bits that are the same and sets bits that are different.
  57.     andlw           B'00110000' ;clears all control bits in WREG so they don't change in the final step
  58.    xorwf           CCP2CON, f          ;changes bits that changed and leaves everything else untouched.
  59.    bra             MainLoop            ;do this forever
  60.  
  61.  
  62. A2d:
  63.                                        ;Start the ADC
  64.    nop                                 ;requried ADC delay of 8uS => (1/(Fosc/4)) = (1/(500KHz/4)) = 8uS
  65.    banksel         ADCON0
  66.    bsf             ADCON0, GO          ;start the ADC
  67.    btfsc           ADCON0, GO          ;this bit will be cleared when the conversion is complete
  68.    goto            $-1                 ;keep checking the above line until GO bit is clear
  69.  
  70.    return
  71.  
  72.    end



A PWM konfigurálása ebben a programban szerinted úgy történik, ahogy írtátok?
Mert szerintem nem.
És ez működik, ennek mintájára írtam meg a saját programom, ami szintén működik, de nem minden indulásnál...És ezt nem értem miért!
A hozzászólás módosítva: Dec 12, 2013
(#) ktamas66 válasza gaspar_zsolt hozzászólására (») Dec 12, 2013 / 1
 
Az a lényeg, hogy elindítja a TMR2-t, ha azt szeretnéd, hogy a motor meg se moccanjon megfordítod a parancsokat. A CCPR1L=0 meg kell adni mivel ez reset után nem feltétlenül nulla, és csak akkor nem kezd a PWM felfutó éllel ha ez 0 (PIC12F683 8.3.1 fejezet). A CCPR1L állítása az AD alapján csak a következő ciklusban lép életbe (csak a ciklus elején másolja az értékét a CCP1H regiszterbe). Amíg nem fut a TMR2 az első ciklus soha nem ér véget (aztán valami kibillenti innen, és akkor már rendesen működik). Tehát TMR2-t inicializáláskor el kell indítani.
A hozzászólás módosítva: Dec 12, 2013
(#) Prendick válasza gaspar_zsolt hozzászólására (») Dec 12, 2013 / 1
 
Azért trehánykodhatott a Microchip programozója, mert a PWM indítás után villámgyorsan futtatja az A/D konverziót és gyakorlatilag a második PWM ciklusnál már van korrekt duty beállítása.
Vagyis elvileg 0%-os duty-val indít, így ráér a TMR2-t akkor belökni, amikor akarja, mert pár cikluson belül nincs jelentősége. Utána egy gyors A/D-vel feltölti a CCPR-t.
Nálad az lehet a gond, hogy elindítod a PWM-et, utána belefuthatsz valami delay-be. Mivel a CCPR regiszterek teljesen véletlenszerű állapotot tudnak felvenni induláskor, nem 0% lesz a duty, hanem akármi. Ha kicsi az érték, nem indul magától a motor, ha nagyobb, akkor igen.

Korábban írtad, hogy a Main-be se talált bele a program. Annak semmi köze nincs a PWM-hez, viszont eredményezheti a leírt hibát. Ugyanis elindítod véletlenszerű adatokkal a PWM-et, közben beragad a program, a motor meg pörög.
A legjobban akkor jársz, ha előbb csinálsz egy előzetes A/D konverziót, beállítod pontosan a duty-t és utána indítod a PWM-et. Ilyenkor mindegy lesz, hogy előbb írod a CCP1CON-t és utána a TMR2-t (ahogy jobban szeretnéd ).
De azért elsőnek nézz utána, hogy mi az a késleltetés, vagy beakadási pont, ami megállítja a programot.

Ha meg nem hiszed el, amit írunk, azon nem tudunk segíteni. A hit már teológiai kérdés lenne és azt nem tolerálnák a moderátorok.
(#) gaspar_zsolt válasza ktamas66 hozzászólására (») Dec 12, 2013 /
 
Köszönöm, átnézem a beállításokat és kipróbálom ezt a CCPR1L=0-ás indítást is.
A hozzászólás módosítva: Dec 12, 2013
(#) gaspar_zsolt válasza Prendick hozzászólására (») Dec 12, 2013 /
 
Idézet:
„Ha meg nem hiszed el, amit írunk, azon nem tudunk segíteni. A hit már teológiai kérdés lenne és azt nem tolerálnák a moderátorok.”

Idézet:
„Azért trehánykodhatott a Microchip programozója, mert a PWM indítás után villámgyorsan futtatja az A/D konverziót és gyakorlatilag a második PWM ciklusnál már van korrekt duty beállítása.”


Látod, hogy ezért vagyok szkeptikus, nem a ti tudásotokban nem bízok. Kipróbálok szépen lassan minden megoldást.

Egyébként átírtam az inicializálást és arra jutottam én is kísérletezve, hogy jobb egy fix értékkel indulni, és aztán lekapcsolni a PWM-et a TMR2ON-nal, mert aztán újra bekapcsolva már stabil!

Neked is köszönöm a segítséged!
(#) gaspar_zsolt hozzászólása Dec 12, 2013 /
 
És akkor a folytatás egy EEPROM írás-olvasási gondommal.
Megpróbáltam az AD által mért értékeket beírni, hogy a következő indulásnál egy CALL EEPROM_READ után az egyszer mért és beállított értékeket ne kelljen feltétlenül még egyszer mérni, csak behívni és megadni a PWM-nek az adatokat.
De nem írja be a program az EEPROM-ba, és az olvasással sem vagyok biztos, hogy helyes eredményt ad.

Ezek is a MC adatlapról, illetve a T-és-T oldalról származó leírásokból vannak.

Itt mit gondoltok, mi a differencia? Vagy mit értettem félre? Ez sem tartom kizártnak a PWM után!

  1. EEPROM_WRITE                                    ;beírjuk az eepromba a beállításokat
  2.         BSF     STATUS,RP0                      ;;Bank1
  3.         MOVLW   B'00000000'
  4.         MOVWF   EEADR
  5.         MOVF    POT_START_POZ,W
  6.         MOVWF   EEDATA
  7.         CALL    EE_WRITE
  8.         MOVLW   B'00000001'
  9.         MOVWF   EEADR  
  10.         MOVF    POT_END_POZ,W
  11.         MOVWF   EEDATA
  12.         CALL    EE_WRITE
  13.         MOVLW   B'00000010'
  14.         MOVWF   EEADR
  15.         MOVF    POT_SPEED,W
  16.         MOVWF   EEDATA
  17.        
  18. EE_WRITE
  19.         BCF     INTCON,GIE                      ;Disable INTs
  20.         BSF     EECON1,WREN             ;Enable write
  21.         MOVLW   B'01010101'                     ;H'55' Unlock write
  22.         MOVWF   EECON2
  23.         MOVLW   B'10101010'             ;H'AA'
  24.         MOVWF   EECON2
  25.         BSF     EECON1,WR                       ;Start the write
  26.         BSF     INTCON,GIE                      ;Enable INTS
  27.         BTFSC   EECON1,WR
  28.         GOTO    $-1
  29.         BCF     EECON1,WREN
  30.         RETURN
  31.        
  32. ;----------------------------------------------------------------------
  33. EEPROM_READ                                     ;az eepromból olvassuk be a beállításokat
  34.         BSF     STATUS,RP0              ;Bank 1
  35.         MOVLW   B'00000000'                     ;
  36.         MOVWF   EEADR                   ;Address to read
  37.         BSF     EECON1,RD               ;EE Read
  38.         MOVF    EEDATA,W                ;Move data to W
  39.         MOVWF   POT_START_POZ
  40.         BTFSC   EECON1,RD
  41.         GOTO    $-1
  42.        
  43.         MOVLW   B'00000001'                     ;
  44.         MOVWF   EEADR                   ;Address to read
  45.         BSF     EECON1,RD               ;EE Read
  46.         MOVF    EEDATA,W                ;Move data to W
  47.         MOVWF   POT_END_POZ
  48.         BTFSC   EECON1,RD
  49.         GOTO    $-1
  50.        
  51.         MOVLW   B'00000010'                     ;
  52.         MOVWF   EEADR                   ;Address to read
  53.         BSF     EECON1,RD               ;EE Read
  54.         MOVF    EEDATA,W                ;Move data to W
  55.         MOVWF   POT_SPEED
  56.         BTFSC   EECON1,RD
  57.         GOTO    $-1
  58.        
  59.         MOVLW   B'00000011'                     ;
  60.         MOVWF   EEADR                   ;Address to read
  61.         BSF     EECON1,RD               ;EE Read
  62.         MOVF    EEDATA,W                ;Move data to W
  63.         MOVWF   COUNTER
  64.         BTFSC   EECON1,RD
  65.         GOTO    $-1
  66.         RETURN
  67. ;----------------------------------------------------------------------
(#) Prendick válasza gaspar_zsolt hozzászólására (») Dec 12, 2013 / 1
 
Ez egy klasszikus hiba, amit szerintem mindannyian elkövettünk már kezdő korunkban. Átmentél a Bank1-be, hogy megírd az eprom regisztereit, de a változóid a Bank0-ban vannak.

Olvasásnál is van egy hiba. Azelőtt akarod kiolvasni az EEDATA-t, hogy lefutott volna az RD ellenőrző ciklus.
Annak pont az a lényege, hogy jelezze neked, hogy kész az eprom olvasás, viheted az adatodat.

Tehát a MOVWF POT_START_POZ sort a GOTO alá kell tenni, és előtte vissza kell menni Bank0-ba.

  1. BTFSC   EECON1,RD
  2. GOTO    $-1
  3. MOVF    EEDATA,W     ;Move data to W
  4. BCF     STATUS,RP0   ;Bank 0
  5. MOVWF   POT_START_POZ


Írásnál meg így:

  1. BSF     STATUS,RP0         ;;Bank1
  2. MOVLW   B'00000000'
  3. MOVWF   EEADR
  4. BCF     STATUS,RP0   ;Bank 0
  5. MOVF    POT_START_POZ,W
  6. BSF     STATUS,RP0         ;;Bank1
  7. MOVWF   EEDATA


Megvan ennek is a logikája, amit ritkán írnak le az adatlapban, mert úgy vélik, ezt mindenkinek tudnia kell, mielőtt belefog.
Következő: »»   467 / 1211
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