CodeVision AVR в вопросах и ответах
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
такая возможность есть, но надо быть крепко выпимши, чтобы придумать такое поведение программы! (это я мягко выражаюсь, если кто не понял).Avarges писал(а):Как на cvavr написать такой момент чтобы по окончанию обработчика прерывания int1 программа возвращалась не в ту точку main откуда она прервалась, а в указанную точку внутри main программы.
Иными словами, есть какой-нибудь глобальный goto, jump или что-то такое в cvavr?
сразу забудьте про эту идею! и никогда-никогда к ней не возвращайтесь!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Avarges
- Вымогатель припоя
- Сообщения: 512
- Зарегистрирован: Вт дек 22, 2009 02:24:50
- Контактная информация:
И так понятно что с точки зрения программирования это не хорошо, но лучше бы написали (если знаете
) ответ на вопрос.
Зачем мне это надо: в main процедуре я вызываю usart_receive и она ждёт входные данные и так она и ждёт пока данных нет, а тут происходит int1 который нужно немедленно обработать, естественно при входе в обработчик прерывания можно отключить usart, а в конце включить, только мне не понятно: int1 ведь вернёт управление куда-то в usart_receive и что дальше будет мне совершенно непонятно, поэтому хотелось бы просто начинать usart_receive с начала, потому что получать частичные/ошибочные данные из usart_receive крайне нежелательно.
Зачем мне это надо: в main процедуре я вызываю usart_receive и она ждёт входные данные и так она и ждёт пока данных нет, а тут происходит int1 который нужно немедленно обработать, естественно при входе в обработчик прерывания можно отключить usart, а в конце включить, только мне не понятно: int1 ведь вернёт управление куда-то в usart_receive и что дальше будет мне совершенно непонятно, поэтому хотелось бы просто начинать usart_receive с начала, потому что получать частичные/ошибочные данные из usart_receive крайне нежелательно.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
с точки зрения программирования это не "не очень хорошо", а просто отвратительно! потому я, хоть и знаю, не буду рассказывать, как это сделать!
а вот как сделать правильно - расскажу.
во-первых, что вас смущает? пусть uart_resive ждет себе, пусть поступает и обрабатывается прерывание - в чем проблема? прерывания для того и предназначены, чтобы прерывать течение основной программы!
во-вторых, внутри обработчика прерывания для чего вы собираетесь отключать UART?! с какой-такой целью? чтобы поиметь побольше логических ошибок и потом с потом и кровью их отлавливать? не надо этого делать.
будьте проще, и люди к вам потянутся
то есть не люди, а байты (по USART) 
а вот как сделать правильно - расскажу.
во-первых, что вас смущает? пусть uart_resive ждет себе, пусть поступает и обрабатывается прерывание - в чем проблема? прерывания для того и предназначены, чтобы прерывать течение основной программы!
во-вторых, внутри обработчика прерывания для чего вы собираетесь отключать UART?! с какой-такой целью? чтобы поиметь побольше логических ошибок и потом с потом и кровью их отлавливать? не надо этого делать.
будьте проще, и люди к вам потянутся
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Avarges
- Вымогатель припоя
- Сообщения: 512
- Зарегистрирован: Вт дек 22, 2009 02:24:50
- Контактная информация:
Хорошо, допустим вот этой функцией я принимаю:
и вот случилось такое: функция уже приняла 4 бита от всего пакета (8 бит) и в этот момент происходит int1, который обрабатывается долго. Что произойдёт с остальными четырьмя непринятыми битами, они примутся тоже или они потреяются и что вернёт
"return UDR;" когда прерывание отработает и вернёт управление внутрь USART_Receive?
Код: Выделить всё
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
- Откуда: Новочеркасск
- Контактная информация:
во-первых, любое прерывания обязано обрабатываться быстро. если оно у вас обрабатывается долго - это скорее всего указывает на неправльное построение алгоритма.
прием битов ведется аппаратно, при этом скорость работы USART (ну, пожалуй, максимум 115200 бит/сек) как минимум в 10 раз ниже скорости работы самого МК (ядра), с учетом того, что байт передается фактически минимум 10-ю битами, то времени достаточно для быстрой обработки прерывания. а если учесть, что во многих МК имеется USART (а не просто UART), который сможет принять второй байт без потери первого - времени вообще вагон!
так что не надо ничего бояться, ничего плохого с вашим UDR не произойдет. а вот если вы "остановите" UART - то наверняка повредите не до конца принятый байт.
прием битов ведется аппаратно, при этом скорость работы USART (ну, пожалуй, максимум 115200 бит/сек) как минимум в 10 раз ниже скорости работы самого МК (ядра), с учетом того, что байт передается фактически минимум 10-ю битами, то времени достаточно для быстрой обработки прерывания. а если учесть, что во многих МК имеется USART (а не просто UART), который сможет принять второй байт без потери первого - времени вообще вагон!
так что не надо ничего бояться, ничего плохого с вашим UDR не произойдет. а вот если вы "остановите" UART - то наверняка повредите не до конца принятый байт.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Avarges
- Вымогатель припоя
- Сообщения: 512
- Зарегистрирован: Вт дек 22, 2009 02:24:50
- Контактная информация:
Хотел свою первую прошивку коряво написанную по быстрому доделать, а теперь получается что надо по всем канонам научно-фантастического программирования всю структуру программы переделывать и тебе прерывание по быстрому обрабатывать и longjmp (так ведь
?) не использовать. Чего то в си замудроенный какой-то этот вариант setjmp, longjmp, и правда не тянет им пользоваться. Эх, дайте мне двойной ассемблер 

- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
да у вас там и структуры нет никакой - тяп-ляп-лишьбыкак.Avarges писал(а):Хотел свою первую прошивку коряво написанную по быстрому доделать, а теперь получается что надо по всем канонам научно-фантастического программирования всю структуру программы переделывать и тебе прерывание по быстрому обрабатывать и longjmp (так ведь?) не использовать. Чего то в си замудроенный какой-то этот вариант setjmp, longjmp, и правда не тянет им пользоваться. Эх, дайте мне двойной ассемблер
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
andre_74 писал(а):... Что может быть?
Диагностика обычна для ком-порта:
1. Проверить переходник с помощью ЭХА - соединить на выходе переходника RX и TX и добиться возвращения отправленного символа.
2. Выяснить точно на какой тактовой частоте работает микроконтроллер и проверить установку битовой скорости (baud-rate) и формата кадра (кол-во бит, четность).
3. ПОСЛЕ проверки переходника и выяснения тактовой частоты, попробовать написать минимальный исходник (только инициализация и эхо).
4. Если ничего не получается выложить исходник сюда, при этом указав от чего тактируется контроллер и собственно тактовую частоту.
ARV, Проект отсюда http://hardlock.org.ua/mc/tiny/termostat_v2/index.html
На старой версии (1.29) CVAVR собирается ошибок нет.
На новой 2.04.4a не видит глобальных переменных из функций обьявленных в внешнем файле , при компиляции ругается - что они не определены.
С AVR'ками мало общаюсь , тем более с компиляторами...
На старой версии (1.29) CVAVR собирается ошибок нет.
На новой 2.04.4a не видит глобальных переменных из функций обьявленных в внешнем файле , при компиляции ругается - что они не определены.
С AVR'ками мало общаюсь , тем более с компиляторами...
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
а при чем тут я? проект не мой, с CVAVR я стараюсь никаких дел не иметь...dosikus писал(а):ARV, Проект отсюда http://hardlock.org.ua/mc/tiny/termostat_v2/index.html
На старой версии (1.29) CVAVR собирается ошибок нет.
На новой 2.04.4a не видит глобальных переменных из функций обьявленных в внешнем файле , при компиляции ругается - что они не определены.
С AVR'ками мало общаюсь , тем более с компиляторами...
термостат свой собственный сделал на WinAVR
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
моя активность ограничена общими вопросами по языку Си, которых в этой теме большинство. конкретно CVAVR я не занимаюсь...dosikus писал(а):ARV, Извиняюсь - смотрел по твоей активности здесь.
По твоему термостату вопросов нет, думаю и не будет - все пашет ,крутится, мигает ...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- AI_Disable
- Сверлит текстолит когтями
- Сообщения: 1116
- Зарегистрирован: Чт окт 15, 2009 14:16:18
- Откуда: Екб
- Контактная информация:
- ssvd
- Нашел транзистор. Понюхал.
- Сообщения: 167
- Зарегистрирован: Ср ноя 04, 2009 18:00:56
- Откуда: Алтайский край
- Контактная информация:
вот не могу понять где косяк! может кто увидит...
В реальности, если к схеме подключен 1датчик, то все нормально, а если 2 датчика, то показывается всякая фигня....
Если тоже самое делаю в Proteus, то там фигня постоянно показывается...
Уже все передумал, не могу понять..
Подскажите....
В реальности, если к схеме подключен 1датчик, то все нормально, а если 2 датчика, то показывается всякая фигня....
Если тоже самое делаю в Proteus, то там фигня постоянно показывается...
Уже все передумал, не могу понять..
Подскажите....
- Вложения
-
- termometr2dLED.rar
- (93.72 КБ) 203 скачивания