Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
1

Не срабатывают прерывания

31.08.2017, 12:17. Показов 3445. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет.
Написал программу для измерения длины импульса, прерывания должны срабатывать при приходе переднего фронта (INT0) и заднего фронта импульса (INT1). Обработчик прерывания считывает содержимое счетчика, обнуляет его, запускает вновь и зажигает на дисплее символ r для переднего фронта и L для заднего.
Но не срабатывают почему-то (не зажигаются символы переднего и заднего фронтов.)
ПОдскажите пожалуйста, что там написано не так?
И ещё наверно, я не правильно пользуюсь отладкой, потому что при пошаговом режиме оно доходит до WHILE и дальше не бегает по строкам.
И ещё мне непонятно, как в режиме отладки имитировать работу генератора импульсов длину которых я собираюсь измерить?
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
/*
 * DUTYCYCLE.cpp
 *
 * Created: 22.08.2017 16:26:07
 * Author : John
 */ 
/*
 * OLDTIMER.c
 *
 * Created: 21.08.2017 16:01:31
 * Author : John
 */ 
 
#define F_CPU 16000000L
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
 
//----------------gLOBAL VARIABLES----------------------------
unsigned char i=0;
unsigned char seg=0;
unsigned char HighLength=0;
unsigned char LowLength=0;
 
//--------------------------------------------
 
 
 
void segchar (unsigned char seg)
{
    switch(seg)
    {
        case 1: PORTD = 0b00000110; break;
        case 2: PORTD = 0b01011011; break;
        case 3: PORTD = 0b01001111; break;
        case 4: PORTD = 0b01100110; break;
        case 5: PORTD = 0b01101101; break;
        case 6: PORTD = 0b01111101; break;
        case 7: PORTD = 0b00000111; break;
        case 8: PORTD = 0b01111111; break;                                                                
        case 9: PORTD = 0b11101111; break;//with dot point (dp) segment
        case 0: PORTD = 0b00111111; break;
        case 10: PORTD = 0b01110111; break; //A  
        case 11: PORTD = 0b01111100; break; //b
        case 12: PORTD = 0b00111001; break; //C
        case 13: PORTD = 0b01011110; break; //d
        case 14: PORTD = 0b01111001; break; //E
        case 15: PORTD = 0b01111011; break; //e
        case 16: PORTD = 0b01110001; break; //F
        case 17: PORTD = 0b00111101; break; //G
        case 18: PORTD = 0b01110110; break; //H
        case 19: PORTD = 0b00011110; break; //J
        case 20: PORTD = 0b00111000; break; //L
        case 21: PORTD = 0b01011100; break; //o
        case 22: PORTD = 0b01110011; break; //P
        case 23: PORTD = 0b01100111; break; //q
        case 24: PORTD = 0b01010000; break; //r
        case 25: PORTD = 0b00111110; break; //U
        case 26: PORTD = 0b01101110; break; //y                                                       
    }                              
}                             
//--------------------------------------------
void timer_ini(void)        //set 1 sec timer
{                                                                                                                                                                                                                                                                                                                                                     
    TCCR1B |= (1<<WGM12); // устанавливаем режим СТС (сброс по совпадению)
    TIMSK1 |= (1<<OCIE1A);  //устанавливаем бит разрешения прерывания
                            // 1ого счетчика по совпадению с OCR1A(H и L)
    OCR1AH = 0b01111010; //записываем в регистр число для сравнения
    OCR1AL = 0b00010010;
    TCCR1B |= (1<<CS12);//установим делитель.
}
//--------------------------------------------
ISR (TIMER1_COMPA_vect)
{
    if(i>25) i=0;
    segchar(i);
    i++;
}
//--------------------------------------------
//--------------------------------------------
ISR (PCINT0_vect )   //rising Edge Pin Change Interrupt Request 
{
    SREG = SREG & 0x7F; // GlOBAL interrupt disable 0xxx xxxx
    HighLength = TCNT1;//read timer
 
    //stop timer  TCCR1B=0x00;
    TCNT1 = 0;  //reset timer
    i=24;  //24-r 20-L
    seg=24;
    segchar(seg); //out on 7seg LED display
    segchar(i); //out on 7seg LED display
    PORTD = 0b00000101; //out on port D
    TCCR1B = TCCR1B | 0x05; //start timer  from prescaler /1024 
                            /*(1 sec = 15625 0.3s = 469
                             0.35=547 0.25s=391 */
 
    SREG = SREG | 0x80; // GlOBAL interrupt enable 1xxx xxxx
                    
}
//--------------------------------------------
//--------------------------------------------
ISR (PCINT1_vect )   //Falling edge Pin Change Interrupt Request
{
    SREG = SREG & 0x7F; // GlOBAL interrupt disable 0xxx xxxx
    LowLength = TCNT1;//read timer//stop timer  TCCR1B=0x00;
    TCNT1 = 0;  //reset timer
    i=20;  //24-r 20-L
    seg=20;
    segchar(seg); //out on 7seg LED display
    segchar(i); //out on 7seg LED display
    PORTD = 0b00001010; //out on port D
    TCCR1B = TCCR1B | 0x05; //start timer  from prescaler /1024 
                            /*(1 sec = 15625 0.3s = 469
                             0.35=547 0.25s=391 */
    SREG = SREG | 0x80; // GlOBAL interrupt enable 1xxx xxxx
    
}
    //--------------------------------------------
