Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
generation472
19 / 19 / 7
Регистрация: 04.11.2011
Сообщений: 564
Записей в блоге: 1
1

МК не уходит в прерывание

07.04.2016, 14:46. Просмотров 1038. Ответов 9
Метки нет (Все метки)

Миконтролер Atmega165P не хочет уходить в прерывание по изменению состояния на ножке PB6, что странно что в Протеусе он уходит, вот код


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
/*
 * AvrYDK_YOD.c
 *
 * Created: 29.02.2016 20:12:39
 * Author : Ваня
 *
 * Проект под YDK
 */ 
 
#define F_CPU 16000000
 
#define   BitIsClear(reg, bit)    ((reg & (1<<bit)) == 0)
#define   BitIsSet(reg, bit)       ((reg & (1<<bit)) != 0)
 
#define SS_BIT 0
#define SCK_BIT 1
#define MOSI_BIT 2
#define MISO_BIT 3
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
char switcher;
 
unsigned char temp;
unsigned char counter;
 
unsigned char BufOut[36]={};//Выходной буфер SPI-A
unsigned char BufIn[36]={}; //Входной буфер SPI-A
unsigned char iterSPI=0;    
    
unsigned char BufUsiOut[9]={};  //Выходной буфер SPI-B
unsigned char BufUsiIn[8]={};   //Входной буфер SPI-B
unsigned char IterUsi=0;
unsigned char USItmpIN,USItmpOUT;
    
unsigned char UsiBUF[5]={};
unsigned char tmpUSI;
    
unsigned char SYNK1=0;
unsigned char SYNK2=0;  
 
 
void SpiTransfer();
void buffExchange();
void buffUsiExchange();
 
 
 
 
/*
Обработка USI
*/
ISR (USI_OVERFLOW_vect){
            
        
    BufUsiIn[IterUsi]=USIDR;
    USISR =_BV(USIOIF);
    USIDR=BufUsiOut[IterUsi+1];
        
        //USItmp;
    if(IterUsi==7)
            {
                USISR =_BV(USIOIF);
                USIDR=BufUsiIn[0];
                IterUsi=0;  
                buffUsiExchange();
             }
        else
            {       
            IterUsi++;
            }
        
 
}
 
 
 
ISR (INT0_vect){
    
    if(switcher){PORTA|=(1<<0);switcher=0;}else{PORTA&=~(1<<0);switcher=1;}
    SpiTransfer();
}
 
 
///Обработка SYNK2, и SS Для USI
ISR (PCINT0_vect){
    
    if(BitIsSet(PINE,7)){
        SpiTransfer();
    }
    
    
}
    
ISR (PCINT1_vect){  
 
        if(BitIsSet(PINB,6)){
        SpiTransfer();  
    }
    
}
 
 
 ISR(SPI_STC_vect) {
     
    
 }
 
/*
Настройка прерывания для сигналов SYNK1 и SYNK2
*/
void InitInterruptSynk(){
    
    ////Настройка прерывания
 
    EIMSK=0b11000000;///включить прерывания на группах PCIE1 и PCIE0
 
    PCMSK0|=(1<<7);///Включить прерывание на контакте PE7
    PCMSK1|=(1<<6);///Включить прерывние на контакте PB6 
 
    //PCMSK0|=(1<<3);///Включить прерывание на коньакте PE3
        
    DDRE&=~(1<<PE7);/// PE7 настроен на вход сигнала    
    DDRB&=~(1<<PB6);/// PB6 настроен на вход сигнала
    
    
        //  
}
 
/*
Настройка интерфейса SPI 
*/
void InitSPi(){ 
    
///////Настройка портов SPI
    DDRB |=(1<<SS_BIT);
    DDRB |=(1<<SCK_BIT);
    DDRB |=(1<<MOSI_BIT);
    DDRB &=~(1<<MISO_BIT);
    PORTB |=(1<<SS_BIT);
        
///////Настройка SPI
    SPCR|=(1<<4);/// ведущий 
    //настройка частоты 8MhZ/8MhZ =1 MhZ
    
    
    SPCR |=(1<<0);
    SPCR &=~(1<<1);
    SPSR |=(1<<0); //БИТ УДВОЕНИЕ СКОРОСТИ SPI
    
    
    /// Передача со старшего бита в байте
    SPCR &=~(1<<5);
    //// Режим SPI 
    SPCR &=~(1<<3);///такты положительной полярности
    SPCR &=~(1<<2);///Считывание по переднему фронту
    ///Включаем SPI 
    SPCR |=(1<<6);
    ///Включаем флаг прерывания
    SPCR |=(1<<7);
}
/*
Обмен данными по SPI 
*/
void SpiTransfer(){
    
    iterSPI=0;
    //asm("cli");/// запретить прерывания 
    
    
    PORTB &=~(1<<SS_BIT);///
    
    for(int i=0;i<36;i++){  
        SPDR=BufOut[i];
            while (!(SPSR & (1 << SPIF))){asm("nop");}; // Ждем конца ПЕРЕДАЧИ
        _delay_us(10);//10 микросекунд
        BufIn[i]=SPDR;
        UDR0=BufIn[i];
 
    }
    PORTB |=(1<<SS_BIT);///Выключить SS;
    buffExchange();
    
//  asm("sei");/// разрешить прерывания 
}
 
 
void buffExchange(){
    
    for(int i=0;i<36;i++){
        BufOut[i]=BufIn[i]; 
    }   
}
 
