прерывание - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » прерывание (идёт переполнение стёка)
прерывание
Oleg12345 Дата: Вс, 25.07.2010, 18:51  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 6
Репутация: 0   ±
Замечания:   ±
На сайте с 09.03.2010

Статус: Offline

помогите начинающему с прерыванием
нужно подсчитывать количество импульсов но через энное количество импульсов идёт переполнение стёка и ресет
вот пример что здесь не то

Device 18F4550

Xtal 20
LCD_Type = 0 ' Задать режим работы с алфавитно-цифровым ЖКИ
LCD_DTPin = PORTD.4 ' Задать вывод порта к которому будет подключен вход DB4 ЖКИ
LCD_RSPin = PORTD.2 ' Задать вывод порта с которого будет выдаваться сигнал RS на ЖКИ
LCD_ENPin = PORTD.3 ' Задать вывод порта с которого будет выдаваться сигнал E на ЖКИ
LCD_Interface = 4 ' Задать 4-битный режим обмена информацией для ЖКИ
LCD_Lines = 2 ' Задать ЖКИ 4-строчный режим работы (для 2-строчных ЖКИ LCD_LINES = 2 , для 1-строчных LCD_LINES = 1)
LCD_CommandUs = 2000 ' Задать паузу между передачей команд на ЖКИ
LCD_DataUs = 50 ' Задать паузу между передачей данных на ЖКИ

Dim g As Word
Dim c As Word
TRISB = %00000001
TRISC = %11111010
Output PORTC

PORTC = 0

c = 0

On_Interrupt GoTo Flash ' Включить обработку аппаратных прерываний и при их возникновении перейти к метке Flash:

GoTo ee

'---------------------------------------- Подпрограмма обработки прерываний ----------------------------------------
Flash: ' Метка начала подпрограммы обработки прерываний

If INTCON.1 = 0 Then c = c + 1

ee:

INTCON.4 = 1 ' включить вход rb.0 int0
INTCON2.6 = 1 ' срабатывание от спада или нарастания

INTCON.7 = 1 ' разрешить все прерывания
'------------------------------------------- Основная программа -------------------------------------------

main:

Print At 2,2, Dec4 c

GoTo main

End ' Конец программы

Сообщение отредактировал Oleg12345 - Вс, 25.07.2010, 18:52
ЯНДЕКС Дата: 25.07.2010
chiper Дата: Вс, 25.07.2010, 19:50  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 108
Репутация: 4   ±
Замечания:   ±
На сайте с 14.07.2010

Статус: Offline

Что именно не работает? а то у меня ПК под PicbasicPro заточен, а помочь хочется!

Ну перечислю счас что у меня вызывает подозрение^

1. для начала выведите просто переменную с на дисплей без всяких там "Print At 2,2, Dec4 c"
2. вы обрываете всю программу.... у вас тупо мигает LCD.....

Code
main:     

Print At 2,2, Dec4 c     

GoTo main

По идее вся прога должна выглядеть так

Code


Device 18F4550     

Xtal 20     
LCD_Type = 0 ' Задать режим работы с алфавитно-цифровым ЖКИ     
LCD_DTPin = PORTD.4 ' Задать вывод порта к которому будет подключен вход DB4 ЖКИ     
LCD_RSPin = PORTD.2 ' Задать вывод порта с которого будет выдаваться сигнал RS на ЖКИ     
LCD_ENPin = PORTD.3 ' Задать вывод порта с которого будет выдаваться сигнал E на ЖКИ     
LCD_Interface = 4 ' Задать 4-битный режим обмена информацией для ЖКИ     
LCD_Lines = 2 ' Задать ЖКИ 4-строчный режим работы (для 2-строчных ЖКИ LCD_LINES = 2 , для 1-строчных LCD_LINES = 1)     
LCD_CommandUs = 2000 ' Задать паузу между передачей команд на ЖКИ     
LCD_DataUs = 50 ' Задать паузу между передачей данных на ЖКИ     

Dim g As Word     
Dim c As Word     
TRISB = %00000001     
TRISC = %11111010     
Output PORTC     