//--------------------------------------------
void Pulse(void) //for pulse and duty measure
{
    
    
    unsigned char HighLength1=0; // 3 cells for 3 measures then calculate medium value
    unsigned char HighLength2=0;
    unsigned char HighLength3=0;
    
    unsigned char LowLength1=0;  // 3 cells for 3 measures then calculate medium value
    unsigned char LowLength2=0;
    unsigned char LowLength3=0;
    
    EICRA = EICRA | 0x0B;   //Set interrupt requests for 2 input pins: INT0-rising Edge, INT1 -falling
                            //Any logical change on INT0 Bits 1:0  generates an interrupt request.
                            //Any logical change on INT1 Bits 3:2 generates an interrupt request.
                            //10 The falling edge of INT1 generates an interrupt request.
                            // 11 The rising edge of INT0 generates an interrupt request.
                             //    0x0B ==     0b0000 1011
                                                
    EIMSK = EIMSK | 0x03;  //External Interrupt Request 0 and 1 Enable      
    SREG = SREG | 0x80;    // GlOBAL interrupt enable 1xxx xxxx
    sei();
    while(1)                //While 3 positive and negative pulses will be filled
                            //this program will be write later
                            //now it just endless cycle                
            {
            
            HighLength1 =  HighLength;
            HighLength = 0; 
                
                
            }                      
    
}
//--------------------------------------------
 
int main(void)
{
    //unsigned char butcount=0, butstate=0;
    //timer_ini();
    DDRD = 0xFF; //SET PORT d to output
    DDRB = 0x00;//set port B to input
    PORTD = 0b00000000;
    PORTB = 0b00000001;//set pin PCINT0 to High
    i=0;
    Pulse();    //start pulse measuring
}
Вложения
Тип файла: zip DUTYCYCLE.ZIP (95.2 Кб, 7 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.08.2017, 12:17
Ответы с готовыми решениями:

Прерывания ATxmega256a3U не срабатывают
Здравствуйте. Уже не первый день пытаюсь понять, почему не срабатывает прерывание. Все работает,...

Не срабатывают внешние прерывания INT0/INT1 в Atmega8
Помогите разобраться новичку в МК, в чем может быть проблема. Пытаюсь освоить самостоятельно...

не срабатывают прерывания Alarm будильника RTC
Здравствуйте! Пытаюсь разобраться с RTC в NUCLEO-STM32l476RG. Написал тестовый исходник в котором...

STM32F4 discovery не срабатывают прерывания по I2C
Работая по шине y2s в режиме ожидания флагов контроллер получает данные. Решил сделать работу на...

13
317 / 268 / 61
Регистрация: 12.10.2011
Сообщений: 434
31.08.2017, 12:50 2
Цитата Сообщение от design_m Посмотреть сообщение
доходит до WHILE и дальше не бегает по строкам
C
1
2
3
4
5
6
7
8
9
10
  while(1)                //While 3 positive and negative pulses will be filled
                            //this program will be write later
                            //now it just endless cycle                
            {
            
            HighLength1 =  HighLength;
            HighLength = 0; 
                
                
            }
volatile? Скорее всего оптимизатор выкинул эти строчки, как бессмысленные.
0
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
31.08.2017, 13:24  [ТС] 3
ну я просто не дописал функцию, но основной вопрос почему прерывания не срабатывают?
кстати, а что же тут бессмыссленного если одной переменной присваивается значение аккумулятора, и затем он обнуляется?
0
317 / 268 / 61
Регистрация: 12.10.2011
Сообщений: 434
31.08.2017, 13:38 4
Объявите переменную HighLength, как volatile
C
1
volatile unsigned char HighLength=0;
0
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
31.08.2017, 14:01  [ТС] 5
Обьявил, спасибо за совет, но это не повлияло на работу прерываний, светодиодная индикация, которую должно зажигать прерывание, всё равно не загорается.
C++
1
2
3
4
5
6
7
//----------------gLOBAL VARIABLES----------------------------
unsigned char i=0;
unsigned char seg=0;  // 0-255
volatile unsigned short HighLength=0; //0-65535
volatile unsigned short LowLength=0;
 
//--------------------------------------------
0
317 / 268 / 61
Регистрация: 12.10.2011
Сообщений: 434
31.08.2017, 14:10 6
Под рукой нет компилятора под avr. Не на чем проверить.

Просьба модераторам перенести тему в раздел Микроконтроллеры AVR. Там помогут быстрее.
0
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
31.08.2017, 18:20  [ТС] 7
вот отредактировал, но всё равно прерывания не срабатывают.
на схеме симулятора состояние портов меняется при записи в регистр D из основной программы, а при записи в регистр D из прерывания - не меняется, из чего я сделал вывод, что прерывание не срабатывает - то ли я его неправильно написал, то ли событие прерывания не происходит. Хотя компилируется без ошибок. Во вложении есть файл прототип, из которого я переделал в эту программу, так он работает замечательно. И симулятор и железо.
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
/*
 * DUTYCYCLE.cpp
 *this code for interrupt by rising edge and interrupt from INT1 f=by falling edge,                                                                                                                                                                                                                                       
 * Created: 22.08.2017 16:26:07
 * Author : John
 */ 
/*
 * OLDTIMER.c
 *
 * Created: 21.08.2017 16:01:31
 * Author : John
 */ 
 
#define F_CPU 16000000L
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
 
//----------------gLOBAL VARIABLES----------------------------
unsigned char i=0;
unsigned char seg=0;  // 0-255
volatile unsigned short HighLength=0; //0-65535
volatile unsigned short LowLength=0;
 
//--------------------------------------------
 
 
 
void segchar (unsigned char seg)
{
    switch(seg)
    {
        case 1: PORTD = 0b00000110; break;
        case 2: PORTD = 0b01011011; break;
        case 3: PORTD = 0b01001111; break;
        case 4: PORTD = 0b01100110; break;
        case 5: PORTD = 0b01101101; break;
        case 6: PORTD = 0b01111101; break;
        case 7: PORTD = 0b00000111; break;
        case 8: PORTD = 0b01111111; break;                                                                
        case 9: PORTD = 0b11101111; break;//with dot point (dp) segment
        case 0: PORTD = 0b00111111; break;
        case 10: PORTD = 0b01110111; break; //A  
        case 11: PORTD = 0b01111100; break; //b
        case 12: PORTD = 0b00111001; break; //C
        case 13: PORTD = 0b01011110; break; //d
        case 14: PORTD = 0b01111001; break; //E
        case 15: PORTD = 0b01111011; break; //e
        case 16: PORTD = 0b01110001; break; //F
        case 17: PORTD = 0b00111101; break; //G
        case 18: PORTD = 0b01110110; break; //H
        case 19: PORTD = 0b00011110; break; //J
        case 20: PORTD = 0b00111000; break; //L
        case 21: PORTD = 0b01011100; break; //o
        case 22: PORTD = 0b01110011; break; //P
        case 23: PORTD = 0b01100111; break; //q
        case 24: PORTD = 0b01010000; break; //r
        case 25: PORTD = 0b00111110; break; //U
        case 26: PORTD = 0b01101110; break; //y                                                       
    }                              
}                             
//--------------------------------------------
// void timer_ini(void)        //set 1 sec timer
// {                                                                                                                                                                                                                                                                                                                                                     
//  TCCR1B |= (1<<WGM12); // устанавливаем режим СТС (сброс по совпадению)
//  TIMSK1 |= (1<<OCIE1A);  //устанавливаем бит разрешения прерывания
//                          // 1ого счетчика по совпадению с OCR1A(H и L)
//  OCR1AH = 0b01111010; //записываем в регистр число для сравнения
//  OCR1AL = 0b00010010;
//  TCCR1B |= (1<<CS12);//установим делитель.
// }
//--------------------------------------------
// ISR (TIMER1_COMPA_vect)
// {
//  if(i>25) i=0;
//  segchar(i);
//  i++;
// }
//--------------------------------------------
//--------------------------------------------
ISR (PCINT0_vect )   //rising Edge Pin Change Interrupt Request 
{
    SREG = SREG & 0x7F; // GlOBAL interrupt disable 0xxx xxxx
    HighLength = TCNT1;//read timer
    //stop timer  TCCR1B=0x00;
    TCNT1 = 0;  //reset timer
    TCCR1B = TCCR1B | 0x05; //start timer  from prescaler /1024 
                            //1 sec = 15625 0.3s = 469 0.35=547 0.25s=391 
    //------------------start  of display (for debugging, later must comment it)-----------
    i=24;  //24-r 20-L
    seg=24;
    segchar(seg); //out on 7seg LED display
    segchar(i); //out on 7seg LED display                       
    PORTD = 0b00000101; //out on port D 
    _delay_ms(500);                 
    //------------------end of display-----------
    SREG = SREG | 0x80; // GlOBAL interrupt enable 1xxx xxxx
                    
}
//--------------------------------------------
//--------------------------------------------
ISR (PCINT1_vect )   //Falling edge Pin Change Interrupt Request
{
    SREG = SREG & 0x7F; // GlOBAL interrupt disable 0xxx xxxx
    LowLength = TCNT1;//read timer//stop timer  TCCR1B=0x00;
    TCNT1 = 0;  //reset timer
    TCCR1B = TCCR1B | 0x05; //start timer  from prescaler /1024 
                            //1 sec = 15625 0.3s = 469 0.35=547 0.25s=391
    //------------------start  of display (for debugging, later must comment it)-----------
    i=20;  //24-r 20-L
    seg=20;
    segchar(seg); //out on 7seg LED display
    segchar(i); //out on 7seg LED display
    PORTD = 0b00001010; //out on port D
    _delay_ms(500);
    //------------------end of display-----------
    SREG = SREG | 0x80; // GlOBAL interrupt enable 1xxx xxxx
    
}
    //--------------------------------------------
//--------------------------------------------
void Pulse(void) //for pulse and duty measure
{
    
    
    unsigned short HighLength1=0; // 3 cells for 3 measures then calculate medium value
    unsigned short HighLength2=0;
    unsigned short HighLength3=0;
    
    unsigned short LowLength1=0;  // 3 cells for 3 measures then calculate medium value
    unsigned short LowLength2=0;
    unsigned short LowLength3=0;
    unsigned char j=0;               //variable 
    
    EICRA = EICRA | 0x0B;   //Set interrupt requests for 2 input pins: INT0-rising Edge, INT1 -falling
                            //Any logical change on INT0 Bits 1:0  generates an interrupt request.
                            //Any logical change on INT1 Bits 3:2 generates an interrupt request.
                            //10 The falling edge of INT1 generates an interrupt request.
                            // 11 The rising edge of INT0 generates an interrupt request.
                             //    0x0B ==     0b0000 1011
                                                
    EIMSK = EIMSK | 0x03;  //External Interrupt Request 0 and 1 Enable      
    SREG = SREG | 0x80;    // GlOBAL interrupt enable 1xxx xxxx
    sei();
    while(1)                //While 3 positive and negative pulses will be filled
                            //this program will be write later
                            //now it just endless cycle                
            {
                if (HighLength1 == 0)
                {
                    HighLength1 =  HighLength;
                    HighLength = 0;
                } 
            
                if (LowLength1 == 0)
                {
                    LowLength1 = LowLength;
                    LowLength = 0;   
                
                
                }                      
            }
}
//--------------------------------------------
 
int main(void)
{
    //unsigned char butcount=0, butstate=0;
    //timer_ini();
    DDRD = 0xFF; //SET PORT d to output
    DDRB = 0x00;//set port B to input
    PORTD = 0b00000000;
    PORTB = 0b00000000;//set pin PCINT0 to High
    i=0;
    Pulse();    //start pulse measuring
}
Вложения
Тип файла: zip at328.zip (186.0 Кб, 5 просмотров)
0
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
01.09.2017, 07:55 8
1) а где у вас объявляется, что вы работаете с mega328? в коде я этого не встретил.
2) Не перебдите с управлением SREG в AVR. Глобальный флаг управляется атомарно, инструкциями sei, cei, вызовом прерываний и reti. Все это предусмотрено в библиотеке и настройках компилятора. дергать SREG не только не обдуманно, но и опасно.
0
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
01.09.2017, 12:48  [ТС] 9
Так а что именно из этого мне надо изменить, чтобы прерывания срабатывали?
0
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
01.09.2017, 13:28 10
design_m, для начала разберитесь, какие прерывания Вы используете.
По идее, INT0 и INT1.
А какие вектора Вы описали?
PCINT0_vect и PCINT1_vect

Добавлено через 1 минуту
Voland_, указание на ATmega328P находится в проекте

Добавлено через 1 минуту
Как и подключение iom328p.h

Добавлено через 3 минуты
design_m, выкиньте все манипуляции с SREG.

Добавлено через 3 минуты
design_m, перед написанием программы внимательно изучайте datasheet на контроллер
1
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
01.09.2017, 14:51  [ТС] 11
Цитата Сообщение от _liv_ Посмотреть сообщение
design_m, для начала разберитесь, какие прерывания Вы используете.
По идее, INT0 и INT1.
А какие вектора Вы описали?
PCINT0_vect и PCINT1_vect
нУ ошибся маленько, с кем не бывает?
0
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
01.09.2017, 15:36  [ТС] 12
Добавлено через 3 минуты
design_m, выкиньте все манипуляции с SREG.

поправил вектора, так все равно прерывания не срабатывают (т.е не загораются светодиоды в Proteus), а как проверить пошаговым просмотром то, что использует импульсы, я никак не могу догадаться?
подскажите пожалуйста, как мне смоделировать приход переднего фронта импульса в пошаговом симуляторе Atmel Studio?

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
ISR (INT0_vect )   //rising Edge Pin Change Interrupt Request 
{
    SREG = SREG & 0x7F; // GlOBAL interrupt disable 0xxx xxxx
    HighLength = TCNT1;//read timer
    //stop timer  TCCR1B=0x00;
    TCNT1 = 0;  //reset timer
    TCCR1B = TCCR1B | 0x05; //start timer  from prescaler /1024 
                            //1 sec = 15625 0.3s = 469 0.35=547 0.25s=391 
    //------------------start  of display (for debugging, later must comment it)-----------
    i=24;  //24-r 20-L
    seg=24;
    segchar(seg); //out on 7seg LED display
    segchar(i); //out on 7seg LED display                       
    PORTD = 0b00000101; //out on port D 
    _delay_ms(500);                 
    //------------------end of display-----------
    //SREG = SREG | 0x80; // GlOBAL interrupt enable 1xxx xxxx
    sei();
                    
}
//--------------------------------------------
//--------------------------------------------
ISR (INT1_vect )   //Falling edge Pin Change Interrupt Request
{
    SREG = SREG & 0x7F; // GlOBAL interrupt disable 0xxx xxxx
    LowLength = TCNT1;//read timer//stop timer  TCCR1B=0x00;
    TCNT1 = 0;  //reset timer
    TCCR1B = TCCR1B | 0x05; //start timer  from prescaler /1024 
                            //1 sec = 15625 0.3s = 469 0.35=547 0.25s=391
    //------------------start  of display (for debugging, later must comment it)-----------
    i=20;  //24-r 20-L
    seg=20;
    segchar(seg); //out on 7seg LED displayhttps://www.cyberforum.ru/avr/thread2033343.html#
    segchar(i); //out on 7seg LED display
    PORTD = 0b00001010; //out on port D
    _delay_ms(500);
    //------------------end of display-----------
    //SREG = SREG | 0x80; // GlOBAL interrupt enable 1xxx xxxx
    sei();
Заменил SREG на sei(); - тоже не помогло, может тут ещё какая то ошибка существует?
(Прицепил полный проект Atmel+Proteus)
Вложения
Тип файла: zip dutycycle1.zip (50.5 Кб, 2 просмотров)
0
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
01.09.2017, 16:34 13
1) design_m, я не случайно сказал, "перед написанием программы внимательно изучайте datasheet на контроллер"
int0 и int1 на каких портах?
2) уберите ВСЕ манипуляции с SREG. А также внутри прерывания sei() также лишний. После выхода из прерывания прерывания будут разрешены автоматически. Как и запрещены прерывания при входе.
3) _delay_ms(500); - лишнее. Зачем висеть в прерывании на паузе?
4) TCCR1B = TCCR1B | 0x05; вынесите в Pulse(). Запускаем один раз. Дальше только считываем и обнуляем.

