HDD и прерывания - доработка программы из статьи /node/220
Написал inspiritus дата Суб, 12/15/2012 - 13:36
Здравствуйте.
нужна помощь, пытаюсь запустить движок HDD.
взял за основу программу из статьи https://avrlab.com/node/220
однако у меня Arduino MEGA на проце 2560.
Внес изменения в программу - убрал работу по UART и на плате драйвера поставил 2 кнопки, которые завел на 4 и 5 разряды порта С.
кнопки работают, проверено на LED 4-го разряда порта B - пин13 ардуины со светодиодом.
нет ухода на прерывания, и еще, компилятор ругается на TIMSK, видимо оттого, что на 2560 их аж 5 штук, какой применить для правильной работы с имеющейся инициализацией прерываний. Также непонятно, где происходит привязка подпрограмм-обработчиков...
и все равно компилятор ругается на TIMSK и GIMSK наверно для atmega2560 там что то другое должно быть
# include "avr/io.h" # include "avr/interrupt.h" # include "stdio.h" #define nop() {asm("nop");} char status,data; char state; unsigned int lvl=65530/4; // кнопки на int0 и int1 20 и 21 контакты SIGNAL(SIG_INTERRUPT0)//обработка прерываний кнопки "+" {cli(); lvl++; //увеличение при нажатии на кнопку "+" на 1 sei();} SIGNAL(SIG_INTERRUPT1)//обработка прерываний кнопки "-" {cli(); lvl--; //уменьшение при нажатии на кнопку "-" на 1 sei(); } // Timer1 output compare A interrupt service routine ISR(TIMER1_COMPA_vect) { switch (state) { case 0: PORTC=1; PORTB=0x00;break; case 1: PORTC=3; PORTB=0x80;break; case 2: PORTC=2; PORTB=0x00;break; case 3: PORTC=6; PORTB=0x80;break; case 4: PORTC=4; PORTB=0x00;break; case 5: PORTC=5; PORTB=0x80;break; } if (state<5) state++; else state=0; } int main(void) { PORTC=0xF0; DDRC=0x0F; DDRB=0x80; PORTB=0x80; GIMSK=0b11000000; //разрешаем прерывание int0 и int1 MCUCR=0b00001111;// прерывание по возрастающему фронту - для кнопки 1 и 2 // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 8000,000 kHz // Mode: CTC top=OCR1A // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: On // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x09; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0xFF; OCR1AL=0xFF; OCR1BH=0x00; OCR1BL=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK = 0x10; // Global enable interrupts sei(); while (1) { // if ((PINC&0x20)==0x00) PORTB=0x80; else PORTB=0x00; //при нажатии кнопки зажигаем светодиод OCR1A=lvl; }; }
»
Посмотри документацию на свой
Посмотри документацию на свой МК у него судя по всему регистры TIMSK и GIMSK по другому называются, могут типа
TIMSK0 и GIMSK0 или TIMSK1 и GIMSK1 называться. Глянь, с 2560 не работал сам.
Так ты же не убрал привязку к
Так ты же не убрал привязку к работе от прерывания по приходу UART у тебя до сих пор в программе стоит обработчик прерывания по UART а не по кнопке.
перекинул кнопки
и все равно компилятор ругается на TIMSK и GIMSK наверно для atmega2560 там чтото другое должно быть
хм... то есть имя обработчика
хм... то есть имя обработчика это привязка к прерыванию...
ччерт а где про это почитать...
и собственно на кнопки не реагирует и пока фиг с ними, не могу понять, почему на 0-1-2 порты С не идут импульсы по другому прерыванию... видимо проблема с TIMSK ... подскажите какой номер на него вешать...
Ошибки кода: 1. В обработчике
Ошибки кода:
1. В обработчике не обязательно cli(); и sei(); ставить так как на время выполнение прерывания ЦПУ и так будет занят только обработкой прерывания.
2. Все что касается кнопки советую цеплять на внешнее прерывание, на порты int0 и int1.
http://avrlab.com/node/83 -
http://avrlab.com/node/83 - тут про работу с кнопками
http://avrlab.com/node/87 - тут про работу с прерываниями