 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
pr2501 Član

Pridružen-a: Sre 18 Okt 2006 10:40 Prispevkov: 28 Aktiv.: 0.12
|
Objavljeno: Pon Okt 23, 2006 10:51 pm Naslov sporočila: Ne morem uporablajati spremenljivke izven INTERRUPTA |
|
|
uporabljam 18f4550.
Sprejemam mojo željeno vrednost preko usarta: RCREG.
Če dam mojo vrednost na PORTB znotraj interrupta (coda 1) potem mi bojo ledice gorele takokot je bilo poslani iz PC.
Toda če premaknem RCREG v spremenljivko in potem uporabljam to spremenljivko izven interupta (coda 2); bo vrenost spremenljivke netočna in je vedno ista (neodvisno od odtikane vrednosti na tipkovnici) kot je bila prižgana pri na začetku po vnašanju programa.
Koda: |
Coda 1
ORG 0x0000
goto Main ;go to start of main code
ORG 0x0008
int
bcf INTCON, GIE
movwf bckw
swapf STATUS,W
clrf STATUS
movwf bckst
;------------------------------------------------------------
btfss PIR1, RCIF
goto out_int
movf RCREG,0
movwf PORTB
;-----------------------------------------
out_int
bcf PIR1, RCIF
swapf bckst,W
movwf STATUS
swapf bckw,F
swapf bckw,W
bsf INTCON, GIE
retfie
;---------------------------------------------------------------------------------------
Main
bsf INTCON, GIE
bsf INTCON, PEIE
bsf PIE1, RCIE
movlw b'11000000'
movwf TRISC
movlw b'00100100'
movwf TXSTA
movlw .12
movwf SPBRG
movlw b'01001000'
movwf BAUDCON
movlw b'10010000'
movwf RCSTA
clrf TRISB
teja
goto teja
end
Coda2
ORG 0x0000
goto Main ;go to start of main code
ORG 0x0008
int
bcf INTCON, GIE
movwf bckw
swapf STATUS,W
clrf STATUS
movwf bckst
;------------------------------------------------------------
btfss PIR1, RCIF
goto out_int
CLRF one
movf RCREG,0
movwf one
;-----------------------------------------
out_int
bcf PIR1, RCIF
swapf bckst,W
movwf STATUS
swapf bckw,F
swapf bckw,W
bsf INTCON, GIE
retfie
;---------------------------------------------------------------------------------------
Main
bsf INTCON, GIE
bsf INTCON, PEIE
bsf PIE1, RCIE
movlw b'11000000'
movwf TRISC
movlw b'00100100'
movwf TXSTA
movlw .12
movwf SPBRG
movlw b'01001000'
movwf BAUDCON
movlw b'10010000'
movwf RCSTA
clrf TRISB
movf one,0
movwf PORTB
teja
goto teja
end
|
Rešiti ta problem mi je pomembno, ker imam izdelan že program za regulacijo
in mi manka le še sprejemanje željene vrednosti.
Torej je lahko razumljivo kako bi bila rešitev dobrodošla. |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pon Okt 23, 2006 11:56 pm Naslov sporočila: |
|
|
Tako na hitro pogledan program. Meni prva moteča zadeva je vklop interuptov , če prav v danem primeru ne bi smelo imeti vpliva. Lepo je, da se vse kar je potrebno postori prej potem se šele vključijo prekinitve. V tvojem primeru tik pred glavno zanko. Če pa želiš, da se ti bo vrednost iz regista "one" prepisala na portb moraš zanko "teja" dvigniti dve vrstici višje sicer tisto kodo
Koda: |
movf one,0
movwf PORTB |
pobere le ob vklopu.  _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.58
|
Objavljeno: Tor Okt 24, 2006 12:14 am Naslov sporočila: |
|
|
Domnevam, da nisi pripel celotnega programa [za regulacijo], zato napaka iz objavljenega morda sploh ni razvidna.
Je kaj drugace ce tri vrstice za goto out_int nadomestis z
movff RCREG,one
? Ce to deluje, potem imas v tvoji kodi narobe nastavljen BSR (drugace v interruptu in programu). Ce tudi to ne deluje, potem nekaj drugega pregazi vrednost registra.
Za odkrivanje takih napak se sicer uporablja simulator - MPLABov je kar soliden. |
|
Nazaj na vrh |
|
 |
pr2501 Član

Pridružen-a: Sre 18 Okt 2006 10:40 Prispevkov: 28 Aktiv.: 0.12
|
Objavljeno: Tor Okt 24, 2006 12:28 am Naslov sporočila: |
|
|
Zahvaljujem se za tako hiter odgovor: nazalost pa moram sporočiti da ukljucevanje pisanja spremenljivke na port v zanko na "koncu" programa ni bilo uspešno.
teja
movf one,0
movwf PORTB
goto teja
Nebi rad bil nevljuden samo bi vseno rad še vprašal ob tej priliki, kakko
se v 18f4550 nastavi : for no avto increment .Pic 17C42 ima zato register ALUSTA
(STATUS) v 18f4550 pa ne najdem: FSRO mode select.
bsf ALUSTA,FS0
bsf ALUSTA,FS1 ; set FSR0 for no auto increment |
|
Nazaj na vrh |
|
 |
pr2501 Član

Pridružen-a: Sre 18 Okt 2006 10:40 Prispevkov: 28 Aktiv.: 0.12
|
Objavljeno: Tor Okt 24, 2006 12:40 am Naslov sporočila: |
|
|
movff ne pomaga.
Kaj bi mi lahko samo na kratko povedali kaj to je BSR in kako se da v simulatorju upoštevati (simulirati prekinitev)?
Hvala |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.58
|
Objavljeno: Tor Okt 24, 2006 12:46 am Naslov sporočila: |
|
|
pr2501 je napisal/a: |
teja
movf one,0
movwf PORTB
goto teja |
Tudi ti dve vrstici zamenjaj z
movff one,PORTB
(in tisto zgoraj)
Ob tem naj bo one deklariran absolutno (12-bitni naslov). Ali tako spremenjen program deluje pravilno ? Ce ne, potem velja napisano zgoraj (da nekaj povozi spremenljivko), kje pa se tocno to zgodi, pa bos moral ugotoviti v simulatorju.
Vprasanja o FSRju ne razumem - inkrement se zgodi samo kadar vpisujes v dolocen register, ki je temu namenjen. Ob normalnem dostopu (namesto v POSTINC0 recimo pises v INDF0) do post-inkrementa ne pride. Isto velja za post-dekrement in pre-inkrement. Vse to je opisano v datasheetu. |
|
Nazaj na vrh |
|
 |
pr2501 Član

Pridružen-a: Sre 18 Okt 2006 10:40 Prispevkov: 28 Aktiv.: 0.12
|
Objavljeno: Tor Okt 24, 2006 9:23 am Naslov sporočila: |
|
|
Dobro avtomatskemu (ne)inkrementu se bom posvetil za tem.
Hvala za pomoč.
Mogoče pa je kaj narobe s CONFIG biti ?
Saj mi še vedno ne uspeva .
Koda: |
LIST P=18F4550 ;directive to define processor
#include <P18F4550.INC> ;processor specific variable definitions
__CONFIG _CONFIG1L, _PLLDIV_1_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_1_1L
__CONFIG _CONFIG1H, _FOSC_HS_1H & _FCMEM_ON_1H & _IESO_OFF_1H
__CONFIG _CONFIG2L, _PWRT_OFF_2L & _BOR_OFF_2L & _BORV_46_2L & _VREGEN_OFF_2L
__CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_1_2H
__CONFIG _CONFIG3H, _MCLRE_ON_3H & _LPT1OSC_OFF_3H & _PBADEN_OFF_3H & _CCP2MX_OFF_3H
__CONFIG _CONFIG4L, _DEBUG_OFF_4L & _LVP_OFF_4L & _STVREN_OFF_4L
__CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L
__CONFIG _CONFIG5H, _CPB_OFF_5H
__CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L
__CONFIG _CONFIG6H, _WRTB_OFF_6H & _WRTC_OFF_6H & _WRTD_OFF_6H
__CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L
__CONFIG _CONFIG7H, _EBTRB_OFF_7H & _DEVID1 & _IDLOC0
one equ 0x0021
ten equ 0x0022
hun equ 0x0023
tou equ 0x0024
test equ 0x0025
oneA equ 0x0026
tenA equ 0x0027
hunA equ 0x0028
touA equ 0x0029
binar equ 0x0030
highONE equ 0x0031
lowONE equ 0x0032
testT equ 0x0033
lowTEN equ 0x0034
highTEN equ 0x0035
flag equ 0x0036
bckst equ 0x36
bckw equ 0x37
ORG 0x0000
goto Main ;go to start of main code
ORG 0x0008
int
;bcf INTCON, GIE
movwf bckw
swapf STATUS,W
clrf STATUS
movwf bckst
;------------------------------------------------------------
btfss PIR1, RCIF
goto out_int
CLRF one
movf RCREG, W
movwf one
bsf flag, 0 ; tell main loop that a new character has been received
;-----------------------------------------
out_int
bcf PIR1, RCIF
swapf bckst,W
movwf STATUS
swapf bckw,F
swapf bckw,W
; bsf INTCON, GIE
retfie
;---------------------------------------------------------------------------------------
Main
movlw b'11000000'
movwf TRISC
movlw b'00100100'
movwf TXSTA
movlw .12
movwf SPBRG
movlw b'01001000'
movwf BAUDCON
movlw b'10010000'
movwf RCSTA
bsf INTCON, GIE
bsf INTCON, PEIE
bsf PIE1, RCIE
clrf TRISB
clrf PORTB
teja
btfss flag,0 ; Check for a new character
goto teja ; Did not find one go check again (or do other stuff)
movff one,PORTB
bcf flag,0 ; Clear flag bit so that we don't look at it again
goto teja
goto teja
end |
|
|
Nazaj na vrh |
|
 |
pr2501 Član

Pridružen-a: Sre 18 Okt 2006 10:40 Prispevkov: 28 Aktiv.: 0.12
|
Objavljeno: Tor Okt 24, 2006 9:28 am Naslov sporočila: |
|
|
Se opravičujem
Pozabil sem vprašati :
Ob tem naj bo one deklariran absolutno (12-bitni naslov)
??? |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.58
|
Objavljeno: Tor Okt 24, 2006 10:07 am Naslov sporočila: |
|
|
Dostop do RAMa je pri vecini ukazov s pomocjo segmentnega registra, movff pa je izjema in potrebuje absoluten naslov (vseh 12 bitov) in posledicno ignorira - morebiti narobe nastavljene - segmenti register (BSR). Poleg tega je tudi bolj pregleden kot dve loceni vrstici in ne pregazi W.
Tvoj program je napisan (milo receno) nekoliko nenavadno: interrupt se sprozi samo, ko prispe znak, torej mora biti RCIF vedno postavljen (preverjanje tega je nesmiselno). Ce bi se interrupt sprozil kako drugace (npr. z timerjem in ne z Receive flagom UARTa), bi bilo preverjanje smiselno, a bi v tem primeru imel v kodi en race condition zato, ker gre skok (goto out_int) en ukaz premalo dalec (moral bi skociti vrstico nizje).
Se zadnjic: uporabi simulator in sledi toku programa, pa bos videl kje pride do tezav. |
|
Nazaj na vrh |
|
 |
pr2501 Član

Pridružen-a: Sre 18 Okt 2006 10:40 Prispevkov: 28 Aktiv.: 0.12
|
Objavljeno: Tor Okt 24, 2006 11:03 am Naslov sporočila: |
|
|
zahvaljujem se za potrpežljivost.
Sedaj mi deluje . flag spremenljivko sem pomotoma shranil enako kot eno drugo spremenljivko.
Da bi se izognil temu bi me rešila simulacija: samo nevem kako MPLAB SIM lahko simulira
interapt. |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.58
|
Objavljeno: Tor Okt 24, 2006 11:29 am Naslov sporočila: |
|
|
pr2501 je napisal/a: |
Da bi se izognil temu bi me rešila simulacija: samo nevem kako MPLAB SIM lahko simulira interapt. |
Ce bi prebral navodila za uporabo, bi izvedel - poglej stran 224 in nizje (234/288 v Acrobat Readerju). |
|
Nazaj na vrh |
|
 |
pr2501 Član

