|
|
  |
PIC12F629 & MPLAB на симуляторе работает, а при, прошивке не работает |
|
|
|
Jan 7 2011, 17:28
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 6-12-07
Из: Рига, Латвия
Пользователь №: 33 036

|
Цитата(xemul @ Jan 5 2011, 20:44)  Проверьте, не затерся ли байт калибровки внутреннего генератора. Прочитайте память контроллера, по адресу 0x3fe должно быть 0x34xx. Чтобы исключить проказы компилятора, которым Вы пользуетесь, в аттаче два хекса, собранных по последнему сорцу разными версиями. Чтобы исключить предупреждения программатора, в конфиге замаскированы неиспользуемые биты. Код __CONFIG(WDTDIS & UNPROTECT & INTIO & MCLRDIS & 0x31ff); [attachment=51778:test.zip] Да, если не будет в конце памяти программ инструкции "retlw" с константой, а она в данном случае не причем, то код будет циклиться в начале стартапа. Обойти это - поможет не вызывать функцию 0x3ff. Я перекомпилил код выше без вызова функции. Естественно генератор будет уже некалиброванным, что на самом деле не страшно.  В догонку вот что получилось при компилировании: Код list p=12F629 ; list directive to define processor #include <p12F629.inc> ; processor specific variable definitions
errorlevel -302 ; suppress message 302 from list file
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
org 0 GOTO L00F
org 4 MOVWF 0x5e ; save W MOVF STATUS,W BCF STATUS,RP0 MOVWF 0x20 ; save STATUS MOVF FSR,W MOVWF 0x21 ; save FSR MOVF PCLATH,W MOVWF 0x22 ; save PCLATH MOVF 0x5f,W MOVWF 0x23 GOTO L034 ; jump to int overlay L00F BSF STATUS,RP0 ; CALL 0x3ff ; get calibration value ; MOVWF OSCCAL ; save CLRF STATUS GOTO L050 L014 MOVLW 0xc ; GPPU<<1|INTEDG<<1 BSF STATUS,RP0 MOVWF OPTION_REG MOVLW 0x20 MOVWF INTCON ; T0IE<<1 MOVLW 0x8 MOVWF TRISIO ; xx00 1000 MOVLW 0x7 BCF STATUS,RP0 MOVWF CMCON ; set 0..2 pin as digio MOVLW 0xff MOVWF GPIO ; xx11 1111 BSF INTCON,GIE ; sei L021 MOVLW 0x2 BCF STATUS,RP0 MOVWF 0x26 MOVLW 0x03 MOVWF 0x25 MOVLW 0xba MOVWF 0x24 L028 ; delay overlay init 0x0203ba DECFSZ 0x24,F GOTO L028 DECFSZ 0x25,F GOTO L028 DECFSZ 0x26,F GOTO L028 BCF STATUS,RP0 COMF GPIO,F ; toggle pins NOP GOTO L021 GOTO L021 GOTO L00F L034 BTFSS INTCON,T0IE ; TMR0 enabled ? GOTO L037 ; GOTO L038 ; TMR0 Int enabled L037 GOTO L045 ; no, resume int L038 BTFSS INTCON,T0IF ; int req from TMR0 overflow ? GOTO L03B ; no, resume int GOTO L03C L03B GOTO L045 ; restore content L03C BCF INTCON,T0IF ; clear flag MOVLW 0x1 ADDWF 0x27,F ; low tick_count BTFSC STATUS,C INCF 0x28,F MOVLW 0 ADDWF 0x28,F ; high tick_count GOTO L045 GOTO L045 L045 MOVF 0x23,W MOVWF 0x5f MOVF 0x22,W ; restore PCLATH MOVWF PCLATH MOVF 0x21,W MOVWF FSR ; restore FSR MOVF 0x20,W MOVWF STATUS ; restore STATUS SWAPF 0x5e,F SWAPF 0x5e,W ; restore W RETFIE L050 CLRF 0x29 CLRF 0x27 CLRF 0x28 CLRF STATUS GOTO L014
end
Сообщение отредактировал Дмитрий Ветра - Jan 7 2011, 17:21
|
|
|
|
|
Jan 9 2011, 05:01
|
Местный
  
Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006

|
Цитата(xemul @ Jan 6 2011, 16:28)  - взять новый контроллер, а запиленный прибить гвоздём на видном месте. Неа проще взять PciKit2 и восстановить константу.
|
|
|
|
|
Jan 11 2011, 09:42
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(skyled @ Jan 11 2011, 12:20)  Вот такая вот ошибка в т.ч. и в случае с перекомпиленным. Что бы это значило? Да что угодно - хардварные проблемы в программаторе (н-р, Vpp не держится), софтовые от и до. Если есть время и желание - разбирайтесь. А лучше закажите PicKit2'образное (я и забыл про него, спасибо DL36).
|
|
|
|
|
Jan 11 2011, 12:36
|
Местный
  
Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868

|
http://www.qrz.ru/schemes/contribute/constr/extra-pic/ Вот этим пользуюсь. 12 В держится, но в процессе светодиод помигивает. Это должно так быть? Пробовал шить - проблемы с нулевым адресом на всех файлах и двух платах. Код А лучше закажите PicKit2'образное Да вот хочу на PIC18F2550 PicKit2-образное собрать, но тотже PIC надо чем-то шить
|
|
|
|
|
Jan 12 2011, 05:27
|
Местный
  
Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868

|
Цитата хардварные проблемы в программаторе Ну вобщем так и вышло. Только проблема не в программаторе была, а в целевом устройстве. К выв. 6 и 7 были подключены входы микросхемы ULN2003. Выпаял и все заработало как по маслу. Собственно в связи с этим вопрос. В даташите есть упоминание о резисторах между выводами программирования и остальной схемой, но нет упоминания про их номинал (или смотрел плохо). В ULN2003 стоит 2,7 кОм. Это мало?
|
|
|
|
|
Jan 12 2011, 09:33
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(skyled @ Jan 12 2011, 11:27)  Ну вобщем так и вышло. Только проблема не в программаторе была, а в целевом устройстве. К выв. 6 и 7 были подключены входы микросхемы ULN2003. Выпаял и все заработало как по маслу. Собственно в связи с этим вопрос. В даташите есть упоминание о резисторах между выводами программирования и остальной схемой, но нет упоминания про их номинал (или смотрел плохо). В ULN2003 стоит 2,7 кОм. Это мало? Странно это. 2.7 кОм по PGD, PGC было достаточно любому программатору/отладчику, которыми мне доводилось пользоваться. Могу предположить только, что 1533ЛА3 на 2.7 кОм не обеспечивает VIH1 (CLOCK, DATA) input high level >= 0.8 VDD (при программировании PGD, PGC на вход работают триггерами Шмитта с порогами 0.2 и 0.8 VDD). Если есть возможность, попробуйте заменить её на КМОП аналог типа 74AC(T)00. Кста, в списке поддерживаемых этим программатором PIC18F2550/4550 отсутствуют (это я про сборку пиккит2). И не нравится мне неотключаемое Vcc, но, наверное, это фича всех подобных программаторов.
|
|
|
|
|
Feb 4 2011, 10:10
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 6-12-07
Из: Рига, Латвия
Пользователь №: 33 036

|
Цитата(smk @ Feb 3 2011, 22:30)  Калибровочное слово я знаю уже. Дело действительно именно в нем. по совету сменить программатор собрал PicKit2 Если я записываю им hex из MPLAB, то калибровочное слово теряется и контроллер не работает (не тактируется? или с чем это связано?). Если я в программе PicKit2 v2.52 с помощью нового программатора сначала определяю это калибровочное слово, а потом прошиваю hex то все работает. При повторном программировании из MPLAB опять не работает. Кстати последний раз не удалось восстановить калибровочное слово программатором. Попыток было несколько. Хорошо, что записал на бумажке.Ввел вручную - заработало. Как сделать так чтобы MPLAB не сносила єто слово и можно было программировать из нее. Для чего нужна строка OSCCAL = _READ_OSCCAL_DATA(); и в каком месте программы она должна быть? Спасибо. Эта строка (функция) как раз то и читает калибровочное слово из памяти PIC. Если по адресу нахожднения калибровочного слова не будет инструкции RETLW, то не будет возврата из функции _READ_OSCCAL_DATA(), а это означает, что программа будет крутитьтся в начале инициализации вечно.  Когда MPLAB сносит (стирает) константу, вместо RETLW там будет пустая ячейка, что интерпретируется как инструкция ADDWF. Код CALL 0x3ff ; get calibration value MOVWF OSCCAL ; save
|
|
|
|
|
Feb 4 2011, 11:41
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(smk @ Feb 3 2011, 23:30)  Калибровочное слово я знаю уже. Дело действительно именно в нем. по совету сменить программатор собрал PicKit2 Если я записываю им hex из MPLAB, то калибровочное слово теряется и контроллер не работает (не тактируется? или с чем это связано?). Если я в программе PicKit2 v2.52 с помощью нового программатора сначала определяю это калибровочное слово, а потом прошиваю hex то все работает. При повторном программировании из MPLAB опять не работает. Кстати последний раз не удалось восстановить калибровочное слово программатором. Попыток было несколько. Хорошо, что записал на бумажке.Ввел вручную - заработало. Как сделать так чтобы MPLAB не сносила єто слово и можно было программировать из нее. Programmer->Settings->Calibration memory Чтобы использовалась заводская калибровка (или то, что уже записано), снимите галку "Allow to program Calibration memory" Чтобы записать своё значение, поставьте галку и задайте "New Value". 0x80 соответствует середине калибровочного интервала. Цитата Для чего нужна строка OSCCAL = _READ_OSCCAL_DATA(); и в каком месте программы она должна быть? Спасибо. Project->Build Options->Project->Linker Установленная галка "Calibrate oscillator" всё сделает за Вас (в прологе, до старта main(); см. startup.lst в папке проекта). Можете задать своё значение в поле "Alternate oscillator calibration value". Для использования заводской калибровки поле нужно очистить. Если же хочется всё сделать самому, снимите галку и вставьте OSCCAL = _READ_OSCCAL_DATA(); в прогу там, где хочется. Если такой галки нет, обновите UniversalToolSuite. Можно ещё почитать .chm к MPLab'у и программатору, manual.pdf к компилятору и помедитировать в симуляторе.
|
|
|
|
|
Feb 4 2011, 15:46
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата Programmer->Settings->Calibration memory
Вот такого у меня нет. Цитата Project->Build Options->Project->Linker Установленная галка "Calibrate oscillator" всё сделает за Вас
Такая галка есть, но она установлена и поле пустое. Почему ничего не происходит?
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Feb 4 2011, 18:05
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(smk @ Feb 4 2011, 18:46)  Вот такого у меня нет. Версия MPLab какая? UPD сейчас добавил поддержку PICKit2 (ну нет у меня его) - действительно в настройках программатора в MPLab никаких упоминаний об OSCCAL. Посмотрите "\Program Files\Microchip\MPLAB IDE\PICkit 2\hlpPICkit2.chm" - там описывается какая-то оболочка для PICKit2, и в её опциях поминается OSCCAL. Цитата Такая галка есть, но она установлена и поле пустое. Почему ничего не происходит? Значит на компилятор можно не грешить. Проверьте на всякий случай: - на закладке Linker поле Debugger установлено в Auto; - при компиляции с включённым симулятором последнее слово в памяти программ должно получаться 0x3400, с выключенной отладкой - 0x3fff.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|