Добавлено через 9 минут
6) все записи вида TCCR1B = TCCR1B | 0x05 можно смело заменить на TCCR1B = 0x05, т.к. в вашем случае надо просто записать в регистр значение.
А вот как "смоделировать приход переднего фронта импульса в пошаговом симуляторе Atmel Studio" не подскажу, ибо пишу программы только для готовых плат.
1
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
04.09.2017, 17:46  [ТС] 14
Цитата Сообщение от _liv_ Посмотреть сообщение
1) design_m, я не случайно сказал, "перед написанием программы внимательно изучайте datasheet на контроллер"
int0 и int1 на каких портах?
Спасибо, что подсказали. я читаю, просто снова ошибся маленько. Так зато теперь у меня возникла новая проблема - если я использую для индикации 7 сегментный индикатор, в порту D теперь не будет 2 битов. А если я перевел выходы в порт B, так там тоже все выводы не используешь, из-за подключения кристалла на В7 и В6.
Как в таких случаях поступать - делить выводы индикатора между двумя портами, т.е. делать вывод знака двумя командами,

C++
1
        case 12: PORTB = 0b00100001;PORTС = 0b00011000; break; //C
или какой-то еще способ существует?
Сейчас у меня при переводе входов индикатора на порт В 7й вывод (6й бит) не работает (он не показывает никакого уровня в PROTEUS? Я думаю, как раз из за наличия кварцевого резонатора.
2) уберите ВСЕ манипуляции с SREG.
я убрал, а почему его нельзя использовать? Я просто думал, что такое прямое управление регистром то же самое, что в Ассемблере?
3) _delay_ms(500); - лишнее. Зачем висеть в прерывании на паузе?
Так это временно , просто для индикации срабатывания прерывания, я же не увижу её, если всё будет работать как положено, без неё.
6) все записи вида TCCR1B = TCCR1B | 0x05 можно смело заменить на TCCR1B = 0x05, т.к. в вашем случае надо просто записать в регистр значение.
Не понял, почему - ведь остальные биты заменятся нулями?
0
04.09.2017, 17:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.09.2017, 17:46
Помогаю со студенческими работами здесь

Не срабатывают стили для текста, но для фона срабатывают
&lt;form action=&quot;#&quot; method=&quot;post&quot;&gt; &lt;input placeholder=&quot;Введите имя&quot;...

[Вопрос] Перехват прерывания прямым доступом к вектору прерывания
Всех приветствую! В данный момент разбираюсь с обработкой аппаратного прерывания (прерывание...

Вычислить адрес вектора прерывания по номеру прерывания.
17. По заданному номеру прерывания (13 h) вычислите логические адреса хранения исходных адресов...

Вызов прерывания в обработке прерывания
В программе,нажатие кнопки вызывает прерывание,в котором оно обрабатывается.Попутно в обработке...

Не срабатывают якоря
В общем ситуация такая: Есть два блока, один выводится при большом размере экрана, второй при...

Не срабатывают скрипты
Доброго времени суток. Подскажите, почему могут не срабатывают скрипты при загрузки страницы? ...

Не срабатывают кнопки
Прошу удалить, ошибку понял.


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru