Teade

Collapse

Foorumi reeglid.

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

Väike PIC ja jadaport

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

    Väike PIC ja jadaport

    Tere.

    Probleem on sihuke, et üks pisike PIC 12F672 loeb kahte analoogvärtust ja peab need edastama PC-le jadapordi kaudu. PC aga peab ütlema PIC'ile kumba väärtust ta saada tahab. Häda on selles, et PIC ei taha kuidagi vastu võtta PC poolt tulevaid baite. Kasutan kommunikatsiooniks omakirjutatud koodi. Pole leidnud kusagilt kindlalt töötavat koodinäidet. Äkki kellelgi on midagi kuskil silma hakanud. Kui lasen PIC-il ainult järjest PC-sse kirjutada siis toimib kõik kenasti. S.t see koodi pool on OK. Äkki on probleem selles, et kasutan PIC-i sisemist kella ja see pole sideks küllalt täpne.
    Lugupidamisega
    Ank

    #2
    9600Bd sisemise 4MHz taktiga toimib rahuldavalt. Kas nivood on ikka õiged (HIGH on passiivne ja vastupidi)? Kas mõni katkestus ei sega vahele? Mismoodi üldse sümboli algusest teada saad?
    - 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
      Originally posted by felch@Jun 3 2005, 12:49
      9600Bd sisemise 4MHz taktiga toimib rahuldavalt. Kas nivood on ikka õiged (HIGH on passiivne ja vastupidi)? Kas mõni katkestus ei sega vahele? Mismoodi üldse sümboli algusest teada saad?
      Nivoodega ei tohiks probleeme olla. Kuna (sorry unustasin) kasutan MAX 232 kivi kontrolleri küljes. Edasi tuleks vist natuke koodi siia postitada. Panen siia lühikese testvareiandi kus on ainult kasutusel jadapordi protseduurid.
      Kood:
      	list   p=12f629     &#59; list directive to define processor
      	#include <p12f629.inc>    &#59; processor specific variable definitions
      
      	errorlevel -302       &#59; suppress message 302 from list file
       
      	__CONFIG  _CP_OFF & _CPD_OFF & _BODEN_ON & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT 
      
      ;***** VARIABLE DEFINITIONS
      w_temp    EQU   0x20    &#59; variable used for context saving 
      status_temp  EQU   0x21    &#59; variable used for context saving	
      ;**********************************************************************
      	cblock 0x22&#59;Viite loendurite plokk
       Xmit_Byte      &#59;holds byte to xmit
          Rcv_Byte      &#59;holds received byte 
          Bit_Cntr      &#59;bit counter for RS232
          Delay_Count     &#59;delay loop counter
      	endc
      ;**********************************************************************
       ORG   0x000      &#59; processor reset vector
       goto  main       &#59; go to beginning of program
      
       ORG   0x004      &#59; interrupt vector location
       movwf  w_temp      &#59; save off current W register contents
       movf	STATUS,w     &#59; move status register into W register
       movwf	status_temp   &#59; save off contents of STATUS register
      ; isr code can go here or be located as a call subroutine elsewhere
       call int_subr
       movf  status_temp,w  &#59; retrieve copy of STATUS register
       movwf	STATUS      &#59; restore pre-isr STATUS register contents
       swapf  w_temp,f
       swapf  w_temp,w     &#59; restore pre-isr W register contents
       retfie          &#59; return from interrupt
      &#59;#include macros.inc
      
      ; these first 4 instructions are not required if the internal oscillator is not used
      main
       call  0x3FF      &#59; retrieve factory calibration value
       bsf   STATUS,RP0    &#59; set file register bank to 1 
       movwf  OSCCAL      &#59; update register with factory cal value 
       bcf   STATUS,RP0    &#59; set file register bank to 0
      ; remaining code goes here 
      	&#59;bcf STATUS, RP0
       clrf GPIO &#59;Puhastan i/o registri
       bsf STATUS, RP0	&#59;Valin bank 1
       movlw b'00110000'&#59;sean sisend/väljund suunad
       movwf TRISIO
       movlw b'00110000'&#59;sean vastaca sisendi katkestuste loabitid
       movwf IOC 
       bcf STATUS, RP0	&#59;Valin bank 0
       movlw 0x07 &#59;Esimesed kolm pini kasutan tavaliste io'dena
       movwf CMCON
       bsf INTCON, GPIE&#59;Sisendite muutumise katkestuste lubamine
       bsf INTCON, GIE	&#59;globaalsete katkestuste lubamine
       call SER_INIT
      main_loop 
       call message
       sleep
      	&#59;call Rcv_RS232
      	&#59;btfss STATUS, Z
      	&#59;call XMIT_RS232
       goto main_loop 
      
      SER_INIT   	&#59;Jadapordi initsialiseerimine
            BSF   STATUS, RP0    &#59;select bank 1
            BCF   TRISIO, 2     &#59;set B6 as an output
            BSF   TRISIO, 3     &#59;set B7 as an input
            BCF   STATUS, RP0    &#59;select bank 0
            BSF   GPIO, GP2     &#59;set B6 high
            RETURN
      
      XMIT_RS232 MOVWF  Xmit_Byte      &#59;move W to Xmit_Byte
            MOVLW  0x08         &#59;set 8 bits out
            MOVWF  Bit_Cntr
            BCF   GPIO, GP2
            CALL  Bit_Delay
      Ser_Loop  RRF   Xmit_Byte , f    &#59;send one bit
            BTFSS  STATUS  , C
            BCF   GPIO, GP2
            BTFSC  STATUS  , C
            BSF   GPIO, GP2
            CALL  Bit_Delay
            DECFSZ Bit_Cntr , f    &#59;test if all done
            GOTO  Ser_Loop
            BSF   GPIO, GP2
            CALL  Bit_Delay
            RETURN
      
      Rcv_RS232  BTFSC  GPIO, GP3      &#59;wait for start bit
            GOTO  Rcv_RS232
            CALL  Start_Delay     &#59;do half bit time delay
            BTFSC  GPIO, GP3       &#59;check still in start bit
            GOTO  Rcv_RS232
            MOVLW  0x08         &#59;set up to read 8 bits
            MOVWF  Bit_Cntr
            CLRF  Rcv_Byte
      Next_RcvBit CALL  Bit_Delay
            BTFSS  GPIO, GP3
            BCF   STATUS  , C
            BTFSC  GPIO, GP3
            BSF   STATUS  , C
            RRF   Rcv_Byte , f
            DECFSZ Bit_Cntr , f    &#59;test if all done
            GOTO  Next_RcvBit
            CALL  Bit_Delay
            MOVF  Rcv_Byte, W
            RETURN
      ; 
      ; ------- 
      ; MESSAGE 
      ; ------- 
      ; 
      message movlw '1' 
          call XMIT_RS232 
          movlw '2' 
          call XMIT_RS232 
          movlw 'F' 
          call XMIT_RS232 
          movlw '6' 
          call XMIT_RS232 
          movlw '2' 
          call XMIT_RS232 
          movlw '9' 
          call XMIT_RS232 
          movlw ' ' 
          call XMIT_RS232
          movlw 'a' 
          call XMIT_RS232
          movlw 'l' 
          call XMIT_RS232 
          movlw 'i' 
          call XMIT_RS232 
          movlw 'v' 
          call XMIT_RS232 
          movlw 'e' 
          call XMIT_RS232 
          movlw 0x0D&#59; CR 
          call XMIT_RS232 
          movlw 0x0A&#59; LF 
          call XMIT_RS232 
          return 
      
      Start_Delay MOVLW  0x0C
            MOVWF  Delay_Count
      Start_Wait NOP
            DECFSZ Delay_Count , f
            GOTO  Start_Wait
            RETURN
      
      Bit_Delay  MOVLW  0x18
            MOVWF  Delay_Count
      Bit_Wait  NOP
            DECFSZ Delay_Count , f
            GOTO  Bit_Wait
            RETURN
      
      int_subr
       btfsc GPIO, GP4
       goto int_set_out
       btfsc GPIO, GP5
       goto int_set_out
       goto int_rst_out
      int_set_out
       bsf GPIO, GP0
       goto int_out
      int_rst_out
       bcf GPIO, GP0
      int_out
       bcf INTCON, GPIF&#59;Kui seda bitti ei puhasta läheb tagasi katkestusse
       return
       
       ORG 0x3FF &#59;Ostsillaatori skaleerimisväärtus võtta kivist!
       retlw 0x24	&#59;konkreetse kivi jaoks
      ; initialize eeprom locations
      
       ORG	0x2100
       DE	0x00, 0x01, 0x02, 0x03
      
       END           &#59; directive 'end of program'
      Nagu juba öeldud PIC saadab arvutile ilusti, aga arvuti saatmisel ei toimu midagi.
      Lugupidamisega
      Ank

      Comment


        #4
        Mina küll ei märka et kusagilt Rcv_RS232 kutsutaks. See aga ongi seriali vastuvõtu rutiin.
        - 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


          #5
          Sisemine rc-kell ei ole piisavalt täpne seriali jaoks. Sagedus võib kõikuda rohkem kui +-5%. Samas serial ei taha eriti üle 1-he protsendi, võivad vead sisse tulla. See siis, kui kasutad 8-sa bitist datat. Kui ag ateed 4-ja bitise andmeedastuse, siis saab küll sisemise kellaga hakkama(proovitud, töötas mul pic16c505).

          Comment


            #6
            Kvartsiga on parem küll kuid 12f629-l olen 4800bd kenasti käima saanud sisemise generiga. Praegu on koodis ka viga. Proovi see ära parandada ja katseta uuesti.
            - 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


              #7
              On kellegil äkki mõne lihtsa PIC-i baasil datalogeri skeemi ja koodi?
              Asi peaks tegema järgmist: Lugema analog sisendite väärtuse ja selle
              edastama üle com pordi arvutise, hea oleks ka kui edastatakse
              digitaal sisendite olekud.
              MINULE EI MEELDI KUI MÕNINGAD ISIKUD MINU POSTITUSI MUUDAVAD,
              KUI POSTITUS EI SOBI SIIS PALUKS SEE KUSTUTADA !

              Comment


                #8
                leidsin ühe enamvähem sobiva asja
                4 chanel dataloger
                sellise skeemiga


                Aga millega ma selle kompileeriks ?

                Kood:
                 INCLUDE "MODEDEFS.BAS"
                '---------------------------------------------------------
                ' PIC12C671 SAMPLE ROUTINE FOR 4-CHANNEL, SERIAL, A/D
                '---------------------------------------------------------
                ' PIN NAME USE/CONNECTION
                ' 1 Vdd +5VDC
                ' 2 GPIO.5 SERIAL OUT TO PC
                ' 3 GPIO.4 (CHANNEL 3)
                ' 4 GPIO.3 N/C
                ' 5 GPIO.2 (CHANNEL 2)
                ' 6 GPIO.1 (CHANNEL 1)
                ' 7 GPIO.0 (CHANNEL 0)
                ' 8 Vss (GROUND)
                '---------------------------------------------------------
                DEFINE OSCCAL_1k 1 ' DEFINE OSCCAL FOR PIC12C671
                ADCON1 = 0 ' PINS TO ANALOG INPUT, Vref = Vdd
                RESULT VAR BYTE[4] ' 4-BYTE ARRAY
                J VAR BYTE ' A/D CHANNEL NUMBER BYTE VARIABLE
                
                MAIN:
                FOR J = 0 TO 3   ' 4-CHANNEL COUNTER LOOP
                  ADCON0 = 65 + (J*8) ' SET A/D Fosc/8 + A/D = ON
                  PAUSE 10        ' PAUSE 10mS FOR CHANNEL SETUP
                  ADCON0.2 = 1  ' SET GO/DONE-BIT + START CONVERSION
                  PAUSE 10        ' PAUSE 10mS FOR CONVERSION
                  RESULT[J] = ADRES
                NEXT
                PAUSE 250     ' PAUSE 250mS
                SEROUT GPIO.5,N2400,[1,RESULT[0],2,RESULT[1],3,RESULT[2],4,RESULT[3]]
                PAUSE 250     ' PAUSE 250mS
                GOTO MAIN    ' DO IT AGAIN
                
                END              ' END PROGRAM
                Võtmesõnaks oli lihtsalt vaja panna ADC
                MINULE EI MEELDI KUI MÕNINGAD ISIKUD MINU POSTITUSI MUUDAVAD,
                KUI POSTITUS EI SOBI SIIS PALUKS SEE KUSTUTADA !

                Comment


                  #9
                  Originally posted by klm@Jun 29 2005, 16:07
                  aga millega ma selle kompileeriks ?
                  mingi basic-keele kompilaatoriga pic-i jaoks nagu koodist näha.

                  Comment


                    #10
                    Asmis kirjutad, see kood on üsna lühike ju.
                    Mingi temp. loggeri kirjeldus on siin: http://parsek.yf.ttu.ee/~felc/PIC/tlogger.zip
                    - 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


                      #11
                      Originally posted by digital@Jun 29 2005, 20:00
                      mingi basic-keele kompilaatoriga pic-i jaoks nagu koodist näha.
                      Seda muidugi.
                      Oskad mõnda tasuta saadavat soovitada ?
                      Endal on PIC Basic Pro demo versioon,
                      noh 31 rea piiri saaks ju kätte kui kommentaarid kustutada,
                      kuid demo versioon ei toeta Include direktiivi ja
                      samuti PIC12C671 protsessorit
                      MINULE EI MEELDI KUI MÕNINGAD ISIKUD MINU POSTITUSI MUUDAVAD,
                      KUI POSTITUS EI SOBI SIIS PALUKS SEE KUSTUTADA !

                      Comment


                        #12
                        Kas 12F675 prose ei sobiks? Ja pisikese ASMis koodijupi võib ju ära kirjutada, see on lihtne. Või on mingi põhjus miks -basicut eelistad?
                        - 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


                          #13
                          12F675 oleks vist küll parem varjant, on teine vist flash kivi
                          st. mitmekortselt ümber progetav ?
                          12C671 on aga ühekordselt progetav, kui just aknaga versiooni ei kasuta.
                          Hind on vist kah 675 -l soodsam ca 40 eeku 671-e 60 eegu vastu.
                          Asmis miks kah mitte - kuid kahjuks ei ole asjaga enam mittmeid aastaid tegelenud ja ei tea kas saan hakkama. Basicus oli lihtsalt valmis programm olemas.
                          MINULE EI MEELDI KUI MÕNINGAD ISIKUD MINU POSTITUSI MUUDAVAD,
                          KUI POSTITUS EI SOBI SIIS PALUKS SEE KUSTUTADA !

                          Comment


                            #14
                            Originally posted by felch@Jun 29 2005, 20:12
                            Mingi temp. loggeri kirjeldus on siin: http://parsek.yf.ttu.ee/~felc/PIC/tlogger.zip
                            noh jah DS1820 on ju digi temp mõõtja
                            ja PIC16F84 -el ei ole analoog sisendeid,
                            nii et ega sealt koodist palju võtta pole ...

                            http://www.qsl.net/dl4yhf/soundutl/serpicad.htm
                            Lehel on enamvähem selline asi mis vaja.
                            Sellel on kiirust taga aetud, 2400 piisaks mulle täiesti, pigem olgu sisendeid
                            rohkem. sellel lehel pole kahjuks koodi lisatud, on ainult valmis HEX fail.
                            MINULE EI MEELDI KUI MÕNINGAD ISIKUD MINU POSTITUSI MUUDAVAD,
                            KUI POSTITUS EI SOBI SIIS PALUKS SEE KUSTUTADA !

                            Comment


                              #15
                              Kiiruse muutmine pole raske: paar konstanti muutuvad. Aga jah, selleks on lähtekoodi vaja.
                              Nagu ütlesin, pole sellise mõõtmise tarbeks koodi kirjutamine üldse mitte raske:
                              - sead pordid paika (mis väljund, mis analoogsisend)
                              - lülitad järjest sisendeid A/D muundi külge ja mõõdad tulemuse
                              - keskmistad kui tarvis
                              - saadad mingi oma protokolli järgi teele.

                              Aga paistab, et viidatud lingil on kõik juba tehtud, anna vaid toide peale...
                              - 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

                              Working...
                              X