Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.94/33: Рейтинг темы: голосов - 33, средняя оценка - 4.94
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
1

Обмен данными между МК через RS-485 (MAX487)

28.10.2015, 09:01. Просмотров 6044. Ответов 86
Метки нет (Все метки)

Доброго времени суток.

Сразу к делу:
В сообщении прикреплено фото и файл исходного кода (AtmelStudio 6) и проект в Proteus 8 Prof.

Проблема в следующем:
из МК U2 поднимаем ножку PD3, передаем данные TXD (рис.п.1) MAX487 передает другой стороне (рис.п.2), а U3 принимает RXD (рис.п.3).

Далее U3 обрабатывает данные и выдает ответ TXD (рис.п.4), MAX487 передает другой стороне (рис.п.5), но вот U2 через RXD (рис.п.6) ничего не принимает.

Помогите пожалуйста разобраться.
0
Миниатюры
Обмен данными между МК через RS-485 (MAX487)  
Вложения
Тип файла: zip project.zip (105.9 Кб, 49 просмотров)
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2015, 09:01
Ответы с готовыми решениями:

Обмен данными по RS-485 в CodeVisionAVR (на базе кода Wizard
Задача: дополнить (видоизменить) код на С (в CodeVisionAvr) , чтобы получить...

RS-485: PIC18f4620 и MAX487
Доброй ночи. Подскажите, пожалуйста, такую штуку. Разбираюсь с передачей...

Обмен данными по UART между несколькими устройствами
Планирую собрать систему из 2 - 33 устройств обменивающимися данными между...

Обмен данными по SPI между двумя Atemga
Пытаюсь реализовать обмен 5 байт данными между двумя Atmeg(1-Atmega165 ведущий,...

Обмен данными через COM- порт
Добрый день, пытаюсь освоить передачу данных. Отсылаю на мк скажем "1",...

86
raxp
10188 / 6571 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
28.10.2015, 10:10 2
...правильное включение драйвера RS-485:


p.s.: среди прочего, есть MAX13410 с автодетекцией сигнала в линии и автопереключением драйвера с приема на передачу автоматом. Код упрощается к тому же.
3
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
28.10.2015, 15:03  [ТС] 3
т.е. все дело только в гальванической развязке?
0
raxp
10188 / 6571 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
28.10.2015, 15:15 4
Нет. Но на практике это сыграет свою роль в будущем.

p.s.: код тоже приложите в теме в явном виде, обрамив тегами.
0
raxp
10188 / 6571 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
28.10.2015, 15:23 5
Теперь покажу вариант организации обвязки другими разработчиками (уже не мной):

Обмен данными между МК через RS-485 (MAX487)


Обмен данными между МК через RS-485 (MAX487)


Присмотритесь к диффканалу 485-го.
2
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
28.10.2015, 20:33  [ТС] 6
Код:

для AtMega16 по схеме:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
#define F_CPU 8000000UL
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <string.h>
#include <stdio.h>
 
char c_DEVICE_UID[8] = {'C', 'O', 'N', 'T', 'R', 'O', 'L', 'L'};    // S-TPH/01
char c_DEVICE_MAC[4] = {0x01, 0x01, 0x01, 0x01};
#define DEVICE_UID                  c_DEVICE_UID
#define DEVICE_MAC                  c_DEVICE_MAC
 
#define RS485_SETBIT(x,y)           ( x |= ( 1 << y ) )
#define RS485_CLRBIT(x,y)           ( x &= ~( 1 << y ) )
#define RS485_PORT                  PORTD
#define RS485_CONTROL               PD3          // управление приемом/передачей RS485
#define RS485_TR                    RS485_SETBIT(RS485_PORT,RS485_CONTROL) // Установить RE DE в 1. Отправка
#define RS485_RS                    RS485_CLRBIT(RS485_PORT,RS485_CONTROL) // Установить RE DE в 0. Прием
 
// Usart makros of speed
#define USORT_BAUD                  9600
#define UBRR_VAL                    F_CPU / 16 / USORT_BAUD - 1
// USORT Receiver buffer
#define DATA_REGISTER_EMPTY         ( 1 << UDRE )
#define RX_COMPLETE                 ( 1 << RXC )
#define FRAMING_ERROR               ( 1 << FE )
//#define PARITY_ERROR              ( 1 << UPE )
#define DATA_OVERRUN                ( 1 << DOR )
#define RX_ADDRESS_SIZE             4
#define RX_DATA_SIZE                16
#define RX_BUFFER_SIZE              1 + RX_ADDRESS_SIZE + RX_DATA_SIZE + 1
#define USORT_STARTPACKET           0x0A
#define USORT_STOPPACKET            0x0B
// This flag is set on USORT Receiver buffer overflow
unsigned char ex_rx_index;
char ex_rx_buffer_adr[RX_ADDRESS_SIZE];
char ex_rx_buffer_cmd;
char ex_rx_buffer_dat[RX_DATA_SIZE];
bool ex_rx_buffer_overflow = false;
bool ex_rx_enable = false;
bool ex_rx_data_complite = false;
 
// LED ON
void LEDLAMP_ON(unsigned int n_pin)
{
    PORTC |= ( 1 << n_pin );
}
 
// LED OFF
void LEDLAMP_OFF(unsigned int n_pin)
{
    PORTC &= ~( 1 << n_pin );
}
 
void UART_Init (unsigned int speed)
{
    // Устанавливаем скорость Baud Rate
    UBRRH = (unsigned char)( speed >> 8 );
    UBRRL = (unsigned char) speed;
    UCSRA = 0x00;
    
    // Hазрешение работы передатчика
    UCSRB = ( 1 << TXEN ) | ( 1 << RXEN ) | (1 << RXCIE ) | (1 << TXCIE );
    
    //Установка формата посылки: 8 бит данных, 1 стоп-бит
    //UCSRC = (1 << USBS) | (3<<UCSZ0);
 
    /* Set frame format: 8data, 2stop bit */
    UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
    _delay_ms(50);
}
 
// Send to UART
void UART_Send_Char (char data_tx)
{
    while ( !( UCSRA & (1<<5)) ) {}
    RS485_TR;
    UDR = data_tx;
}
 
// Send to UART
void UART_SendString (char data_tx[])
{
    int i;
    int len;
    len = strlen( data_tx );
    for (i=0; i < len; i++) {
        UART_Send_Char(data_tx[i]);
    }
}
 
ISR(USORT_TXC_vect)
{
    RS485_RS; // Установить RE DE в 0. Прием
}
 
void USORT_SendPacket(char rx_device_mac[4], char rx_buffer_cmd, char rx_buffer_dat[RX_DATA_SIZE])
{
    char tmp_tx_data[RX_BUFFER_SIZE];
    sprintf(tmp_tx_data, "%c%c%c%c%c%c%s%c",    USORT_STARTPACKET,
                                                rx_device_mac[0],
                                                rx_device_mac[1],
                                                rx_device_mac[2],
                                                rx_device_mac[3],
                                                rx_buffer_cmd,
                                                rx_buffer_dat,
                                                USORT_STOPPACKET);
    UART_SendString(tmp_tx_data);
}
 
ISR(USORT_RXC_vect)
{
    char status, data;
    unsigned char sub_rx_index;
    status = UCSRA;
    data = UDR;
    if ((status & (FRAMING_ERROR /*| PARITY_ERROR */| DATA_OVERRUN))==0)
    {
 
        if (data == USORT_STARTPACKET)
        {
            memset(ex_rx_buffer_adr, 0, sizeof(ex_rx_buffer_adr));
            ex_rx_buffer_cmd = 0;
            memset(ex_rx_buffer_dat, 0, sizeof(ex_rx_buffer_dat));
            ex_rx_index=0;
            ex_rx_enable = true;
            ex_rx_data_complite = false;
            
        }
        
        if ( (data == USORT_STOPPACKET) && (ex_rx_enable == 1) )
        {
            ex_rx_enable = 0;
            ex_rx_data_complite = true;
        }
        
        if (ex_rx_enable == 1)
        {
            if ( (ex_rx_index >= 0) && (ex_rx_index <= 4) )
            {
                ex_rx_buffer_adr[ex_rx_index] = data;
                if (ex_rx_index == 4)
                {
                    if ( !strcat(ex_rx_buffer_adr, DEVICE_MAC) )
                    {
                        ex_rx_enable = 0;
                        ex_rx_data_complite = false;
                    }
                }
                ++ex_rx_index;
            } else if (ex_rx_index == 5)
            {
                ex_rx_buffer_cmd = data;
                ++ex_rx_index;
            } else if (ex_rx_index > 5)
            {
                sub_rx_index = ex_rx_index - 6;
                ex_rx_buffer_dat[sub_rx_index] = data;
                ++ex_rx_index;
            }
 
            if (ex_rx_index >= RX_BUFFER_SIZE)
            {
                ex_rx_enable = false;
                ex_rx_buffer_overflow=1;
            }
            
        }
        
    }
}
 
void ExchangeUART(char rx_buffer_cmd, char rx_buffer_dat[RX_DATA_SIZE])
{
LEDLAMP_ON(0);
    char tmp_rx_buffer[RX_DATA_SIZE];
    if (rx_buffer_cmd == 0xA2) // Активация устройства
    {
 
        memset(tmp_rx_buffer, 0, sizeof(tmp_rx_buffer));
        sprintf(tmp_rx_buffer, "%s", "GOOD!!!");
        
        //USORT_SendPacket(DEVICE_MAC, 0xA2, tmp_rx_buffer);
    }
}
 
int main(void)
{
    UART_Init(UBRR_VAL);
    
    DDRD |= ( 1 << PD3);
    RS485_RS; // Установить RE DE в 0. Прием
    
    DDRC |= ( 1 << PC0);
    
    char rx_device_mac[4] = {0x01, 0x01, 0x01, 0x01};
    
    sei();
    
    while(1)
    {
        _delay_ms(1500);
        memset(ex_rx_buffer_dat, 0, sizeof(ex_rx_buffer_dat));
        
        
        USORT_SendPacket(rx_device_mac, 0xA1, ex_rx_buffer_dat);
        _delay_ms(15);
        if (ex_rx_data_complite)
        {
            ex_rx_data_complite = false;
            ExchangeUART(ex_rx_buffer_cmd, ex_rx_buffer_dat);
        }
    }
}


для AtMega8 по схеме:

Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
#define F_CPU 8000000UL
 
 
 
char c_DEVICE_UID[8] = {'S', '-', 'T', 'P', 'H', '/', '0', '1'};    // S-TPH/01
char c_DEVICE_MAC[4] = {0x01, 0x01, 0x01, 0x01};
#define DEVICE_UID                  c_DEVICE_UID
#define DEVICE_MAC                  c_DEVICE_MAC
 
 
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <string.h>
#include <stdio.h>
 
#define RS485_SETBIT(x,y)           ( x |= ( 1 << y ) )
#define RS485_CLRBIT(x,y)           ( x &= ~( 1 << y ) )
#define RS485_PORT                  PORTD
#define RS485_CONTROL               PD3          // управление приемом/передачей RS485
#define RS485_TR                    RS485_SETBIT(RS485_PORT,RS485_CONTROL) // Установить RE DE в 1. Отправка
#define RS485_RS                    RS485_CLRBIT(RS485_PORT,RS485_CONTROL) // Установить RE DE в 0. Прием
 
 
// Usart makros of speed
#define USORT_BAUD                  9600
#define UBRR_VAL                    F_CPU / 16 / USORT_BAUD - 1
// USORT Receiver buffer
#define DATA_REGISTER_EMPTY         ( 1 << UDRE )
#define RX_COMPLETE                 ( 1 << RXC )
#define FRAMING_ERROR               ( 1 << FE )
//#define PARITY_ERROR              ( 1 << UPE )
#define DATA_OVERRUN                ( 1 << DOR )
#define RX_ADDRESS_SIZE             4
#define RX_DATA_SIZE                16
#define RX_BUFFER_SIZE              1 + RX_ADDRESS_SIZE + RX_DATA_SIZE + 1
#define USORT_STARTPACKET           0x0A
#define USORT_STOPPACKET            0x0B
// This flag is set on USORT Receiver buffer overflow
unsigned char ex_rx_index;
char ex_rx_buffer_adr[RX_ADDRESS_SIZE];
char ex_rx_buffer_cmd;
char ex_rx_buffer_dat[RX_DATA_SIZE];
bool ex_rx_buffer_overflow = false;
bool ex_rx_enable = false;
bool ex_rx_data_complite = false;
 
// LED ON
void LEDLAMP_ON(unsigned int n_pin)
{
    PORTC |= ( 1 << n_pin );
}
 
// LED OFF
void LEDLAMP_OFF(unsigned int n_pin)
{
    PORTC &= ~( 1 << n_pin );
}
 
void UART_Init (unsigned int speed)
{
    // Устанавливаем скорость Baud Rate
    UBRRH = (unsigned char)( speed >> 8 );
    UBRRL = (unsigned char) speed;
    UCSRA = 0x00;
    
    // Hазрешение работы передатчика
    UCSRB = ( 1 << TXEN ) | ( 1 << RXEN ) | (1 << RXCIE ) | (1 << TXCIE );
    
    //Установка формата посылки: 8 бит данных, 1 стоп-бит
    //UCSRC = (1 << USBS) | (3<<UCSZ0);
 
    /* Set frame format: 8data, 2stop bit */
    UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
    _delay_ms(50);
}
 
// Send to UART
void UART_Send_Char (char data_tx)
{
    while ( !( UCSRA & (1<<5)) ) {}
    RS485_TR;
    UDR = data_tx;
}
 
// Send to UART
void UART_SendString (char data_tx[])
{
    int i;
    int len;
    len = strlen( data_tx );
    for (i=0; i < len; i++) {
        UART_Send_Char(data_tx[i]);
    }
}
 
ISR(USORT_TXC_vect)
{
    RS485_RS; // Установить RE DE в 0. Прием
}
 
void USORT_SendPacket(char rx_device_mac[4], char rx_buffer_cmd, char rx_buffer_dat[RX_DATA_SIZE])
{
    char tmp_tx_data[RX_BUFFER_SIZE];
    sprintf(tmp_tx_data, "%c%c%c%c%c%c%s%c",    USORT_STARTPACKET,
                                                rx_device_mac[0],
                                                rx_device_mac[1],
                                                rx_device_mac[2],
                                                rx_device_mac[3],
                                                rx_buffer_cmd,
                                                rx_buffer_dat,
                                                USORT_STOPPACKET);
    UART_SendString(tmp_tx_data);
}
 
ISR(USORT_RXC_vect)
{
    char status, data;
    unsigned char sub_rx_index;
    status = UCSRA;
    data = UDR;
    //LEDLAMP_ON(0);
    if ((status & (FRAMING_ERROR /*| PARITY_ERROR */| DATA_OVERRUN))==0)
    {
 
        if (data == USORT_STARTPACKET)
        {
            memset(ex_rx_buffer_adr, 0, sizeof(ex_rx_buffer_adr));
            ex_rx_buffer_cmd = 0;
            memset(ex_rx_buffer_dat, 0, sizeof(ex_rx_buffer_dat));
            ex_rx_index=0;
            ex_rx_enable = true;
            ex_rx_data_complite = false;
            
        }
        
        if ( (data == USORT_STOPPACKET) && (ex_rx_enable == 1) )
        {
            ex_rx_enable = 0;
            ex_rx_data_complite = true;
        }
        
        if (ex_rx_enable == 1)
        {
            if ( (ex_rx_index >= 0) && (ex_rx_index <= 4) )
            {
                ex_rx_buffer_adr[ex_rx_index] = data;
                if (ex_rx_index == 4)
                {
                    if ( !strcat(ex_rx_buffer_adr, DEVICE_MAC) )
                    {
                        ex_rx_enable = 0;
                        ex_rx_data_complite = false;
                    }
                }
                ++ex_rx_index;
            } else if (ex_rx_index == 5)
            {
                ex_rx_buffer_cmd = data;
                ++ex_rx_index;
            } else if (ex_rx_index > 5)
            {
                sub_rx_index = ex_rx_index - 6;
                ex_rx_buffer_dat[sub_rx_index] = data;
                ++ex_rx_index;
            }
 
            if (ex_rx_index >= RX_BUFFER_SIZE)
            {
                ex_rx_enable = false;
                ex_rx_buffer_overflow=1;
            }
            
        }
        
    }
}
 
void ExchangeUART(char rx_buffer_cmd, char rx_buffer_dat[RX_DATA_SIZE])
{
    char tmp_rx_buffer[RX_DATA_SIZE];
    if (rx_buffer_cmd == 0xA1) // Активация устройства
    {
        memset(tmp_rx_buffer, 0, sizeof(tmp_rx_buffer));
        //sprintf(tmp_rx_buffer, "%s", DEVICE_UID);
        //sprintf(tmp_rx_buffer, "%c", '!');
        LEDLAMP_ON(0);
        USORT_SendPacket(DEVICE_MAC, 0xA2, tmp_rx_buffer);
    }
}
 
int main(void)
{
    UART_Init(UBRR_VAL);
    
    DDRD |= ( 1 << PD3);
    RS485_RS; // Установить RE DE в 0. Прием
    
    DDRC |= ( 1 << PC0) | ( 1 << PC1);
    //_delay_ms(1000);
    //LEDLAMP_ON(0);
    //_delay_ms(1000);
    //LEDLAMP_OFF(0);
    
    sei();
    
    while(1)
    {
        _delay_ms(1);
        if (ex_rx_data_complite)
        {
            ex_rx_data_complite = false;
            ExchangeUART(ex_rx_buffer_cmd, ex_rx_buffer_dat);
        }
    }
}



raxp, на второй картинке +5В - это разные источники, или они замкнуты
0
ValeryS
Модератор
7447 / 5639 / 716
Регистрация: 14.02.2011
Сообщений: 19,211
Завершенные тесты: 1
28.10.2015, 23:03 7
Цитата Сообщение от Calligraff Посмотреть сообщение
// Устанавливаем скорость Baud Rate
UBRRH = (unsigned char)( speed >> 8 );
UBRRL = (unsigned char) speed;
мелочь конечно, но я обычно пишу так
C
1
2
 UBRRH =  speed/256;
 UBRRL =  speed%256;
и я не заметил, ты пользуешься прерываниями?
1
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
29.10.2015, 07:19  [ТС] 8
Да, конечно, прерывания используются
C++ (Qt)
1
2
3
4
5
...
sei();
...
ISR(USORT_TXC_vect) {...}
ISR(USORT_RXC_vect) {...}
в обоих МК

ISR(USORT_TXC_vect) - для выхода из режима передачи после отправки байта
0
raxp
10188 / 6571 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
29.10.2015, 07:25 9
на второй картинке +5В - это разные источники, или они замкнуты
на второй нет развязки, это один источник, на третьей должны быть разные, иначе смысла в опторазвязке нет. Но дело не в этом.
0
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
29.10.2015, 08:03  [ТС] 10
Эммм.. ну да, я про третью и говорил... ясно!

Вчера немного покумекал и пришел к выводу, что в моей схеме проблема точно не в развязке.

заменив 120 Ом на 10к (причем по ошибке) получились разницы на "А" и "Б" одинаково-противоположные (как и должно быть), но с разными пределами.

по кривым видно, что линии 3 и 4 поднимается и опускается вовремя.

при посылке с U2 на U3 все прекрасно и на кривых 1 и 2. а вот обратно 1 с низким потенциалом (линия А MAX487)

в Протеусе, для симуляции перед пайкой, небыло других компонентов RS485 кроме MAX487, поэтому их и использовал. да и в наличии есть они у меня.
0
Миниатюры
Обмен данными между МК через RS-485 (MAX487)  
ValeryS
Модератор
7447 / 5639 / 716
Регистрация: 14.02.2011
Сообщений: 19,211
Завершенные тесты: 1
29.10.2015, 08:45 11
Цитата Сообщение от Calligraff Посмотреть сообщение
ISR(USORT_TXC_vect) {...}
это какой компилятор?
ни разу не видел такой записи
схему проверить не смогу, мой протеус при двух камнях вешается
мг бы просмотреть програмку но поскольку придется продиратся через код, то пока подождуможет кто то придет и поправит, если нет то придется продиратся
попробуй поставить точку останова в U2 на прием и посмотри доходит ли дело до прерывания?
может где то флаги не сбрасываешь?
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
29.10.2015, 08:51 12
Наверно имелось ввиду ISR(USORT_RXC_vect)
0
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
29.10.2015, 08:55  [ТС] 13
В начале описал все. Это AtmelStudio 6

по поводу прерываний в U2 в до U2 то и не доходит сигнал.

Из U2 уходит в связку MAX487 далее приходит на U3. Там отрабатывают прерывания, обрабатывается пакет и отправляется ответ обратно с U3 на U2 и тут - то трабла. из U3 Выходит как надо, а вот в U2 уже не доходит - затыкается на связке MAX487, причем только в обратном направлении.
0
ValeryS
Модератор
7447 / 5639 / 716
Регистрация: 14.02.2011
Сообщений: 19,211
Завершенные тесты: 1
29.10.2015, 08:56 14
Цитата Сообщение от Calligraff Посмотреть сообщение
Это AtmelStudio 6
пардон, не заметил
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
29.10.2015, 09:00 15
ИМХО: не факт что так оно и есть, Proteus тоже глючит. Я в своё время попадал на такое(не правильная симуляция), после этого Proteus не использую.
ЖЕЛЕЗО НАШЕ ВСЁ!
0
ValeryS
Модератор
7447 / 5639 / 716
Регистрация: 14.02.2011
Сообщений: 19,211
Завершенные тесты: 1
29.10.2015, 09:03 16
Цитата Сообщение от Calligraff Посмотреть сообщение
Выходит как надо, а вот в U2 уже не доходит - затыкается на связке MAX487, причем только в обратном направлении.
я так понял уровни прием/передача нормально переключаются
подключи еще один осциллограф на 1, 4 ножку MAX487 и посмотри пропускает она сигнал или нет
может кстати и протеус косячить
0
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
29.10.2015, 09:12  [ТС] 17
Хм... темный лес какой-то:

подключил на 1 и 4 ножки - сигналы есть.
подключил осцилоскопы параллельно - показывают разные значения.
Отключил вообще осцилоскопы и симуляция вообще отказывается работать.

Неужели действительно проблема в протеусе.

На недели придет отладочная плата. попробую собрать на железе и реальным осцилографом померить, у меня С1-93 СССРовский еще.
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
29.10.2015, 10:34 18
Цитата Сообщение от Calligraff Посмотреть сообщение
Хм... темный лес какой-то:
таки писали же:
Цитата Сообщение от Витальич Посмотреть сообщение
Proteus тоже глючит
Цитата Сообщение от ValeryS Посмотреть сообщение
кстати и протеус косячить
0
raxp
10188 / 6571 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
29.10.2015, 13:47 19
в моей схеме проблема точно не в развязке.
обратите внимание на мой пост еще раз, прочитайте его более внимательно. Про развязку говорил во вторую очередь. Возьмите еще раз три схемы и сравните со своей.
0
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
29.10.2015, 14:09  [ТС] 20
Цитата Сообщение от Витальич Посмотреть сообщение
Наверно имелось ввиду ISR(USORT_RXC_vect)
Есть и то и другое:
ISR(USORT_RXC_vect)
ISR(USORT_TXC_vect) - для выхода из режима передачи после отправки байта. СМ Полный код

Добавлено через 3 минуты
Цитата Сообщение от raxp Посмотреть сообщение
обратите внимание на мой пост еще раз, прочитайте его более внимательно. Про развязку говорил во вторую очередь. Возьмите еще раз три схемы и сравните со своей.
Взял - Смотрю..

подтяжку уже исправил +5 и GND.
сопротивления тоже разные пробовал, но это не та суть..

Пока еще смотрю дальше

Добавлено через 2 минуты
а какую роль в третьей схеме выполняет транзистор "КТ361"

Добавлено через 1 минуту
Все понял. как ключ.. не туда просто посмотрел сначало
0
29.10.2015, 14:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2015, 14:09

Разработка ПО для PIC 16F877, обеспечивающего двухсторонний обмен данными по интерфейсу RS232
на приеме байта зацикливается на двух строках btfss PIR1, RCIF ; ожидание...

Обмен файлами между микроконтроллерами
Здравствуйте, форумчане. Возникла проблема, ломаю голову над ее решением....

Обмен данными между 2 клиентами через интернет
Пожалуйста, подробно опишите, как сделать обмен данных через интернет между...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru