Добрый день!
Проблема, похоже в схеме, а не с ПО и не с протоколом, так что тему создал в этом разделе, а не в разделе "Интеграция с ПК".
Надо передавать данные на МК atmega16 через COM порт компьютера(!!!
USB НЕ ПРЕДЛАГАТЬ, надо именно через COM)
Вот схема и код WinAVR:

Код:
#define FOSC 4000000UL //
#define F_CPU FOSC
#define BAUD 9600L //Скорость порта
#define UBRRVAL FOSC/16/BAUD-1
#include <avr/io.h>
#include <avr/iom16.h>
#include <util/delay.h>
#include <stdio.h>
#include <avr/interrupt.h>
int counter = 0; //счётчик для изменения режима
void USART_Transmit( unsigned char data )
{
while (!(UCSRA&(1<<UDRE))){}; //wait for empty transmit buffer
UDR=data ; //send number to USART
}
void writeBr()
{
USART_Transmit(0x0d);//переход в начало строки
USART_Transmit(0x0a);//переход на новую строку
}
void writeInputPrompt()
{
writeBr();
USART_Transmit('m');
USART_Transmit('2');
USART_Transmit(0x20);
USART_Transmit(0x23);
USART_Transmit(0x3a);
USART_Transmit(0x20);
}
ISR(USART_RXC_vect)
{
cli();
int b;
b = UDR;
USART_Transmit(0x20);
USART_Transmit('-');
USART_Transmit(0x20);
USART_Transmit(b+1); //следующий символ
if (--counter > 0)
writeInputPrompt();
else
writeBr();
sei();
}
int main(void)
{
//Set baud rate
UBRRL=UBRRVAL; //low byte
UBRRH = (unsigned char)(UBRRVAL>>8); //hi byte
//Set data frame format: asynchronous mode,no parity, 1 stop bit, 8 bit size
UCSRC=(1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|
(0<<USBS)|(0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0);
//Enable Transmitter and Receiver
UCSRB=(1<<RXEN)|(1<<TXEN);
UCSRB |= (1<<RXCIE); //разрешениепрерывания по завершению приема
while(1)
{
while (counter < 3)
{
USART_Transmit('m');
USART_Transmit('1');
USART_Transmit(0x20);
_delay_ms(1500); //long delay
counter++;
}
writeInputPrompt();
sei();
while (counter > 0)
{
}
cli();
}
return 0;
}
Проект во вложении.
Проблема: при моделировании в Proteus на COM порт выдаются и принимаются искажённые данные.
До max232 на терминале VT1 всё выглядит отлично. На VT2 и в программу, подключённую к COM порту, выдаются искажённые данные(одинаковые и на VT2 и в программе). В даташите max232 про конденсаторы написано, что должны быть 1,0μF, как понимаю это 1x10[sup]-6[/sup]F или 1000х10[sup]-9[/sup]F. Хотя не заметил, чтобы протеус менял результаты при изменении емкости конденсаторов.
Подскажите в чём ошибка.
P.S. К COM порту подключаю программу Terminal v1.6b(
ссылка)
P.P.S. Порты к которым подключены протеус и терминал должны быть соединены нуль-модемным кабелем. Использую виртуальные, созданные com0com v2.2.2.0(
ссылка).