Полная версия этой страницы:
Пара вопросов по С
_ANDREW
Mar 21 2006, 13:03
Х очется узнать мнение профи по волнующим меня вопросам.ИЗУЧАЮ С, использую 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 и тогда опять глюки.
Имхо,у тебя ошибка,первой должна идти putchar-передача символа,а потом прием.И как ты видишь,
что программа не работает?Я бы посоветовал соединить TX c RX ,а после getchar прикрутить вывод при-
нятого символа на индикатор или в порт.А симулятор при работе с UART плохой помощник.
В языке С не предусматривается присвоение локальной переменной начального значения.
#pragma savereg- применять не нужно, если только прерывание не написано на ассемблере.
defunct
Mar 21 2006, 21:12
> WHALE
Код, с технической стороны у него абсолютно верный, и должен выполнять задумку автора вопроса. Единственной проблемой является то, что функции putchar и getchar надо описать самостоятельно!
Цитата
иногда глобальные переменные помещаются в SRAM и всё ОК. а иногда в R16 и тогда опять глюки.
чтобы не было никаких "загадок" необходимо переменную, которая должна сохранять свое значение между входами в обработчик прерывания объявлять как static...
Цитата(defunct @ Mar 22 2006, 00:12)

> WHALE
Код, с технической стороны у него абсолютно верный, и должен выполнять задумку автора вопроса. Единственной проблемой является то, что функции putchar и getchar надо описать самостоятельно!
Не нужно, в CV они уже есть в stdio.lib. Впрочем, можно написать их самостоятельно или использовать предлагаемые CodeWizard'ом.
TamTam
Mar 22 2006, 00:35
Все должно работать.
Типо совет ---> скачай себе Протеус и будет тебе счастье.
niccom
Mar 22 2006, 10:21
И ещё один вопрос
при входе в прерывание по переполнения таймера0 объявляю переменную типа char её компилятор помещает в R16, а она автоматически равняется одной из глобальных, находящейся в этом же регистре до входа в прерывание при использовании #pragma savereg+, при #pragma savereg-, всё нормально через раз. иногда глобальные переменные помещаются в SRAM и всё ОК. а иногда в R16 и тогда опять глюки.
Если тебе необходимо чтобы переменная была помещена на регистр
объяви ее как register char blabla, компилятор если сможет разместит ее на регистре, но гарантий нет.
Если тебе нужно сохранять ее значение между выходами из прерывания,
то как выше было сказано используй static
static char blabla;
при первом входе в прерывание проинициализируй ее и до конца программы
она будет как бы глобальная но с областью видимости блок твоего прерывания.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.