void buffUsiExchange(){
    
    for(int i=0;i<8;i++)
    {
        BufUsiOut[i]=BufUsiIn[i];
    }
 
    };
 
 
 
 
/*
Настройка интерфейса USI 
*/
void USIinit(){
    
    
    //USICR=0b11011000;/// настройка регистра
    
    USICR |=(1<<7);
    USICR |=(1<<6);
    USICR &=~(1<<5);
    USICR |=(1<<4);
    USICR |=(1<<3);
    USICR &=~(1<<2);
    USICR &=~(1<<1);
    USICR &=~(1<<0);
    
    DDRE &=~(1<<3);//SS
    DDRE &=~(1<<4);//SCK
    DDRE &=~(1<<5);//DI
    DDRE |=(1<<6); //DO
    //PORTE &=~(1<<6);  
    
    USItmpOUT=BufUsiOut[0];
}
 
void initUSORT(){
    
    DDRE &=~(1<<0);// RX
    DDRE |=(1<<1);// TX
    
    //  UBRR0=0; ///Скорость 115200
    UBRR0=8;
    UCSR0B=0b00001000;
    UCSR0C=0b10000110;
}
 
int main(void)
{
    
    switcher=0;
    ///Настройка порта ЛЕД
 
 
    InitSPi();
    //USIinit();
    InitInterruptSynk();
    initUSORT();
    
    sei();
    while (1) 
    {   
        asm("nop");
 
    }
}
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2016, 14:46
Ответы с готовыми решениями:

PIC16F84A - Не уходит в прерывание
PIC16F84A - Не уходит в прерывание не уходит в прерывание - проверял в протеус. ; На RB7...

отладка в GDB, не уходит в прерывание
Здравствуйте. Изучаю мк stm32c8t6, компилятор GCC отладка в gdb через st-link. Столкнулся с...

Как уходит (или не уходит) мое письмо?
Всем привет! Хочу иметь хотя бы примерное понимание механизма отправки почты от имени PHP и не...

Прерывание
При вызове прерывание компилятор пишет ошибка доступа. #include &lt;iostream&gt; using namespace std; ...

Прерывание
после запуска программы(изменение системной даты и времени) после того как я ввожу новые значения...

9
Dolphin
812 / 795 / 201
Регистрация: 21.09.2012
Сообщений: 2,646
07.04.2016, 18:59 2
Как изменение состояния происходит? Схема подключения
1
pyzhman
1152 / 508 / 74
Регистрация: 15.05.2012
Сообщений: 2,903
07.04.2016, 19:13 3
Схема ладно. Важно еще и исполнение.
0
generation472
19 / 19 / 7
Регистрация: 04.11.2011
Сообщений: 564
Записей в блоге: 1
08.04.2016, 08:25  [ТС] 4
Dolphin, Вот схема, и как происходит изменения состояния, я хочу чтобы после каждого перехода с лог 0 на 1, срабатывало прерывание, после срабатывание прерывания происходит обмен данными по SPI 38 байт, в протеусе это работает, на железе я проверил на ножку поступает сигнал, но не срабатывает прерывание
0
Миниатюры
МК не уходит в прерывание   МК не уходит в прерывание   МК не уходит в прерывание  

08.04.2016, 08:25
Mirmik
techpriest
631 / 210 / 57
Регистрация: 27.02.2014
Сообщений: 1,152
08.04.2016, 09:44 5
Предлагаю проверить, видит ли вообще контроллер изменения сигала.
1
generation472
19 / 19 / 7
Регистрация: 04.11.2011
Сообщений: 564
Записей в блоге: 1
08.04.2016, 10:27  [ТС] 6
Mirmik, Да сейчас проверю, то есть просто один сигнал подать?

