www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Ne morem uporablajati spremenljivke izven INTERRUPTA

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja PIC-a v Assembler-ju
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
pr2501
Član
Član



Pridružen-a: Sre 18 Okt 2006 10:40
Prispevkov: 28
Aktiv.: 0.12

PrispevekObjavljeno: Pon Okt 23, 2006 10:51 pm    Naslov sporočila:  Ne morem uporablajati spremenljivke izven INTERRUPTA Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.95
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Pon Okt 23, 2006 11:56 pm    Naslov sporočila:   Odgovori s citatom

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. Wink

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.58

PrispevekObjavljeno: Tor Okt 24, 2006 12:14 am    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
pr2501
Član
Član



Pridružen-a: Sre 18 Okt 2006 10:40
Prispevkov: 28
Aktiv.: 0.12

PrispevekObjavljeno: Tor Okt 24, 2006 12:28 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
pr2501
Član
Član



Pridružen-a: Sre 18 Okt 2006 10:40
Prispevkov: 28
Aktiv.: 0.12

PrispevekObjavljeno: Tor Okt 24, 2006 12:40 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.58

PrispevekObjavljeno: Tor Okt 24, 2006 12:46 am    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
pr2501
Član
Član



Pridružen-a: Sre 18 Okt 2006 10:40
Prispevkov: 28
Aktiv.: 0.12

PrispevekObjavljeno: Tor Okt 24, 2006 9:23 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
pr2501
Član
Član



Pridružen-a: Sre 18 Okt 2006 10:40
Prispevkov: 28
Aktiv.: 0.12

PrispevekObjavljeno: Tor Okt 24, 2006 9:28 am    Naslov sporočila:   Odgovori s citatom

Se opravičujem

Pozabil sem vprašati :

Ob tem naj bo one deklariran absolutno (12-bitni naslov)
???
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.58

PrispevekObjavljeno: Tor Okt 24, 2006 10:07 am    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
pr2501
Član
Član



Pridružen-a: Sre 18 Okt 2006 10:40
Prispevkov: 28
Aktiv.: 0.12

PrispevekObjavljeno: Tor Okt 24, 2006 11:03 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.58

PrispevekObjavljeno: Tor Okt 24, 2006 11:29 am    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
pr2501
Član
Član



Pridružen-a: Sre 18 Okt 2006 10:40
Prispevkov: 28
Aktiv.: 0.12

PrispevekObjavljeno: Čet Okt 26, 2006 2:38 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja PIC-a v Assembler-ju Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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