PORTC = 0     

c = 0     

GoTo ee    
On_Interrupt GoTo Flash ' Включить обработку аппаратных прерываний и при их возникновении перейти к метке Flash:     

     
ee:  
'---------------------------------------- Подпрограмма обработки прерываний ----------------------------------------     
Flash: ' Метка начала подпрограммы обработки прерываний     

If INTCON.1 = 0 Then c = c + 1     

     

INTCON.4 = 1 ' включить вход rb.0 int0     
INTCON2.6 = 1 ' срабатывание от спада или нарастания     

INTCON.7 = 1 ' разрешить все прерывания     
'------------------------------------------- Основная программа -------------------------------------------     

main:     

Print  c     

GoTo ee

End ' Конец программы


Как бы ты хорошо не паял, твой девайс на микроконтроллере без прошивки будет просто куском железа.
Сообщение отредактировал chiper - Вс, 25.07.2010, 19:56
Oleg12345 Дата: Вс, 25.07.2010, 19:55  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Новенький
Сообщений: 6
Репутация: 0   ±
Замечания:   ±
На сайте с 09.03.2010

Статус: Offline

прерывание вроде ловит но переполняется стёк и происходит ресет
и обнуляется переменная "с"
brown Дата: Вс, 25.07.2010, 20:01  |                                                                                                                Сообщение # 4
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 335
Репутация: 10   ±
Замечания:   ±
На сайте с 18.09.2007

Статус: Offline

Если я правильно понял ваш замысел и не путаю в INTCON, то где то так:
Code
PORTC = 0   

c = 0   
INTCON.4 = 1 ' включить вход rb.0 int0   
INTCON2.6 = 1 ' срабатывание от спада или нарастания   

INTCON.7 = 1 ' разрешить все прерывания   
On_Interrupt GoTo Flash ' Включить обработку аппаратных прерываний и при их возникновении перейти к метке Flash:   

GoTo main   

'---------------------------------------- Подпрограмма обработки прерываний ----------------------------------------   
Flash: ' Метка начала подпрограммы обработки прерываний   
INTCON = 0
   c = c + 1   
INTCON = %10010000

Context Restore

'------------------------------------------- Основная программа -------------------------------------------   

main:   

Print At 2,2, Dec4 c   

GoTo main   

End ' Конец программы   


Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
Сообщение отредактировал brown - Вс, 25.07.2010, 20:03
Oleg12345 Дата: Вс, 25.07.2010, 20:08  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Новенький
Сообщений: 6
Репутация: 0   ±
Замечания:   ±
На сайте с 09.03.2010

Статус: Offline

попробовал в протеусе ваш код
вродеработает
но потом пропадает изображение с экрана жк и в log окне появляется надпись hd44780 controller recived data whilst busy
ivan_fd Дата: Вс, 25.07.2010, 20:10  |                                                                                                                Сообщение # 6
Группа: Модераторы
Ранг:  Специалист
Сообщений: 882
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Чуток не успел.
Вот что пишет даташит.....

Quote
8.6 Внешние прерывания INT
Внешние прерывания с входов RB0/INT0, RB1/INT1 и RB2/INT2 происходит: по переднему фронту сигнала, если бит INTEDGx (регистр INTCON2) установлен в Т; по заднему фронту, если бит INTEDGx сброшен в '0'. При появлении ожидаемого фронта сигнала на входе RBx/INTx устанавливается флаг прерываний INTxF. Прерывание может быть запрещено сбросом бита INTxE. Флаг прерывания INTxF должен быть сброшен программно в обработчике прерываний, перед разрешением прерываний. Все внешние прерывания (INTO, INT1 и INT2) могут вывести микроконтроллер из режима SLEEP, если бит INTxE был установлен в '1' до перехода в режим SLEEP. Если разрешены прерывания (GIE=1), то произойдет переход по вектору прерывания.
Приоритет прерываний INT1, INT2 определяется битами INT1IP(INTCON3<6>), INT2IP(INTCON3<7>) соответственно. Обратите внимание, что внешние прерывание INTO не имеет бита приоритета. Прерывание INTO всегда с высоким приоритетом.


Меня все время преследуют умные мысли...но я быстрее!!!
Oleg12345 Дата: Вс, 25.07.2010, 20:17  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Новенький
Сообщений: 6
Репутация: 0   ±
Замечания:   ±
На сайте с 09.03.2010

Статус: Offline

суть такая хочу сделать счётчик километров при динамическом отображении на жк дисплее
назрел другой вопрос ?
как отображать данные на жк дисплее при высокой частоте входящих импульсов
ведь при передаче данных на жк требуется некоторое время
эмулирую в протеусе
при поднятии частоты выше скажем 70 герц пропадает изображение на жк

Сообщение отредактировал Oleg12345 - Вс, 25.07.2010, 20:44
brown Дата: Вс, 25.07.2010, 20:35  |                                                                                                                Сообщение # 8
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 335
Репутация: 10   ±
Замечания:   ±
На сайте с 18.09.2007

Статус: Offline

Восстановить регистры и выйти из прерывания.

Вам будет очень полезно сходить на сайт http://www.terrarus.ucoz.ru/ и найдете там ответы на многие вопросы.


Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
Oleg12345 Дата: Вс, 25.07.2010, 21:04  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Новенький
Сообщений: 6
Репутация: 0   ±
Замечания:   ±
На сайте с 09.03.2010

Статус: Offline

спосибо со всем разобрался.
chiper Дата: Вс, 25.07.2010, 23:04  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 108
Репутация: 4   ±
Замечания:   ±
На сайте с 14.07.2010

Статус: Offline

Можно конечный код в студию ?)

Как бы ты хорошо не паял, твой девайс на микроконтроллере без прошивки будет просто куском железа.
Oleg12345 Дата: Вс, 25.07.2010, 23:12  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Новенький
Сообщений: 6
Репутация: 0   ±
Замечания:   ±
На сайте с 09.03.2010

Статус: Offline

Device 18F4550

Xtal 20
LCD_Type = 0 ' Задать режим работы с алфавитно-цифровым ЖКИ
LCD_DTPin = PORTD.4 ' Задать вывод порта к которому будет подключен вход DB4 ЖКИ
LCD_RSPin = PORTD.2 ' Задать вывод порта с которого будет выдаваться сигнал RS на ЖКИ
LCD_ENPin = PORTD.3 ' Задать вывод порта с которого будет выдаваться сигнал E на ЖКИ
LCD_Interface = 4 ' Задать 4-битный режим обмена информацией для ЖКИ
LCD_Lines = 2 ' Задать ЖКИ 4-строчный режим работы (для 2-строчных ЖКИ LCD_LINES = 2 , для 1-строчных LCD_LINES = 1)
LCD_CommandUs = 2000 ' Задать паузу между передачей команд на ЖКИ
LCD_DataUs = 50 ' Задать паузу между передачей данных на ЖКИ

Dim g As Word
Dim c As Float
TRISB = %00000001
TRISC = %11111010
Output PORTC

PORTC = 0

c = 0
INTCON.4 = 1 ' включить вход rb.0 int0
INTCON2.6 = 1 ' срабатывание от спада или нарастания
INTCON.7 = 1 ' разрешить все прерывания
On_Interrupt GoTo Flash ' Включить обработку аппаратных прерываний и при их возникновении перейти к метке Flash:

GoTo main

'---------------------------------------- Подпрограмма обработки прерываний ----------------------------------------
Flash: ' Метка начала подпрограммы обработки прерываний
INTCON = 0
c = c + 0.3

INTCON = %10010000

Context Restore

'------------------------------------------- Основная программа -------------------------------------------

main:
DelayMS 50

Print At 1,1,Dec3 с
DelayMS 50
GoTo main

End ' Конец программы

на жк вылазит куча нулей

Сообщение отредактировал Oleg12345 - Вс, 25.07.2010, 23:32
Форум Picbasic.ru » Программирование МК » Proton PicBasic » прерывание (идёт переполнение стёка)
Страница 1 из 11
Поиск: