Teade

Collapse

Foorumi reeglid.

Foorumi reeglistik on uuendatud. Palume tutvuda ja arvesse võtta.
See more
See less

PIC16Fxxx ja interrupti sisenemine programmimälu teiselt leheküljelt

Collapse
X
 
  • Filter
  • Kellaaeg
  • Show
Clear All
new posts

    PIC16Fxxx ja interrupti sisenemine programmimälu teiselt leheküljelt

    Tekkis järgmine probleem - kui katkestus tekib ajal, kui täidetakse programmimälu teisel leheküljel asuvaid alamprogramme, sattub program counter kuhugi teise lehekülje esimese alamprogrammi algusesse.

    MCU (PIC16F690i) töö ühtlustamiseks ja kella-rakenduse lihtsustamiseks on põhiprogrammtsükli alustamise tingimuseks ühe biti seadmine üheks. Iga 1 ms järel saab TMR2 täis, kutsutakse katkestuse alamprogramm, milles seatakse bitt üheks ja põhiprogrammi täitmine võib alata.
    Kõik toimis, kuni lisasin programmimälu teisele leheküljele (h '0900'...) alamprogrammi USART-i kaudu andmete saatmiseks. Keset selle täitmist saab 1 ms täis.

    Kuidas saaks teiselt leheküljelt katkestuse teenindamise alamprogrammini?
    Proovisin ,,org 0x0004" ja ,,goto ISR" vahele mahutada ,,pagesel ISR", kuid kompilaator andis veateate (,,could not fit into absolute section").
    Hoiatus - muudan oma postituse sisu kuni 30 minuti vältel pärast postitamist.

    #2
    Vs: PIC16Fxxx ja interrupti sisenemine programmimälu teiselt leheküljelt

    proged Cs? siis ei tohiks ju see teema olla.
    Samas kes peaks Cs ksutama goto jms asju, oleks ajuvaba.
    Tõenäoliselt tegu siiski asmiga.
    Kui compiler karjub ja nagunii juba väga low level asjaga tegeled. Vb tasuks proovida otse masinkoodi kirjutada, siis compiler ei kurdaks?
    Modelleerimises ja tootmises kehtivad:
    1. Avariikindel vooluring lühistab kõik teised.
    2. Transistor, millel on kiiresti toimiv kaitse, säästab kaitset, sulades kõigepealt ise.

    Comment


      #3
      Vs: PIC16Fxxx ja interrupti sisenemine programmimälu teiselt leheküljelt

      Esmalt postitatud 6p45s poolt Vaata postitust
      Kõik toimis, kuni lisasin programmimälu teisele leheküljele (h '0900'...) alamprogrammi USART-i kaudu andmete saatmiseks. Keset selle täitmist saab 1 ms täis.

      Kuidas saaks teiselt leheküljelt katkestuse teenindamise alamprogrammini?
      Kas on õigem võtta kasutusele katkestuse põhine UART-i saatmine: baidi saatmise lõppedes kutsutakse välja katkestus "UART data register empty", mis võtab ringpuhvrist järgmise baidi; UART-i saatmiseks tuleb siis vaid baidid ringpuhvri esimesse otsa toppida ja see võtab üsna vähe aega, kindlasti mitte 1ms?
      If you think education is expensive, try ignorance.

      Comment


        #4
        Vs: PIC16Fxxx ja interrupti sisenemine programmimälu teiselt leheküljelt

        Esmalt postitatud andreie poolt Vaata postitust
        Kas on õigem võtta kasutusele katkestuse põhine UART-i saatmine: baidi saatmise lõppedes kutsutakse välja katkestus "UART data register empty", mis võtab ringpuhvrist järgmise baidi; UART-i saatmiseks tuleb siis vaid baidid ringpuhvri esimesse otsa toppida ja see võtab üsna vähe aega, kindlasti mitte 1ms?
        Tänan vastuse eest!

        Siiski on probleem natuke üldisem. Kui 1 ms täistiksumist saab veel ette ennustada ja lihtsalt natuke varem ISR-i leheküljele (üldjuhul olen selle ja põhiprogrammi paigutanud esimesele leheküljele) tagasi minna, siis mitte-ennustatava katkestuse (igasugused nupuvajutused jms. välismaailmast saabuvad signaalid) korral kirjeldatud lahendus ei toimi. Lihtsalt siiani on pool-kogemata õnnestunud probleemist mööda hiilida. Mingi lahendus peaks eksisteerima, sest muidu tuleks näiteks PIC16F877 kolmveerand programmimälu jaoks (page 1..3) katkestused ära keelata või ISR igale leheküljele kopeerida vms.

        Andmeleht näitab, et stack on 13-bitine ehk programmimälu iga aadress mahub sinna ära, k.a teisel leheküljel paikneva alamprogrammi ja ISR-i absoluutne aadress programmimälus. Probleem tekib sellest, et enne ISR-i minekut tuleks kuidagi PCLATH-i sisu muuta, et program counter sattuks esimesele leheküljele.

        Täpsustuseks - kasutan assemblerit.

        Murphy'le - kompilaator ei karju praegu ka, lihtsalt ISR-i asemel täidetakse mingit suvalist koodijuppi. Idee poolest peaks pärast esimest ,,return"-i ka stack-ist õige koha aadress välja tulema ja programmi täitmine jätkuma. Ainult et ISR-is leiduvad tegevused (põhiprogrammi läbimise lipu seadmine) jäävad tegemata.
        viimati muutis kasutaja 6p45s; 25 m 2010, 16:44.
        Hoiatus - muudan oma postituse sisu kuni 30 minuti vältel pärast postitamist.

        Comment


          #5
          Vs: PIC16Fxxx ja interrupti sisenemine programmimälu teiselt leheküljelt

          Võib olla saab nii kui paneks kõigi lehekülgede algusesse LEHE_ALGUSE_AADRESS+0004h järgneva:

          1. pagesel isr ; kui 0x0004 kannab nime "isr"
          2. call isr
          3. pagesel <mingi label aktiivsel leheküljel>

          Parandus: pagesel tahab label-eid, mitte lehekülgede numbreid.
          viimati muutis kasutaja qratman; 25 m 2010, 17:16.

          Comment


            #6
            Vs: PIC16Fxxx ja interrupti sisenemine programmimälu teiselt leheküljelt

            Kas väljavahetamine PIC18 vastu on mõeldav? See on vaid veidi kallim, aga ei pea lehekülgi jälgima.
            If you think education is expensive, try ignorance.

            Comment


              #7
              Vs: PIC16Fxxx ja interrupti sisenemine programmimälu teiselt leheküljelt

              Esmalt postitatud qratman poolt Vaata postitust
              Võib olla saab nii kui paneks kõigi lehekülgede algusesse LEHE_ALGUSE_AADRESS+0004h järgneva:

              1. pagesel isr ; kui 0x0004 kannab nime "isr"
              2. call isr
              3. pagesel <mingi label aktiivsel leheküljel>
              See variant tundub kõige mõistlikum, viimase ,,pagesel"-i võiks ilmselt ära jätta, sest pärast ISR-i ,,return"-i saadakse stack-ist pooleli jäänud koha õige aadress. Üritan lähiajal katsetada.
              Hoiatus - muudan oma postituse sisu kuni 30 minuti vältel pärast postitamist.

              Comment


                #8
                Vs: PIC16Fxxx ja interrupti sisenemine programmimälu teiselt leheküljelt

                Ei, see teooria on jama. Ükskõik mis lehel oled, katkestus viskab ikka page 0 peale.

                Kas sa hüppad "goto"-ga 0x004 aadressilt ISR rutiinide peale?
                Kui nii, siis tema on süüdlane, sest tulles teiselt lehelt ei saa gotoga nüüd esimesel ( või nullindal, kus ISR vektor asub) lehel navigeerida. Goto viskab tagasi teise lehe algusesse (0x0804 peale) PCLATH bittide tõttu.

                Kiire lahendus:
                Kui on lühike koodi jupp, siis alates 0x0004 aadressist kirjutad kohe oma ISR koodi (ei lennuta goto ega call-iga mujale ning goto ja calle ISR sees ei kasuta).

                Parem lahendus:
                Ikka otse 0x0004 peale kood. Siis teed esimese asjana context save (andmelehes on näide) JA lisaks (mida andmelehes pole) salvestad ka PCLATH ning nullid ta ära (sätid page0 peale). Nüüd võid ISR sees goto käske kasutada. ISR lõpus context restore (s.h. PCLATH tagasi).

                Comment


                  #9
                  Vs: PIC16Fxxx ja interrupti sisenemine programmimälu teiselt leheküljelt

                  Esmalt postitatud qratman poolt Vaata postitust
                  Parem lahendus:
                  Ikka otse 0x0004 peale kood. Siis teed esimese asjana context save (andmelehes on näide) JA lisaks (mida andmelehes pole) salvestad ka PCLATH ning nullid ta ära (sätid page0 peale). Nüüd võid ISR sees goto käske kasutada. ISR lõpus context restore (s.h. PCLATH tagasi).
                  Sama trikki kasutasin mina ka. Toimis! 18-seeria on tõesti parem!
                  - Vend Hieronymus tunneb Motorola toodete nimekirja kõige paremini, las tema ütleb.
                  - Motorola poolt loodud kiipide hulgas ei ole teda üles tähendatud. - Tähendab: ta on Intelist!

                  Comment


                    #10
                    Vs: PIC16Fxxx ja interrupti sisenemine programmimälu teiselt leheküljelt

                    Tänud kõigile, kes vastasid!

                    Qratman'i ja Felch'i soovitatud variant toimib ja üks karp sai nüüd RS232-liidese võrra paremaks.

                    Et järgmistel oleks lihtsam, lisan ka ühe lõigu koodi.
                    Põhiprogrammi alguses on järgmised read (_config ja Start vahel):

                    extern Katkestus

                    udata
                    ajutine res 1 ; abimuutuja

                    RST code 0x00
                    goto Start
                    code 0x04
                    nop

                    Pohi code h'0040'

                    Tegelikult võib ,,extern Katkestus" vist ka ära jääda, kuna sildile suunavad käske ei kasutata.
                    Käsk ,,nop" täidab mälupesa h'0004' programmimälus, katkestuse alamprogrammi algusaadress on sellest ühe võrra suurem.
                    Järgnevas kasutatakse enamasti ,,movf destination,W" asemel ,,swapf destination,W". Ilmselt üritatakse vältida STATUS-registri sisu muutumist. Context save koos PCLATH-i salvestamsega (ISR asub eraldi .asm-failis) näeb välja nii:

                    #include "p16f690.inc"

                    global Katkestus
                    udata_ovr
                    W_TEMP res 1
                    STATUS_TEMP res 1
                    PCLH_TEMP res 1

                    KatkAP code h'0005'
                    Katkestus


                    MOVWF W_TEMP ;Copy W to TEMP register
                    SWAPF STATUS,W ;Swap status to be saved into W
                    CLRF STATUS ;bank 0, regardless of current bank, Clears IRP,RP1,RP0
                    MOVWF STATUS_TEMP ;Save status to bank zero STATUS_TEMP register
                    SWAPF PCLATH,W ;Salvesta PCLATH
                    MOVWF PCLH_TEMP ;
                    CLRF PCLATH ; nullib PCLATH-i ja võimaldab goto-sid ISR-i sees


                    ISR ;Insert user code here

                    SWAPF PCLH_TEMP,W ; paneme PCLATH-i vana vaartuse tagasi,
                    MOVWF PCLATH ; siit kuni ISR-i lopuni goto-d kasutada ei saa
                    SWAPF STATUS_TEMP,W
                    ;Swap STATUS_TEMP register into W (sets bank to original state)
                    MOVWF STATUS ;Move W into STATUS register

                    SWAPF W_TEMP,F ;Swap W_TEMP

                    SWAPF W_TEMP,W ;Swap W_TEMP into W





                    return
                    end







                    viimati muutis kasutaja 6p45s; 29 m 2010, 08:53.
                    Hoiatus - muudan oma postituse sisu kuni 30 minuti vältel pärast postitamist.

                    Comment


                      #11
                      Vs: PIC16Fxxx ja interrupti sisenemine programmimälu teiselt leheküljelt

                      Natuke O.T-d ka.

                      Pärast Java uuendusi kipuvad MPLAB ja PICkit 2 segaseks minema, esimene ei leia ,,breakpointe" ja teine üritab PIC16F690 kustutada ja LVP-režiimis kirjutada.
                      Aitab arvuti (OS = XP Home) restart, mida eriti tihti ei tee, kuna enamasti puhkab ,,standby"-olekus.

                      Kuidas suhtuda MikroElektronika C-kompilaatorisse? Tean, et demoversioonil oli 2k koodimahu piirang ja library-te sisu ei saanud muuta ja seetõttu osutus näiteks HD44780-LCD library minu jaoks kasutuks. Viimati katsetades tekkist huvitav olukord - kui pordid enne trisasid algväärtustada, jooksis mingil hetkel ,,rööbastelt maha". Kõik ,,banksel"-id olid vist olemas (kui C-s üldse seda käsku kasutati).

                      EDIT: banksel on ikkagi ainult direktiiv.
                      viimati muutis kasutaja 6p45s; 29 m 2010, 12:22.
                      Hoiatus - muudan oma postituse sisu kuni 30 minuti vältel pärast postitamist.

                      Comment


                        #12
                        Vs: PIC16Fxxx ja interrupti sisenemine programmimälu teiselt leheküljelt

                        Esmalt postitatud 6p45s poolt Vaata postitust
                        Kuidas suhtuda MikroElektronika C-kompilaatorisse?
                        MikroC IDE on kole käkk. Kompilaatori kohta kommenteerida ei oska. Plussiks on teekide rohkus.

                        Ise olen kasutanud SourceBoostC (neil ka C++ ja BASIC) nimelist kompilaatorit. Väga meeldiv süntaks. Teeke kaasas praktiliselt pole aga netist üht-teist siiski leiab. IDE on meeldivalt lihtne. Demol on samuti koodi (2k) ja pankade piirangud (Täisversioon $70).

                        Kõrgkeeltes programmeerides mälupankade ja koodilehekülgede üle arvestust pidama ei pea.
                        viimati muutis kasutaja qratman; 29 m 2010, 11:36.

                        Comment


                          #13
                          Vs: PIC16Fxxx ja interrupti sisenemine programmimälu teiselt leheküljelt

                          miks MikroC kole on? Ma leian et MPLAB on hullem pasandus. Sõltub muidugi millisest versioonist jutt käib. Muidu mikroC oli suht ok kui kasutasin. Ja just nende koodi klotside pärast oli asi väga pro. Uuem versioon nägi suht pro välja. dsPIC C compileril olid omad kiiksud. Nagu lambist sulgumine, mitte salvestamine, projketifailide rikkumine jne.
                          Modelleerimises ja tootmises kehtivad:
                          1. Avariikindel vooluring lühistab kõik teised.
                          2. Transistor, millel on kiiresti toimiv kaitse, säästab kaitset, sulades kõigepealt ise.

                          Comment


                            #14
                            Vs: PIC16Fxxx ja interrupti sisenemine programmimälu teiselt leheküljelt

                            Pole küll minu kogemus, aga siin ta on: CCS kompilaatori mehed igatahes ütlesid, et nemad PIC18 peal XINST-i toetama ei hakka ja kuna nemad on kliendist targemad, soovitasid PIC24-ja kasutada ja seega PIC24 kompilaator osta. Nii et kui kompilaatori ostmine plaanis, tasub väike uuring teha.
                            If you think education is expensive, try ignorance.

                            Comment


                              #15
                              Vs: PIC16Fxxx ja interrupti sisenemine programmimälu teiselt leheküljelt

                              Lisan veel et mikroe asjade help on tõesti helpfull erinevalt tavaks saanud hunnikust mulast mis kuidagi kasulik pole. Ma leian et korralik doc, help ja support kaalub yles misiganes 1-2% koodisuuruse säästu.
                              Mikroe-l on 1 kiiks, need softi klotsid on fix koodiga ja kryptitud. Seega ringi teha eriti miskit ei saa. Samuti ei saa kolida teise compileri alla kergesti kui neid klotse kasutad.
                              Aga aus olla teevad need elu üpris lihtsaks. Ja katsetamiseks ongi see demo. Kui ei meeldi pole miskit kaotanud.
                              Modelleerimises ja tootmises kehtivad:
                              1. Avariikindel vooluring lühistab kõik teised.
                              2. Transistor, millel on kiiresti toimiv kaitse, säästab kaitset, sulades kõigepealt ise.

                              Comment

                              Working...
                              X