Thông báo

Collapse
No announcement yet.

Nỗi ác mộng mang tên RS232

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Nỗi ác mộng mang tên RS232

    Post bài bên picvietnam mà có vẻ bên đó yên ắng quá mang sang đây đông người hy vọng gặp được cao thủ

    Có ai giúp em với ?! Giao tiếp PIC16F877A - RS232, nó vẫn gửi và nhận dữ liệu từ máy tính bình thường, những mỗi tội là ký tự rờ rờ, chả đúng gì cả, gửi 1 ký tự từ máy tính xuống , nó hiển thị lên LCD và phát trở lại máy tính mà sai bét , hu hu, ai giúp em với


    Code:
    #include <16f877a.h>
    #include <def_877a.h>
    #device *=16                                       
    #use delay(clock=20000000)                                                   
    #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stop=1)      
    #fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT 
    #include <lcd_lib_4bit.c>         
                                                                   
    char c;                                            
    char d[]="Test RS232"; 
    int8 i;
                                                          
    #INT_RDA                             
    void Receive_isr()                    
    {                                   
         c=getc();                          
         delay_us(10);                                         
         //printf(c); 
         putc(c);
    }                                                  
    /////////////////////////////////////////////
    
    void main()                   
    {                                         
      ENABLE_INTERRUPTS(INT_RDA);                                  
      enable_interrupts(global);              
    
      lcd_init();
                                           
      for(i=0;i<10;i++)
      {
          //printf(d[i]);                    
          putc(d[i]);                               
      }                        
    
    
      while(1)
      {                                   
          lcd_putcmd(0xC0);
          lcd_putchar(c);
      }   
    }

  • #2
    Mới thử kết nối giữa 2 con pic, đấu trực tiếp rx và tx với nhau, một con phát còn 1 con nhận và hiển thị lên LCD, vẫn truyền nhận đc, nhưng mà ký tự lại rờ rờ luôn , chẳng biết đoạn nào mà lân. 2 con PIC và mạch em vẫn dùng để điều khiển động cơ và các loại sensor ầm ầm, chỉ có mỗi giao tiếp RS232 là vẫn củ chuối, điên cả người rồi Có ai giúp em với

    Comment


    • #3
      phần khai báo rs232 em thử chỉ để
      #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)

      Trong hàm main, thêm phần khởi tạo PORTC: set_tris_c(0x80);
      Trong trường hợp có dùng LCD tại portC thì khai báo I/O cho phù hợp.

      Sau hàm Lcd_init() thêm lệnh printf("Hello, This is a test"); để kiểm tra thử.

      Trong trường hợp bị sai thì thử kiểm tra lại thạch anh xem sao, có thể do thạch anh không tốt nên dao động sai, dẫn tới sai baudrate luôn.
      Ethernet-RS232, PIC Webserver, RFID Reader
      CallerID, Cảnh báo BTS, ...
      0988006696
      linhnc308@gmail.com
      http://linhnc308.blogspot.com

      Comment


      • #4
        Em cảm ơn anh.
        Hôm qua em phát hiện ra là nếu cắm LCD vào trong lúc truyền serial thì sẽ bị nhiễu và ký tự nhận gửi sẽ sai ngay. Sau khi rút LCD ra, em đã nhận được đúng ký tự dạng charater từ máy tính và phản hồi trở lại. Nhưng mà có một điều em không hiểu là vì sao khi em truyền số lại không được
        Cụ thể là khi em gõ số 0 trên PC truyền xuống PIC, nó phản hồi lại PC và PC hiển thị lên ký tự rất lạ, xem dạng hex thì thấy nó thành 0xF0. Tương tự số 1 thì thành 0xF1 ... số 9 thì thành 0xF9. Và một số ký tự đặc biệt cũng bị sai luôn(trừ ký tự @ [ ] { } và ký tự _ ). Anh có thể giải thích cho em được không ạ

        Comment


        • #5
          nếu bạn truyền chuỗi char thì số 0, hay 1 cũng chỉ như ký tự bình thương thôi mà, gửi chữ A được thì số 0 cũng giông thế thôi, bạn xem lại chương trình truyền trên máy tính, là truyền kiểu gì?

          Comment


          • #6
            Các bác cho em hỏi trong phần khai báo:
            Code:
            #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9)
            thì bits=9 có ý nghĩa j và dùng nó được sử dụng khi nào. Thank!
            Nhớ quá khứ buồn rơi nước mắt.
            Nhìn tương lai lạnh buốt sống lưng.
            Y!M: nhamdtk4.

            Comment


            • #7
              Có nghĩa là truyền một lần 9 bits, Bạn nên để bits=8 là được.

              Web:[url]www.ledviet.info/url]
              Email:
              DĐ:0949299699

              Comment


              • #8
                Nguyên văn bởi manhha2799 Xem bài viết
                Có nghĩa là truyền một lần 9 bits, Bạn nên để bits=8 là được.
                Nhưng mà vd khi truyền một ký tự chẳng hạn thì riêng số bit mã ASCII của nó đã là 8bit rồi cộng cả bit start, bit stop nữa thì bits=8 làm sao mà được hả bác.
                Nhớ quá khứ buồn rơi nước mắt.
                Nhìn tương lai lạnh buốt sống lưng.
                Y!M: nhamdtk4.

                Comment


                • #9
                  Các bit start và stop là các bit nhận dạng trong quá trình truyền nhận bác ah, nên ko ảnh hưởng gì đến 8 bit kia. Nói chính xác là: 8 bit data đấy!
                  Chúc vui!

                  Comment


                  • #10
                    cho mình hỏi luôn vấn đề của mình trong này nhé:
                    chả là mình dùng PIC16F628, giao diện thì làm trên VB6
                    Mình cho gửi dữ liệu từ PC xuống PIC, sau khi nhận hết dữ liệu thì mình cho PIC truyền ngược trở lại thì có hiện tượng là mình cứ truyền 2 byte thì chỉ nhận lại được 1 byte. Ví dụ như, PC mình gửi xuống "1234" thì chỉ nhận lại được "13". Vấn đề nằm ở chỗ nào vậy?
                    Giúp mình với!

                    Đây là code chương trình của PIC, nhận dữ liệu qua UART, khi có phím ở chân INT thì truyền dữ liệu trở lại!
                    Code:
                    ;Nhan du lieu tu cong COM.
                    ;Gui lai du lieu qua cong COM nhan dc khi co ngat ngoai - phim bam ngat ngoai INT
                    ;RA0 - LED 1 bao VDK da thiet lap che do
                    ;RA1 - LED 2 bao nhan du lieu
                    ;RA2 - LED 3 bao gui du lieu
                    ;RA3 - LED 4 bao ko co du lieu nhan va gui di khi an INT
                    	#include	<p16F628.inc>
                    	__config	h'3fe6'
                    	;errorlevel -302	
                    
                    count   = 	h'20'				;dem ki tu nhan duoc
                    storage	=	h'21'				;dia chi luu du lieu dau tien
                    
                    	org 		0x00
                    	goto 		init
                    	org 		0x04
                    	btfsc		PIR1, RCIF		;Kiem tra ngat nhan USART	
                    	goto		isr_receive		;Ngat RC, RCIF = 1, FALSE >>> thuc hien ngat nhan USART
                    isr_INT							;Ngat INT, RCIF = 0, TRUE >>> thuc hien ngat INT
                    	bcf			INTCON, INTF	;Xoa co ngat (bat buoc)
                    ;Kiem tra xem co du lieu ko?
                    	movf		count, w		;count >>> w, neu count = 0 >>> Z = 1, neu count > 0 >>> Z = 0
                    	btfss		STATUS, Z
                    	goto		continue		;Neu co du lieu, Z = 0 >> FALSE, tiep tuc!
                    exit:							;Neu ko co du lieu, Z = 1 >> TRUE, thoat!
                    	bcf			PORTA, 2
                    	bsf 		PORTA, 3		;Test LED 4
                    	retfie						
                    continue:					
                    	bcf 		PORTA, 3	
                    	movlw		storage		
                    	movwf		FSR
                    	incf		count, f		;count = count + 1 >>> dam bao truyen het du lieu
                    	bcf			RCSTA, CREN		;disable reception (because CREN override TXEN)
                    	bsf			STATUS, RP0
                    	bsf			TXSTA, TXEN		;enable transmits
                    	bcf			STATUS, RP0
                    
                    ;Truyen du lieu
                    loop
                    	bcf			PORTA, 2 		;Test LED 3
                    	movf		INDF, W
                    	movwf		TXREG			;Noi dung RAM tai vi tri FSR tro toi duoc dua vao TXREG >>> bat dau truyen
                    	btfss		PIR1, TXIF		
                    	goto		$-1
                    	incf		FSR, f
                    	decfsz		count, f
                    	goto 		loop
                    
                    ;ket thuc truyen
                    	bsf			STATUS, RP0
                    	bcf			TXSTA, TXEN		;disable transmits
                    	bcf			STATUS, RP0
                    	bsf			RCSTA, CREN		;enable reception (override TXEN)
                    	movlw		storage
                    	movwf		FSR				;reset lai bo luu tru
                    	bsf			PORTA, 2		;Test LED 3
                    	retfie	
                    
                    ;Nhan du lieu
                    isr_receive
                    	bcf			PORTA, 1 		;Test LED 2
                    	movf 		RCREG, W		;RCREG >>> W
                    	movwf		INDF			;W >>> RAM co dia chi FSR, dau tien la 21h
                    	incf		FSR, f			;Tang FSR
                    	incf		count, f		;Tang bo dem
                    	bsf			PORTA, 1		;Test LED 2	
                    	retfie
                    	
                    	org			0x40
                    init
                    ;Khoi tao USART
                    ;bank1
                    	bsf 		STATUS, RP0
                    	movlw		h'07'
                    	movwf		TRISB			;RB0 - in, others - out
                    	movlw		h'f0'			;RA0-3 : output, others : input	
                    	movwf		TRISA
                    	movlw		d'64'
                    	movwf		SPBRG			;baudrate = 19200		
                    	bsf			TXSTA, BRGH		;highspeed baudrate
                    	bcf			STATUS, RP0
                    ;bank 0
                    	bsf			RCSTA, SPEN		;enable USART
                    	bsf 		RCSTA, CREN		;enable reception
                    ;bank 1
                    	bsf			STATUS, RP0
                    	bsf			PIE1, RCIE		;enable reception interupt
                    	bcf			STATUS, RP0
                    ;Khoi tao vung nho
                    	movlw 		storage
                    	movwf		FSR
                    ;Vung luu so luong byte nhan duoc
                    	clrf		count
                    ;Cho phep ngat Receive USART, INT
                    	bsf			STATUS, RP0
                    	bcf 		OPTION_REG, INTEDG	;fall-edge
                    	bcf			OPTION_REG, 7		;pull-up
                    	bcf			STATUS, RP0
                    	movlw		h'd0'
                    	movwf		INTCON
                    	bsf			PORTA, 0		;test LED 1
                    ;sleep
                    	sleep
                    	goto 		$-1
                    	end

                    Comment


                    • #11
                      Cảm ơn các bác, em đã tìm ra lỗi rồi một kinh nghiệm để đời. Lúc đầu em cắm lại mạch khác nhưng mà con Xtal cũng chập nên vẫn bị sai, sau đó kiên trì thử lại thì phát hiện ra tại mạch, nhất là phần giao động ấy. .
                      Mà chuối nhất là lúc tắt nguồn cấp cho PIC mà máy tính vẫn nhận đc chuỗi ký tự lung tung trả về :-/. Khi VDK chạy, nó chỉ nhận đúng các ký tự từ @ trở đi trong bảng mã ascii thế mới đau (nhiễu có chọn lọc ). Giờ thì ngon rồi, em viết phần mềm chụp ảnh từ C328 và lưu vào ROM, rồi lại truyền cả 1 cái ảnh 20 k lưu trong 2464 lên máy tính chả sao, máy tính nhận đc và lưu lại dạng JPG thì hiển thị đúng.

                      Comment


                      • #12
                        Nguyên văn bởi thientaisodo Xem bài viết
                        Giờ thì ngon rồi, em viết phần mềm chụp ảnh từ C328 và lưu vào ROM, rồi lại truyền cả 1 cái ảnh 20 k lưu trong 2464 lên máy tính chả sao, máy tính nhận đc và lưu lại dạng JPG thì hiển thị đúng.
                        Nghe hấp dấn vậy ta, bác có thể mô tả rõ ràng cho anh em học hỏi được không. Thank!
                        Nhớ quá khứ buồn rơi nước mắt.
                        Nhìn tương lai lạnh buốt sống lưng.
                        Y!M: nhamdtk4.

                        Comment


                        • #13
                          êh, cái C238 là camera hay điện thoại di động vậy bác? mình cũng đang tìm mấy cái module camera...rẻ tiền 1 chút nhưng k có, hix

                          Comment


                          • #14
                            C328 là Camera đơn board có giao tiếp RS232 luôn. Có các lệnh để setup và nếu dùng PIC chụp thì yêu cầu PIC phải có bộ nhớ đủ lớn để lưu trữ (dùng bộ nhớ ngoài 24C64)

                            Đây là hình bề ngoài của C328, con này ko biết ở Việt Nam mình có ko? ngoài ra có rất nhiều con khác
                            :


                            Các bạn thông cảm vì mạng chỗ mình ko up files lên để các bạn có thể interface C328 đc, để hôm nào mình up lên share cho. Hoặc vào google search cũng có nhiều tài liệu lắm

                            Comment


                            • #15
                              Mình dùng PIC16f877a giao tiếp với PC với giao diện VB. Vậy hiểu như thế này có đúng không các bạn nếu sai thì mong các bạn sửa lại giúp:
                              Vấn đề truyền nhận:
                              Nhận dự liệu từ PC : Getc( ) nhận từng ký tự
                              Gets( ) nhận cả chuỗi ký tự
                              putc( ) và printf ( ) là như nhau trong việc gởi ký tự lên PC

                              Các lệnh chuyển đổi ký tự thành số hay ngược lại như thế nào và mục đích để làm j?
                              ví dụ: atoi() chuyển số sang kiểu integer...
                              Theo mình biết thì dữ liệu được truyền qua cổng com có dạng 1bit start - 5,6,7bit dữ liệu - 1bit stop. Vậy dữ liệu mỗi lần truyền nằm trong khoảng đó phải không?

                              Về vấn đề ngắt:
                              ở PIC thì mình thấy các bạn sử dụng ngắt #int_RDA (ngắt xảy ra khi có dữ liệu được gởi xuống từ PC).vậy có ngắt nào khác thực hiện được việc này không?
                              ở PC thì mình không biết các bạn sử dụng ngắt gì để nhận dữ liệu gởi lên. À hình như là sử dụng sự kiện
                              MSComm1.CommEvent = comEvReceive (Khi có dữ liệu ở bộ đệm nhận).
                              Vấn đề giao diện VB:mình thấy các bạn có vẽ được đồ thị động và lưu báo cáo các giá trị truyền nhận. Vậy có bạn nào biết về vấn đề này không chỉ mình với.
                              Vì lần đầu tiếp xúc với chủ đề này nên có nhiều thắc mắc mong các đàn anh(Nam,Bắc,Falleaf....) dành chút thời gian chỉ dẫn giúp. Chân thành cảm ơn

                              Comment

                              Về tác giả

                              Collapse

                              thientaisodo Tìm hiểu thêm về thientaisodo

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X