|
Прерывание на С, для Keil |
|
|
|
Oct 31 2005, 05:47
|

инженер
   
Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701

|
Цитата(Regbist @ Oct 31 2005, 00:01) Народ, я написал обработчик прерываний для com порта, используя Keil/ А как мне вызвать эти прерывание в программе? Прерывания вызываются не в программе. По приходу события - запроса прерывания от источника прерываний вызывается подпрограмма обработки прерывания. В Вашем случае может быть 2 прерывания, свидетельствующие о завершении операции передачи информации по последовательному порту, и о завершении операции приема информации. Фоновая программа с другими вычислениями выполняется параллельно процессу приема/передачи (точнее квазипараллельно). Поэтому синхронизацию фоновой программы с подпрограммой обработки прерывания ("...потом "Бац" и мне приходит команда по компорту,которую надо обработать и понять что это за команда,остановив при этом вычисления...."), равно как и обмен данными ("...и как я узнаю, что мне чтото пришло по компорту...") нужно "ручками", т.е. самим программировать. Вообще то в Вашем случае  , уважаемая наша молодежь, нужно с книг начинать. Можно вот эти, хотя бы 1. Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT. – М.: “Финансы и статистика”, 1991. 2. Фролов А.В., Фролов Г.В. Аппаратное обеспечение компьютера IBM PC. – М.: “Диалог-МИФИ”, книги 1-2, 1992. (Библиотека системного программиста; Т. 2). 3. Фролов А.В., Фролов Г.В. Программирование модемов. – М.: “Диалог-МИФИ”, 1993. (Библиотека системного программиста; Т. 4). 4. Густав Олссон, Джангуидо Пиани. Цифровые системы автоматизации и управления.- С.Петербург: “Невский диалект”, 2001. Если у Вас уж очень серьезная необходимость, а книг нет - то могу выложить в этой ветке (кроме Джордейна).
|
|
|
|
|
Oct 31 2005, 09:52
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Regbist @ Oct 30 2005, 23:01) ....я написал обработчик прерываний для com порта.....А как мне вызвать эти прерывание в программе?...... Если разрешены прерывания по COM порту, то прерывание вызоветься автоматически по приходу (или отсылки - в зависимости от настроек разрешения) байта в(из) порта. Если требуеться передать в основной цикл нечто, то делают (обычно) буффер приёма (к примеру) и в него кидают принятый байт. В основном цикле проверяют данный буффер. Если в нём нечто есть - читаем и освобождаем в буфере место... То же самое и на передачу мона делать, только направление обратное... записываем, проверяем на активность обработчик, запускаем если спит, прерывание отработало (передался байтик), взяли очередной из буффера, очистили место в буффере, закинули в COM. Или вот ышо вариант... Приходящий байтик по COM порту вываливаем на шинку порта. Тут буфером никаким не пахнет. Единственный нюанс (как и везде) - заботиться о сохранности регистров проца. Ведь если Вы заюзали регистр "a" (к примеру) - то нуна сохранить старое значение. Сохранить мона либо на стэке, либо в ячейке памяти. удачи Вам (круглый)
|
|
|
|
|
Dec 13 2005, 13:16
|
Частый гость
 
Группа: Свой
Сообщений: 123
Регистрация: 13-12-05
Из: Украина, Тернополь
Пользователь №: 12 161

|
Цитата(Regbist @ Oct 30 2005, 23:01)  Народ, я написал обработчик прерываний для com порта, используя Keil/ А как мне вызвать эти прерывание в программе? к примеру задача такая: я выполняю какие то операции в контроллере , затем мне надо всё остановить и передеть по com порту, 1. Включаеш режым дебагера (CTRL+F5) 2. Ставиш брекпоинт в начале обработчика перериваний (Debug - Insert/Remove Breakpoint) 3. Запускаєшь на исполнение (F5) В случае если биты ЕА и ЕS равны 1 после комманды SBUF=... (через определенное количество операций) твоя программа должна остановится на брекпоинте. Цитата(Regbist @ Oct 30 2005, 23:01)  затем опять начать считать что то в контроллере,либо котроллер что то считает , потом "Бац" и мне приходит команда по компорту,которую надо обработать и понять что это за команда,остановив при этом вычисления. 1. Включаеш режым дебагера (CTRL+F5) 2. Ставиш брекпоинт в начале обработчика перериваний (Debug - Insert/Remove Breakpoint) 3. Запускаєшь на исполнение (F5) Для проверки обработчика на прием необходимо в окне Watch открыть переменные SBUF и RI, присваиваешь SBUF нужное значение затем присваиваешь RI 1 и программа останавливается на брек поинте. Не забудь в конце обработчика програмно сбросить флаги ТI и RI
|
|
|
|
|
Dec 14 2005, 08:51
|

