Teade

Collapse

Foorumi reeglid.

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

PORTA lugemine, PORTB kirjutamine, kuidas teha Cga

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

    PORTA lugemine, PORTB kirjutamine, kuidas teha Cga

    Tere mehed!

    Olen algaja, ei oska portisid korralikult lugeda.

    TRISA = 0b11111111;
    TRISB = 0b00000000;

    mask= 0b00001111;
    PORTB = PORTA & mask; // Kuidas selle peaks ümber kirjutama?

    Tahaks et PORTA dioodid (4tk) näitaks mis PORTBsse(0 - 3) sisse tuleb (0V või 5V).


    Kasutan MPLABi koos CC5Xga. Assemblerit ei oska, Cd natukene.
    Ehk keegi oskab ja viitsib aidata...

    PIC 16F628A

    #2
    Seda C-d ma ei tunne aga hakkasin harjutama WinAVRi omaga. Seal tehakse nii:
    Sea pordi C pinn nimega LCD_CLK_PIN kõrgeks: PORTC |= LCD_CLK_PIN;
    ja madalaks: PORTC &= ~LCD_CLK_PIN;

    On ka selline süntaks:
    PORTB = 0xff; // enable pull-ups for inputs, set outputs high
    DDRB = 1<<LED; // Pin LED väljundiks

    DDRB on AVRi register aga süntaksi näide ehk aitab (märgid <<)
    - 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


      #3
      n<<m tähendab nihuta n m bitti vasakule. Samamoodi on operaator >>, mis on nihe paremale. 1<<m tähendab seega m-is bitt. Kui vaja mitut bitti torkida, siis võib ka (1<<m)|(1<<n) süntaksit kasutada.
      a|=b on sama mis a = a|b... ehk lihtsalt or tehe. eeldab muidugi, et registrit a saab tagasi lugeda... on mõndasid registreid, mille lugemisel tuleb ühte kraami ja kirjutatakse hoopis muud.
      ~ tähendab bitwise not. a&=~b tähendab a=a & (~b) ehk siis and&#39;itakse bitt maha.

      Antud juhul pole vast see probleemiks.

      Kas teemaalgataja ikka programmi kuskil lõpmatusse tsüklisse keeras?
      Kood:
      TRISA = 0b11111111;
      TRISB = 0b00000000;
      while&#40;1&#41;{
      mask= 0b00001111;
      PORTB = PORTA & mask; 
      }
      Kontrollerile progedes tuleb veenduda, et kontrolleri kood kunagi üle alumise serva ei jookseks. Ehk kui midagi pole vaja teha, siis lihtsalt las toimetab tsüklit.

      Comment


        #4
        mask= 0b00001111;
        PORTB = PORTA & mask;

        Need käsud võiks asendada sedasi. Tulemus on märksa kohmakam ja võtab kivis rohkem ruumi aga algajale see eest ehk paremini mõistetav.

        Kood:
        //kood CC5X jaoks
        
        #include &#60;C&#58;&#092;PIC&#092;CC5X&#092;16F628A.H&#62;
        #pragma chip pic16f628A
        
        void main&#40; void &#41;
        {
         TRISA = 0b.11111111; // PORTA kõik viigud on sisendid
         TRISB = 0b.00000000; // PORTB väjundid
         char done = 0;
        
         while&#40;done == 0&#41;
         {
           if&#40;PORTA.0 == 1&#41;
             PORTB.0 = 1;
           else
             PORTB.0 = 0;
        
           if&#40;PORTA.1 == 1&#41;
             PORTB.1 = 1;
           else
             PORTB.1 = 0;
           
           if&#40;PORTA.2 == 1&#41;
             PORTB.2 = 1;
           else
             PORTB.2 = 0;
        
            //jne..
           }
        }

        Comment


          #5
          Täpselt nii tegin jah while(1).

          Vahel on veel

          PORTB = 0b00001111;
          delay(100);
          PORTB = 0b00000000;
          delay(100);

          nii et on näha ett proge töötab.
          -----------------------------------------------------------------
          Leidsin vea üles. Mul puudus see rida:

          CMCON = 7;

          et komparaatorid digitaalseks konfigida.
          -----------------------------------------------------------------

          Teine probleem on siiski et PIC segab mu teist kivi kuidagi moodi(teine kivi katkestuab oma tegevuse ebakorrapäraselt umbes sekundi ajal. Ei tea kas PORTA lugemine kuidagi ka kirjutab midagi? Kas see äkki on "read-modify-write"-probleem? (See teema võib-olla enam siia ei sobi...)

          PORTB = PORTA & mask;
          vahetasin välja selle vastu:
          W=PORTA;
          W=W & mask;
          PORTB = W;
          et äkki aitab aga ei aidanud...

          Aitäh vastuste eest&#33;

          Comment


            #6
            äkki kirjutad ka, mis kivi see teine on ja kuidas ta pic&#39;iga seotud on?
            Kirjutamine ei ole kindlasti read-modyft-write kui sa just ei kirjuta ise niimoodi (näiteks a|=b)

            Comment


              #7
              Sain juba hakkama. Panin kondekaid juurde, GND ja +5 vahele. Siis hakkas kõik korralikult tööle. Algaja viga... ;-)

              Comment

              Working...
              X