Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   331 / 1319
(#) szigetivan hozzászólása Nov 2, 2008 /
 
Sziasztok!

Valaki tudna nekem egy olyan programrészletet küldeni melyben van SLEEP és ebből hogyan ébred fel a kontroller(PIC16F690-esem van)??Vagy programkóddal és kommentekkel elmagyarázni az egész lényegét..
Köszi
(#) zsimon hozzászólása Nov 2, 2008 /
 
Hali!

Tudja valaki hogy miért nem veszi figyelembe Mpalb Sim-je a breakpoint-okat? Simán átgázol rajta.
Anno használtam a 8.14-et. Működött. Aztán néztem hogy javítottak 8.15--re amiben az ECAN regisztereken sokat faragtak (anno jeleztem nekik). Erre a fenti problémát csinálja ICD2-vel. Na vissza 8.14-re. Ezzel is. Aztán ICD2 mindkét verzióban kikapcsol, és a SIM se veszi fogyelembe a breakpoint-okat...

Mi lehet?
(#) Mate78 válasza trudnai hozzászólására (») Nov 2, 2008 /
 
Idézet:
„A tabla olvasas igy ebben a formaban nem jo, mivel csak akkor mukodik ha a tablazat nem esik laphatarra.”


Azt,hogy egy adott kontrollerben,jelen esetben nálam 18F452-ben hol vannak a laphatárok azt honnan tudom meg?Az rendben hogy 32768 byte a program memória,tehát 16384 word,de hány részre van osztva?Tehát milyen címen kell elhelyeznem a táblázatomat hogy jó legyen?(34bytes-os a táblázatom.)

Adatlapot már néztem többször is de nem találtam meg.

köszi

üdv
(#) watt válasza Mate78 hozzászólására (») Nov 2, 2008 /
 
A 18F-eken nincs laphatár. A táblázatokat sem RETLW-vel kell megoldani, hanem a táblakezelő utasításokkal.
(#) szilva válasza watt hozzászólására (») Nov 2, 2008 /
 
Ha a MOVWF PCL és hasonló utasításokkal megvalósított táblázatolvasást nézed, akkor az azt jelenti, hogy minden 256. byte új "lapra" esik, azaz kell foglalkozni a PCLATH regiszterrel is (sőt, ha kellően nagy a flash, akkor ott még a PCLATU-val is). De mivel a 18F-ben léteznek a táblázatkezelő utasítások, ezt így nem szoktuk ott használni. Esetleg akkor van létjogosultsága, ha egy kész progit migrálunk 16F-ről 18F-re és nem akarjuk az egész, 16F-en már belőtt táblázatkezelést átírni (de a PCLATH-val 16F-en is kell foglalkozni).
(#) Mate78 válasza watt hozzászólására (») Nov 2, 2008 /
 
Akkor jó.Egyébként nem RETLW-vel csinálom hanem a táblázatkezelő utasításokkal.
(#) icserny válasza szigetivan hozzászólására (») Nov 2, 2008 /
 
Az adatlap 14.6.1 alfejezete elmagyarázza. Elég sok lehetőséget sorol fel a felébresztésre. Konkrétan kérdezz: ezek közül melyik kellene, vagy mi nem világos az ott leírtakban?

(#) szigetivan válasza icserny hozzászólására (») Nov 2, 2008 /
 
Szia!

nekem egy olyan kellene, amit már Potyo megírt,h. elméletben hogyan kellene,ami a kontrollert sleep állapotba juttatja és olyan 10 perc múlva felébreszti, de sajnos nem tudom lekódolni
"Pl. lehet úgy, hogy a Timer1 külső oszcillátorát engedélyezed, teszel rá egy 32,768kHz-es kvarcot 4-es prescalerrel, és a kontrollert meg SLEEP-be küldöd. Amikor a Timer túlcsordult, akkor felébreszti a kontrollert, ekkor egy változó tartalmát megnöveled egyel, és ismét SLEEP. Ezzel 8 másodpercenként ébred fel néhány us időre. Amikor a változód elért 75-re, akkor telt le a 10 perc, nullázod a változót, és megcsinálod, amit kell. Ezután kezdődik előlről."
(#) trudnai válasza Mate78 hozzászólására (») Nov 3, 2008 /
 
Idézet:
„Azt,hogy egy adott kontrollerben,jelen esetben nálam 18F452-ben hol vannak a laphatárok azt honnan tudom meg?Az rendben hogy 32768 byte a program memória,tehát 16384 word,de hány részre van osztva?Tehát milyen címen kell elhelyeznem a táblázatomat hogy jó legyen?(34bytes-os a táblázatom.)”


Az adatlapon a "Computed Goto" foglalkozik a kerdessel... Arrol van szo, hogy a memoria cimzes ezeknel 20 bites, igy sem 8 sem 16 biten nem fer el a teljes cim - elmeletben, gyakorlatilag mivel csak 32kB a RAM ezert 16 biten leirhato... Az architektura ugye 8 bites, igy a teljes PC-hez (Program Counter) nem fersz hozza, csak a PCL (PC Low) regiszterhez. Ez csak 8 bit igy 0..255 -ig vagy kepes ezzel cimezni. A PCL ugye a PC also 8 bitje, tehat minden 256-os laptoresek keletkeznek. A 0. lap a 0...255, az 1. a 256...511 es igy tovabb...

Mivel a 18F-eken 1 utasitas 16 bites, es neked byte-os cimzesed van, ezert a szamitott ugrasoknal van egy kettes osztas, azaz egy lapon max 128 elemet tarolhatsz el - marmint ha egy elem 1 szavas utasitas. Namost ha a tablad a 250-es cimen kezdodik, akkor (256-250)/2, azaz 3 tabla elem fer bele az aktualis lapba, a rakovetkezok mar a kovetkezo lapra esnek.

Ha a talad biztosan elfer egy laoon, akkor meg lehet csinalni, hogy lekerdezed a tabla elejen es vegen a programszamlalo cimet, ossze hasonlitod es ha nem egyezik egy error-al leallitod a forditast. high(TABLA) ill high(TABLA_VEGE) mondja meg, es egy egyszeru IF-el lehet az elagazast megoldani.

Abban viszont wattnak maximalisan igaza van, hogy tablakhoz 18F-nel mar nem szokas RETLW-s tablakat hasznalni, annal joval hatekonyabb a TBLRD stb utasitasok hasznalata. Szamitott elagazast persze ettol fuggetlenul meg lehet eszkozolni mas feladatokra.
(#) mrfencer válasza trudnai hozzászólására (») Nov 3, 2008 /
 
Trudnai, Köszi a választ villog a ledem! És azt hiszem értem mis a lényeget. Kicsit tovább akartam fejleszetnia progimat de nem sikerül. A PORTC 0-3ig van egy 4 es kapcsolóm azt szeretném megvalósitnai hogy ha a RC0 n lévó kapcsolót egyesbe állirom akkor induljon el a LED villogás ha meg lekapcsolom akkor megszünjön a villogás. Próbálkoztam pár dologgal de aze a megszakitásos dolog nekem még kinai. Tudnátok nekem segiteni hogy mit hova irjak hogy működjön a kapcsolgatás? Előre is köszi!
  1. LIST P=16F877
  2. #INCLUDE "P16F877.INC"
  3. __CONFIG _XT_OSC&_CP_OFF&_WDT_OFF&_LVP_OFF
  4.  
  5. ORG 0
  6.  
  7. #define RRLED PORTB,0  ; Right_Red_LED RB0
  8. #define ROLED PORTB,1  ; Right_Orange_LED RB1
  9. #define LOLED PORTB,2  ; Left_Orange_LED RB2
  10. #define LGLED PORTB,3  ; Left_Green_LED RB3
  11. #define S1 PORTC,0         ; S1 switch
  12.         d1 equ 0x20
  13.         d2 equ 0x21
  14.  
  15.  
  16. START
  17.         banksel TRISB           ; Selects bank containing register TRISB
  18.         clrf    TRISB           ; All port B pins are configured as outputs
  19.         banksel PORTB           ; Selects bank containing register PORTB
  20.  
  21.  
  22.         btfsc S1              ;ez itt tuti nem ilyen egyszerű
  23.         goto testB          
  24. testB
  25.  
  26.         bcf ROLED
  27.         bcf LOLED
  28.         call delay
  29.         call delay
  30.         bsf ROLED
  31.         bsf LOLED
  32.         call delay
  33.         call delay
  34.         goto testB
  35.  
  36. delay                           ;250ms-es késleltetés
  37.         movlw 0xff
  38.         movwf d1
  39.         movlw 0xff
  40.         movwf d2
  41. del
  42.         decfsz d1
  43.         goto del
  44.         decfsz d2
  45.         goto del
  46.         return
  47.  
  48. end
(#) watt válasza trudnai hozzászólására (») Nov 3, 2008 /
 
Köszönöm a leírást, végül is C-ben hasonló a helyzet, és ott használom is félig meddig a dolgot de csak eddig a szintig(még annyit tettem, hogy másképp osztottam fel a memória területet a linker fájl szerkesztésével).

A cikk írására ösztökélnélek, mert szerintem sokan nagyon örülnének(én is!), főleg a több nyelvű forrásból való összelinkelés menetének(ASM+C)!
Mégegyszer köszi!
(#) icserny válasza szigetivan hozzászólására (») Nov 3, 2008 /
 
Idézet:
„de sajnos nem tudom lekódolni”

A kiinduláshoz elég annyi, hogy az adatlap 6.8 alfejezetében leírtakat kell követni.
(#) icserny válasza mrfencer hozzászólására (») Nov 3, 2008 /
 
Errefelé próbálkozz:
  1. testC
  2.         btfsc S1    
  3.         goto testC          
  4. testB
  5.         bcf ROLED
  6.         bcf LOLED
  7.         call delay
  8.         call delay
  9.         bsf ROLED
  10.         bsf LOLED
  11.         call delay
  12.         call delay
  13.         goto testC


Tehát csak S1 egy bizonyos állapotában engedd a vezérlést a testB szakaszra, s minden ciklusban S1 tesztelésére kell visszaugrani.

Természetesen a C port kezdeti konfigurálását rád hagytam...
(#) mrfencer válasza icserny hozzászólására (») Nov 3, 2008 /
 
Nagyon szépen köszönöm!
Működik
(#) watt válasza icserny hozzászólására (») Nov 3, 2008 /
 
Igazából elég lett volna annyi, hogy a testB-t átteszi a btfsc S1 elé és kész.
De bevallom nem nagyon szeretek olyan szöveget olvasni, amiben egy szál vessző sincs, ezért el se olvastam a kérdését végig! Minden tiszteletem a tiéd, hogy Te veszed a fáradságot!
(#) trudnai válasza mrfencer hozzászólására (») Nov 3, 2008 /
 
Orulok, hogy villog a LED-ed. A PORTC-t is illik felinicializalni, talan ha szerencsed van akkor eppen digitalis input lesz a power-on reset utan (bekapcsolast kovetoen).
  1. btfsc S1              ;ez itt tuti nem ilyen egyszerű
  2.         goto testB
  3. test8

De igen, epp, hogy ilyen egyszeru, csakhogy nem elore kellene ugrani!
  1. test8
  2.         btfsc S1              ;ez itt tuti nem ilyen egyszerű
  3.         goto testB

Azonban ez:
  1. bsf ROLED
  2.         bsf LOLED

problemat okozhat! Az van ugyanis, hogy ha ugyanazon a porton ketszer egymast kovetoen elvegzel egy RMW utasitast, akkor nem biztos, hogy a vart eredmenyt kapod meg.

Mi az az RMW? Read-Modify-Write. Mikor azt mondod BCF peldaul, akkor elobb kiolvassa a teljes portot, majd elvegzi a bitmuveletet majd vissza irja a teljes portot. Ez nem baj eddig, a baj az, hogy a BSF ROLED (ami ugye BSF PORTB,1) magasra allitana a portot, de a port nem kepes eleg gyorsan magasra allni, igy a kovetkezo hasonlo utasitasnal amikor a port kiolvasodik akkor meg alacsony erteket mutat, ezert ezt az alacsony erteket szepen vissza irja a portba (ugye mert hiaba allitasz egy masik port bitet akkor is a teljes portot olvassa-irja)!

A lusta javitasa ennek a problemanak, hogy egy NOP-ot szursz ezek koze, a profi javitasa, hogy un. shadow regisztert alkalmazol, azon vegzed el a muveletet es azt irod ki a PORT-ra...
  1. BSF    SHADOWB,1
  2.         BSF    SHADOWB,2
  3.         BSF    SHADOWB,3
  4.         MOVF   SHADOWB,W
  5.         MOVWF  PORTB

Ja, es igen, elkepzelheto, hogy veletlenul mukodott a LED villogtatas, ettol meg a problema fenn all - valtozik a feszultseg, a homerseklet vagy a para tartalom es a cuccod megall!
(#) mrfencer válasza trudnai hozzászólására (») Nov 3, 2008 /
 
Srácok! Köszönöm a válaszokat, ezek több mint válaszok, jól el is magyarázzátok, többet segítetek, mint itt Franciaoban a kedves konzulensem. Le se sz*r. Szóval tényleg köszi szépen!
(#) icserny válasza watt hozzászólására (») Nov 3, 2008 /
 
Idézet:
„Igazából elég lett volna annyi, hogy a testB-t átteszi a btfsc S1 elé és kész.”

Meglehet. Csak kicsit furán nézett volna ki a TesB címke a C port tesztelésénél....
(#) watt válasza icserny hozzászólására (») Nov 3, 2008 /
 
Ahá! Látod ilyen összefüggést nem kerestem!
(#) trudnai válasza watt hozzászólására (») Nov 3, 2008 /
 
En raadasul meg a "testB" elneztem "test8" -nak Amugy mentsegunkre legyen mondva a teszteles az S1-re hivatkozik, igy nem egyertelmu hogy miert B vagy C a cimke
(#) mrfencer válasza trudnai hozzászólására (») Nov 3, 2008 /
 
Elárulom a titkot: a próbálgatások közepette ugy maradt és nem írtam át
(#) Mate78 válasza trudnai hozzászólására (») Nov 3, 2008 /
 
Köszi szépen.Kezdem érteni a táblakezelést.
Ha jól értem akkor a PCL állítása csak a RETLW-s megoldásnál kell.Viszont ha TBLRD valamelyikét használom akkor nem kell bántani a PCL-t,hanem csak a TBLPTR regisztereket.Erre az esetre is vonatkozik a lapváltás amit írtál?

köszi

üdv



(#) trudnai válasza Mate78 hozzászólására (») Nov 3, 2008 /
 
Idézet:
„Ha jól értem akkor a PCL állítása csak a RETLW-s megoldásnál kell.”


Igy van.

Idézet:
„Viszont ha TBLRD valamelyikét használom akkor nem kell bántani a PCL-t,hanem csak a TBLPTR regisztereket.Erre az esetre is vonatkozik a lapváltás amit írtál?”


Nem kell PCL - Az a gyanum, hogy nem erted a PCL/RETLW-s megoldas hogy mukodik es hogy mi a kulonbseg a tablas olvasastol. PCL az szamitott GOTO utasitas. Azaz a programszal alugrik valahova. Ott azon a helyen pl van egy csupa RETLW utasitasbol adodo tablazat. Mikor RETLW vegrehajtodik vissza ter a CALL utasitas utani cimre, de kozben a W-be betolti azt amit megadsz a RETLW parameterekent... Magyaran annal ugy nez ki a dolog, hogy
  1. CALL fixtablacim
  2.     ...mikor ide visszater, akkor W erteke 1 vagy 2 vagy 3 .. vagy n
  3.  
  4. fixtablacim
  5.     {szamitott GOTO}
  6.     RETLW 1
  7.     RETLW 2
  8.     RETLW 3
  9.     ...
  10.     RETLW n

A {szamitott GOTO} az valojaban az ADDWF PCL - ill ha normalisan csinalja meg az ember akkor az ami szamol a PC felso bitjeivel is...

TBLRD-nel nincs ugras! Ott a tabla mutatot kell feltolteni, es ugyanugy kell szmaolni a cimek felso bitjeivel, nemcsak az alsokkal. Magyaran a TBLPTR regiszter 3 reszre van osztva:

TBLPTRU : TBLPTRH : TBLPTRL --> U)pper : H)igher : L)ower:

Ami miatt a TBLPTR-nel mindenkeppen torodnod kell a felso bitekkel, mert mig a PC eseteben ha a PCL-t kiolvasod akkor a PCU es PCH automatan atmasolodik a PCLATU : PCLATH regiszterekbe, mig a TBLPTRL olvasasanal ilyen jatekok termeszet szeruleg nincsenek. Magyaran ADDWF PCL -nel ami tortenik: Ugye ADDWF ugyanugy RMW utasitas, tehat:

1. Kiolvasodik a PCL, emiatt a felso bitek masolasa megtortenik a PCLATU : PCLATH -ba
2. ADD W
3. PCL vissza irasa

Magyaran ha nincs az ADDWF es a tabla vege kozott lapvaltas akkor minden ok, mivel a felso bitek aktualizalodnak... TBLPTR-nel meg ugye minden esetben ki kell tolteni a felso biteket, de ami gond szokott lenni, hogy nem eleg egyszzer kitolteni, mikor hozza adsz a TBLPTR-hez manualisan erteket, akkor azt 16 ill 24 bitesen kell megtenni... Szerencsenkre ez 18F eseteben eleg egyszeru:
  1. ADDWF   TBLPTRL,F
  2.     MOVLW   0
  3.     ADDWFC  TBLPTRH,F
  4.     ADDWFC  TBLPTRU,F
(#) icserny hozzászólása Nov 4, 2008 /
 
Egy tanulságos hiba

Ismerkedve a FlashForth programnyelvvel, nekiestem az ADC programozásnak. Mivel a "!" utasítással bármely címre írhatunk adatot, így akartam inicializálni az ADC-t:

  1. Hibás kód!!!
  2.           1 adcon0 !   ( select channel 0, enable ADC )
  3.          $0e adcon1 !   ( Vref=Vdd,Vss onla AN0 is analog )
  4.          $b6 adcon2 !   ( Right justified, 16TAD, Fosc/64 )


Csupán arról az "apróságról" feledkeztem meg, hogy az alap adattípus 16 bites, így ADCON1 írásakor kitöröltem ADCON0-t, ADCON2 írásakor pedig ADCON1-et. A bájtonkénti írás (c!) használata természetesen megoldotta a problémát.

A működő kód:

  1. : adc-init 1 porta mclr  ( clear bit 0 )
  2.            1 trisa mset  ( set bit 0 as input )
  3.            1 adcon0 c!   ( select channel 0, enable ADC )
  4.          $0e adcon1 c!   ( Vref=Vdd,Vss onla AN0 is analog )
  5.          $b6 adcon2 c!   ( Right justified, 16TAD, Fosc/64 )
  6.          $40 pie1  mclr  ( clear ADIE = disable ADC interrupt )
  7.          $40 pir1  mclr  ( clear ADIF flag )
  8.   ;
  9.  
  10. : adc-an0 $40 pir1 mclr  ( clear ADIF flag  )
  11.           2 adcon0 mset  ( start conversion )
  12.           begin
  13.             2 adcon0 mtst 0= ( check if GO cleared )
  14.           until          ( wait until conversion finishes )
  15.           adresl @       ( get result and leaves on top of stack )
  16.   ;


adc-init analóg bemenetnek konfigurálja AN0-t.
adc-an0 pedig indít egy konverziót és visszatér egy
0-1023 közötti értékkel.

Korábbban felmerült már itt, hogy mire jó a Forth. Nos, leginkább a breadboardhoz (dugdosós panel) tudnám hasonlítani. Olyan a Forth a programfejlesztésben, mint a dugdosós panel az áramkörfejlesztésben. Könnyű összerakni benne egy kísérleti elrendezést, s könnyű ellenőrizni a működését, vagy módosítani valamit, ha nem működik. Amióta a HPC Explorerbe egyszer beégettem a Forth interpretert, azóta nyugdíjaztam a PICkit-et és az MPLAB-ot.

(#) watt válasza icserny hozzászólására (») Nov 4, 2008 /
 
Régebben volt olyan nyelv, hogy Forthran, annak van valami köze ehhez? Na azt se szerettem meg. Olvashatatlan áttekinthetetlen számomra az egész íráskép.
(#) trudnai válasza watt hozzászólására (») Nov 4, 2008 /
 
Idézet:
„Forthran, annak van valami köze ehhez?”


Nem, az inkabb Pascalos. A Forth es "mas programnyelvek" kozott kb annyi a kulonbseg, mint egy HP48-as kalkulator es "mas szamologep"-ek kozott... A HP48 ugyanis forditott lengyel logikaval dolgozik, tehat mikor azt akarod, hogy (3+4) * (5+6) akkor beirod:

3 4 + 5 6 + *

Ezt a logikat meg kell szokni, elonye, hogy nem kell zarojelezni (es amugy minden programozasi nyelv ebbe a formaba onti at a dolgainkat).

Ha jol ertem icserny, ezzel a Forth interpreterrel van egy RS232 linked a PC es a PIC+breadboard kozott, tehat ahogy beirod "1 portb c!" azonnal latod, hogy pl a LED kigyullad? A definialt fuggvenyek hol tarolodnak le? Program memoriaban? Ugyanis az hamar elhasznalodik, ha sokszor ujrairogatja az ember...
(#) icserny válasza watt hozzászólására (») Nov 4, 2008 /
 
Idézet:
„Régebben volt olyan nyelv, hogy Forthran, annak van valami köze ehhez?”

Nem, nincs. Az FORTRAN volt azaz FORmula Translator, s az volt a célja, hogy a tudományos, műszaki, vagy egyéb számolások viszonylag kényelmesen megfogalmazhatók legyenek benne (azaz a fordító tudja a matematikai kifejezéseket gépi kódra fordítani).

A Forth-nak inkább a 4th-hoz van köze, "negyedik generációs" nyyelvnek szánta a kitatálója.
(#) icserny válasza trudnai hozzászólására (») Nov 4, 2008 /
 
Idézet:
„ezzel a Forth interpreterrel van egy RS232 linked a PC es a PIC+breadboard kozott, tehat ahogy beirod "1 portb c!" azonnal latod, hogy pl a LED kigyullad?”


Igen, így van. Sőt, a copy+paste is használható. S ha beírom, hogy portb c@ . akkor meg beolvassa és kiírja a B port állapotát. Sőt, azzal is lehet szórakozni, hogy $ff trisb c! $ff latb c! portb c@ . latb c@ . s akkor látom, hogy portb estleg nulla, latb meg csupa egyes.

Van egy RAM buffer, s a változókat ide pakolhatom, illetve a direkt parancsok is ezt írogatják felül. Az újonnan definiált parancsok azonban (előbb vagy utóbb ) a programtárba kerülnek (ezért Flash Forth a neve). Az elhasználódással valóban számolni kell, ezért:

- bár elvileg tehet az ember változót a Flask memóriába is, nem érdemes, ha az gyakran változik.
- Amit lehet, azt direkt paranccsal (a már meglevő utasítások kombinálásával) próbálok ki. Ez - tudomásom szerint - csak a RAM-ba ír.
- Az új definiciók próbálgatásánál inkább haladok előre a memóriában ( pl. ha adc-test nem jól működik, akkor a memóríában utána írom a javított változatot adc-test2, adc-test3 néven) hogy ne egy helyen gyötörjem a memóriát újraírással, s csak amikor végeztem, akkor törlöm ki egyben a szemetet (ehhez kell a marker utasítás).
- nem utolsó sorban papíron ceruzával kell megírni a programot úgy, hogy ne kelljen sokat javítgatni rajta

Mindezek mellett a PIC18F8722 10000-100000-szeres ujraírhatósága elég soknak tűnik...

(#) watt válasza icserny hozzászólására (») Nov 4, 2008 /
 
Jé! Eddig ez nekem nem esett le, hogy ez ilyen! Ez nem is olyan rossz!
(#) szigetivan válasza icserny hozzászólására (») Nov 4, 2008 /
 
köszi.
még egy olyan kérdésem lenne,h.ha nem így akarom megoldani a megszakítást, hanem ugy,h.egy (RA2/INT) -en lévő gomb nyomására induljon újra a mérés, akkor mit kell figyelembe venni??
Következő: »»   331 / 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