Добавлено через 14 минут
Mirmik, Сделал сигнал с изменением в 3 секунды, и всё равно миконтролер крутится в цикле и не хочет уходить в прерывание, не понимаю, а почему тогда в протеусе работает
0
Mirmik
techpriest
631 / 210 / 57
Регистрация: 27.02.2014
Сообщений: 1,152
08.04.2016, 12:49 7
Лучший ответ Сообщение было отмечено generation472 как решение

Решение

Я имею ввиду, считать его через регистр PIN. Убедится, что порт рабочий, и контролллер вообще видит, что на ноге сигнал меняется.

И вообще, минимизировать пример, выкинуть всякие spi и прочее, оставить только инициализацию порта и прерывание. В цикле считывать пин и выводить его на любую другую ногу.
1
generation472
19 / 19 / 7
Регистрация: 04.11.2011
Сообщений: 564
Записей в блоге: 1
12.04.2016, 11:54  [ТС] 8
Mirmik, да я проверил, регистр Pin считывает 0 и единицу но не уходит в прерывание

Добавлено через 11 минут
Mirmik,
Вот минимизировал чтоб не было лишнего
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
 * Itnr0.c
 *
 * Created: 12.04.2016 11:47:31
 */ 
#define F_CPU 16000000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
 
unsigned char temp;
 
#define   BitIsClear(reg, bit)    ((reg & (1<<bit)) == 0)
#define   BitIsSet(reg, bit)       ((reg & (1<<bit)) != 0)
 
///Обработка SYNK2, и SS Для USI
ISR (PCINT0_vect){
    
    temp=0;
    if(BitIsSet(PINE,7)){
        //if(SYNK1==0){PORTA&=~(1<<0);SYNK1=1;}else{PORTA|=(1<<0);SYNK1=0;}
        //SpiTransfer();
    }
    
    
}
 
ISR (PCINT1_vect){
 
    temp=0;
    if(BitIsSet(PINB,6)){
        //if(SYNK2==0){PORTA&=~(1<<1);SYNK2=1;}else{PORTA|=(1<<1);SYNK2=0;}
        //SpiTransfer();
    }
    
}
 
 
/*
Настройка прерывания для сигналов SYNK1 и SYNK2
*/
void InitInterruptSynk(){
    
    ////Настройка прерывания
    
    
    EIMSK=0b11000000;///включить прерывания на группах PCIE1 и PCIE0
    //unsigned char EM=EIMSK;
    //EIMSK|=(1<<PCIE0);
    //  EIMSK|=(1<<PCIE1);
    PCMSK0|=(1<<7);///Включить прерывание на контакте PE7
    PCMSK1|=(1<<6);///Включить прерывние на контакте PB6
 
    //PCMSK0|=(1<<3);///Включить прерывание на коньакте PE3
    
    DDRE&=~(1<<PE7);/// PE7 настроен на вход сигнала
    PORTE|=(1<<PE7);
    
    DDRB&=~(1<<PB6);/// PB6 настроен на вход сигнала
    PORTB|=(1<<PB6);/// Резистор
    
    MCUCR&=~(1<<PUD);///НАСТРОЙКА РЕЗИСТОРОВ
    //
}
 
 
int main(void)
{
    
    
    InitInterruptSynk();
    sei();
    while (1) 
    {
        asm("nop");
    }
}
0
Витальич
1275 / 1182 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
12.04.2016, 13:03 9
EICRA
0
generation472
19 / 19 / 7
Регистрация: 04.11.2011
Сообщений: 564
Записей в блоге: 1
12.04.2016, 14:22  [ТС] 10
Витальич, Так EICRA нужен для создания условия прерывания на INT0, а я использую pci0, pci1, там нельзя задавать условия

Добавлено через 1 час 3 минуты
Витальич, всё разобрался проблема была что мне дали не тот камень, оказывается я работал с Atmega165PU-AU
0
12.04.2016, 14:22
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2016, 14:22

Не уходит почта
Подскажите плз. что может быть? Не уходт почта наружу и не приходит, внутри сети все ок, а вот...

Дребезг, прерывание
Немного не селен в прерываниях. подскажите как установить таймер для проверки нажатия кнопки и...

Прерывание цикла
Здравствуйте. Есть ф-ция для загрузки нескольких фото.Нужно ограничить кол-во до пяти и вывести...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru