Arduino не входит в прерывание конечных точек
- Войдите на сайт для отправки комментариев
Втр, 30/03/2021 - 11:36
Прошу помощи у знающих людей. Сломал всю голову. Не могу добиться, что бы срабатывали прерывания от конечных точек. Контроллер отказывается в них входить, хотя в Протеусе все нормально
Вот часть кода.
.Cseg .org $0000 jmp rese; ; ***** INTERRUPT VECTORS ************************************************ ;.org INT0addr; = 0x0002 ; External Interrupt Request 0 ;rjmp INT0address ;.org INT1addr; = 0x0004 ; External Interrupt Request 1 ;rjmp INT1address ;.org INT2addr; = 0x0006 ; External Interrupt Request 2 ;rjmp INT2address ;.org INT3addr; = 0x0008 ; External Interrupt Request 3 ;rjmp INT3address ;.org Reserved1addr; = 0x000a ; Reserved1 ;rjmp Reserved1address ;.org Reserved2addr; = 0x000c ; Reserved2 ;rjmp Reserved2address ;.org INT6addr; = 0x000e ; External Interrupt Request 6 ;rjmp INT6address ;.org Reserved3addr; = 0x0010 ; Reserved3 ;rjmp Reserved3address ;.org PCI0addr; = 0x0012 ; Pin Change Interrupt Request 0 ;rjmp PCI0address .org USB_GENaddr; = 0x0014 ; USB General Interrupt Request jmp USB_GENaddress .org USB_COMaddr; = 0x0016 ; USB Endpoint/Pipe Interrupt Communication Request jmp USB_COMaddress ;.org WDTaddr; = 0x0018 ; Watchdog Time-out Interrupt ;rjmp WDTaddress ;.org Reserved4addr; = 0x001a ; Reserved4 ;rjmp Reserved4address ;.org Reserved5addr; = 0x001c ; Reserved5 ;rjmp Reserved5address ;.org Reserved6addr; = 0x001e ; Reserved6 ;rjmp Reserved6address ;.org ICP1addr; = 0x0020 ; Timer/Counter1 Capture Event ;rjmp ICP1address .org OC1Aaddr; = 0x0022 ; Timer/Counter1 Compare Match A jmp OC1Aaddress ;.org OC1Baddr; = 0x0024 ; Timer/Counter1 Compare Match B ;rjmp OC1Baddress ;.org OC1Caddr; = 0x0026 ; Timer/Counter1 Compare Match C ;rjmp OC1Caddress ;.org OVF1addr; = 0x0028 ; Timer/Counter1 Overflow ;rjmp OVF1address ;.org OC0Aaddr; = 0x002a ; Timer/Counter0 Compare Match A ;rjmp OC0Aaddress ;.org OC0Baddr; = 0x002c ; Timer/Counter0 Compare Match B ;rjmp OC0Baddress ;.org OVF0addr; = 0x002e ; Timer/Counter0 Overflow ;rjmp OVF0address ;.org SPIaddr; = 0x0030 ; SPI Serial Transfer Complete ;rjmp SPIaddress ;.org URXC1addr; = 0x0032 ; USART1, Rx Complete ;rjmp URXC1address ;.org UDRE1addr; = 0x0034 ; USART1 Data register Empty ;rjmp UDRE1address ;.org UTXC1addr; = 0x0036 ; USART1, Tx Complete ;rjmp UTXC1address ;.org ACIaddr; = 0x0038 ; Analog Comparator ;rjmp ACIaddress .org ADCCaddr; = 0x003a ; ADC Conversion Complete jmp ADCCaddress ;.org ERDYaddr; = 0x003c ; EEPROM Ready ;rjmp ERDYaddress ;.org ICP3addr; = 0x003e ; Timer/Counter3 Capture Event ;rjmp ICP3address .org OC3Aaddr; = 0x0040 ; Timer/Counter3 Compare Match A jmp OC3Aaddress ;.org OC3Baddr; = 0x0042 ; Timer/Counter3 Compare Match B ;rjmp OC3Baddress ;.org OC3Caddr; = 0x0044 ; Timer/Counter3 Compare Match C ;rjmp OC3Caddress ;.org OVF3addr; = 0x0046 ; Timer/Counter3 Overflow ;rjmp OVF3address ;.org TWIaddr; = 0x0048 ; 2-wire Serial Interface ;rjmp TWIaddress ;.org SPMRaddr; = 0x004a ; Store Program Memory Read ;rjmp SPMRaddress ;.org SPMRaddr; = 0x004c ; Timer/Counter4 Compare Match A ;rjmp SPMRaddress ;.org OC4Baddr; = 0x004e ; Timer/Counter4 Compare Match B ;rjmp OC4Baddress ;.org OC4Daddr; = 0x0050 ; Timer/Counter4 Compare Match D ;rjmp OC4Daddress ;.org OVF4addr; = 0x0052 ; Timer/Counter4 Overflow ;rjmp OVF4address ;.org OVF4addr; = 0x0054 ; Timer/Counter4 Fault Protection Interrupt ;rjmp OVF4address ;.org INT_VECTORS_SIZE ;= 86 ; size in words ;rjmp INT_VECTORS_SIZEess ;******************************************************************** .def prom1 =r20; промежуточный регистр 1 .def prom2 =r21; промежуточный регистр 2 .def prom3 =r22; промежуточный регистр 3 .def prom4 =r23; промежуточный регистр 4 .def prom5 =r24; промежуточный регистр 5 .def schetchik =r25; промежуточный регистр 6 .Cseg .org $d0 rese: ldi prom1, low(ramend) out spl, prom1 ldi prom1, high(ramend) out sph, prom1 cli ...................... sei loop: rjmp loop init_USB_DEVICE: ............................ ;Usb_select_endpoint(EP_CONTROL = 0) ldi r16,0 sts UENUM,r16 ; Выбираем EndPoint 0 (мало ли что там случилось) lds r16, UEIENX ldi r23, RXSTPE; разрешение прерывания по setup pacet call wybor_bit_or sts UEIENX,r16 lds r16, UEIENX ldi r23, RXOUTE; разрешение прерывания по приему данных call wybor_bit_or sts UEIENX,r16 ;lds r16, UEIENX ;ldi r23, TXINE; разрешение прерывания по передаче данных ;call wybor_bit_or ;sts UEIENX,r16 SB_wait_vbus: LDS R16,USBSTA SBRS R16,VBUS ; Если на ноге VBUS устаканилось напряжение, продолжаем ;ret rjmp USB_wait_vbus lds r16, UDCON ldi r23, DETACH call wybor_bit_and ldi r23, LSM call wybor_bit_and sts UDCON, r16 ret USB_COMaddress: in r10, sreg push r16 push r17 push r18 push r19 push r20 push r21 push r22 push r23 push r24 push r25 push r26 push r27 push r28 push r29 push r30 push r31 call USB_Decriptor pop r31 pop r30 pop r29 pop r28 pop r27 pop r26 pop r25 pop r24 pop r23 pop r22 pop r21 pop r20 pop r19 pop r18 pop r17 pop r16 out sreg, r10 reti
хотите, чтобы кто-то обратил внимание на ваш вопрос - выкладывайте код правильно
1. Вставка программного кода в тему/комментарий
2. Поясните, пожалуйста, что такое "прерывания от конечных точек"?
Подскажите, как правильно
Прерывания, которые вызывают установку флагов RXTSPI, RXOUTE и т.д.
Фига-се. Может быть в таком случае, Вы, кроме правильной вставки полного (а не огрызка) кода, ещё и скажете какой у Вас контроллер? Или нам угадывать надо?
Такой же как в Ардуино - atmega32u4
Такой же как в Ардуино - atmega32u4
В какой Ардуино?
На 32U4 сделано две платы - Леонардо и Микро, из полутора десятков. Самые распространенные платы - Ардуино Нано и Уно - сделаны за Atmega 328p. Это раз.
И два: В приведенном ассемблерном куске не содержится вообще ничего содержательного (милая тавтология ;) ). Никакого осмысленного кода.
И три: 32К памяти + 2.5К ОЗУ + 16 МГц требуют кода на ассемблере для какой-то задачи? Или это попытка показать себя? ;))))))
Если вы не в состоянии правильно вставить код в форум, то зачем вы лезете в ассемблер ?
Ваш код НИЧЕГО кроме установки указателя стека не делает !
Ваш код НИЧЕГО кроме установки указателя стека не делает !
Как это ничего? А кто засирает 10-ый регистр в ISR?
Моя плата Ардуино называется pro micro. Собрана на базе контроллера atmega32u4. Память 32кБт, тактовая частота 16МГц. Все как обычно. С Ардуино я новичок. Занимаюсь с китайским чудом, где-то две недели сразу как пришла посылка. Первое, что подумал, а как стереть прошивку ардуино и залить свою. В первые же 15 минут одну ардуино залочил. Потом долго мучался, чтобы ее восстановить, думал попрощался с платой.
Затем решил разработать на базе ардуино CDC устройство для USB. Неделя мучений и о чудо устройство стало обмениваться данными с компьютером. Единственный косяк получать от хоста USB дескрипторы приходится в теле программы, а удобнее, чтобы не возникали таймауты через прерывания. Для этих целей и есть прерывания конечных точек USb_Comadress. В Протеусе к слову сказать код работает. Подумалось случаем не косяк в китайском железе. Сэкономили на этом прерывании.
И делаю все вроде бы правильно. В таблице векторов прерывание есть.
В подпрограмме инициализации выставляю в регистрах нужные биты для разрешения прерываний
Глобально разрешаю все прерывания, а контроллер в его не входит
Извините может сумбурно. Весь код не привожу, потому что он большой и работает с той разницей лишь, что я опрашиваю флаги RXstpi, Rxoute для получения дескрипторов в теле программы, а не в прерывании.
Сэкономили на этом прерывании(C)
Сколько, интересно, в юанях?
1.
С чего сделан вывод, что
контроллер в его не входит
какие именно тесты на это указывают? Я, например, не вижу в обработчике прерывания попытки подать сигнал, что оно туда вошло (светодиод зажечь, например).
2.
Из каких соображений Вы загаживаете регистр 10 в обработчике прерывания и не восстанавливаете его?
3.
После заявлений типа
обычно следует ответ: тогда разбирайтесь сами.
Искать ошибки в коде, не видя его, я не умею.
Хорошо пошутил.
1. Здесь в коде, а так зажигаю светодиод подключенный к PD5. В Протеусе загорается, а в железе нет. Из этого делают вывод, что в прерывание не входит, ну а дальше дескрипторы не обрабатываются и устройство определяется, как неопознанное.
2. Просто я так привык к своим кодам. Сила привычки. R10 использую только по регистр статуса. Но это к прерываниям дела не имеет.
3. Я пишу, что код большой, но по моему вход в прерывание определяется, только выжимками из кода.
Хотя полную версию я сделаю, чуть позже.
1. Здесь в коде, а так зажигаю светодиод подключенный к PD5.
Ну, вот, видите, а мне-то это откуда знать? И откуда мне знать, что Вы там ещё делаете или не делаете?
Ну если я писал, что через прерывание, не работает, через флаги все ок. Значит я менял код , я же не могу все версии привести. Вы не можете привести пример, как войти в прерывание.
Выкладываю код.
а нафига это все через асм делать, интересно?
На ассемблере более гибкое программирование.
И кто как умеет.
На ассемблере более гибкое программирование.
И кто как умеет.
Это Вы признались что си не знаете или вы-лись? Типа - "в этом г-не уж точно никто копаться не будет"?
На ассемблере более гибкое программирование.
то есть то, что это на Си занимает 10-20 строк. а на АСМе - более 1000 - это называется "более гибко"?
Не, ну я понимаю, когда пишешь для тактовой частоты 32кГц с жестким таймкодом. Но в этой задаче на 16МГц какие проблемы?
Я понял почему не был показан код ...
Там ШЕДЕВРЫ !!!!
wybor_bit_and: wybor_bit_or:
Мне нравится писать на ассемблере.
Выкладываю код.
Я Вас ещё утром об этом просил, но Вы всё сопротивлялись. А сейчас уже поздно, не могу этим заниматься. Мож другой кто, или в другой день.
Кстати, опишите как его запускать. Какую частоту выставить, что куда подсоединить. Что должно происходить. Как его запустить, в общем. Почему из Вас надо всё клещами тянуть?
Ну а как вы в регистре нужный бит установите или сбросите.
Хорошо, подожду.
Про сдвиговые операции не слышали ??? В 32 битном регистре будете 32 варианта перебирать ???
Вы имеете ввиду команды rol, ror. Приведите пример как например 6 бит установить, не повредив другие. Вообще кто, как привык, тот так и программирует.
Хорошо, подожду.
А второй абзац не прочитали? Ответ-то будет?
Давай до завтра. Просто сейчас интернет выключат, связи не будет.
Приведите пример как например 6 бит установить, не повредив другие.
Давай до завтра. Просто сейчас интернет выключат, связи не будет.
8))
Спасибо что предупредил. Ща все файлы посохраняю..
x |= 0x40;
или x |= 1<<6;
а нафига это все через асм делать, интересно?
вот не надо завидовать )))
да все, в турме прогулка закончилась, инет вырубили...
Тихо офигеваю... ))) ну не мог не написать чего нибудь, попкорна мало будет - нужно пицу заказать и за пивом сходить )
Задача побаловаться прерываниями и асм'ом что ли ?
Сила привычки. R10 использую только по регистр статуса. Но это к прерываниям дела не имеет.
Ачо именно r10?
И эта, наманые пасаны делают так:
Правило очень простое - скока пушей --- стока попов! )))))))))))))
Правило очень простое - скока пушей --- стока попов! )))))))))))))
ой, не всегда. Иногда, надо вернуться не туда, откуда вызвали, а забежать еще кой-куда по дороге, тогда пушишь на стек адрес, куда надо быстренько спрыгать и делаешь ret. Скока ночей я GPF отлавливал с таким кодом, но научился в конце концов. :)
Ну а как вы в регистре нужный бит установите или сбросите.
Твой любимый r10
выставим 5-й бит
сбросим 6 и 1-й биты
Иногда, надо вернуться не туда, откуда вызвали, а забежать еще кой-куда по дороге, тогда пушишь на стек адрес, куда надо быстренько спрыгать и делаешь ret.
Это когда "попутный чипок" уже закрыли а дагнаццо надо? )))
Ваш код работать не будет
Наверное правильно так
А можно и в цикле , используя команды rol, ror
Так у меня также в подпрограммах делается, речь шла о командах rol, ror.
Ваш код работать не будет
А проверить (прежде чем писать чушь) не судьба ?
Ваш "код" порождает разное число тактов, в зависимости от положения бита !
Вы же константы используете - пусть всё высчитывается на этапе перевода команд в машинный код, а не в процессе выполнения кода !!!
Прошивка записывается в ардуино. Старая стирается вместе с фьзами загрузчика. Тактовая частота 16МГц.
Код активизируется при подключении к USB порту компьютера и устройство начинает обмениваться дескрипторами. Подпрограмма init_USB настраивает USB ардуинки. Для вызова дескрипторов используется прерывание OC1Aaddress с тактом 10мКс, а по идее нужно через прерывание от конечных точек. В этом и заключаются мои грабли. Остальные прерывания не нужны, использовал как дежурные.
Если будешь запускать код, то поправь ветку, чтобы светодиод мигал. По частоте мигания светодиода оцениваю работу ардуино (зависла или работает).
Про китайское железо хочу сказать следующее. Мне пришли две одинаковые ардуино. Так вот одна при отключение от USB при снятии синхронизации бит FRZCLK виснет, а другая нет. Хотя код один и тотже.
За ранее благодарен если поможешь. Я склоняюсь к дефекту ардуино. Хотя обе ардуинки в плане прерывания ведут себя одинаково.
Проверил в Протеусе. Выдает вместо кода $0с код $40. Может протеус глючит, но мой код выдает все правильно.
Вы про команды rol и ror писали приведите пример, как в 32 разрядном регистре устанавливать и сбрасывать биты. Я привел , проверил все считает в AVR STUDIO.
В ассемблере вы оперируете напрямую с машинными командами и всегда можете упростить код, побороться за время выполнения, а в СИ за Вас это делает компилятор и не всегда корректно. У компилятора есть ограничения. Мне как то нужно было умножить два числа вида $FFFFFFFF. На СИ этого не получается, там ограничения в максимальном размере - $FFFF, а на ассемблере написал свою библиотеку и все считает