Xin chỉ chỗ sai trong chương trình test giao tiếp máy tính qua r485
Collapse
X
-
Bắt tay hay sao mà dùng cái RST làm gì???Mình chỉ cần RXT và TXD thôi là đc mà.Mình dùng RS485 cho cặp 8051 thấy ngon mà.Theo ý kiến riêng của mình thì bạn dùng thạch anh 8Mhz là quá đủ rồi.16Mhz khiếp quá
-
mình vừa test thử tầng 232 (không nối với 485 cũng như atmega8)
mình nối 2 chân phía TLL của 232 là chân 11 và 12 với nhau ( <=> test nối chân 2 và 3 của cổng com DB9). kết quả là truyền nhận tốt ==> mạch từ pc --> 232 đã tạm ổn nhưng với điều kiện là không được đưa tín hiệu RTS lên mức cao ( lưu ý là lúc này mình chỉ test nối đơn thuần là pc <-> 232).
code chạy : (có giá trị trả về test box nhân)
code không chạy ( không có giá trị trả về test box nhân hoặc trả về tùm lum)Code:MSComm1.Output = Text2.Text
= > ?? tại sao vậy nhỉCode:MSComm1.RTSEnable = True MSComm1.Output = Text2.Text
Last edited by newbie_avr; 15-11-2009, 11:46.
Leave a comment:
-
Nối trực tiếp xem nó có chạy không đã, sau đó mới cho tầng 485 vào mà chạy.
Leave a comment:
-
vậy bạn test thử chỗ đó. có k quả j báo cho bà con bit với hen..Nguyên văn bởi newbie_avr Xem bài viếtphần cứng thì mình nghĩ mạch đơn giản không có gì đáng nói có điều về chương trình nếu bạn nào làm rồi thì mình nghĩ sai đâu đó.
- mình không mắc 232 <->485 theo kiểu tự động (chân pin2+3_ic75176 được điều khiển trong chương trình).
code viết để truyền thử một kí tự kiểu này có ổn không, có nghĩa là sau khi mình đưa dữ liệu ra bộ đệm để gửi xuống vdk (chưa truyền )Code:Private Sub cmdSend_Click() MSComm1.RTSEnable = False ' Pin7_DB9 = 0 ( pin2+3_ic75176 = 1 ==> truyền data) MSComm1.Output = Text2.Text ' đưa dữ liệu xuống bộ đệm phát MSComm1.RTSEnable = True ' Disable pin7_DB9 = 1 (pin2+3_ic75176 = 0 ==> nhận data) End Submà mình đưa chân ic rs485 (75176) xuống mức thấp liền thì nó không cho phép gửiCode:MSComm1.Output = Text2.Text ' đưa dữ liệu xuống bộ đệm phát
mặc dù mục đích là để máy tính của mình trở về trạng thái chờ nhận data trả về từ atmega8. có lẽ nào đoạn code này sai ở ngay chỗ đó và atmega8 sẽ không nhận được dữ liệu hoặc có nhận sẽ nhận không đủ gây luôn sai.Code:MSComm1.RTSEnable = True ' Disable pin7_DB9 = 1 (pin2+3_ic75176 = 0 ==> nhận data)
Leave a comment:
-
phần cứng thì mình nghĩ mạch đơn giản không có gì đáng nói có điều về chương trình nếu bạn nào làm rồi thì mình nghĩ sai đâu đó.
- mình không mắc 232 <->485 theo kiểu tự động (chân pin2+3_ic75176 được điều khiển trong chương trình).
code viết để truyền thử một kí tự kiểu này có ổn không, có nghĩa là sau khi mình đưa dữ liệu ra bộ đệm để gửi xuống vdk (chưa truyền )Code:Private Sub cmdSend_Click() MSComm1.RTSEnable = False ' Pin7_DB9 = 0 ( pin2+3_ic75176 = 1 ==> truyền data) MSComm1.Output = Text2.Text ' đưa dữ liệu xuống bộ đệm phát MSComm1.RTSEnable = True ' Disable pin7_DB9 = 1 (pin2+3_ic75176 = 0 ==> nhận data) End Submà mình đưa chân ic rs485 (75176) xuống mức thấp liền thì nó không cho phép gửiCode:MSComm1.Output = Text2.Text ' đưa dữ liệu xuống bộ đệm phát
mặc dù mục đích là để máy tính của mình trở về trạng thái chờ nhận data trả về từ atmega8. có lẽ nào đoạn code này sai ở ngay chỗ đó và atmega8 sẽ không nhận được dữ liệu hoặc có nhận sẽ nhận không đủ gây luôn sai.Code:MSComm1.RTSEnable = True ' Disable pin7_DB9 = 1 (pin2+3_ic75176 = 0 ==> nhận data)
Leave a comment:
-
hic, mấy bác ơi.. con này chơi tới 20Mhz mà mấy bác cứ la ơi ới vậy.. làm bạn ý lo rùi. cả M8 lẫn M8L đều chạy dc ở 16Mhz, với dk là nguồn cấp phải đủ 5V và ổn định tí, thông tin chính xác thì cứ coi trong datasheet, mấy trang gần cuối, coi cái giản đồ tần số theo điện áp ấy.Nguyên văn bởi newbie_avr Xem bài viếtMình chỉ làm test đơn giản như sau :
- Phần cứng : máy tính <--> max232 <--> 75176 <----> 75176 <---> atmega8.Trên chương trình VB sẽ gửi kí tự xuống và atmega8 sẽ nhận và gửi trở lại VB. Nhưng sửa rồi kiểm tra phần cứng mà không được, không thấy có kí tự gửi về Text box của VB. Bạn nào làm chạy rồi chỉ mình biết có thể sai do đâu :
- code vb đoạn gửi dữ liệu ra bus rs485 :
- code vb của cả chương trình :Code:Private Sub cmdSend_Click() MSComm1.RTSEnable = False ' Pin7_DB9 = 0 ( pin2+3_ic75176 = 1 ==> [COLOR="Red"]truyền data[/COLOR]) MSComm1.Output = Text2.Text ' [COLOR="Magenta"]đưa dữ liệu xuống bộ đệm phát[/COLOR] MSComm1.RTSEnable = True ' Disable pin7_DB9 = 1 (pin2+3_ic75176 = 0 ==> [COLOR="red"]nhận data[/COLOR]) End Sub
- Phần chương trình cho atmega8 mình test với 1 con nên chỉ nhận data từ máy tính rồi gửi lại thôi . Bình thường vdk đưa pin_23_75176 (low để nhận dữ liệu), khi cần truyền dữ liệu về máy tính thì lại đưa chân này lên mức cao.Code:Private Sub cmdClear_Click() Text1.Text = "" End Sub Private Sub cmdExit_Click() Unload Me End Sub Private Sub cmdSend_Click() MSComm1.RTSEnable = False ' Pin7_232 = 0 MSComm1.Output = Text2.Text MSComm1.RTSEnable = True ' Disable pin7_rs232 = 1 End Sub Private Sub D_RTS_Click() MSComm1.RTSEnable = True ' Disable pin7_rs232 = 1 End Sub Private Sub Form_Load() cmdSend.Caption = "&Send" Text1.Text = "" Text2.Text = "" Text1.Enabled = False cmdExit.Caption = "&Exit" With MSComm1 .Settings = "9600,N,8,1" .CommPort = 1 .RThreshold = 1 .SThreshold = 0 .InputMode = comInputModeText .InputLen = 0 .Handshaking = comNone .InBufferSize = 1024 .OutBufferSize = 1024 If .PortOpen = False Then .PortOpen = True End If End With End Sub Private Sub MSComm1_OnComm() Dim Buffer As Variant If MSComm1.CommEvent = comEvReceive Then Text1.Text = Text1.Text + MSComm1.Input End If End Sub Private Sub RTS_ENABLE_Click() MSComm1.RTSEnable = False ' Pin7_232 = 0 End Sub
.Code:/***************************************************** This program was produced by the CodeWizardAVR V1.24.8d Professional Automatic Program Generator © Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 11/14/2009 Author : F4CG Company : F4CG Comments: Chip type : ATmega8 Program type : Application Clock frequency : 16.000000 MHz Memory model : Small External SRAM size : 0 Data Stack size : 256 *****************************************************/ #include <mega8.h> #include <delay.h> #define RXB8 1 #define TXB8 0 #define UPE 2 #define OVR 3 #define FE 4 #define UDRE 5 #define RXC 7 #define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<OVR) #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC) // USART Receiver buffer #define RX_BUFFER_SIZE 8 char rx_buffer[RX_BUFFER_SIZE]; #if RX_BUFFER_SIZE<256 unsigned char rx_wr_index,rx_rd_index,rx_counter; #else unsigned int rx_wr_index,rx_rd_index,rx_counter; #endif // This flag is set on USART Receiver buffer overflow bit rx_buffer_overflow; // USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) { char status,data; status=UCSRA; data=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index]=data; if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; rx_buffer_overflow=1; }; }; } #ifndef _DEBUG_TERMINAL_IO_ // Get a character from the USART Receiver buffer #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char data; while (rx_counter==0); data=rx_buffer[rx_rd_index]; if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; #asm("cli") --rx_counter; #asm("sei") return data; } #pragma used- #endif // USART Transmitter buffer #define TX_BUFFER_SIZE 8 char tx_buffer[TX_BUFFER_SIZE]; #if TX_BUFFER_SIZE<256 unsigned char tx_wr_index,tx_rd_index,tx_counter; #else unsigned int tx_wr_index,tx_rd_index,tx_counter; #endif // USART Transmitter interrupt service routine interrupt [USART_TXC] void usart_tx_isr(void) { if (tx_counter) { --tx_counter; UDR=tx_buffer[tx_rd_index]; PORTB.0 = 1; // ------------------> pin 2+3_ic75176 de truyen du lieu ve lai may tinh if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0; }; } #ifndef _DEBUG_TERMINAL_IO_ // Write a character to the USART Transmitter buffer #define _ALTERNATE_PUTCHAR_ #pragma used+ void putchar(char c) { while (tx_counter == TX_BUFFER_SIZE); #asm("cli") if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0)) { tx_buffer[tx_wr_index]=c; if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0; ++tx_counter; } else { UDR=c; PORTB.0 = 1; // ------------------> pin 2+3_ic75176 de truyen du lieu ve lai may tinh } #asm("sei") } #pragma used- #endif // Standard Input/Output functions #include <stdio.h> // Declare your global variables here void main(void) { PORTB=0x00; DDRB=0x03; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // 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; // Global enable interrupts #asm("sei") while (1) { // Place your code here PORTB.0 = 0; // chan pin2+3 _ic75176 = 0 (low) de cho nhan du lieu if(rx_counter > 0) { putchar(getchar()); // gui ve lai may tinh } } }
Mình dùng thạch anh 16Mhz , phần cứng có lẽ tạm nhưng phần mềm không biết sai chỗ nào nên không có dữ liệu gửi về . nhờ các bạn chỉ cho mình chỗ sai để khắc phục.
bạn cứ để vậy mà debug thì.. khó lắm.. vì nguyên nhân ở quá nhiều chỗ, ko bit nguyên nhân ở chỗ nào, giờ thì bạn nên tách từng phần ra, debug để chắc chắn là từng phần đó chạy được đã..
bạn nên dùng các phần mềm terminal của win để test trước, hoặc có thể dùng trực tiếp thằng terminal của CodeVision cũng dc. nếu vậy mà nó cũng ko thấy chạy thì bạn gỡ 2 con 176 ra.. rồi debug từ từ.. chứ để một cục vậy thì.. hic khó ăn lém.
Leave a comment:
-
Bạn xem lại Datasheet con Mega8 nhé, vì theo mình nhớ Mega8 chỉ có max là 12Mhz thôi, mỗi con Mega48 mới lên tới được 20Mhz. Bạn chạy thạch anh lớn thế kia mình sợ là VĐK chạy ko đúng là đúng rồi.
Leave a comment:
-
không 20Mhz mới overlock mình sai atmega8 -16 mà. chỉ có điều theo data sheet thì với baud là 9600 sẽ có sai số 0.2 %. mạch mình làm test nên hàn chung trên một board khoảng cách không đáng kể
Leave a comment:
-
oạch.Mega8 mà chơi tới tận 16MHZ cơ à?Con này mình nghĩ nó chạy ở 12Mhz là đã overlock rồi đấy.Bạn thử coi lại phần chuyển đổi rs232-rs485 coi có vấn đề gì ko nhé!
Leave a comment:
-
Xin chỉ chỗ sai trong chương trình test giao tiếp máy tính qua r485
Mình chỉ làm test đơn giản như sau :
- Phần cứng : máy tính <--> max232 <--> 75176 <----> 75176 <---> atmega8.Trên chương trình VB sẽ gửi kí tự xuống và atmega8 sẽ nhận và gửi trở lại VB. Nhưng sửa rồi kiểm tra phần cứng mà không được, không thấy có kí tự gửi về Text box của VB. Bạn nào làm chạy rồi chỉ mình biết có thể sai do đâu :
- code vb đoạn gửi dữ liệu ra bus rs485 :
- code vb của cả chương trình :Code:Private Sub cmdSend_Click() MSComm1.RTSEnable = False ' Pin7_DB9 = 0 ( pin2+3_ic75176 = 1 ==> [COLOR="Red"]truyền data[/COLOR]) MSComm1.Output = Text2.Text ' [COLOR="Magenta"]đưa dữ liệu xuống bộ đệm phát[/COLOR] MSComm1.RTSEnable = True ' Disable pin7_DB9 = 1 (pin2+3_ic75176 = 0 ==> [COLOR="red"]nhận data[/COLOR]) End Sub
- Phần chương trình cho atmega8 mình test với 1 con nên chỉ nhận data từ máy tính rồi gửi lại thôi . Bình thường vdk đưa pin_23_75176 (low để nhận dữ liệu), khi cần truyền dữ liệu về máy tính thì lại đưa chân này lên mức cao.Code:Private Sub cmdClear_Click() Text1.Text = "" End Sub Private Sub cmdExit_Click() Unload Me End Sub Private Sub cmdSend_Click() MSComm1.RTSEnable = False ' Pin7_232 = 0 MSComm1.Output = Text2.Text MSComm1.RTSEnable = True ' Disable pin7_rs232 = 1 End Sub Private Sub D_RTS_Click() MSComm1.RTSEnable = True ' Disable pin7_rs232 = 1 End Sub Private Sub Form_Load() cmdSend.Caption = "&Send" Text1.Text = "" Text2.Text = "" Text1.Enabled = False cmdExit.Caption = "&Exit" With MSComm1 .Settings = "9600,N,8,1" .CommPort = 1 .RThreshold = 1 .SThreshold = 0 .InputMode = comInputModeText .InputLen = 0 .Handshaking = comNone .InBufferSize = 1024 .OutBufferSize = 1024 If .PortOpen = False Then .PortOpen = True End If End With End Sub Private Sub MSComm1_OnComm() Dim Buffer As Variant If MSComm1.CommEvent = comEvReceive Then Text1.Text = Text1.Text + MSComm1.Input End If End Sub Private Sub RTS_ENABLE_Click() MSComm1.RTSEnable = False ' Pin7_232 = 0 End Sub
.Code:/***************************************************** This program was produced by the CodeWizardAVR V1.24.8d Professional Automatic Program Generator © Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 11/14/2009 Author : F4CG Company : F4CG Comments: Chip type : ATmega8 Program type : Application Clock frequency : 16.000000 MHz Memory model : Small External SRAM size : 0 Data Stack size : 256 *****************************************************/ #include <mega8.h> #include <delay.h> #define RXB8 1 #define TXB8 0 #define UPE 2 #define OVR 3 #define FE 4 #define UDRE 5 #define RXC 7 #define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<OVR) #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC) // USART Receiver buffer #define RX_BUFFER_SIZE 8 char rx_buffer[RX_BUFFER_SIZE]; #if RX_BUFFER_SIZE<256 unsigned char rx_wr_index,rx_rd_index,rx_counter; #else unsigned int rx_wr_index,rx_rd_index,rx_counter; #endif // This flag is set on USART Receiver buffer overflow bit rx_buffer_overflow; // USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) { char status,data; status=UCSRA; data=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index]=data; if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; rx_buffer_overflow=1; }; }; } #ifndef _DEBUG_TERMINAL_IO_ // Get a character from the USART Receiver buffer #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char data; while (rx_counter==0); data=rx_buffer[rx_rd_index]; if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; #asm("cli") --rx_counter; #asm("sei") return data; } #pragma used- #endif // USART Transmitter buffer #define TX_BUFFER_SIZE 8 char tx_buffer[TX_BUFFER_SIZE]; #if TX_BUFFER_SIZE<256 unsigned char tx_wr_index,tx_rd_index,tx_counter; #else unsigned int tx_wr_index,tx_rd_index,tx_counter; #endif // USART Transmitter interrupt service routine interrupt [USART_TXC] void usart_tx_isr(void) { if (tx_counter) { --tx_counter; UDR=tx_buffer[tx_rd_index]; PORTB.0 = 1; // ------------------> pin 2+3_ic75176 de truyen du lieu ve lai may tinh if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0; }; } #ifndef _DEBUG_TERMINAL_IO_ // Write a character to the USART Transmitter buffer #define _ALTERNATE_PUTCHAR_ #pragma used+ void putchar(char c) { while (tx_counter == TX_BUFFER_SIZE); #asm("cli") if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0)) { tx_buffer[tx_wr_index]=c; if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0; ++tx_counter; } else { UDR=c; PORTB.0 = 1; // ------------------> pin 2+3_ic75176 de truyen du lieu ve lai may tinh } #asm("sei") } #pragma used- #endif // Standard Input/Output functions #include <stdio.h> // Declare your global variables here void main(void) { PORTB=0x00; DDRB=0x03; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // 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; // Global enable interrupts #asm("sei") while (1) { // Place your code here PORTB.0 = 0; // chan pin2+3 _ic75176 = 0 (low) de cho nhan du lieu if(rx_counter > 0) { putchar(getchar()); // gui ve lai may tinh } } }
Mình dùng thạch anh 16Mhz , phần cứng có lẽ tạm nhưng phần mềm không biết sai chỗ nào nên không có dữ liệu gửi về . nhờ các bạn chỉ cho mình chỗ sai để khắc phục.Tags: None
dự án của bạn Tra theo mã, xem datasheet và đặt hàng trực tuyến. MicrochipROHMEpsonTaejin
Đặt hàng & tư vấn
Hà Nội024.3640 8561
TP.HCM028.3811 9870
Quét mã hoặc bấm để chat Zalo với R&PChat Zalo
Quét mã hoặc bấm để chat Zalo với R&PChat Zalo
Bài viết mới nhất
Collapse
-
Trả lời cho Tìm bạn thân quen cũ.bởi thuaimiVẫn nhớ và kính trọng Bác cũng các cao nhân trên dientuvietnam.net. Tính từ ngày tham gia trên này cũng đã hơn 20 năm rồi. Quá nhiều thay đổi cả trong công việc và cuộc sống. Nhưng được thấy lại các nick cũ vẫn sáng đèn là thấy vui rồi....-
Channel: Tâm tình dân kỹ thuật
26-10-2026, 16:33 -
-
Trả lời cho Tìm bạn thân quen cũ.bởi nhathung1101Còn sống không lão??? Mất một thời gian chữa bệnh nên quên hỏi thăm.......
-
Channel: Tâm tình dân kỹ thuật
25-10-2026, 03:09 -
-
Trả lời cho Công suất truyền qua lõi máy biến ápbởi nhathung1101Thời buổi năng lượng xanh, nhất là xanh cả mặt... Thì Điện mặt giời, điện gió, sẽ lên ngôi.
Nếu không nắm bắt được cái cơ bản đó thì đi làm coder à? Mà coder giờ thất nghiệp cả lũ vì AI rồi!!!









