|
Работа с прерываниями в WinAVR, Глобальные переменные в main и прерываниях |
|
|
|
Oct 17 2008, 11:12
|
Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970

|
Код #define PacketReceiveComplete INT5_vect
volatile uint64t_t DestMAC;
ISR(PacketReceiveComplete){ getDestMAC(&DestMAC); }
int main(void){ ... printf("%lx",DestMAC); } ps. мое личное IMHO, использование int такого размера на 8-мибитнике для хранения MAC адреса - не лучшая идея.
|
|
|
|
|
Oct 17 2008, 11:14
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(studert @ Oct 17 2008, 14:07)  Что я делаю не так? Попробуйте так int main(void){ uint64t_t temp; ... cli(); temp= DestMAC; sei(); printf("%lx",temp); }
|
|
|
|
|
Oct 17 2008, 11:28
|
Частый гость
 
Группа: Свой
Сообщений: 76
Регистрация: 6-03-05
Из: Новосибирск
Пользователь №: 3 121

|
Цитата(Палыч @ Oct 17 2008, 18:14)  Попробуйте так
int main(void){ uint64t_t temp; ... cli(); temp= DestMAC; sei(); printf("%lx",temp); } Так тоже не работает, если при попытке отправить в порт DestMAC выводится мусор, то как присвоив мусор другой переменной от него избавиться? Где и как нужно объявлять глобальные переменные, чтобы они были доступны всем подпрограммам?
|
|
|
|
|
Oct 17 2008, 11:33
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(studert @ Oct 17 2008, 15:07)  Объявлена глобальная переменная, значение которой uint64t_t DestMAC; avr-libc-user-manual FAQ#1 Цитата(studert @ Oct 17 2008, 15:07)  printf("%lx",DestMAC); Уточните в avr-libc-user-manual поддерживает ли printf 64-битные типы. Цитата(studert @ Oct 17 2008, 15:07)  ISR(PacketReceiveComplete){ cli(); getDestMAC(&DestMAC); sei(); } Нельзя разрешать прерывания перед выходом из прерывания, они сами разрештся при выполнении инструкции RETI. Анатолий.
|
|
|
|
|
Oct 17 2008, 11:45
|
Частый гость
 
Группа: Свой
Сообщений: 76
Регистрация: 6-03-05
Из: Новосибирск
Пользователь №: 3 121

|
Цитата(SasaVitebsk @ Oct 17 2008, 18:27)  volatile забыли. Иначе оптимизатор может выкинуть чтение перед выдачей.
Непонятно зачем cli в прерывании. Хотя смотря как вы вектор объявляли. Ну cli это я от незнания поставил, первый раз с прерываниями работаю в этом компиляторе, до этого на асме только использовал. Я правильно понял, что компилятор сам поставит cli/sei? А volatile что-то тоже не помог. Может есть у кого пример, в котором по внешнему прерыванию изменяется какая-нибудь переменная, которая потом выводится в main?
Сообщение отредактировал studert - Oct 17 2008, 11:53
|
|
|
|
|
Oct 17 2008, 11:55
|
Частый гость
 
Группа: Свой
Сообщений: 76
Регистрация: 6-03-05
Из: Новосибирск
Пользователь №: 3 121

|
Цитата(aesok @ Oct 17 2008, 18:33)  avr-libc-user-manual FAQ#1 Уточните в avr-libc-user-manual поддерживает ли printf 64-битные типы. Нельзя разрешать прерывания перед выходом из прерывания, они сами разрештся при выполнении инструкции RETI.
Анатолий. Спасибо за ответ. Действительно принтф не поддерживает 64 бит.
|
|
|
|
|
Oct 17 2008, 12:04
|
Группа: Новичок
Сообщений: 11
Регистрация: 17-10-08
Пользователь №: 41 018

|
Цитата(aesok @ Oct 17 2008, 14:33)  Нельзя разрешать прерывания перед выходом из прерывания, они сами разрештся при выполнении инструкции RETI. Можно конечно. Не запрещено.
|
|
|
|
|
Oct 17 2008, 12:05
|
Участник

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

|
Цитата(studert @ Oct 17 2008, 15:07)  Задаю благозвучное название прерывания #define PacketReceiveComplete INT5_vect
Объявлена глобальная переменная, значение которой uint64t_t DestMAC;
Обработчик прерывания, функция getDestMAC записывает в переменную DestMAC нужные данные ISR(PacketReceiveComplete){ cli(); getDestMAC(&DestMAC); sei(); } int main(void){ ... printf("%lx",DestMAC); } Это не работает, печатает мусор,причем попытки изменить DestMAC main тоже неудачны, она не меняется. Что я делаю не так? 1) А просто printf у вас работает, если не использовать обработчиков прерываний по приему, по окончании передачи, по свободному регистру UDRn?
|
|
|
|
|
Oct 17 2008, 12:27
|
Частый гость
 
Группа: Свой
Сообщений: 76
Регистрация: 6-03-05
Из: Новосибирск
Пользователь №: 3 121

|
Цитата(mandrew @ Oct 17 2008, 19:05)  1) А просто printf у вас работает, если не использовать обработчиков прерываний по приему, по окончании передачи, по свободному регистру UDRn? Принтф работает, выводит все как положено, если 64 битные данные не кормить.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|