Профессионал
    
Группа: Свой
Сообщений: 1 195
Регистрация: 26-07-05
Из: Санкт-Петербург
Пользователь №: 7 111

|
Цитата(Vic1 @ Oct 31 2005, 08:47)  Вообще то в Вашем случае  , уважаемая наша молодежь, нужно с книг начинать. Можно вот эти, хотя бы 1. Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT. – М.: “Финансы и статистика”, 1991. 2. Фролов А.В., Фролов Г.В. Аппаратное обеспечение компьютера IBM PC. – М.: “Диалог-МИФИ”, книги 1-2, 1992. (Библиотека системного программиста; Т. 2). 3. Фролов А.В., Фролов Г.В. Программирование модемов. – М.: “Диалог-МИФИ”, 1993. (Библиотека системного программиста; Т. 4). 4. Густав Олссон, Джангуидо Пиани. Цифровые системы автоматизации и управления.- С.Петербург: “Невский диалект”, 2001. Если у Вас уж очень серьезная необходимость, а книг нет - то могу выложить в этой ветке (кроме Джордейна). Очень бы хотелось почитать что-нибудь о прерываниях на русском языке, желательно с примерами на ЯП Си. У меня по Си есть книги, но, к сожалению, в них про прерывания не сказано почти ничего. Наверное не то читаю...
|
|
|
|
|
Dec 14 2005, 12:47
|

инженер
   
Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701

|
Цитата(san822 @ Dec 14 2005, 12:51)  Цитата(Vic1 @ Oct 31 2005, 08:47)  Вообще то в Вашем случае  , уважаемая наша молодежь, нужно с книг начинать. Можно вот эти, хотя бы 1. Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT. – М.: “Финансы и статистика”, 1991. 2. Фролов А.В., Фролов Г.В. Аппаратное обеспечение компьютера IBM PC. – М.: “Диалог-МИФИ”, книги 1-2, 1992. (Библиотека системного программиста; Т. 2). 3. Фролов А.В., Фролов Г.В. Программирование модемов. – М.: “Диалог-МИФИ”, 1993. (Библиотека системного программиста; Т. 4). 4. Густав Олссон, Джангуидо Пиани. Цифровые системы автоматизации и управления.- С.Петербург: “Невский диалект”, 2001. Если у Вас уж очень серьезная необходимость, а книг нет - то могу выложить в этой ветке (кроме Джордейна). Очень бы хотелось почитать что-нибудь о прерываниях на русском языке, желательно с примерами на ЯП Си. У меня по Си есть книги, но, к сожалению, в них про прерывания не сказано почти ничего. Наверное не то читаю... Теоретически, для чего нужны прерывания - см. 2 главу [4] Практически на примерах программирования на Си для IBM PC AT - глава из [2]. Последний файл - это материал из моих старых лекций (давно электронный вариант не обновляла, рассказываю студентам уже немного по другому и естеств., с примерами) А дальше уже смотрите свою док. на используемый контроллер (принципы организации прерываний) и компилятор Си (ключевые слова типа interrupt, функции установки векторов прерываний и маскирования).
Прикрепленные файлы
olson1.zip ( 2.33 мегабайт )
Кол-во скачиваний: 52
ch2.htm ( 80.12 килобайт )
Кол-во скачиваний: 68
lec.doc ( 34 килобайт )
Кол-во скачиваний: 356
|
|
|
|
|
Dec 23 2005, 14:21
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Karol @ Oct 21 2005, 07:53)  Какое время отклика на прерывание следует ожидать у LPCxx ? По моим наблюдениям отклик на внешнее прерывание, SPI и I2C в области микросекунд. Программа на Кейл Ц во внешней RAM. Время отклика в первую очередь зависит от приоритета прерывания и далее от частоты кварца, настроек PLL, частоты периферийной шины... переход на обработчик FIQ LPC (в Keil) в области наносекунд (завершение текущей команды, сохранение в стек адреса возврата и переход по адресу FIQ), IRQ векторные - медленнее, а безвекторные могут откликаться, как Вы и говорите, в области микросекунд, т.к. могут откладываться до завершения обработки всех активных более высокоприоритетных прерываний плюс имеют дополнительный тормоз - потребность в программном определении источника прерывания. Реакция на прерывание не зависит от источника, будь-то внешний источник или внутренний, главное в какой слот записан вектор обработчика.
|
|
|
|
|
Dec 29 2005, 10:44
|
Участник

Группа: Новичок
Сообщений: 20
Регистрация: 8-09-05
Пользователь №: 8 357

|
здрасте!!! это снова я, и снова с прерываниями  теперь проблема такая. написал обработчик прерывания по com порту для микроконтроллера (DS80c400) в кейле,но при компиляции проекта прроисходит наложение адресов. #memory space overlap from c:400023h to c:400027h#. как мне избавиться от этого? ещё такие особенности заметил при эксперименте с этим делом  если для етого контроллера компилировать проект для его пошагового исполния в эмуляторе кейловском, то всё нормально компилируется, если же подгружать файл startup.a51(необходииый для загрузки в железо), то как раз происходит вышеуказанная путаница.... наверно я один из студентов разбираюсь с железяками в такое время, когда все остальные уже начали отмечать НГ  ))) всем удачи и с наступающим
|
|
|
|
|
Jan 10 2006, 13:03
|
Участник

Группа: Новичок
Сообщений: 20
Регистрация: 8-09-05
Пользователь №: 8 357

|
UP!!
|
|
|
|
|
Jan 11 2006, 19:12
|
Частый гость
 
Группа: Свой
Сообщений: 123
Регистрация: 13-12-05
Из: Украина, Тернополь
Пользователь №: 12 161

|
Цитата(Regbist @ Dec 29 2005, 14:44)  написал обработчик прерывания по com порту для микроконтроллера (DS80c400) в кейле,но при компиляции проекта прроисходит наложение адресов. #memory space overlap from c:400023h to c:400027h#. как мне избавиться от этого? ещё такие особенности заметил при эксперименте с этим делом  если для етого контроллера компилировать проект для его пошагового исполния в эмуляторе кейловском, то всё нормально компилируется, если же подгружать файл startup.a51(необходииый для загрузки в железо), то как раз происходит вышеуказанная путаница.... Попробуй подгружать не startup.a51 а start390.a51 из ...Keil\C51\EXAMPLES\Dallas 390\C (я прицел его к етому сообщению) Извиняюсь, почемуто файл с расширением A51 не цепляется (смотри предыдущее сообщение). Поетому пришлось переименовать в ТХТ (смотри атачмент).
|
|
|
|
|
Jan 26 2006, 20:32
|
Частый гость
 
Группа: Свой
Сообщений: 123
Регистрация: 13-12-05
Из: Украина, Тернополь
Пользователь №: 12 161

|
Цитата(Regbist @ Jan 26 2006, 23:40)  я подгружал файл startup400.a51 и startup390.a51 ошибка такая же  (( может в настройках Keila надо сделать что то ? пока разбираюсь с файлом startup400.a51, может там кроется истина  Выложи здесь обработчик прерываний, может с ним чтото не так. Попробуй в startup400.a51 отключить ненужные опции (следуй операторам IF ELSE) и рано или позно найдеш что тебе мешает (хотя я лично не вижу что ето может быть).
|
|
|
|
|
Feb 16 2006, 08:43
|
Участник

Группа: Свой
Сообщений: 25
Регистрация: 2-02-06
Пользователь №: 13 904

|
Адрес code:27h - это адрес вектора прерывания serial0. Очевидно у тебя два обработчика прерывания на этот порт (interrupt 4)
Но самое главное - бросай этот процесоор. Он не приспособлен для написания больших программ (с размером кода больне 64К) - просто не хватает сегмена data для автоматических переменных (туда помещаются аргументы функций и переменные внутри функция). Те, кто используют для этих целей сегмент xdata/hdata - извращенцы. И прочих дыр там полно - загрузчик, таймеры, выборка периферии.
Для проектов с размером коа меньше 64К Используй AVRMega, для большего - ARM7
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|