Thông báo

Collapse
No announcement yet.

Xin chỉ chỗ sai trong chương trình test giao tiếp máy tính qua r485

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

  • #46
    để mình góp ý cho bạn nhé.Mình chưa làm con rs485 nhưng rs232 thì có rồi.Phần cứng bạn chỉ cần đo chân mass và vcc vào con rs485 là được rồi chánh chết rs 485.phần mềm bên codevison bạn viết đúng rồi.nhưng trên VB viết j mà dài thế kiểm tra khó ra.viết the này là đủ nè Private Sub Form_Load()
    Timer1.Enabled = True
    With MSComm1
    .CommPort = 1
    .Settings = "9600,n,8,1"
    .PortOpen = True
    End With
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
    MSComm1.PortOpen = False
    End Sub
    Private Sub Command1_Click()
    text1.text=MSComm1.input
    End Sub
    nhớ kiểm tra dây nối nhé,nếu có vấn đề j liên lạc canh48ckcd@gmail.com

    Comment


    • #47
      ko có dòng này Timer1.Enabled = True

      Comment


      • #48
        Mình mới làm 1 trạm thôi (pc -atmega8) test phần cứng tạm chạy ổn rồi.
        - Phần Uart có lẽ tạm chấp nhận vậy. Giờ là phần ADC mình nối một biến trở khoảng 5K vào pin_23 (ADC0) đo điện áp tại chân này khoảng 2,1 V ( điện áp này sẽ thay đổi khi vặn biến trở).

        - Mình khai báo dùng ngắt ADC:
        + Khi xảy ra ngắt thì trong chương trình ngắt sẽ gửi về kí tự a ( thực tế là nó chỉ gửi về 2 kí tự a)
        => vậy mình nghĩ một kí tự a được gửi về khi chương trình chạy từ trên xuống dưới, một kí tự a nữa là khi xảy ra ngắt adc. vậy là ngắt adc chỉ xảy ra một lần duy nhất thì phải ?

        + đây là code trong đoạn chương trình ngắt ADC :
        Code:
        #define ADC_VREF_TYPE 0x40
        
        // ADC interrupt service routine
        interrupt [ADC_INT] void adc_isr(void)
        {
        unsigned int adc_data;
        // Read the AD conversion result
        adc_data=ADCW;
        // Place your code here
         putchar('a');
        // putchar(adc_data >>8);
        ADCSRA=0xCF;       // tiep tuc cho phep chuyen doi mục đích để tiếp tục xảy ra ngắt ADC 
        }
        - còn đây là đoạn code khai báo ADC :
        Code:
        / ADC initialization
        // ADC Clock frequency: 125.000 kHz
        
        ADMUX=ADC_VREF_TYPE; // ADC Voltage Reference: AVCC pin  "#define ADC_VREF_TYPE 0x40"
                                                          //ADMUX(3:0) = 000 chon chanal 0 (ADC0).                   
        
        ADCSRA=0x8F;    // ADCSRA.7  = 1 cho phep ADC neu = 0 se ngung ADC ngay ca khi dang chuyen doi
                                      //ADCSRA.3 = 1 // cho phep ngat ADC
                                      //ADCSRA(2:0) = 1 scale he so chia 128        
        //ADCSRA |=(1<<6); // Cho Phep qua trinh chuyen doi bat dau  ADSC(ADC Start Conversion): 
         ADCSRA=0xCF;       // Cho phep chuyen doi ADC de gay ngat 
        // Global enable interrupts
        #asm("sei")
        - vậy không hiểu lỗi xảy ra ở đâu ?

        Comment


        • #49
          Phải chăng nếu mình để dòng lệnh gửi kí tự 'a' về trên máy tính ngay trong bản thân chương trình ngắt ADC gây ra lỗi vì có thể là ngắt trong ngắt..
          Code:
          // USART initialization
          // Communication Parameters: 8 Data, 1 Stop, No Parity
          // USART Receiver: On
          // USART Transmitter: On
          // USART Mode: Asynchronous
          // USART Baud rate: 9600
          UCSRA=0x00;
          UCSRB=0xD8;
          UCSRC=0x86;
          UBRRH=0x00;
          UBRRL=0x67;

          Comment


          • #50
            Trong đoạn code trên có chỗ nào không hợp lý để ngắt kô tiếp tục xảy ra kô ? mục đích là sẽ gửi 'a' liên tục để mình xác nhận là mạch ADC hoạt động và có ngắt xảy ra liên tục..

            Comment


            • #51
              Mình vừa chỉnh lại doạn code một chút và thu được trên màn hình là (03FF = 1023) tức là = 5 V khi mình để áp tham chiếu VACC là 5V và biến trở mình để ở mức cực đại. Vấn đề còn lại vẫn là ngắt ADC chỉ xảy ra 1 một lần do vậy khi mình thay đổi biến trở thì dữ liệu gửi về máy tính vẫn không thay đổi trừ khi mình reset Atmega8.. mong các bạn đóng góp cho newbie_avr.
              Và đây là đoạn code và kết quả như mình đã mô tả ở trên :
              Code:
              // ADC interrupt service routine
              interrupt [ADC_INT] void adc_isr(void)
              {
              unsigned int adc_data;
              // Read the AD conversion result
              //adc_data=ADCW;      
              dis_h = ADCH; // đưa dữ liệu từ thanh lưu trữ ADC vào biến tạm  sau khi xảy ra ngắt để gửi về cp
              dis_l = ADCL;  
              
              // Place your code here
              
              }
              Đoạn code gửi về máy tính :
              Code:
              while (1)
                    {
                    // Place your code here
                   PORTC.5 = 0;  //test nhâp nháy một con led thôi chứ ko có gì
                   delay_ms(100);
                   PORTC.5 =1;
                   delay_ms(150);   
                  // putchar('a');
               putchar(dis_h); 
               putchar(dis_l);
              // putchar(hienthi >>8);
              ADCSRA=0xCF;       // ??? đã cho phép chuyển đổi tiếp tại sao không xuất hiện ngắt tiếp theo ??
              delay_ms(500);      

              Comment


              • #52
                bạn đã khai báo ngắt toàn cục chưa ?

                Comment


                • #53
                  Uh rồi bác ah ! mình mới đọc lại datasheet của atmega8 phần ADC thì chạy oke rùi ! "đúng là trứng không thể .." nhưng chác sẽ phải hỏi nhiều các bác. Bác nào có kinh nghiệm về atmega8 cho em hỏi nếu một con này vừa phải quét cỡ khoảng 5 led, dọc cỡ 5 sensor mà bắt buộc phải bám theo tín hiệu cỡ 50Hz vừa phải giao tiếp máy tính thì có ổn kô ?.. vì riêng chuyện đọc sensor theo dạng lấy mẫu rời rạc tín hiệu sin 50HZ liên tục vậy để xử lý nó mất cỡ khoảng 20ms rồi trong khi đó muốn quét led ở đây mình thiếu port nên cách dùng kiểu quét chứ kô sài chốt mà cũng tốn kém . như vậy khả năng sẽ bị chồng chéo gây nhấp nháy ... mình dùng soft để dò zero và tìm peak nên sẽ phải bám theo tín hiệu .. kết hợp với ic phân kệnh anaglog để đảm bảo lun sài ADC 10 bit vì thằng atmega8 dạng dip nè có 2 kệnh 8 bit rùi ...

                  Comment


                  • #54
                    Nguyên văn bởi newbie_avr Xem bài viết
                    Uh rồi bác ah ! mình mới đọc lại datasheet của atmega8 phần ADC thì chạy oke rùi ! "đúng là trứng không thể .." nhưng chác sẽ phải hỏi nhiều các bác. Bác nào có kinh nghiệm về atmega8 cho em hỏi nếu một con này vừa phải quét cỡ khoảng 5 led, dọc cỡ 5 sensor mà bắt buộc phải bám theo tín hiệu cỡ 50Hz vừa phải giao tiếp máy tính thì có ổn kô ?.. vì riêng chuyện đọc sensor theo dạng lấy mẫu rời rạc tín hiệu sin 50HZ liên tục vậy để xử lý nó mất cỡ khoảng 20ms rồi trong khi đó muốn quét led ở đây mình thiếu port nên cách dùng kiểu quét chứ kô sài chốt mà cũng tốn kém . như vậy khả năng sẽ bị chồng chéo gây nhấp nháy ... mình dùng soft để dò zero và tìm peak nên sẽ phải bám theo tín hiệu .. kết hợp với ic phân kệnh anaglog để đảm bảo lun sài ADC 10 bit vì thằng atmega8 dạng dip nè có 2 kệnh 8 bit rùi ...
                    bạn đã tìm ra được lỗi, vậy lỗi bạn gặp phải là j? post lên để mọi ng cùng tham khảo chứ..? bạn chỉ post câu hỏi lên thôi ah.
                    mà mình thấy có 2 chỗ này..
                    thứ nhất là ko có chuyện ngắt xảy ra trong ngắt, trừ khi bạn cố tình muốn vậy, vì khi chương trình nhảy vào ngắt thì tự nó sẽ xóa bit cho phép ngắt toàn cục, và khi thoát khỏi thì nó sẽ set lại bit này, thời gian để ra vào ngắt hình như ít nhất tới 4 hay 5 ck j đó.
                    thứ 2 là chuyện đọc data từ adc. bạn cần đọc ADCL trước khi đọc ADCH chứ ko thì dữ liệu của bạn sẽ bị sai.
                    còn câu hỏi của bạn ở trên, bạn có thể nói rõ hơn ko, quét 5 led.? led 7 đoạn, matrix hay led j?
                    đọc 5 ss là ss ji, đọc adc về ah? giao tiếp máy tính, bạn cần truyền j về, data nhiều hay ko?
                    còn về số kênh adc thì bạn có thể chuyển qua dùng loại mega8 SMD nó có 8 kênh trong đó có 6 kênh ADC 10 bit

                    Comment


                    • #55
                      mình đấu sai mấy chân AVcc, Aref, nên nó chạy tùm lum ah ! .

                      Comment

                      Về tác giả

                      Collapse

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

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

                      Collapse

                      Đang tải...
                      X