С Новым годом! Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
 Аватар для generation472
24 / 24 / 7
Регистрация: 04.11.2011
Сообщений: 566
Записей в блоге: 1

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

07.04.2016, 14:46. Показов 1635. Ответов 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.04.2016, 14:46
Ответы с готовыми решениями:

PIC16F84A - Не уходит в прерывание
PIC16F84A - Не уходит в прерывание не уходит в прерывание - проверял в протеус. ; На RB7 подать +5в LIST P=PIC16F84A ...

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

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

9
 Аватар для Dolphin
814 / 797 / 201
Регистрация: 21.09.2012
Сообщений: 2,656
07.04.2016, 18:59
Как изменение состояния происходит? Схема подключения
1
1184 / 670 / 113
Регистрация: 15.05.2012
Сообщений: 4,078
07.04.2016, 19:13
Схема ладно. Важно еще и исполнение.
0
 Аватар для generation472
24 / 24 / 7
Регистрация: 04.11.2011
Сообщений: 566
Записей в блоге: 1
08.04.2016, 08:25  [ТС]
Dolphin, Вот схема, и как происходит изменения состояния, я хочу чтобы после каждого перехода с лог 0 на 1, срабатывало прерывание, после срабатывание прерывания происходит обмен данными по SPI 38 байт, в протеусе это работает, на железе я проверил на ножку поступает сигнал, но не срабатывает прерывание
Миниатюры
МК не уходит в прерывание   МК не уходит в прерывание   МК не уходит в прерывание  

0
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
08.04.2016, 09:44
Предлагаю проверить, видит ли вообще контроллер изменения сигала.
1
 Аватар для generation472
24 / 24 / 7
Регистрация: 04.11.2011
Сообщений: 566
Записей в блоге: 1
08.04.2016, 10:27  [ТС]
Mirmik, Да сейчас проверю, то есть просто один сигнал подать?

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

Решение

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

И вообще, минимизировать пример, выкинуть всякие spi и прочее, оставить только инициализацию порта и прерывание. В цикле считывать пин и выводить его на любую другую ногу.
1
 Аватар для generation472
24 / 24 / 7
Регистрация: 04.11.2011
Сообщений: 566
Записей в блоге: 1
12.04.2016, 11:54  [ТС]
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
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
12.04.2016, 13:03
EICRA
0
 Аватар для generation472
24 / 24 / 7
Регистрация: 04.11.2011
Сообщений: 566
Записей в блоге: 1
12.04.2016, 14:22  [ТС]
Витальич, Так EICRA нужен для создания условия прерывания на INT0, а я использую pci0, pci1, там нельзя задавать условия

Добавлено через 1 час 3 минуты
Витальич, всё разобрался проблема была что мне дали не тот камень, оказывается я работал с Atmega165PU-AU
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.04.2016, 14:22
Помогаю со студенческими работами здесь

Кука уходит в Redis, но не уходит в браузер
Здравствуйте, уважаемые форумчане! Никак не могу понять, что не так. Раньше все работало. Я создаю куку на сервере, но она не уходит в...

прерывание
procedure ClearScreen; asm mov ah, 0 mov al, 2 int 10h end; procedure SetCursor; asm mov ah, 2

Прерывание
Ввести числа через консоль и при нажатии на пустую строку вывести данные числа Например: 5 6 1 3 (Пустая строка) 5613 ...

Прерывание
Реализовать замену символа, полученного нажатием одной из клавиш на любую другую

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru