Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
02.10.2009, 15:30
|
|
Прописка
Регистрация: 29.09.2007
Адрес: Донецк, ????
Сообщений: 199
Сказал спасибо: 21
Сказали Спасибо 19 раз(а) в 15 сообщении(ях)
|
Проблема с PIC16F73
subj, привожу пример кода:
Код:
|
i2c_send_byte
bsf STATUS,RP0 ;bank1
bcf STATUS,RP1 ;bank1
bcf SDA_SET ; SDA - вывод
bcf SCL_SET ;SCL - на вывод
bcf STATUS,RP0 ;bank 0
bcf SCL_PIN ; SCL - 0
call i2c_wait
movlw 0x08
---------------------//--------------------------------
return; |
происходит подвисание PIC-а
после первой же команды вызванной функции(причем независимо, что это за команда, пытался подставлять разные
если попробовать заглушить функцию
Код:
|
i2c_send_byte
return; |
то выполнение функции нормально завершается и программа
идет дальше :о
Мрак какой-то никто с похожим не сталкивался???
Я уже не знаю что и думать
|
|
|
|
02.10.2009, 18:46
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.01.2005
Адрес: Воронеж
Сообщений: 1,384
Сказал спасибо: 24
Сказали Спасибо 243 раз(а) в 182 сообщении(ях)
|
Re: Проблема с PIC16F73
С этим МК плотно не работал но что то с банками мудрено.
|
|
|
|
02.10.2009, 19:25
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,530
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
|
Re: Проблема с PIC16F73
Это чисто программная ошибка. Копайте свою прогу или приводите здесь весь текст.
|
|
|
|
02.10.2009, 19:55
|
|
Прописка
Регистрация: 29.09.2007
Адрес: Донецк, ????
Сообщений: 199
Сказал спасибо: 21
Сказали Спасибо 19 раз(а) в 15 сообщении(ях)
|
Re: Проблема с PIC16F73
Цитата:
|
Это чисто программная ошибка. Копайте свою прогу или приводите здесь весь текст.
|
Все бы было ничего, но виснет даже на совсем невинных
командах типа:
bsf STATUS,RP0 ;
причем сразу же после захода в функцию, т.е.
даже банк переключить не могу :о
Часть кода: (причем первые три функции работают нормально)
Код:
|
i2c_init
bsf STATUS,RP0 ;bank1
bcf STATUS,RP1
bcf SDA_SET ;SDA - сначала на вывод данных
bcf SCL_SET ;SCL - тоже
bcf STATUS,RP0 ; set file register bank to 0
bcf SCL_PIN ;SCL - низкий уровень
bsf SDA_PIN
call i2c_wait
bsf SCL_PIN ;SCL - высокий уровень
call i2c_wait
bcf SDA_PIN ;инициируем нисходящий фронт
call i2c_wait
bcf SCL_PIN ;SCL - низкий уровень
return;
i2c_close
bsf STATUS,RP0 ;bank1
bcf STATUS,RP1
bcf SDA_SET ;SDA - сначала на вывод данных
bcf SCL_SET ;SCL - тоже
bcf STATUS,RP0 ;bank 0
bcf SDA_PIN
bsf SCL_PIN
call i2c_wait
bsf SDA_PIN ;инициируем восходящий фронт
return;
i2c_wait
nop
return;
movlw 0x02
; movlw 0x32
movwf i2c_count
wait nop
decfsz i2c_count,1
goto wait
return;
i2c_send_byte
bsf STATUS,RP0 ;bank1
bcf STATUS,RP1
btfsc SDA_SET
bcf SDA_SET ; SDA - вывод
btfsc SCL_SET
bcf SCL_SET ;SCL - на вывод
bcf STATUS,RP0 ;bank 0
bcf SCL_PIN ; SCL - 0
call i2c_wait
movlw 0x08
movwf i2c_tmp
send_bit
bcf STATUS,RP0 ;bank 0
bcf STATUS,RP1
btfsc i2c_byte,7 ; бит данных - 0?
bsf SDA_PIN ; нет,выводим 1 на SDA
bsf STATUS,RP0 ;bank1
bcf STATUS,RP1
bsf SCL_SET ;SCL - на вход!!!
;; bcf STATUS,RP0 ;bank0
;; bcf STATUS,RP1
;; bsf SCL_PIN ; нет,выводим 1 на SCL
get_scl_write btfss SCL_PIN ; и ожидаем, пока ведомое устройство не попустит :)
goto get_scl_write
; попустило :)))
call i2c_wait ; ждем-ссс
rlf i2c_byte,1 ; сдвигаем влево байт данных
bsf STATUS,RP0 ;bank1
bcf STATUS,RP1
bcf SCL_SET ;SCL - на выход
bcf STATUS,RP0 ;bank 0
bcf STATUS,RP1
bcf SCL_PIN ; выводим 0 на SCL
bcf SDA_PIN ; выводим 0 на SDA
call i2c_wait
decfsz i2c_tmp,1 ; конец цикла ?
goto send_bit ; нет - переход
bsf STATUS,RP0 ;bank1
bcf STATUS,RP1
bsf SDA_SET ; SDA - ввод
bsf SCL_SET ;SCL - на вход!!!
bcf STATUS,RP0 ;bank 0
get_scl_ack btfss SCL_PIN ; ожидаем подтверждения SCL!!!
goto get_scl_ack
get_ack btfsc SDA_PIN ; читаем АСК, и идем дальше
nop
; goto get_ack ; или что нить делаем... (т.е. ожидаем подтверждения ACK :)
call i2c_wait
bsf STATUS,RP0 ;bank1
bcf STATUS,RP1
bcf SCL_SET ;SCL - на выход
bcf STATUS,RP0 ;bank 0
bcf SCL_PIN ; выводим 0 на SCL
bcf SDA_PIN ; выводим 0 на SDA
call i2c_wait
return; |
|
|
|
|
03.10.2009, 01:33
|
|
Прописка
Регистрация: 25.11.2006
Адрес: Харьков
Сообщений: 295
Сказал спасибо: 25
Сказали Спасибо 71 раз(а) в 60 сообщении(ях)
|
Re: Проблема с PIC16F73
А чем Вы видите, на каких командах "виснет"?
|
|
|
|
03.10.2009, 09:43
|
|
Прописка
Регистрация: 29.09.2007
Адрес: Донецк, ????
Сообщений: 199
Сказал спасибо: 21
Сказали Спасибо 19 раз(а) в 15 сообщении(ях)
|
Re: Проблема с PIC16F73
Подставляю некое видимое действие, например вывод в
порт, сконфигурированный на вывод определенного
значения до вызова функции (нормально проходит)
и в самой функции (не работает даже если стоит в самом начале)
Если функцию заглушить, то после выхода из нее
вывод проходит тоже нормально :о
|
|
|
|
03.10.2009, 10:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.01.2005
Адрес: Воронеж
Сообщений: 1,384
Сказал спасибо: 24
Сказали Спасибо 243 раз(а) в 182 сообщении(ях)
|
Re: Проблема с PIC16F73
А почему вы Mplab не пользуете или симулятор для наглядности?
|
|
|
|
03.10.2009, 12:11
|
|
Прописка
Регистрация: 29.09.2007
Адрес: Донецк, ????
Сообщений: 199
Сказал спасибо: 21
Сказали Спасибо 19 раз(а) в 15 сообщении(ях)
|
Re: Проблема с PIC16F73
Mplab пользовал, но в нем-то как раз все проходит
без сучка и задоринки в отличие от реала
|
|
|
|
03.10.2009, 18:21
|
|
Временная регистрация
Регистрация: 09.06.2006
Адрес: Lugansk
Сообщений: 75
Сказал спасибо: 0
Сказали Спасибо 26 раз(а) в 21 сообщении(ях)
|
Re: Проблема с PIC16F73
Ожидать внешнее событие без выхода по таймауту - плохой тон программирования,
если событие по какимто причинам не произошло то программа как-бы "зависнет"
Пример из Вашего кода
Код:
|
get_scl_write btfss SCL_PIN ; и ожидаем, пока ведомое устройство не попустит :)
goto get_scl_write |
Если ведомое устройство не "попустило" то программа будет вечно ждать.
Правильно сделать ожидание в течении некоторого времени, и если устройство в этот период не ответило, выставлять флаг ошибки переферийного устройства и выходить из функции.
|
|
|
|
03.10.2009, 19:54
|
|
Прописка
Регистрация: 29.09.2007
Адрес: Донецк, ????
Сообщений: 199
Сказал спасибо: 21
Сказали Спасибо 19 раз(а) в 15 сообщении(ях)
|
Re: Проблема с PIC16F73
Цитата:
|
Ожидать внешнее событие без выхода по таймауту - плохой тон программирования,
если событие по какимто причинам не произошло то программа как-бы "зависнет"
|
Это понятно
В этом случае проц будет сброшен по WDT
Тем более, что зависание происходит не там (пробовал убирать
этот цикл а буквально в первой строчке функции.
P.S. На другом PIC-е этот же код отлично функционирует
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:58.
|
|