RP Store Tìm linh kiện theo mã, gửi BOM nhận báo giá Gửi BOM

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

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts

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

    Leave a comment:


  • dt_love
    replied
    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

    Leave a comment:


  • newbie_avr
    replied
    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 ...

    Leave a comment:


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

    Leave a comment:


  • newbie_avr
    replied
    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; // [COLOR="Blue"]đư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[/COLOR]
    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;       [COLOR="Red"][SIZE="4"]// ???[/SIZE][/COLOR] [COLOR="Blue"]đã 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);      [/COLOR]

    Leave a comment:


  • newbie_avr
    replied
    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..

    Leave a comment:


  • newbie_avr
    replied
    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;

    Leave a comment:


  • newbie_avr
    replied
    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 ?

    Leave a comment:


  • anhhungckcd
    replied
    ko có dòng này Timer1.Enabled = True

    Leave a comment:


  • anhhungckcd
    replied
    để 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

    Leave a comment:


  • huyhungdt32
    replied
    newbie_avr làm đến đâu rồi mình cũng đang làm một mạch tương tự như newbie_avr. Mình dùng PC làm master và atmega8 cho 2 slaver. Mạch chuyển đổi thì mình dùng 555 và 75176 nói chung phần cứng mình làm xong rồi, mình cũng đã test thử nhưng chỉ truyền nhận giữa 1 slaver và PC thôi thì chạy ok còn bây giờ thêm 1 slaver nữa thì mình chwa làm đc .Mình cũng chỉ mới bắt đầu tìm hiểu về Avr thôi nên lập trình còn kém lắm mong newbie_avr và các bạn chỉ giáo

    Leave a comment:


  • dt_love
    replied
    Nguyên văn bởi newbie_avr Xem bài viết
    Trong diễn đàn này thấy bác Hoctro89xxxx cũng có nói về mạch này và đã làm thành sản phẩm và chạy tốt.. mặc dù là dùng cổng not bằng CD4069 có độ trễ tín hiệu vào ra lớn hơn con 74LS004 mà vẫn oke thì ổn wa... Có một điều khó hơi khó hiểu là khi Tx truyền bit 1. thì 485 của mình cho phép nhận trong khi nó đang muốn truyền đi. Mình chưa giải thích được đoạn này có Mấy Mod ở nước ngoài cũng nói trong xuốt quá trình truyền thì pin_23 phải luôn ở mức cao.. nhưng cũng có thể họ chưa làm mạch kiểu này bao giờ . Theo trang web mà mình đọc được nói về chuẩn 485 cũng nói về phương pháp auto.. có một mạch kiểu này nhưng dùng 555 bạn có đánh giá gì về chất lượng 2 kiểu này không ?
    về độ trễ tín hiệu thì với giao tiếp rs này ko có vấn đề j đâu, chắc bạn dùng cao lắm là vài chục k.
    vấn đề cần giải quyết ở đây là làm sao khi bên truyền có bit 0 thì bên nhận là bit 0, khi truyền là bit 1 thì bên nhận cũng là bit 1, ko cần biết là truyền trực tiếp hay gián tiếp.
    bạn coi kĩ trong chỗ Function Tables DS75176B Receiving
    nếu chân RE =0 thì ngõ ra RO sẽ là 1 khi trên đường truyền là mức 1 hay được thả lỏng(ko có tín hiệu) nó chỉ về mức 0 khi mà trên đường truyền có tín hiệu mức 0,
    do đó cách giải quyết là ta sẽ truyền bit 0 lên đường truyền và bit 1 thì bỏ nó đi, thả lỏng đường truyền thay vì đưa nó lên mức tín hiệu 1. đây được xem như là cách gián tiếp để truyền data 1 từ bên này sang bên kia.
    dựa vào bảng
    Function Tables
    DS75176B Transmitting
    bạn sẽ chọn được 2 trạng thái ở giữa.. khi nối cổng not vào giữa DE và DI thì khi DI=0 thì đường truyền =0, ngược lại, khi DI=1 thì đường truyền sẽ được thả lỏng,
    như vậy là đã giải quyết được vấn đề rồi.

    đây là phương pháp truyền data đi mà ko cần ràng buộc về chân 2,3 khi truyền, còn nếu bạn muốn chắc chắn rằng data luôn được truyền đi khi truyền, nghĩa là chân 2,3 luôn ở mức cao thì dùng con 555, làm mạch trễ, nó sẽ tạo trễ trong thời gian bạn truyền một byte đi, lúc này bạn phải tính tốc độ truyền và suy ra thời gian này để tính toán các linh kiện cho mạch 555.

    Leave a comment:


  • dt_love
    replied
    Nguyên văn bởi newbie_avr Xem bài viết
    Uhm đêm wa không ngủ làm cái coverter 232 - 485 và một cái slave dạng auto direction và plug and play liền . Mình cho truyền nhận đúng như bạn nói không sai một kí tự nào rất tốt. mặc dù mình chơi thạch anh 16Mhz. (error 9600 0.2%).

    giờ mình mới bắt đầu viết test thử để làm thêm các slave khác và ngoại vi hoàn chỉnh ..

    - Để kiểm tra địa chỉ khi master gửi xuống mình thử làm một cái đơn giản thế này nhé (nếu cp gửi A thì sẽ on một con led ( katot nối với PORTC.5). Nếu gửi B thì sẽ off nó đi.
    +) Khi mình test với một vài dòng code kiểu này thì nó chạy rất oke :
    Code:
    [COLOR="Blue"]while(rx_counter >0 )       [/COLOR]   
        {   
        
     //     putchar(getchar());    
      //    }   
    //  switch( getchar())
    //      {
       [COLOR="Blue"]   if('A'== getchar())[/COLOR]
     //    case 'A' :
         [COLOR="Blue"] PORTC.5 = 0;    // sáng led[/COLOR]
         // delay_ms(100);   
    [COLOR="Blue"]     if('B'== getchar())[/COLOR]
      //    case 'B' :
         [COLOR="Blue"] PORTC.5 = 1;  // tắt led[/COLOR]
          //delay_ms(100);    
    //      default :
          ;
          }
    +) Tiếp đó mình không mún dùng dạng if để kiểm tra mà dùng switch case thì kết quả tệ chắc sai rùi mà mình chưa nhìn ra . Bạn chỉ xem sai chỗ nào nhé... ( Khi mình gửi các kí tự thường (kô phải kí tự viết hoa (thì led luôn sáng vì mặc định ban đầu khởi tạo là ở mức thấp mà nên sẽ cấp đất cho led . Vcc thì lun được cấp cố định vào anot rùi). Tiếp theo khi mình gửi A hoặc B thì led lập tức tắt lun và cho dù mình có gửi kí tự gì xuống nó cũng không sáng lại .
    đoạn code như thế này :
    Code:
    while(rx_counter >0 )          
        {   
        
     //     putchar(getchar());    
      //    }   
    [COLOR="Blue"] switch( getchar())[/COLOR]
    //      {
    //      if('A'== getchar())
       [COLOR="Blue"] case 'A' :
          PORTC.5 = 0; // on led[/COLOR]
         // delay_ms(100);   
     //    if('B'== getchar())
       [COLOR="Blue"]   case 'B' :
          PORTC.5 = 1; // off led[/COLOR]
          //delay_ms(100);    
         [COLOR="Blue"] default :
          ;[/COLOR]
          }
    ??
    2 đoạn code có lỗi hết.
    đoạn trên thì bạn bị ở chỗ hàm getchar();
    hàm này sẽ lấy data ra khỏi bộ đệm, vì vậy , với đoạn code này, mỗi một giá trị mà bạn gửi xuống thì nó chỉ được kiểm tra một lần thôi, cho dù nó đúng hay ko đúng thì cũng bị xóa,bạn nên sửa lại thế này.
    Code:
    unsigned char temp;
    [COLOR="Blue"]
    while(rx_counter >0 )       [/COLOR]   
        {   
       temp=getchar(); 
     
       [COLOR="Blue"]   if(temp=='A')[/COLOR]
         [COLOR="Blue"] PORTC.5 = 0;    // sáng led[/COLOR]
      [COLOR="Blue"]     if(temp=='B')[/COLOR]
         [COLOR="Blue"] PORTC.5 = 1;  // tắt led[/COLOR]
            }
    đoạn code dưới thì thiếu break() nên khi mới khởi động thì nó sẽ sáng, sau đó nếu bạn gửi A thì nó sẽ chạy một mạch từ trễn xuống dưới.. nên sẽ tắt led, nếu gửi B thì nó sẽ nhảy đến dòng tắt led.. và led cũng bị tắt, kết quả là dù bạn gửi A hay B j thì led cũng tắt và ko thể bật lại, trừ khi bạn reset.

    Leave a comment:


  • newbie_avr
    replied
    U ! với 2 code trên mình thấy code viết với swich cho độ ổn định tốt hơn hẳn.
    vì code viết với if ở trên nhiều lúc mình phải click 2 lần thì nó mới sáng hoặc tối. ??
    còn với code viết bằng switch thì click 10 cái đc lun 10 ..

    Leave a comment:


  • typhoon
    replied
    Thiếu cái break òi !

    Leave a 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...