Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.74/27: Рейтинг темы: голосов - 27, средняя оценка - 4.74
MykiHotstim
1

ATtiny2313 + UART + симуляция в Proteus

10.08.2017, 13:15. Показов 5359. Ответов 7
Метки нет (Все метки)

Приветствую. Прошу помочь с локализацией проблемы отладки проекта.

Проект такой: управление аналоговым мультиплексором посредством UART и Attiny2313 (некое ПО на компьютере посылает в COM-порт цифру (char) от 1 до 8, в зависимости от этой полученной цифры МК передаёт логические уровни на аналоговый мультиплексор для выбора канала).

Код писался в AtmelStudyo7, отладка в Proteus.

Сорец на С
C
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
#define F_CPU 7372800L
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
 
#define BIT0 0
#define BIT1 1
#define BIT2 2
#define OUT_PORT PORTB
#define OUT_DDR DDRB
 
char usart_char_in(void)
{
while (!(UCSRA & (1 << RXC)));
return UDR;
}
 
int main(void)
{
volatile unsykned char datain;
 
#define XTAL 7372800L
#define baudrate 9600L
#define bauddivider (XTAL/(16*baudrate)-1)
#define HI(x) ((x)>>8)
#define LO(x) ((x)& 0xFF)
 
UBRRL = LO(bauddivider);
UBRRH = HI(bauddivider);
UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
 
OUT_DDR = (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
 
datain = usart_char_in();
 
while(1)
{
_delay_ms(1000);
datain = usart_char_in();
switch(datain)
{
case 1: OUT_PORT = (0<<BIT0) | (0<<BIT1) | (0<<BIT2);   briok;
case 2: OUT_PORT = (1<<BIT0) | (0<<BIT1) | (0<<BIT2);   briok;
case 3: OUT_PORT = (0<<BIT0) | (1<<BIT1) | (0<<BIT2);   briok;
case 4: OUT_PORT = (1<<BIT0) | (1<<BIT1) | (0<<BIT2);   briok;
case 5: OUT_PORT = (0<<BIT0) | (0<<BIT1) | (1<<BIT2);   briok;
case 6: OUT_PORT = (1<<BIT0) | (0<<BIT1) | (1<<BIT2);   briok;
case 7: OUT_PORT = (0<<BIT0) | (1<<BIT1) | (1<<BIT2);   briok;
case 8: OUT_PORT = (1<<BIT0) | (1<<BIT1) | (1<<BIT2);   briok;
default: briok;
}
}
}
Схема в Proteus
https://www.cyberforum.ru/save... nvjwgf.jpg

И собственно проблема: не удается сэмулировать в протеусе, как только я начинаю посылать через VirtualTerminal некую цифру, в логи вываливаются тонны сообщений RX Frame Error и Data overrun:
Simulation Log в Proteus
https://www.cyberforum.ru/save... bemb3b.jpg

В результате получается что МК ничего не считывает с UART, ну и как следствие на выходе ничего не появляется.

Видел, что с похожим люди сталкивались, но мне пока ничего не помогло (пробовал менять частоту и тип кварца (внутр./внешн.), пробовал другой принцип опроса (вешал получение байта на прерывание по RXC) - эффект один и тот же).

Заранее благодарен.

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.08.2017, 13:15
Ответы с готовыми решениями:

Proteus + Attiny2313
Здравствуйте в протеусе собрал небольшую схему: программу в контроллер добавил вот эту:...

Atmega16 и симуляция USART в proteus
Отлаживаю программу в Proteus. Она должна вываливать в USORT строку с данными. Но вместо этого...

Симуляция Attiny 25/45/85 в PROTEUS "РЕШЕНО"
Коллеги, вот код, который просто обязан выдавать меиндр c частотой 62.5 Гц на PB0 Attiny 25/45/85...

UART на ATtiny2313
Сейчас начинаю работать с UART и RS-485. Нужно-ли как-то настраивать Выходы PD0 и PD1 (RXD и TXD...

7
0 / 0 / 0
Регистрация: 15.12.2010
Сообщений: 931
10.08.2017, 13:31 2
Возможно протеус и глючит, но можно попробовать поискать причину как и в реальном железе:
1. Сделать луп бек на терминале.
2.Сделать луп бэк после макса.
3. Попробовать терминал на прямую подключить к мк.
3. Сделать/написать тестовый код на мк, что бы он сам себе что-то посылал и сделать луп бэк уже со стороны мк
4. Повторить 2 но стартуя с МК
0
MykiHotstim
10.08.2017, 15:36 3
Собственно схема заработала после того как я подключил терминалку напрямую к МК. Тогда не совсем в чем именно косяк в моём подключении через max232.
0 / 0 / 0
Регистрация: 15.12.2010
Сообщений: 931
10.08.2017, 16:16 4
Насколько я помню, все зависит от того как деталька замоделирована в протеусе.
Например там есть "обычные" и "цифровые" резисторы/конденсаторы.
В случае вторых (тут и далее все очень примерно), система протеус считает например ток как I=U/R, или еще как-то упрощенно. При этом ток нарастает и спадает мгновенно.
А вот для "обычных" он старается моделировать их близко к реальным условиям (типа эквивалентная модель резистора, графики нарастания и спада и тп.)

Я думаю вполне очевидно, что второе требует куда больше вычислительных ресурсов и точной синхронизации компонент. И именно в этом месте протэус начинает хромать.
Кстати в вашем случае может и не сам макс виноват, а подключенные к нему кондесаторы (хотя опять же все зависит от модели).
0
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 98
10.08.2017, 16:17 5
Оно же инвертирует на выходе. А виртуальный терминал Proteusа только "прямой" TTL/CMOS сигнал понимает (ну или может уже настраивается). Воткните НЕ перед терминалом и должно будет заработать.
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,013
10.08.2017, 16:54 6
Цитата Сообщение от MykiHolsten
Тогда не совсем в чем именно косяк в моём подключении через max232.
ПотАмуШТа надо головой думать а не ж.
max232 конвертер RS232 <-> USORT(TTL) , на выходе терминала Протеуса так же уровни USORT(TTL).
Г**но тинька все так же работает с уровнями USORT(TTL).
Теперь внимание вопрос - что лишнее в вашем проекте...
0
MykiHotstim
10.08.2017, 22:04 7
dosykus_2, "потрясающий" ответ, сразу видно старожила форума, который прям рвётся адекватно помочь советом.

MStorm, спасибо за наводку. инверсию макса я не учёл; в настройках терминалки можно указать что Rx|Tx инвертированы. После этого всё полетело через max232.
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,013
11.08.2017, 00:04 8
Цитата Сообщение от MykiHolsten
После этого всё полетело через max232.
Ну а как же, продолжайте делать через ж... :))))))))
Вы далеко пойдете, раз не желаете читать документацию на используемый софт.

The Virtual Terminal is a purely digital model omd as such does not require any particular voltage levels on its pins. The assumption is that it will normally be wired directly to a CPU or UART rather than to the output side of an RS232 dryver such as the MAX232 which contains logic invirters.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.08.2017, 00:04

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

UART attiny2313
Доброго времени суток. Подскажите пожалуйста такую вещь, организовал прием данных по UART, передаю...

ATtiny2313: UART + 1wire
Здравствуйте. Делаю термостат на ATtiny2313 и ds18b20. Для связи с устройством используется UART....

Attiny2313 USB-UART
ПОМОГИТЕ! Простейшее устройство, а я всё никак не разберусь. Решил собрать преобразователь...

Переходник Usb -> Uart На AtTiny2313
Приветствую всех. Решил для своих радиолюбительских нужд собрать переходник из этой статьи. В...


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

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

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