CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Avarges
Вымогатель припоя
Сообщения: 512
Зарегистрирован: Вт дек 22, 2009 02:24:50
Контактная информация:

Сообщение Avarges »

Как на cvavr написать такой момент чтобы по окончанию обработчика прерывания int1 программа возвращалась не в ту точку main откуда она прервалась, а в указанную точку внутри main программы.
Иными словами, есть какой-нибудь глобальный goto, jump или что-то такое в cvavr?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Avarges писал(а):Как на cvavr написать такой момент чтобы по окончанию обработчика прерывания int1 программа возвращалась не в ту точку main откуда она прервалась, а в указанную точку внутри main программы.
Иными словами, есть какой-нибудь глобальный goto, jump или что-то такое в cvavr?
такая возможность есть, но надо быть крепко выпимши, чтобы придумать такое поведение программы! (это я мягко выражаюсь, если кто не понял).

сразу забудьте про эту идею! и никогда-никогда к ней не возвращайтесь!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Avarges
Вымогатель припоя
Сообщения: 512
Зарегистрирован: Вт дек 22, 2009 02:24:50
Контактная информация:

Сообщение Avarges »

И так понятно что с точки зрения программирования это не хорошо, но лучше бы написали (если знаете ;) ) ответ на вопрос.

Зачем мне это надо: в main процедуре я вызываю usart_receive и она ждёт входные данные и так она и ждёт пока данных нет, а тут происходит int1 который нужно немедленно обработать, естественно при входе в обработчик прерывания можно отключить usart, а в конце включить, только мне не понятно: int1 ведь вернёт управление куда-то в usart_receive и что дальше будет мне совершенно непонятно, поэтому хотелось бы просто начинать usart_receive с начала, потому что получать частичные/ошибочные данные из usart_receive крайне нежелательно.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

с точки зрения программирования это не "не очень хорошо", а просто отвратительно! потому я, хоть и знаю, не буду рассказывать, как это сделать!

а вот как сделать правильно - расскажу.
во-первых, что вас смущает? пусть uart_resive ждет себе, пусть поступает и обрабатывается прерывание - в чем проблема? прерывания для того и предназначены, чтобы прерывать течение основной программы!
во-вторых, внутри обработчика прерывания для чего вы собираетесь отключать UART?! с какой-такой целью? чтобы поиметь побольше логических ошибок и потом с потом и кровью их отлавливать? не надо этого делать.

будьте проще, и люди к вам потянутся :))) то есть не люди, а байты (по USART) :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Avarges
Вымогатель припоя
Сообщения: 512
Зарегистрирован: Вт дек 22, 2009 02:24:50
Контактная информация:

Сообщение Avarges »

Хорошо, допустим вот этой функцией я принимаю:

Код: Выделить всё

unsigned char USART_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
;
/* Get and return received data from buffer */
return UDR;
}


и вот случилось такое: функция уже приняла 4 бита от всего пакета (8 бит) и в этот момент происходит int1, который обрабатывается долго. Что произойдёт с остальными четырьмя непринятыми битами, они примутся тоже или они потреяются и что вернёт
"return UDR;" когда прерывание отработает и вернёт управление внутрь USART_Receive?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

во-первых, любое прерывания обязано обрабатываться быстро. если оно у вас обрабатывается долго - это скорее всего указывает на неправльное построение алгоритма.

прием битов ведется аппаратно, при этом скорость работы USART (ну, пожалуй, максимум 115200 бит/сек) как минимум в 10 раз ниже скорости работы самого МК (ядра), с учетом того, что байт передается фактически минимум 10-ю битами, то времени достаточно для быстрой обработки прерывания. а если учесть, что во многих МК имеется USART (а не просто UART), который сможет принять второй байт без потери первого - времени вообще вагон!

так что не надо ничего бояться, ничего плохого с вашим UDR не произойдет. а вот если вы "остановите" UART - то наверняка повредите не до конца принятый байт.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

Сообщение ValBag »

ARV писал(а):...во многих МК имеется USART (а не просто UART), который сможет принять второй байт без потери первого...
Можно добавить, что сдвиговый регистр, может служить буфером для третьего байта.
Аватара пользователя
Avarges
Вымогатель припоя
Сообщения: 512
Зарегистрирован: Вт дек 22, 2009 02:24:50
Контактная информация:

Сообщение Avarges »

