Jump to content

    

balk

Участник
  • Content Count

    29
  • Joined

  • Last visited

Everything posted by balk


  1. c инициализацией всё в порядке оказалось. нашёл в подпрограмме работы с таймером ( она участвовала в выводе информации) операцию с INTCON. после правки, всё стало на места. спасибо, уважаемые коллеги, Ваша поддержка очень помогла!
  2. похоже, что подобрался к проблеме обнаружил, что фактически ( на осциллографе) у меня не происходит принятия адреса моим слэйвом -на девятом синхроимпульсе единица. если из цикла ожидания выскочить (например , через кнопку) и попасть на пресловутые bsf GIE и PEIE, то мой слэйв оживает и начинает отвечать на адрес и принимать данные. получается , косяк в инициализации модуля ? вот код инициализации . не понимаю, что не так BANKSEL TRISC movlw b'00011111' ;RC1-RC0 -входы генератора TMR1 ;RC2 -кнопка ;RC3-RC4 -I2C movwf TRISC ;------настройка I2C --------- BANKSEL SSPCON movlw 0x36 movwf SSPCON ;установка слэйв-режима BANKSEL SSPADD movlw 0x18 movwf SSPADD; устанавливаем адрес слэйва clrf SSPSTAT ;-----настройка прерываний---------------- bsf INTCON,GIE bsf INTCON,PEIE BANKSEL PIE1 bsf PIE1,SSPIE
  3. спасибо,My504 ! Ободряющее замечание. ляпы свои убрал. тем не менее, пока ничего в голове у меня не проясняется. попробую ещё тщательно всё проверить.
  4. спасибо за ответ. в принципе , я так себе и представляю ситуацию, но , к сожалению, где-то совершаю промах. вот код модуля прерывания. в общем, всё стандартно. ;подпрограмма обработки прерывания int_SSP ;org 0x04 movf STATUS,W movwf _STAT ;сохранение статуса BANKSEL PIE1 bcf PIE1,SSPIE ;запрет прерываний BANKSEL PIR1 bcf PIR1,SSPIF ;сбросить бит прерывания от SSP BANKSEL SSPSTAT movf SSPSTAT,W ; SMP CKE D/#A P S R/#W UA BF andlw b'00101101' ;маска проверяемых битоа BANKSEL TEMP_RG movwf TEMP_RG test1 movlw 0x29 xorwf TEMP_RG,W btfss STATUS,Z ;DATA ? goto test2 StateDSWB BANKSEL SSPBUF movf SSPBUF,W movwf INDF incf FSR,F goto out test2 movlw 0x09 xorwf TEMP_RG,W btfss STATUS,Z ;ADDRESS ? goto out StateAB BANKSEL SSPBUF movf SSPBUF,W out BANKSEL PIE1 bsf PIE1,SSPIE movf _STAT,W movwf STATUS retfie для того, чтоб разобраться в ситуации, я основной модуль упростил . в итоге он выглядит не совсем реалистичным ( момент прерывания я задаю вручную, осуществляя посылку от другого устройства по i2c), но мне важно понять проблему. в пустом цикле жду прерывания. по нажатию кнопки, осуществляется некий вывод из буфера ( не показано). затем возврат. так вот без установки пресловутых GIE,PEIE почему-то дальнейшие прерывания не наблюдаются. ; .............................. clrf SSPSTAT bsf INTCON,GIE ;разрешение прерываний bsf INTCON,PEIE ;разрешение внешних прерываний BANKSEL PIE1 bsf PIE1,SSPIE wait_int ; ожидаем прерывания по i2с key_down BANKSEL PORTC ;ожидание нажатия кнопки btfsc PORTC,2 goto key_down key_up btfss PORTC,2 goto key_up VYVOD ;вывод информации ;...................... bsf INTCON,GIE ;без этих двух строк не будет прерывания bsf INTCON,PEIE ; goto `wait_int ;возврат к ожиданию
  5. не могу сообразить, что не так. есть простое устройство-слэйв на F873a . которое принимает несколько байтов от мастера и выводит их на индикатор. ловля данных происходит по прерыванию. пишу на asme и вроде всё хорошо, но напрягает момент, который не могу себе объяснить. если в основной программе не сделать повторно bsf INTCON,7 ;разрешение всех прерываний bsf INTCON,6 ;разрешение внешних прерываний , то после возвращения из прерывания в основную программу прерывания больше не возникнут. насколько я понимаю, INTCON при прерывании не изменяется, если его не трогать. Пытался этот код вписывать в модуль прерывания перед retfie, но ситуацию это не поменяло. Почему такое происходит ?
  6. про PCLATH вопрос

    спасибо Smen приятно получить развернутый ответ с изложением тонких мест.
  7. про PCLATH вопрос

    да, но я имел ввиду краткость кода при том же времени исполнения, к тому же оставляю за скобками команды, которые нужно внедрить для манипуляций с аккумулятором. Извините, здесь, должен признаться, не чувствую разницы. Был бы признателен за разъяснения и мне кажется в этом контексте уместней говорить не "загружается", а читается
  8. про MPLAB SIM вопрос

    PGD , PGC не пересекаются с D+/- , но мне это пока не нужно , поскольку хочу отработать только некоторые прерывания в коде на голом виртуальном симуляторе. Можно и продолжить разбираться . В смежной теме.
  9. про PCLATH вопрос

    Smenв смежной теме Вы предложили вернуться к PCLATH. Кстати вопрос у меня остался такой в Вашем коде movlw high table movwf PCLATH,0 используются две команды, кроме того ещё задействован регистр W, который должен передавать в таблицу вектор перехода, соответственно нужно предусматривать дополнительные манипуляции с W. В коде movff tosh,pclath addwf pcl,1,0 не нахожу ничего такого, чем бы он уступал Вашему .
  10. 18F2550, MPLAB IDE 8.92 если сымитировать отработку какого-либо прерывания в UIR, взведёт ли симулятор бит USBIF в PIR2, при всех разрешающих установках?
  11. про PCLATH вопрос

    спасибо! вопросы остаются, но свернём тему , чтоб по второму кругу не начинать.
  12. про PCLATH вопрос

    Спасибо, друзья , за ценные замечания ! всё-таки один момент мне не стал понятнее, как по команде ADDWF PCL программа перейдет на нужную RETLW, если при выполнении ADDWF произойдет запись в PCH из PCLATH, в котором адресный байт другого сегмента. ? в том то и дело , что до RETLW не доходим, а срываемся в другой сегмент. вот собственно хребет , который всё наглядно может продемонстрировать #include <p18f2550.inc> org 0 goto start nop nop nop nop org 0x20 start call module org 0x100 table addwf PCL,1,0 retlw 0x50 retlw 0xde retlw 0x62 retlw 0xc2 retlw 0xcc retlw 0xc1 module movlw 0x06 call table nop nop END после addwf программа перепрыгивает на выделенный жирным nop , а не возвращается в module.
  13. про PCLATH вопрос

    не совсем понимаю, что кроется под hight label. мой замысел был таков от строки вызова call pprog перехожу к метке pprog ( в этом же сегменте) делаю MOFF TOSH,PCLATH - записываю в PCLATH код сегмента вызывателя, чтоб потом через ADDWF PCL и соответствующий retlw вернуться именно к вызывателю, а не к вызывателю вызывателя, находящегося в другом сегменте это просто констатация того, что изображает отладчик
  14. про PCLATH вопрос

    Smen спасибо за содействие с PCLATH я пока обошелся авантюрно- перед ADDWF PCL выставил один оператор MOVFF TOSH,PCLATH и он меня спасает, если таблица и ее вызов находятся в одном сегменте. пока для простой отладки мне достаточно. PCLAT видимо, не так. адреса разные. а у PCL и PCLAT один и тот же адрес FF9, но разрядность у PCLAT 0x000000, хотя изменения почему происходят только в младшем байте. ну как водится со временем можно разобраться , если будет практическая необходимость.
  15. про PCLATH вопрос

    что такое PCH ? не нахожу в даташите на PIC18F2550 кстати, в отладчике среди SFR имеется PCLAT , тоже не понятно что это, ибо в даташите тоже не вижу, по разрядам вроде соответствует счетчику, но изменяется тоже только в пределах 256
  16. про PCLATH вопрос

    влияют вот даташит говорит, что содержимое PC транслируется в PCLATH при любом чтении PC. the upper two bytes of the program counter are transferred to PCLATH and PCLATU by an operation that reads PCL. проверьте в отладчике , если сомневаетесь.
  17. про PCLATH вопрос

    да, спасибо, как водится, пока 5 раз одно и тоже в даташите не прочитаешь, не поймешь. добавил команду MOVF PCL и увидел в PCLATH реальный сегмент адреса. тема собственно меня забеспокоила потому, что в вызове подпрограммы, которая размещается в произвольном месте присутствует еще подпрограмма с т.н. вычисляемым переходом ADDWF PCL, в результате которого у меня вместо 0318h происходит перескок на 0018h
  18. про PCLATH вопрос

    имеется asm-программа . в MPLAB IDE 8.33 запущен отладчик MPLAB SIM. двигаясь по шагам , перехожу на подпрограмму с адреса 0050 на адрес 0140. в окне WATCH наблюдаю изменение PCL на 40, а PCLATH почему-то остается в 00, хотя отладчик двигается дальше 0142.. и в PCLATH я ожидал видеть 01.
  19. всё. перенёс гнездо юсб поближе к гнезду питания. а раньше земля тянулась через всю плату транзитом через микроконтроллер. теперь норм. спасибо мастерам за дельные советы.
  20. спасибо. любопытная история. нет происходит да, сам думаю, видимо надо аккуратненько поработать с землей на плате
  21. да это не схема, а рисунок из книги Яценкова. здесь просто взята идея подачи Vbus на RB4. и это собственно не делитель (напряжения), поэтому все 5 вольт появляются на RB4. При отключенном Vbus от схемы но подключенном D+\D- сброс не происходит. Странно и то, что если вместо Vbus задействовать через кнопку само питание pic (4,9V от сетевого адаптера), то сброса тоже не происходит. разводки в серьезном смысле нет. все делается на макетной плате.
  22. приветствую имеется pic2550 (дип 28 ). из обвеса -два семисегментных индикатора для диагностики. и разъем для подключения юсб-кабеля. d+ к 16 ноге, d- к 15. земля к земле. V+ к резисторам для инициации прерывания на RB4 Проблема в том, что при подсоединении юсб-кабеля происходит сброс программы вместо ожидаемого прерывания. код RCON указывает на сброс по снижению питания и сбросу питания. сброс по снижению питания я заблокировал через регистр конфигурации BOR= OFF. все-равно происходит сброс. что можно предпринять, чтоб решить проблему?
  23. config_18f2550.pdfв общем, как всегда, вопрос решился, но теория до конца не пройдена. как-то у Микрочипа разъяснения по поводу правил записи конфигурации отсутствуют. надыбал такой файлик с мнемоникой битов конфигурации и этим пока уталил жажду знаний
  24. вообще странно в значение битого поля ,например, PLLDIV в такой форме записи CONFIG PLLDIV=6 записывается не b'110', а значение , соответствующее строке divide by 6. в такой же логике при записи CONFIG CPUDIV=3 в поле CPUDIV должно вписаться значение , соответствующее строке divide by 3, однако тарнслятор почему-ио ругается.
  25. вызывает затруднение запись в asm файле битов конфигурации например , пишу CONFIG PLLDIV=6 , транслятор пропускает а вот CONFIG CPUDIV=3 ( и любое другое значение ) пишет value not valid по сему предполагаю, что возможно , пишется для CPUDIV два числа, а как это делается ? и почему два бита в CPUDIV не могут быть записаны простым числом от 0 до 3