Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.133.108.241] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток! Решил пересесть с кодавижина и студии4 на ATMEL STUDIO 6 в связи с тем,что она поддерживает и 8-битные,и 32-битные процы атмела. толкового(а лучше сказать НИКАКОГО)хелпа не имеется.перерыл уже кучу материалов в инете,но ответа так и не нашел. Проблема возникла как и всегда из-за нового синтаксиса.не работает прерывание,и не смог найти толкового ПРИМЕРА ,как правильно написать обработчик. пытался вот так
#pragma vector=PCINT0_vect ISR(KEYS_INTER) и вот так ISR(_VECTOR(2)) при подключенной #include <avr/interrupt.h> эффект-ноль.компилятор не ругается,но и не выполняется подпрограмма. Если у кого есть уже опыт работы с данной ИДЕ или может завалялся хелп,подскжите,пожалуйста,КАК ПРАВИЛЬНО НАПИСАТЬ ОБРАБОТЧИК???? Может у отладчика в шестерке тоже глюки имеются,как это было в четвертой студии?? А может уже шарики за ролики заехали и я просто неправильно инициализирую что-то??поэтому выкладываю все как есть.сильно критиковать не надо,это просто прога,слепленная в целях обучения))))) #define F_CPU 14745600UL #include <avr/io.h> #include <stdio.h> #include <stdlib.h> #include <delay.h> #include <avr/interrupt.h> //******************************************* #pragma vector=USART0_RX_vect ISR(USART0_RX_vect) { while (1) {}; }; //******************************************* // Pin change 0-7 interrupt service routine #pragma vector=PCINT0_vect ISR(KEYS_INTERR) { while (1) {}; }; int main(void) { PORTA=0x00; DDRA=0xFF; PORTB=0x00; DDRB=0xFF; PORTC=0x00; DDRC=0xFB; PORTD=0x00; DDRD=0xFF; PORTE=0x00; DDRE=0x03; PORTF=0x00; DDRF=0xFF; PORTG=0x00; DDRG=0x1F; // External Interrupt(s) initialization // INT0: Off // Interrupt on any change on pins PCINT0-7: On // Interrupt on any change on pins PCINT8-15: Off EICRA=0b00000000; PCMSK0=0b11111000; EIMSK=0b01000000; EIFR=0x40; // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: Off // USART0 Mode: Asynchronous // USART Baud Rate: 19200 UCSR0A=0x00; UCSR0B=0x90; UCSR0C=0x06; UBRR0H=0x00; UBRR0L=0x2F; asm("sei"); while(1) { PORTB |=(1<<PB0); PORTB |=(0<<PB0); PORTB |=(1<<PB0); PORTB |=(0<<PB0); } } |
Сообщ.
#2
,
|
|
|
Я не полностью уверен, в последних AVRStudio в качестве компилятора C применён avr-gcc с библиотекой AVR-LIBC. По этим ключевым словам и надо искать. На сайте AVR-LIBC я в своё время нашёл все ответы. Но правда оболочка у меня была попроще - WinAVR и компиляция через make (makefile).
Так, бегло замечания по коду. 1) avr-gcc не выключает wdt его надо выключать ручками - wdt_disable(); - иначе "странное поведение - постоянный сброс" 2) по-моему все векторы прерываний имеют "стандартные" имена, их можно посмотреть в заголовочных файлах типа "iom8515.h" 3) код isr(USART0_RX_vect) немножко зациклен на себе #pragma vector=USART0_RX_vect ISR(USART0_RX_vect) { while (1) {}; }; Сейчас у меня нет ни AVRStudio ни процессоров. Стоит только старенькая WinAVR-20100110 (это тоже avr-gcc), которой когда-то пользовался. В этой среде и компилировал прилагаемый пример с прерываниями на C и на ассемблере. Пример - таймер с двумя кнопками (старт/стоп и смена диапазона), одним выходом для нагрузки, и выводом № диапазона на один 7-сегментный индикатор. Там используется аж три прерывания. Отлаживал на макетке - всё работало. Возможно, что за несколько лет заголовочные файлы и сам gcc претерпел изменения, и в новой среде даже не откомпилируется... Раньше форумы были полны такими сообщениями. Повторюсь, всему я учился по примерам к avr-libc, а также по форумам при поиске "WinAVR" и "avr-gcc". Прикреплённый файлTimer_00.zip (47,31 Кбайт, скачиваний: 437) |
Сообщ.
#3
,
|
|
|
оказалось,что на работе еще и сборка глючная была установлена.а на домашнем компе установил другую,от одного глюка избавился.
на счет зацикливания в обработчиках-верно.сделал сознательно,учитывая некоторые особенности эмуляции прерываний в студии 4. вечером попробую написать самое простое и автономное прерывание-по переполнению таймера.если и оно не пойдет-значит где-то в настройках проекта надо рыться)))) хелп на ГСС мне попадался,онлайновский.но от него легче не стало |