14.06.2013, 13:49
|
|
Вид на жительство
Регистрация: 29.03.2009
Адрес: Бровары, Украина
Сообщений: 326
Сказал спасибо: 1,397
Сказали Спасибо 82 раз(а) в 46 сообщении(ях)
|
Глюк компилятора? или мозгов?
Добрый день,
Немного разбираюсь в программировании PIC на ассемблере, хочу изучить С.
Пациент: PIC12F675
Собственно проблемка:
написана простейшая программа: на выводы 0, 1, 2 выведен компаратор, а сигнал на 5 соответствует сигналу 4. примитивнейший пример.
проект компилится, в протеусе емуляция проходит, все четенько. А вот при прошивке реального контроллера - такое впечатление, что не меняется даже TRISIO, ничего не работает.
Вот текст тестовой программы:
Код:
|
#include ‹pic.h›
//PIC12F675
__CONFIG(INTIO & WDTDIS & PWRTDIS & BORDIS & MCLRDIS & UNPROTECT & UNPROTECT);
#define knopka GPIO3 // кнопка
#define diod GPIO5 // светодиод
#define vkl GPIO4
void preset (void)
{
STATUS = 0b00000000;
INTCON = 0b00000000; // чистим регистр прерываний
CMCON = 0b00000001; // вкл.компаратора
ADCON0 = 0b00000000; //откл.АЦП
ANSEL = 0b00000011; //вкл.аналог.входи
TRISIO = 0b011011; // направление работы ножек
}
void main (void)
{
preset();
while(1)
{
diod=vkl;
}
} |
Ради интереса - эту же програмку я переписал на ассембдере. Вот она:
Код:
|
; PIC12F675
====================================
LIST p=12F675 ; контроллер.
__CONFIG b'11000110000100'
;================================================= ========; Визначення регістрів.
Status equ 03h ; Вибір банку.
Intcon equ 0Bh
Cmcon equ 19h
Adcon0 equ 1Fh
Ansel equ 1Fh
Trisio equ 05h
Gpio equ 05h
;================================================= ======== org 0 ; Початок програми з адреси 0 PC.
goto Init ; Перехід в ПП Start.
;************************************************* ********Init
clrf Status
clrf Intcon
movlw b'00000001'
movwf Cmcon
clrf Adcon0
bsf Status,5
movlw b'00000011'
movwf Ansel
movlw b'00011011'
movwf Trisio
bcf Status,5
Start
btfss Gpio,4
goto offled
bsf Gpio,5
goto Start
offled bcf Gpio,5
goto Start
;************************************************* *******
end ; Кінець. |
Тоесть, то же самое. в протеусе работает так-же. и самое главное - работает на железе.
я решил дизассемблировать полченные *.hex-ы
Это - из программы на ассемблере:
Код:
|
; original File = D:\MPLab\C_test\ASM\Random.HEX
processor 12F675
#include ‹P12F675.INC›
__config 0x3184
; _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF
; & _INTRC_OSC_NOCLKOUT
; Program
Org 0x0000
; Reset-Vector
GOTO LADR_0x0001
LADR_0x0001
CLRF STATUS
CLRF INTCON
MOVLW 0x01 ; b'00000001' d'001'
; Interrupt-Vector
MOVWF CMCON ; !!Bank!! CMCON - VRCON
CLRF ADCON0 ; !!Bank!! ADCON0 - ANSEL
BSF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
MOVLW 0x03 ; b'00000011' d'003'
MOVWF ADCON0 ; !!Bank!! ADCON0 - ANSEL
MOVLW 0x1B ; b'00011011' d'027'
MOVWF GPIO ; !!Bank!! GPIO - TRISIO
BCF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
LADR_0x000C
BTFSS GPIO,4 ; !!Bank!! GPIO - TRISIO
GOTO LADR_0x0010
BSF GPIO,5 ; !!Bank!! GPIO - TRISIO
GOTO LADR_0x000C
LADR_0x0010
BCF GPIO,5 ; !!Bank!! GPIO - TRISIO
GOTO LADR_0x000C
End |
Почти оригинал.
А вот - дизасемблирована прошивка, сделанная С-компилятором:
Код:
|
; original File = D:\MPLab\C_test\Test.hex
processor 12F675
#include ‹P12F675.INC›
__config 0x3F94
; _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF
; & _INTRC_OSC_NOCLKOUT
; Program
Org 0x0000
; Reset-Vector
BSF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
CALL LADR_0x03FF
MOVWF T1CON ; !!Bank!! T1CON - OSCCAL
CLRF STATUS
; Interrupt-Vector
GOTO LADR_0x03F8
Org 0x03F8
LADR_0x03F8
BCF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BTFSS GPIO,4 ; !!Bank!! GPIO - TRISIO
GOTO LADR_0x03FD
BSF GPIO,5 ; !!Bank!! GPIO - TRISIO
GOTO LADR_0x03F8
LADR_0x03FD
BCF GPIO,5 ; !!Bank!! GPIO - TRISIO
GOTO LADR_0x03F8
End |
повторюс. в протеусе он работает, в железе - нет
В чем может быть дело?
еще меня смущает этот врагмент:
Код:
|
; Reset-Vector
BSF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
CALL LADR_0x03FF
MOVWF T1CON ; !!Bank!! T1CON - OSCCAL
CLRF STATUS
; Interrupt-Vector
GOTO LADR_0x03F8
Org 0x03F8 |
в частности вызов адреса 03FF и запись чего-то в OSCCAL
Помогите, пожалуйста, решить проблему
|
|
|
|
14.06.2013, 15:40
|
|
Гражданин KAZUS.RU
Регистрация: 05.04.2009
Сообщений: 976
Сказал спасибо: 35
Сказали Спасибо 155 раз(а) в 134 сообщении(ях)
|
Re: Глюк компилятора? или мозгов?
Похоже калибровочную константу запороли. Компилятор делает вызов по адресу 0х03F8, там возврат, в регистре W калибровочная константа. В настройках компилятора можно выключить, но микроконтроллер будет работать на "неправильной" частоте.
|
|
|
|
14.06.2013, 16:33
|
|
Вид на жительство
Регистрация: 29.03.2009
Адрес: Бровары, Украина
Сообщений: 326
Сказал спасибо: 1,397
Сказали Спасибо 82 раз(а) в 46 сообщении(ях)
|
Re: Глюк компилятора? или мозгов?
Приобретение нового контроллера решит проблему?
Можно ли восстановить константу вручную?
И насколько не правильная будет частота?
Можете подсказать, где в настройках компилятора можно отключить? Я использую MPLAB v8.60 и компилятор PICC 9.50
|
|
|
|
14.06.2013, 16:58
|
|
Гражданин KAZUS.RU
Регистрация: 05.04.2009
Сообщений: 976
Сказал спасибо: 35
Сказали Спасибо 155 раз(а) в 134 сообщении(ях)
|
Re: Глюк компилятора? или мозгов?
Pickit2 может восстанавливать. Константу можно подсмотреть в микроконтроллере из той же партии - не гарантировано что будет точно. Есть и другие методы определения константы - не помню, читал в интернете.
Можно не восстанавливать:
У меня mplab 8.63 и XC8. Вкладка Linker, птичка Calibrate oscillator.
Как отключите - добавьте в тексте программы например OSCCAL=0x46; , где 0x46 калибровочная константа.
|
|
|
|
14.06.2013, 17:31
|
|
Вид на жительство
Регистрация: 29.03.2009
Адрес: Бровары, Украина
Сообщений: 326
Сказал спасибо: 1,397
Сказали Спасибо 82 раз(а) в 46 сообщении(ях)
|
Re: Глюк компилятора? или мозгов?
Нашел в интернете такое решение:
"Проблема решена вот такой опцией компилятора --RUNTIME=default,-osccal
Все работает. И в жизни и в протеусе."
Как задействовать эту опцию?
|
|
|
|
14.06.2013, 17:44
|
|
Гражданин KAZUS.RU
Регистрация: 27.11.2012
Адрес: 30км от Софии
Сообщений: 732
Сказал спасибо: 89
Сказали Спасибо 310 раз(а) в 180 сообщении(ях)
|
Re: Глюк компилятора? или мозгов?
Сообщение от -vitalik-
|
BSF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
CALL LADR_0x03FF
MOVWF T1CON ; !!Bank!! T1CON - OSCCAL
|
T1CON находится по адресу 10h в банке 0, OSCCAL по адресу 10h в банке 1. Реально запись происходит в OSCCAL. Вобщем я не встречал дизасемблеров, которые соображаются с RP0 и RP1. Тупо берут мнемонику для банка 0. Далее надо самому разбиратся.
По адресу 3FF на худой конец может стоять инструкция retlw 80h. Тоесть какаято центральная частота. Будет отличатся от 4МГц. Ну и что с того ?
У вас компилатор вообще не воспринял функцию preset. Почему не знаю, этим компиляторм не ползьуюсь.
|
|
|
|
14.06.2013, 17:56
|
|
Вид на жительство
Регистрация: 29.03.2009
Адрес: Бровары, Украина
Сообщений: 326
Сказал спасибо: 1,397
Сказали Спасибо 82 раз(а) в 46 сообщении(ях)
|
Re: Глюк компилятора? или мозгов?
Порывшись в интернете понял, что с PIC12 и компилятором 9,50 такая проблема довольно популярна.
Еще нашел и поместил в программе вот такой код:
Код:
|
#define _OSCCAL_DATA(w) \
asm(" psect absdata,abs,ovrld,class=CODE,delta=2 ");\
asm(" org 0x3ff ");\
asm(" retlw "___mkstr(w) )
_OSCCAL_DATA(0x11); |
проблема решилась, проц начал отрабатывать программу
Спасибо всем за помощь, может кому и пригодится
|
|
|
|
14.06.2013, 18:03
|
|
Гражданин KAZUS.RU
Регистрация: 05.04.2009
Сообщений: 976
Сказал спасибо: 35
Сказали Спасибо 155 раз(а) в 134 сообщении(ях)
|
Re: Глюк компилятора? или мозгов?
Для 9.5 не помню - поглядите в настройках проекта (типа command line). Для XC8 опция, повторюсь отключается в настройках линкера - при компиляции видно есть команда: +osccal. Может перейдете на XC8 - размер прошивки поменьше будет.
|
|
|
|
14.06.2013, 18:54
|
|
Вид на жительство
Регистрация: 29.03.2009
Адрес: Бровары, Украина
Сообщений: 326
Сказал спасибо: 1,397
Сказали Спасибо 82 раз(а) в 46 сообщении(ях)
|
Re: Глюк компилятора? или мозгов?
может у Вас есть под рукой ссылка на него?
|
|
|
|
14.06.2013, 20:42
|
|
Гражданин KAZUS.RU
Регистрация: 05.04.2009
Сообщений: 976
Сказал спасибо: 35
Сказали Спасибо 155 раз(а) в 134 сообщении(ях)
|
Re: Глюк компилятора? или мозгов?
http://www.microchip.com/pagehandler...tools/mplabxc/
60 дней работает как PRO затем отключается оптимизация (жить можно), лекарство тоже есть (поискать).
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:59.
|
|