Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/74: Рейтинг темы: голосов - 74, средняя оценка - 4.82
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
1

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток.

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

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

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

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

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

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

Обмен данными между БП и УТ на 1С 8.2 через OLE, ADO
Посоветуйте какие-нибудь статьи, книги, видео уроки по обмену данными между БП и УТ на 1С 8.2 через...

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

Обмен данными между телефонами через интернет
Здравствуйте! Идея заключается вот в чем: я не так давно начал изучать java под android и сейчас...

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


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

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

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


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


Присмотритесь к диффканалу 485-го.
2
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
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
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
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
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
29.10.2015, 07:25 9
на второй картинке +5В - это разные источники, или они замкнуты
на второй нет развязки, это один источник, на третьей должны быть разные, иначе смысла в опторазвязке нет. Но дело не в этом.
0
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, поэтому их и использовал. да и в наличии есть они у меня.
Миниатюры
Обмен данными между МК через RS-485 (MAX487)  
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
29.10.2015, 08:45 11
Цитата Сообщение от Calligraff Посмотреть сообщение
ISR(USORT_TXC_vect) {...}
это какой компилятор?
ни разу не видел такой записи
схему проверить не смогу, мой протеус при двух камнях вешается
мг бы просмотреть програмку но поскольку придется продиратся через код, то пока подождуможет кто то придет и поправит, если нет то придется продиратся
попробуй поставить точку останова в U2 на прием и посмотри доходит ли дело до прерывания?
может где то флаги не сбрасываешь?
0
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
29.10.2015, 08:51 12
Наверно имелось ввиду ISR(USORT_RXC_vect)
0
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
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
29.10.2015, 08:56 14
Цитата Сообщение от Calligraff Посмотреть сообщение
Это AtmelStudio 6
пардон, не заметил
0
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
29.10.2015, 09:00 15
ИМХО: не факт что так оно и есть, Proteus тоже глючит. Я в своё время попадал на такое(не правильная симуляция), после этого Proteus не использую.
ЖЕЛЕЗО НАШЕ ВСЁ!
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
29.10.2015, 09:03 16
Цитата Сообщение от Calligraff Посмотреть сообщение
Выходит как надо, а вот в U2 уже не доходит - затыкается на связке MAX487, причем только в обратном направлении.
я так понял уровни прием/передача нормально переключаются
подключи еще один осциллограф на 1, 4 ножку MAX487 и посмотри пропускает она сигнал или нет
может кстати и протеус косячить
0
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
29.10.2015, 09:12  [ТС] 17
Хм... темный лес какой-то:

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

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

На недели придет отладочная плата. попробую собрать на железе и реальным осцилографом померить, у меня С1-93 СССРовский еще.
0
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
29.10.2015, 10:34 18
Цитата Сообщение от Calligraff Посмотреть сообщение
Хм... темный лес какой-то:
таки писали же:
Цитата Сообщение от Витальич Посмотреть сообщение
Proteus тоже глючит
Цитата Сообщение от ValeryS Посмотреть сообщение
кстати и протеус косячить
0
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
29.10.2015, 13:47 19
в моей схеме проблема точно не в развязке.
обратите внимание на мой пост еще раз, прочитайте его более внимательно. Про развязку говорил во вторую очередь. Возьмите еще раз три схемы и сравните со своей.
0
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.10.2015, 14:09
Помогаю со студенческими работами здесь

Обмен данными через указатель между потоками
Скажите, валидный ли такой код : #include &lt;iostream&gt; #include &lt;thread&gt; using namespace std;...

Обмен данными через COM- соединение между разными конфигурациями
Добрый день! Может быть кто знает в чем может быть причина вот этой проблемы? Есть база 1С...

Обмен данными между программой и сервисом через NamedPipe
Всем доброго времени суток. Друзья, у меня такая проблема: Создаю сервис, на OnExecute создаю...

Обмен данными между процессами через именованные каналы
Добрый день. У меня есть код, который создает 3 процесса-потомка, я пронумеровала каждый из них,...

Обмен данными между формами через нестатические члены
Вопрос выделен из темы Обсуждение FAQ &quot;Ответы на 7 самых частых вопросов по WinForms&quot; ...

Обмен данными между процессами в линуксе через pipe
После закомменчивания части кода записывающей в 1 файл из 2 других программы, она перестала...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru