Кодировка ASCII в Usart Atmega8

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Встал на лапы
Аватара пользователя
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Сообщение boobonick »

Здравствуйте! Вот пытаюсь разобраться с USART, но есть вопрос:
я передаю на virtual terminal proteus'а printf("2") - в терминале пишет "s", printf("1") - пишет "ч". Но смотрю в аски таблицу и как-то не совпадает это все, подскажите,пожалуйста, а как это все возможно наладить и правильно ли это все отображается у меня? :?



#include <mega8>

#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 100
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

// Standard Input/Output functions
#include <stdio>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// 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=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x06;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")
printf("2");
while (1)
{
// Place your code here

};
}
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

А putchar() нормально работает? Попробуйте. Если вам надо символ по коду аски, или просто символ вывести - то путчар надо использовать.
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 534
Зарегистрирован: Пн янв 16, 2006 08:00:17
Откуда: Иркутск

Сообщение Mamonth »

Сделайте вывод в цикле, пусть напечатает раз десять. Первый байт может быть косячный из-за питания или линии связи... Проверьте что скорости на терминале и в МК совпадают.
У протеуса тоже косяков может быть навалом.
Today fine night...
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Сообщение kalobyte »

в 7.5 сп3 такие же глюки с терминалом на меге8
в железе все работает
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Аватара пользователя
Сообщения: 219
Зарегистрирован: Вт сен 18, 2007 16:41:16
Откуда: Украина, г. Запорожье

Сообщение alex2103 »

Я всякие терминалы в протеусе отлаживаю. Глюков не замечено ниразу. Очень часто еще COMPIN + виртуальный ком-порт пользую и прикладное ПО работает по терминалу с отлаживаемым устройством в Протеусе...
Контактная информация:
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 219
Зарегистрирован: Вт сен 18, 2007 16:41:16
Откуда: Украина, г. Запорожье

Сообщение alex2103 »

на какой частоте мега8 работает?
скорее всего либо в протеусе неправильно задано тактирование, либо в виртуалтерминале скорость неправильно выставлена, либо в меге уарт сконфигурирован на 9600 при тактовой 1мгц = большая ошибка.
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Сообщение boobonick »

BCluster писал(а):А putchar() нормально работает? Попробуйте. Если вам надо символ по коду аски, или просто символ вывести - то путчар надо использовать.
Использую putchar() и все равно кваказябры получаются какие-то.
Встал на лапы
Аватара пользователя
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Сообщение boobonick »

alex2103 писал(а):на какой частоте мега8 работает?
скорее всего либо в протеусе неправильно задано тактирование, либо в виртуалтерминале скорость неправильно выставлена, либо в меге уарт сконфигурирован на 9600 при тактовой 1мгц = большая ошибка.


Да, МК в codevision настроен на 1Мгц, попробовал переделать на 4Мгц, ошибка снизилась до 0.2% и
занес 4МГц в строку Clock frequency протеуса, посмотрел терминал - там 9600бит/c - все равно квакозябры. А вот по поводу TOSC frequency, там надо изменять что-нибудь?
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

А если putchar(0x32) вывести что будет?)
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Сообщение boobonick »

Ой :oops: надо было сразу схемку выложить, сдается max232 во всем виноват, без него все правильно заработало. Может я не правильно подключил? Хотя все из хелпа протеуса скопировал.
Вложения
uart.JPG
uart
(164.39 КБ) 823 скачивания
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина

Сообщение Krik99 »

Дык в протеусе если подключаеш виртуальный терминал, там MAX232 и не нужна, всё на прямую. :) И compim подключать ненужно, так как это реальный порт ПК.
Изображение
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 586
Зарегистрирован: Ср мар 07, 2007 22:58:02
Откуда: Черкассы, Украина

Сообщение Negor »

Там приколы с полярностью в самом терминале. Я тоже долго мучался. В настройках терминала поэксперементируй.
There is only 10 kind of people: those who understands binary code and those who dont!!!
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Сообщение boobonick »

Negor писал(а):Там приколы с полярностью в самом терминале. Я тоже долго мучался. В настройках терминала поэксперементируй.

Да,действительно, установил в свойствах терминала inverted и все заработало
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»