Хотел свою первую прошивку коряво написанную по быстрому доделать, а теперь получается что надо по всем канонам научно-фантастического программирования всю структуру программы переделывать и тебе прерывание по быстрому обрабатывать и longjmp (так ведь ;) ?) не использовать. Чего то в си замудроенный какой-то этот вариант setjmp, longjmp, и правда не тянет им пользоваться. Эх, дайте мне двойной ассемблер :beer:
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Avarges писал(а):Хотел свою первую прошивку коряво написанную по быстрому доделать, а теперь получается что надо по всем канонам научно-фантастического программирования всю структуру программы переделывать и тебе прерывание по быстрому обрабатывать и longjmp (так ведь ;) ?) не использовать. Чего то в си замудроенный какой-то этот вариант setjmp, longjmp, и правда не тянет им пользоваться. Эх, дайте мне двойной ассемблер :beer:
да у вас там и структуры нет никакой - тяп-ляп-лишьбыкак.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Avarges
Вымогатель припоя
Сообщения: 512
Зарегистрирован: Вт дек 22, 2009 02:24:50
Контактная информация:

Сообщение Avarges »

ARV писал(а):да у вас там и структуры нет никакой - тяп-ляп-лишьбыкак.

Так про то и речь :))
andre_74
Родился
Сообщения: 13
Зарегистрирован: Чт окт 08, 2009 18:53:17

Сообщение andre_74 »

Доброго времени суток :) Не пойму в чем дело: сделал переходник на виртуальный ком порт на ft232rl, соединил - передает, но! Взять к примеру простую процедуру - то, что принял от компа отправляет обратно в комп. Ответ от МК отображается кракозяброй, йероглифами. МК - atmega16. Что может быть?
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

andre_74 писал(а):... Что может быть?

Диагностика обычна для ком-порта:
1. Проверить переходник с помощью ЭХА - соединить на выходе переходника RX и TX и добиться возвращения отправленного символа.
2. Выяснить точно на какой тактовой частоте работает микроконтроллер и проверить установку битовой скорости (baud-rate) и формата кадра (кол-во бит, четность).
3. ПОСЛЕ проверки переходника и выяснения тактовой частоты, попробовать написать минимальный исходник (только инициализация и эхо).
4. Если ничего не получается выложить исходник сюда, при этом указав от чего тактируется контроллер и собственно тактовую частоту.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

ARV, Проект отсюда http://hardlock.org.ua/mc/tiny/termostat_v2/index.html
На старой версии (1.29) CVAVR собирается ошибок нет.
На новой 2.04.4a не видит глобальных переменных из функций обьявленных в внешнем файле , при компиляции ругается - что они не определены.

С AVR'ками мало общаюсь , тем более с компиляторами...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

dosikus писал(а):ARV, Проект отсюда http://hardlock.org.ua/mc/tiny/termostat_v2/index.html
На старой версии (1.29) CVAVR собирается ошибок нет.
На новой 2.04.4a не видит глобальных переменных из функций обьявленных в внешнем файле , при компиляции ругается - что они не определены.

С AVR'ками мало общаюсь , тем более с компиляторами...
а при чем тут я? проект не мой, с CVAVR я стараюсь никаких дел не иметь...
термостат свой собственный сделал на WinAVR :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

ARV, Извиняюсь - смотрел по твоей активности здесь.
По твоему термостату вопросов нет, думаю и не будет - все пашет ,крутится, мигает ...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

dosikus писал(а):ARV, Извиняюсь - смотрел по твоей активности здесь.
По твоему термостату вопросов нет, думаю и не будет - все пашет ,крутится, мигает ...
моя активность ограничена общими вопросами по языку Си, которых в этой теме большинство. конкретно CVAVR я не занимаюсь...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
L-29
Открыл глаза
Сообщения: 67
Зарегистрирован: Сб янв 23, 2010 00:52:27

Сообщение L-29 »

При чтении FLASH из МК сохраняется в буфер. Подскажите, где этот буфер в CodeVisionAVR, где .hex искать?
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Сообщение AI_Disable »

После чтения жмите File -> Save FLASH и сохраняйте прочитанный hex куда вам угодно.
Аватара пользователя
ssvd
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Ср ноя 04, 2009 18:00:56
Откуда: Алтайский край
Контактная информация:

Сообщение ssvd »

вот не могу понять где косяк! может кто увидит...
В реальности, если к схеме подключен 1датчик, то все нормально, а если 2 датчика, то показывается всякая фигня....
Если тоже самое делаю в Proteus, то там фигня постоянно показывается...
Уже все передумал, не могу понять..
Подскажите....
Вложения
termometr2dLED.rar
(93.72 КБ) 203 скачивания
Аватара пользователя
ssvd
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Ср ноя 04, 2009 18:00:56
Откуда: Алтайский край
Контактная информация:

Сообщение ssvd »

что никто и не поможет? :(
Ответить

Вернуться в «AVR»