Помощь в WinAvr
18.11.2010, 14:03
|
|
|
Частый гость
Регистрация: 12.07.2009
Сообщений: 22
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Помощь в WinAvr
Сообщение от Cybermaker
|
|
У вас же в конце мэйна нет бесконечного цикла - вот процессор и бежит до конца памяти, а потом начинает программу сначала.
|
Так он после выполнения ф-ции прерывания должен должен ведь вернуться в цикл(delay()), а не начинать программу сначала.
|
|
|
|
18.11.2010, 14:08
|
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,102
Сказал спасибо: 113
Сказали Спасибо 860 раз(а) в 610 сообщении(ях)
|
Re: Помощь в WinAvr
Сообщение от WartKert
|
|
Так он после выполнения ф-ции прерывания должен должен ведь вернуться в цикл(delay()), а не начинать программу сначала.
|
А где у вас "цикл(delay())" ? Я не вижу там цикла.
|
|
|
|
18.11.2010, 14:13
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
|
Re: Помощь в WinAvr
Я все же для AGAT0365 отпишусь.
По умолчанию printf в ВинАвр выводит символы в поток stderr. Но это поток-пустышка. Там нет реальных функций вывода. В PC обычно вывод идет в консоль, а вот в микроконтроллерах обычно консоли нет. Поэтому если очень хочется выводить именно через printf, то надо такой поток создать - определить реальные функции записи в поток. Пример есть прямо в самом WinAvr- WinAVR\doc\avr-libc\examples\stdiodemo Там вывод через printf в UART.
Но в любом случае лучше не пользоваться прямым выводом из printf, если цель - вывод в UART. Посимвольный вывод идет очень медленно, ведь он основан на поллинге флага готовности UART, а не по прерываниям. Допустим выводим 20 символов при скорости 9600 - это 20 миллисекунд 100% загрузки контроллера. При наличии аппаратного UART! ИМХО это ни куда не годится. Да, кроме функций ввода/вывода в поток нужно еще и аппаратный ресурс инициализировать. Тот же UART например. printf понятия не имеет куда идет вывод и сама ничего не настроит. Типа скорости, бита четности, количества стопбитов. Да и просто включить UART было бы неплохо до вывода в него.
Если уж так нужен форматированный вывод в UART, то есть sprintf. Функция аналогичная printf, но выводит символы в строку по переданному ей указателю. Дальше с этой строкой можно делать что угодно, в том числе и передать по UART, но уже нормально - по прерываниям.
|
|
|
|
18.11.2010, 16:29
|
|
|
Частый гость
Регистрация: 12.07.2009
Сообщений: 22
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Помощь в WinAvr
Сообщение от st_1
|
|
А где у вас "цикл(delay())" ? Я не вижу там цикла.
|
Может я не правильно выразился, но в функции delay(10) есть цикл, где вообще и разрешается прерывания. И условие выхода из цикла, когда переменная cycl ›= 10.
|
|
|
|
18.11.2010, 16:41
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
|
Re: Помощь в WinAvr
Сообщение от WartKert
|
|
И условие выхода из цикла, когда переменная cycl ›= 10.
|
И куда будет выход? 
Добавьте while(1){}; после Вашего цикла. Точнее - после вызова delay(10);
cycl объявлена с volatile?
Запрещать прерывания внутри обработчика не надо - они и так запрещены.
И reti() там тоже не надо делать!
|
|
|
|
18.11.2010, 21:44
|
|
|
Прописка
Регистрация: 17.02.2009
Сообщений: 154
Сказал спасибо: 14
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Помощь в WinAvr
kison я благодарин за такой содержательный ответ. Но я не могу понять почему так сложно, мне надо отправлять на комп двухзначную цифру через COM порт с пареодичностью 5 мин ( спец.вывод TxD). И что такое ИМХО?
|
|
|
|
18.11.2010, 23:02
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
|
Re: Помощь в WinAvr
Сообщение от AGAT0365
|
|
И что такое ИМХО?
|
 Надо же, думал в Рунете это уже все знают.
http://ru.wikipedia.org/wiki/ИМХО
Сообщение от AGAT0365
|
|
мне надо отправлять на комп двухзначную цифру через COM порт с пареодичностью 5 мин
|
Для этого не нужен printf. Опишите задачу подробнее - что за число и в каком виде его надо отправлять. Подскажем как это сделать.
А сложность с printf кажущаяся. Посмотрите все же пример из каталога WinAvr.
|
|
|
|
19.11.2010, 08:30
|
|
|
Вид на жительство
Регистрация: 21.08.2007
Сообщений: 318
Сказал спасибо: 12
Сказали Спасибо 67 раз(а) в 61 сообщении(ях)
|
Re: Помощь в WinAvr
Глянул более внимательно на листинг. Признаюсь - был не прав. Надо думать что тут к чему. Удаление reti не помогло ?
Последний раз редактировалось Cybermaker; 19.11.2010 в 08:38.
|
|
|
|
19.11.2010, 23:37
|
|
|
Вид на жительство
Регистрация: 21.10.2009
Сообщений: 349
Сказал спасибо: 181
Сказали Спасибо 65 раз(а) в 57 сообщении(ях)
|
Re: Помощь в WinAvr
Для того, чтобы заставить работать printf достаточно
(проц Атмега 16, кварц на 11,0592 MHz)
|
Код:
|
// cpu: ATMega16
// speed: 11.0592 MHz
#include ‹stdio.h›
#include ‹avr/io.h›
//Подготовка UART
static int uart_putchar(char c, FILE *stream);
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,_FDEV_SETUP_WRITE);
static int uart_putchar(char c, FILE *stream)
{
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c;
return 0;
} |
В main выполнить выполнить инициализацию СОМ порта
|
Код:
|
// usart '0'
// settings: 57600 8-n-1
UCSRA = 0;
UCSRB = (1‹‹TXEN);
UCSRC = (1‹‹URSEL)|(1‹‹UCSZ1)|(1‹‹UCSZ0);
UBRRH = 0;
UBRRL = 11; |
и уже можете использовать printf
|
Код:
|
printf("Hello, world!"]); |
|
|
|
|
Эти 2 пользователя(ей) сказали Спасибо CodeNameHawk за это сообщение:
|
|
|
20.11.2010, 02:22
|
|
|
Частый гость
Регистрация: 12.07.2009
Сообщений: 22
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Помощь в WinAvr
Сообщение от Cybermaker
|
|
Удаление reti не помогло ?
|
Помогло вместе с добавлением While(1). Кстате если можете, объясните тогда что reti() делает? И возможно ли в #define такое написание? А то что-то у меня условие всегда выполняется, хотя вроде бы не должно.
|
Цитата:
|
#define Knopka1 PINB=PINB & 0x01 //PB0
void main(){
DDRB=0x00;
PORTB=0xE7;
while(1){
if (Knopka1==0)
{
OCR0A=speed;
}
}
}
|
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:54.
|
|