Pridružen-a: Sre 18 Okt 2006 10:40 Prispevkov: 28 Aktiv.: 0.12
|
Objavljeno: Čet Okt 26, 2006 2:38 am Naslov sporočila: |
|
|
Spodnja koda mi dela velike težave. Saj me nebi toliko skrbelo če mi nebi diploma stala zaradi tega. In hrbet me že hudo boli od tega celodnevnega čepenja za PC.
Ja vem, vsak ima svoje težave.
Poskušal sem slediti navodilom iz (zgoraj pokazanefa linka) Ob tej priliki se bom zahvalil za pomoč.
Data sheet:
1. Once the project is completed, you will need an input file to simulate USART
signal input.
- Select File>Open to open an editor window.
- Enter message-based data for RCREG input (see
Section 18.2.5.2 “Message-Based Data File Description” for information
on this format). Example input might be:
//single-packet example
wait 20 ms
10 20 34
- Select File>Save and name the file input.txt.
2. Select Debugger>SCL Generator>New Workbook. Click on the
Register Injection tab.
- Under “Register”, select “RCREG”.
- Under “Trigger”, “Message” will be selected. (There are no other choices.)
- Under “Data Filename”, locate and select input.txt.
- Under “Rewind”, select “Yes”.
- Under “Format”, “Pkt”, or packet, will be selected. (There are no other
choices.)
- Click Generate SCL from Workbook and name the file usart.scl.
- Click Exit and save the workbook (usart.sbs).
3. Select Debugger>Stimulus Controller>New Scenario.
- Under “Stimulus (SCL) File”, click Attach.
- In the Open dialog, select usart.scl and click OK.
- Click Save Scenario to save the scenario (usart.stc), then minimize this
window as it must stay open for stimulus operation.
4. Open a Watch window to see the USART registers update.
- Select View>Watch.
- In the Watch window, add the SFRs RCREG and TXREG.
5. Build the project again and run it to see the output in the Watch window.
- Select Project>Build All.
- Place a breakpoint at the beginning of the interrupt vector (IntVector) code,
i.e., at line
“btfss PIR1,RCIF ; Did USART cause interrupt?”.
- Run the code till the breakpoint halt to see the value of RCREG change.
- Step to see the value of TXREG change to match the injected value of
RCREG.
- Run and step again to see the values change as per the input file.
in uspel pripeti scenarijo, samo nič.
Test na koncu ni šel skozi.
Čeprav na nek nači uspevam z " debuganjem" s tem, da si zakomentiram sumljive dele kode in potem po korakih grem naprej s tem ko si ispisujem registre oziroma spremenljivke na ledice (PORT). Ko grem v subrutino mi se zgubi vrednost spremenljivke (?????)
Skratka ali mi lahko gdo pomaga prosim? Da se naučim delati simulacijo interaptov.
Saj je iz kode vidno kaj rabim: tri zaporedne prekinitve v presledku ene sekunde in vsakič naj se izpiše druga vrednost v RCREG.
Koda: |
arrived_sign equ 0x0021
ONE equ 0x0022
TWO equ 0x0023
THREE equ 0x0024
in_w_TEM equ 0x0025
in_Hysteresis equ 0x0026
in_c_TEM equ 0x0027
T_bin equ 0x0028
O_bin equ 0x0029
one_Highflag equ 0x0030
ten_flag equ 0x0031
O_HI_LO_bin equ 0x0032
O_HI_LO_bin_high equ 0x0033
flag equ 0x0034
O_HI_LO_bin_z equ 0x0035
end_packet equ 0x0036
O_HI_bin equ 0x37
bckst equ 0x37
bckw equ 0x38
one_flag equ 0x39
ORG 0x0000
goto Main ;go to start of main code
ORG 0x0008
int
btfss PIR1,RCIF ;
bcf INTCON, GIE
movwf bckw
swapf STATUS,W
clrf STATUS
movwf bckst
;------------------------------------------------------------
movf RCREG,0
movwf arrived_sign
bsf flag, 0 ; tell main loop that a new character has been received
;-----------------------------------------
out_int
bcf PIR1, RCIF
swapf bckst,W
movwf STATUS
swapf bckw,F
swapf bckw,W
bsf INTCON, GIE
retfie
Main
INI
movlw b'11000000'
movwf TRISC
movlw b'00100100'
movwf TXSTA
movlw .12
movwf SPBRG
movlw b'01001000'
movwf BAUDCON
movlw b'10010000'
movwf RCSTA
bsf INTCON, PEIE
bsf PIE1, RCIE
bsf INTCON, GIE
clrf TRISB
clrf O_HI_bin
clrf one_Highflag
CLRF T_bin
CLRF TRISB
clrf ten_flag
clrf ten_flag
clrf PORTB
clrf end_packet
clrf flag
clrf one_flag
startstart
start
btfsc end_packet,0
goto start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
new
btfss flag,0 ; Check for a new character
goto new ; Did not find one go check again (or do other stuff)
bcf flag,0 ; Clear flag bit so that we don't look at it again
; movlw b'00110001'
; movwf arrived_sign
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOVLW b'00110000'
subwf arrived_sign,1
movf arrived_sign,0
btfss ten_flag,0
goto writeTen
btfss one_Highflag,0
goto writeOne_High
btfss one_flag,0
goto writeOne
goto startstart
writeTen
movwf T_bin
bsf ten_flag,0
goto startstart
;
writeOne_High
movwf O_HI_bin
SWAPF O_HI_bin,F
bsf one_Highflag,0
goto startstart
;
;
writeOne
movf arrived_sign,0
addwf O_HI_bin,0
movwf O_HI_LO_bin
bsf end_packet,0
bsf one_flag,0
movf O_HI_LO_bin,0
goto startstart
;
end |
|
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 491 dni
Powered by phpBB © 2001, 2005 phpBB Group
|