реклама на сайте
подробности

 
 
> Пара вопросов по С
_ANDREW
сообщение Mar 21 2006, 13:03
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 14-03-06
Пользователь №: 15 223



Х очется узнать мнение профи по волнующим меня вопросам.ИЗУЧАЮ С, использую codevision+avrstudio. В helpе к компилятору нашёл пару примеров стандартного сишного ввода вывода а конкретно функции putchar и getchar. они должны якобы работать с UARTом. вот прмер, но эти функции не работают.Подскажите почему??????????
********************************************************************
#include <90s8515.h>
#include

/* quartz crystal frequency [Hz] */
#define xtal 4000000L

/* Baud rate */
#define baud 9600

void main(void) {
char k;

/* initialize the UART's baud rate */
UBRR=xtal/16/baud-1;

/* initialize the UART control register
RX & TX enabled, no interrupts, 8 data bits */
UCR=0x18;

while (1) {
/* receive the character */
k=getchar();
/* and echo it back */
putchar(k);
};
}

И ещё один вопрос
при входе в прерывание по переполнения таймера0 объявляю переменную типа char её компилятор помещает в R16, а она автоматически равняется одной из глобальных, находящейся в этом же регистре до входа в прерывание при использовании #pragma savereg+, при #pragma savereg-, всё нормально через раз. иногда глобальные переменные помещаются в SRAM и всё ОК. а иногда в R16 и тогда опять глюки.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
WHALE
сообщение Mar 21 2006, 17:45
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Имхо,у тебя ошибка,первой должна идти putchar-передача символа,а потом прием.И как ты видишь,
что программа не работает?Я бы посоветовал соединить TX c RX ,а после getchar прикрутить вывод при-
нятого символа на индикатор или в порт.А симулятор при работе с UART плохой помощник.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
vet
сообщение Mar 21 2006, 19:43
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



В языке С не предусматривается присвоение локальной переменной начального значения.
#pragma savereg- применять не нужно, если только прерывание не написано на ассемблере.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 21 2006, 21:12
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



> WHALE
Код, с технической стороны у него абсолютно верный, и должен выполнять задумку автора вопроса. Единственной проблемой является то, что функции putchar и getchar надо описать самостоятельно!

Цитата
иногда глобальные переменные помещаются в SRAM и всё ОК. а иногда в R16 и тогда опять глюки.
чтобы не было никаких "загадок" необходимо переменную, которая должна сохранять свое значение между входами в обработчик прерывания объявлять как static...
Go to the top of the page
 
+Quote Post
vet
сообщение Mar 21 2006, 22:41
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Цитата(defunct @ Mar 22 2006, 00:12) *
> WHALE
Код, с технической стороны у него абсолютно верный, и должен выполнять задумку автора вопроса. Единственной проблемой является то, что функции putchar и getchar надо описать самостоятельно!

Не нужно, в CV они уже есть в stdio.lib. Впрочем, можно написать их самостоятельно или использовать предлагаемые CodeWizard'ом.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
TamTam
сообщение Mar 22 2006, 00:35
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254



Все должно работать.
Типо совет ---> скачай себе Протеус и будет тебе счастье.
Go to the top of the page
 
+Quote Post
niccom
сообщение Mar 22 2006, 10:21
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 9-06-05
Пользователь №: 5 868



И ещё один вопрос
при входе в прерывание по переполнения таймера0 объявляю переменную типа char её компилятор помещает в R16, а она автоматически равняется одной из глобальных, находящейся в этом же регистре до входа в прерывание при использовании #pragma savereg+, при #pragma savereg-, всё нормально через раз. иногда глобальные переменные помещаются в SRAM и всё ОК. а иногда в R16 и тогда опять глюки.

Если тебе необходимо чтобы переменная была помещена на регистр
объяви ее как register char blabla, компилятор если сможет разместит ее на регистре, но гарантий нет.
Если тебе нужно сохранять ее значение между выходами из прерывания,
то как выше было сказано используй static
static char blabla;
при первом входе в прерывание проинициализируй ее и до конца программы
она будет как бы глобальная но с областью видимости блок твоего прерывания.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 15:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01453 секунд с 7
ELECTRONIX ©2004-2016