Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 14.06.2013, 13:49  
-vitalik-
Вид на жительство
 
Аватар для -vitalik-
 
Регистрация: 29.03.2009
Адрес: Бровары, Украина
Сообщений: 326
Сказал спасибо: 1,397
Сказали Спасибо 82 раз(а) в 46 сообщении(ях)
-vitalik- на пути к лучшему
Вопрос Глюк компилятора? или мозгов?

Добрый день,
Немного разбираюсь в программировании 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

Помогите, пожалуйста, решить проблему
Реклама:
-vitalik- вне форума  
Непрочитано 14.06.2013, 15:40  
oleg110592
Гражданин KAZUS.RU
 
Регистрация: 05.04.2009
Сообщений: 976
Сказал спасибо: 35
Сказали Спасибо 155 раз(а) в 134 сообщении(ях)
oleg110592 на пути к лучшему
По умолчанию Re: Глюк компилятора? или мозгов?

Похоже калибровочную константу запороли. Компилятор делает вызов по адресу 0х03F8, там возврат, в регистре W калибровочная константа. В настройках компилятора можно выключить, но микроконтроллер будет работать на "неправильной" частоте.
oleg110592 вне форума  
Непрочитано 14.06.2013, 16:33  
-vitalik-
Вид на жительство
 
Аватар для -vitalik-
 
Регистрация: 29.03.2009
Адрес: Бровары, Украина
Сообщений: 326
Сказал спасибо: 1,397
Сказали Спасибо 82 раз(а) в 46 сообщении(ях)
-vitalik- на пути к лучшему
По умолчанию Re: Глюк компилятора? или мозгов?

Приобретение нового контроллера решит проблему?
Можно ли восстановить константу вручную?
И насколько не правильная будет частота?

Можете подсказать, где в настройках компилятора можно отключить? Я использую MPLAB v8.60 и компилятор PICC 9.50
-vitalik- вне форума  
Непрочитано 14.06.2013, 16:58  
oleg110592
Гражданин KAZUS.RU
 
Регистрация: 05.04.2009
Сообщений: 976
Сказал спасибо: 35
Сказали Спасибо 155 раз(а) в 134 сообщении(ях)
oleg110592 на пути к лучшему
По умолчанию Re: Глюк компилятора? или мозгов?

Pickit2 может восстанавливать. Константу можно подсмотреть в микроконтроллере из той же партии - не гарантировано что будет точно. Есть и другие методы определения константы - не помню, читал в интернете.
Можно не восстанавливать:
У меня mplab 8.63 и XC8. Вкладка Linker, птичка Calibrate oscillator.
Как отключите - добавьте в тексте программы например OSCCAL=0x46; , где 0x46 калибровочная константа.
oleg110592 вне форума  
Непрочитано 14.06.2013, 17:31  
-vitalik-
Вид на жительство
 
Аватар для -vitalik-
 
Регистрация: 29.03.2009
Адрес: Бровары, Украина
Сообщений: 326
Сказал спасибо: 1,397
Сказали Спасибо 82 раз(а) в 46 сообщении(ях)
-vitalik- на пути к лучшему
По умолчанию Re: Глюк компилятора? или мозгов?

Нашел в интернете такое решение:
"Проблема решена вот такой опцией компилятора --RUNTIME=default,-osccal
Все работает. И в жизни и в протеусе."

Как задействовать эту опцию?
-vitalik- вне форума  
Непрочитано 14.06.2013, 17:44  
3d cube
Гражданин KAZUS.RU
 
Регистрация: 27.11.2012
Адрес: 30км от Софии
Сообщений: 732
Сказал спасибо: 89
Сказали Спасибо 310 раз(а) в 180 сообщении(ях)
3d cube на пути к лучшему
По умолчанию 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. Почему не знаю, этим компиляторм не ползьуюсь.
3d cube вне форума  
Непрочитано 14.06.2013, 17:56  
-vitalik-
Вид на жительство
 
Аватар для -vitalik-
 
Регистрация: 29.03.2009
Адрес: Бровары, Украина
Сообщений: 326
Сказал спасибо: 1,397
Сказали Спасибо 82 раз(а) в 46 сообщении(ях)
-vitalik- на пути к лучшему
По умолчанию 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);
проблема решилась, проц начал отрабатывать программу

Спасибо всем за помощь, может кому и пригодится
-vitalik- вне форума  
Непрочитано 14.06.2013, 18:03  
oleg110592
Гражданин KAZUS.RU
 
Регистрация: 05.04.2009
Сообщений: 976
Сказал спасибо: 35
Сказали Спасибо 155 раз(а) в 134 сообщении(ях)
oleg110592 на пути к лучшему
По умолчанию Re: Глюк компилятора? или мозгов?

Для 9.5 не помню - поглядите в настройках проекта (типа command line). Для XC8 опция, повторюсь отключается в настройках линкера - при компиляции видно есть команда: +osccal. Может перейдете на XC8 - размер прошивки поменьше будет.
oleg110592 вне форума  
Непрочитано 14.06.2013, 18:54  
-vitalik-
Вид на жительство
 
Аватар для -vitalik-
 
Регистрация: 29.03.2009
Адрес: Бровары, Украина
Сообщений: 326
Сказал спасибо: 1,397
Сказали Спасибо 82 раз(а) в 46 сообщении(ях)
-vitalik- на пути к лучшему
По умолчанию Re: Глюк компилятора? или мозгов?

может у Вас есть под рукой ссылка на него?
-vitalik- вне форума  
Непрочитано 14.06.2013, 20:42  
oleg110592
Гражданин KAZUS.RU
 
Регистрация: 05.04.2009
Сообщений: 976
Сказал спасибо: 35
Сказали Спасибо 155 раз(а) в 134 сообщении(ях)
oleg110592 на пути к лучшему
По умолчанию Re: Глюк компилятора? или мозгов?

http://www.microchip.com/pagehandler...tools/mplabxc/
60 дней работает как PRO затем отключается оптимизация (жить можно), лекарство тоже есть (поискать).
oleg110592 вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прощание с Windows hacker7 Отвлекитесь, эмбеддеры! 735 17.09.2012 11:54
[Решено] Сборник перлов любителей кабельщины mikesmith Отвлекитесь, эмбеддеры! 135 14.08.2007 15:49
Кто виноват - MPLAB, программатор или прокладка? Paragon Микроконтроллеры, АЦП, память и т.д 1 28.09.2003 11:18


Часовой пояс GMT +4, время: 00:59.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot