Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   238 / 1319
(#) Amarton válasza watt hozzászólására (») Júl 3, 2008 /
 
Na akkor fussunk neki mégegyszer:

Ez egy működő kód:


  1. CBLOCK 0x020                ;  Variable Declaration
  2. DlayValue:2                  ;  Requires 24 Bit Counter (w/ WREG)
  3.  ENDC
  4.  
  5. Dlay Macro Cycles
  6.  variable CyclesLeft            ;  Keep Track of Remaining Cycles
  7.  variable LargeNum
  8. CyclesLeft = Cycles
  9.  local LongLoop
  10.  if Cycles > 0x04FFFF00         ;  Cant Handle the Anything > 83 Seconds (@ 4 MHz)
  11.  error "Required Delay is longer than "Dlay" Macro can support"
  12.  endif
  13.  if Cycles > 327681             ;  Need Large Loop?  
  14. LargeNum = CyclesLeft / 327681
  15.   movlw   LargeNum
  16.   movwf   DlayValue + 2         ;  Calculate Number of Loops
  17. LongLoop:                       ;  Repeat for Each Loop
  18.   clrf    DlayValue + 1         ;  Do Maximum Possible Loop Count
  19.   clrf    DlayValue
  20.   decf    DlayValue, f
  21.   btfsc   STATUS, Z
  22.    decfsz DlayValue + 1, f
  23.     goto  $ - 3
  24.   decfsz  DlayValue + 2, f      ;  Repeat Loop
  25.    goto   LongLoop
  26. CyclesLeft = CyclesLeft - ((LargeNum * 327681) + 1 + (LargeNum * 3))
  27.  endif  ;  Need Large Loop
  28.  if Cycles > 14                 ;  Will a Loop be required?  
  29.   movlw   high (((CyclesLeft - 3) / 5) + 256)
  30.   movwf   DlayValue + 1
  31.   movlw   low (((CyclesLeft - 3)/ 5) + 256)
  32.   movwf   DlayValue
  33.   decf    DlayValue, f          ;  5 Cycle Constant Delay Loop
  34.   btfsc   STATUS, Z
  35.    decfsz DlayValue + 1, f
  36.     goto  $ - 3
  37. CyclesLeft = CyclesLeft - (3 + (5 * ((CyclesLeft - 3)/ 5)))
  38.  endif                          ;  Finished with Loop Code
  39.  while CyclesLeft >= 2          ;  Put in 2 Instruction Cycle Delays
  40.   goto    $ + 1
  41. CyclesLeft = CyclesLeft - 2
  42.  endw
  43.  if CyclesLeft == 1             ;  Put in the Last Required Cycle
  44.   nop
  45.  endif
  46.  endm
  47.  
  48.   PAGE
  49.  
  50.  org      0
  51.   nop                        ;  Required for MPLAB ICD2
  52.  
  53.  Dlay 3                      ;  Should be goto & nop
  54.   nop
  55.  
  56.  Dlay 44                     ;  Delay 44 Cycles
  57.   nop
  58.  
  59.  Dlay 1000                   ;  1 ms Delay
  60.   nop
  61.  
  62.  Dlay 100000                 ;  Delay 0.1s
  63.   nop
  64.  
  65.  Dlay 5000000                ;  Delay 5s
  66.   nop
  67.  
  68.  Dlay 60000000               ;  Delay 60s
  69.  
  70.   goto    $                  ;  Finished, Everything Okay
  71.  
  72.   end


Egy a baja, hogy nem egészen pontos, és csak fél másodperces a max időzítés.

Elmondom, hogy nekem mire lenne ez jó.

Ha valamit gyorsan össze akarok dobni, és pl kellene 1s-os késlelettés, utána egy 2s utána egy 3s, és esetleg még egy 10ms is, akkor nem kell sem a timerekkel számolgatnom, sem a pedig delay ciklus változókat számolgatnom, hanem csak meghívom a Dlay macrot és utána írom az időzítést.

Szóval tudom mi az a macro, de ezek szerint ilyen nincs senkinek?

Üdv.
(#) Amarton hozzászólása Júl 3, 2008 /
 
faja, most használtam a code gombokat is.

Inkább feltöltöm...

asmDlay.asm
    
(#) trudnai válasza Amarton hozzászólására (») Júl 3, 2008 /
 
a [ code ] -t ki kell javitani [ code=asm ] -re (vagy [ code=C ] -re, ha tudod javitsd ki, ha nem remeljuk Norberto vagy valaki megfarigcsalja need
(#) Amarton válasza Amarton hozzászólására (») Júl 3, 2008 /
 
Na okés, közben rájöttem, hogy miért nem ment.
Nem 24 bit volt lefoglalva a memoriában neki.

Most már megy.

Azért köszi a segítséget
(#) trudnai válasza Amarton hozzászólására (») Júl 3, 2008 /
 
Huh, az aposztrof megkavarja a HE syntax highlightingjat

Na mindegy, igy mar sokkal atlathatobb es rendezettebb a kod! Ket eszrevetelem lenne mar csak:

1. A goto $-3 -akat es hasonlokat lecserelnem cimkes ugrasokra (lokalis cimke makron belul). Ezzel sok fejfajastol mentesulhetsz ha egyszer valamiert a kodhoz kell nyulni (mondjuk a goto $+1 -et nem szoktak, kiveve ha portalod 18F-re, mert ott 16 bites a progrm szo es byte-os a program memoria cimzes, tehat ott ugyanaz goto $+2 lenne - sot bra $+2...)

2. A DlayValue ha nem shared memorian helyezkedik el akkor problemak adodhatnak mivel nem latok bank szelekciot a makroban. Lehet egy BANKSEL DlayValue nem artana a makro elejen.

Amugy akkor ez mukodik 4 megan, 20 megan is? Mik a limitacioi?
(#) watt válasza Amarton hozzászólására (») Júl 3, 2008 /
 
Idézet:
„hanem csak meghívom a Dlay macrot és utána írom az időzítést.”

És tele lesz a programod egyedi várakozási rutinokkal, ami közben semmi más nem fog működni, még egy gomb sem. Persze ha csak valami primitív egyszálú programot írsz(pl. LED villogtatót), akkor mindegy neki, de akkor is szakbarbárság.

Felhívom minden kezdő figyelmét, hogy a beszúrt kódokból ne tanulják meg, hogyan kell időzíteni, mert ez nem időzítés, hanem várakozás!
Így max 10mS időtartamot lehet megoldani, de azt is csak néhány helyen és olyan programban, amiben közben nem kell mást csinálni. 10mS alatti megoldásokhoz viszont nem kell ekkora felhajtás. Elég egy egyszerű ciklus 255 alatti számlálással.
Ezen kívül ha van engedélyezett megszakítás lekezelés a programban, akkor az egész várakozási idő felborul. (azaz még a megszakítást is le kell tiltani, hogy pontos legyen a semmittevés )

Szóval az egész megoldás több sebtől vérzik, és kerülendő!
(#) szilva válasza bladika hozzászólására (») Júl 3, 2008 /
 
Ez teljesen jó megoldás, mintha láttam volna Microchip appnote-ot is ilyesmire. Legutóbb egy HP lapos moncsi kezelőpaneljén fedeztem fel ezt a megoldást. A 4 gomb egy vezetékre van felfűzve különböző ellenállásokkal így egyetlen vezetékpáron megy a nyomógombokról az infó a főpanelre.
(#) trudnai válasza bladika hozzászólására (») Júl 3, 2008 /
 
Szerintem egy egyszeru low pass filter amugy is kell ra az pedig lehet akar debouncing is, nem? Tehat egy soros ellenallas es egy keramia.

De valoszinuleg valami nagyon egyszeru digit szuro is megteszi. Amugy ha jol vannak megvalasztva az ellenallasok talan tobb gomb egyideju nyomasat is korlatozott korulmenyek kozott lehet merni. Es akkor ezt egybe lehet vetni a digit szurovel is, tehat bizonyos ideig ugyanazt kell merni ahhoz, hogy a gomb nyomasa el legyen fogadva, igy a ket gomb nyomasabol adodo idokulonbseg is megoldott.
(#) Tom025 hozzászólása Júl 4, 2008 /
 
Sziasztok! A PIC16F630 ugye teljesen átlagos módon programozható jószág? Mégis el tud működni 3V-ról? (Egy kapcsolásban így láttam). Ugyanez kérdés a 74HC259-re is, bár az nem igazán ide tartozik... Köszi!
(#) szilva válasza Tom025 hozzászólására (») Júl 4, 2008 /
 
Rögtön az adatlap legelején, a tulajdonságok felsorolásánál:

Wide operating voltage range - 2.0V to 5.5V

Amúgy amivel én találkoztam PIC, az mind megy 3V-ról adatlap szerint is. Az más kérdés, hogy van, amelyiknek a programozáshoz minimum 4.5V tápfeszültség kell, de a normál működést ez nem befolyásolja.
(#) watt válasza Tom025 hozzászólására (») Júl 4, 2008 /
 
Nézd meg az adatlap elekromos specifikációs részében(12. bekezdéstől) a táblázatokat is, mert különböző feszeknél, különböző frekitartományokban működhet csak.
(#) Sendi hozzászólása Júl 4, 2008 /
 
Helló Mindenkinek.

A következő a kérdésem.
A saját kis programocskámban használom a PCL regisztert, a következő cím megadásához, kiszámításához.
De ha a PCL értéke nagyobb mint 256, azaz a 8 bit túlcsordul, akkor hibás helyre ugrik.
Tudom, olvastam, hogy van a PCH regiszter, de az nem írható olvasható közvetlenül.

Milyen megoldást javasoltok?

Köszönettel.
(#) potyo válasza Sendi hozzászólására (») Júl 4, 2008 /
 
A PCH akkor íródik, amikor a PCL-t írod. Hogy mi kerüljön a PCH-ba, azt a PCLATH regiszterbe kell beírni, még mielőtt írod a PCL-t. Ugyanígy, ha olvasod a PCL-t, akkor a PCH tartalma átkerül a PCLATH regiszterbe.

Valahol van a microchip application note-jai között egy, ami a nagyméretű táblák kezelésével foglalkozik, de most nem találom.
(#) Sendi válasza potyo hozzászólására (») Júl 4, 2008 /
 
Helló potyo.

AN556 a leírás.
Ebéd után megpróbálom felfogni.

Köszönöm
(#) trudnai válasza Sendi hozzászólására (») Júl 4, 2008 /
 
Persze, hogy a PHC nem irhato, mert gondolj bele mi tortenne, ha igy akarnad feltolteni:
  1. movlw    high(cim)
  2. movwf    PCH
  3. movlw    low(cim)
  4. movwf    PCL

Nos, ha kozvetlenul bele cimeznel a PCH-ba akkor mar a 2. utasitastol elkodorolna a programod... Eppen ezert bevezettek egy latch regisztert, a PCLATH -t. Ebbe nyugodtan bele irhatsz akar mikor, es mikor a PCL-be irsz (pl movwf utasitassal vagy addwf-el) akkor ennek a latch-nak a tartalma automatikusan attoltodik a PCH-ba...

magyaran egy index alapjan valahogy igy tudnal ugralni:
  1. movlw    high(ugrotabla)
  2.     movwf    PCLATH
  3.     movlw    low(ugrotabla)
  4.     addwf    index,W
  5.     btfsc    STATUS,C
  6.     incf     PCLATH,f
  7.     movwf    PCL
  8.  
  9. ugrotabla
  10. ...
  11. ...
  12. ...

Vannak chipek ahol a memoria meret meg a 64k-t is meghaladja, ott meg PCLATU is van, az adatlapban nezd ki, hogy mi a helyzet a tieddel.
(#) Sendi válasza trudnai hozzászólására (») Júl 4, 2008 /
 
Helló Trudnai.

Köszönöm a válaszodat.
Ez a példa már használhatóbbnak tűnik a számomra.
(a megértéshez)
Most rágódom, és próbálkozom, és ha lesz kérdésem akkor kérdezek.

Köszönettel.
(#) Sendi válasza trudnai hozzászólására (») Júl 4, 2008 /
 
Helló Trudnai,

Hogy, felfogtam e azt nem tudom, de működik.
(persze hogy felfogtam)

Köszönettel.
(#) Sendi hozzászólása Júl 5, 2008 /
 
Jó reggelt mindenkinek.

A mai kérdésem a következő.

A PIC memoriáját mennyire lehet teleírni programmal?
Kell hagyni helyet a program futásának?

Mert én most egy kis PIC-ket nagyon teleírtam, MPLAB simulátorban müködik, de élesben nem.

Köszönöm.
(#) kobold válasza Sendi hozzászólására (») Júl 5, 2008 /
 
Ameddig a programmemória tart, addig írhatod. Nincs szüksége extra helyre ahhoz, hogy fusson, mivel ami fut, azt már beleírtad.
Két kivétel van talán: az egyik, ha használni akarod a debuggert-t élesben, mert akkor vannak foglalt területek, illetve ha önmódosító programot akarsz írni, és véletlenül túllógna a vége. Ha viszont az MPLAB rendben lefordítja, akkor inkább valami hiba miatt nem fut.

(Esetleg elérted a kontroller törlési / beégetési képességeinek határát, és nem megbízható már a program megtartása, de szerintem ez azért elég ritka, még mindennapos újraégetés mellett is.)
(#) kissi válasza Sendi hozzászólására (») Júl 5, 2008 /
 
Szia!

Teljesen tele lehet írni, lehet a konfigurációs biteket nem állítottad be jól a programozáskor (szimulációnál nem mind jelentkezik!)!

Jó munkát!

Steve
(#) user hozzászólása Júl 5, 2008 /
 
Hello!

Én egy korábbi témámat szeretném folytatni(469). A kapcsolást módosítottam a javaslatok alapján. A problémám most az,h. a pic csak az RA0-RA3 portokat vezérli.További gond, hogy a max 11-es és 12-es lábán lévő fesz az RB1,RB2 kimenetet állandóan 5v körül tartja a többi láb nem vezérelhető.Az asm kódot a parsic állította elő.
Akinek van ötlete, vagy csinált már ilyet kérem segítsen.
(#) watt válasza user hozzászólására (») Júl 5, 2008 /
 
Csináltam már ilyet, kb. 6-8 évvel ezelőtt, mikor kezdtem játszadozni a PIC-ekkel, de ez a Parsic csak felidegesít! Mért nem dobod ki és próbálod MPLAB-al megoldani. Már rég túl lennél rajta. Ott nincs olyan, hogy miért nem megy, mert ott minden egyértelműen levezethető az okokra. A Parsic-ot közülünk szerintem senki nem ismeri, ezért neked sem ebben kéne kínlódnod. Egy ilyen LED vezérlő progit, a Te hardveredre fél óra alatt össze lehet dobni! C-ben még kevesebb idő alatt, bár a C-is olyan nyelv, amit akkor érdemes használni, ha már az asm és azon keresztül a PIC teljesen fel van derítve, mert a C is hajlamos elfedni a lényeget!

Tehát ha úgy gondolod, szívesen segítek az MPLAB úton elindulni, és azt hiszem teljes bizonyossággal kimondhatom, hogy nem csak én!

A 11,12 lábon már említettem, hogy nem baj hogy ott kb. 5V a fesz...

Még a generált ASM-ról annyit, hogy teljesen áttekinthetetlen, látszik, hogy egy program generálta. Ezt sokkal kevesebb sorból is meg lehet oldani.
(#) Sendi válasza kobold hozzászólására (») Júl 5, 2008 /
 
Helló kobold, és kissi.

Köszönöm a tanácsokat, visszamegyek a kályhához,
az utolsó működő változatba írom be, a bővítéseimet, és meglátjuk hol áll meg.
Érdekes, hogy az utolsó változatot, az MPLAB nem akarta beégetni, (már a 00-s címre olvasási hibát jelzett, míg a PICKIT 2 égetőprg-je csont nélkül beégette.

Másik (új) Pic-kel ugyan ez a helyzet.

Köszönöm, jó hétvégét.
(#) Sendi válasza Sendi hozzászólására (») Júl 5, 2008 /
 
Helló.

Az égetési gond megoldódott, az MPLAB-ban valahogy bekapcsolódott a code protect.
Így nem engedte sem olvasni sem összehasonlítani.

Köszönettel.
(#) Sendi hozzászólása Júl 5, 2008 /
 
Helló Mindenki.

Reggel óta nem tudok rájönni, hogy az alábbi programban a következő cím miért a 302H.
Ez egy karakter kiírató prg, néhány karakter kiírása után, itt a 302 címre ugrik és nem pedig a következő sorra?
Miért?
Köszönettel
(#) kobold válasza Sendi hozzászólására (») Júl 5, 2008 /
 
Mert a PCLATH-ban rossz érték van (3), szerintem...
(#) Sendi válasza kobold hozzászólására (») Júl 5, 2008 /
 
Helló kobold.

Tényleg nem szép az a 3-mas, de akkor is hogy lehet ez a következő lépés?

Köszönettel
(#) trudnai válasza Sendi hozzászólására (») Júl 5, 2008 /
 
Szerintem a W tulcsorog, igy hogy 0 van benne nem menet oda a vezerles (max ha az F8-at nyomogatod el "elszokik" a program es mit tudom en egy WDT-nel leall a szimulacio es epp azon a ponton kovetkezik ez be).

En a W-re tippelnek, es nem tudom van-e a W-re maszkolas mielott ezeket a rutinokat meghivod de ha nincs akkor egy andlw b'00000111' nem artana oda (mivel 7 elemuek a tombjeid ha jol latom).
(#) szilva válasza Sendi hozzászólására (») Júl 5, 2008 /
 
Annak a lépésnek a végrehajtása után a 0x36C címen akarna folytatódni, meg kellene nézni, ott mi van. Lehet, hogy az kintebb esik a programod területén és emiatt képtelen kezelni a debugger.
(#) Sendi válasza trudnai hozzászólására (») Júl 5, 2008 /
 
Helló Trudnai és Szilva.

Köszönöm, a segítségeteket-
A W-vel nem lehet gond, hiszen új karaktert kezdett, és az ugrótábla első elemét kéne kiolvasnia. Tehát oda "0" kell. A 36C-t megnézem.
Közben arra jöttem rá, azokat a karaktereket szépen kiírja, amelyeknél a PCLATH kiolvasása után, elugorva a kiírandóra, ugyanaz a 'felsőcím' mint a PCLATH-ben, és hibázzik,(megbolondul) ha a 'felsőcím' eltér a PCLATH tartalmától.

Ezt kell megkeresnem. (szerintem)
Csak az a baj, hogy ahová ugrik, ott egy meghívás van és oda nem tudom tenni a PCLATH kiolvasását.

Persze próbálkozom.
Köszönöm a segítségeteket, ha elakadok, kérdezek.
Következő: »»   238 / 1319
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