...
-
Channel: Điện tử công suất
25-10-2026, 03:03 -
-
Trả lời cho Công suất truyền qua lõi máy biến ápbởi quangdonguehChà, lâu lắm rồi nhưng diễn đàn vẫn còn những chủ đề cốt lõi của điện tử công suất...-
Channel: Điện tử công suất
24-10-2026, 07:53 -
-
bởi bqvietNếu muốn tăng công suất cần tăng con chip và tăng biến áp lên lớn hơn. Thiết kế ban đầu dùng TNY25x và biến áp EE16 hoặc EE13. Tăng con chip lên TNY268 vẫn mạch nguyên lý đó và biến áp lên EE19 sẽ nâng công suất ra thêm nhiều. Tăng tối đa...-
Channel: Điện tử công suất
24-10-2026, 02:14 -
-
bởi Nexus 6PMạch này chỉ chạy cho LED 10W trở xuống, còn muốn chạy Led công suất cao thì sao bác thớt ơi?-
Channel: Điện tử công suất
22-10-2026, 14:33 -
-
bởi Nexus 6PMạch này chỉ chạy cho LED 10W trở xuống, còn muốn chạy Led công suất cao thì sao bác thớt ơi?-
Channel: Điện tử công suất
22-10-2026, 10:49 -
-
Trả lời cho Tìm VR 5 chânbởi dinhthuong80Cảm ơn bác bqviet . Nhưng hình như các VR 5 chân của linhkienchatluong là loại có 2 chân là công tắc đóng mở. Thấy trên Shopee có chỗ bán linh kiện đàn Organ, mà không biết đúng loại không, với lại sao ... mắc dữ dội luôn ấy!!!
...-
Channel: Hướng dẫn tìm thông tin linh kiện
19-10-2026, 11:30 -
Leave a comment: