Страница 1 из 1

"Hello world!" на pic16f877a

Добавлено: Вс дек 04, 2016 11:09:37
Gurvinok
Всем привет!
Я AVRшик, а PICи видел только припаянные к плате, но жизнь заставила разобраться с устройством на PIC контроллере. Дали мне HEX файл и все. Я его деассемблировал и начал изучать. Естественно ASM AVR отличается от ASM PIC. Отсюда встал вопрос изучения этого дела. Поставил MPLAB X, купил для мучений PIC16F877A, собрал схему на макетке в виде МК + кварц на 8МГц с двумя капаситорами на 22р от кварца на GND и светодиод от RC3 через резюк на GND. Программатор PicKit3. Ну вроде бы как все должно быть комильфо, но...
Накидал такой код.

Код: Выделить всё

    LIST p=16F877A
    __CONFIG 3FF1H
    
    ERRORLEVEL -302
    
STATUS   equ  03h
TRISC    equ  87h
PORTC    equ  07h
RP0	 equ  5
PC3	 equ  3
    
    org 0
    
    clrf STATUS
    
    bsf STATUS,RP0
    bcf TRISC,PC3

    bcf STATUS,RP0
    bsf PORTC,PC3
    
    end
Все скомпилилось без ошибок, но светодиод не горит, а на RC3 сидит 0,53в как на всех остальных ногах. Как я понял из 0 в 1 я так и не перешел.
Вопрос. В чем может быть проблема? Смущает регистр STATUS. Когда я сбрасываю третий разряд в регистре TRISC для перевода пина на выход, мне нужно перейти в банк1. Собственно в регистре STATUS я это и делаю выставляя RP0 в единицу, а вот когда мне нужно перебраться в банк 0... Регистр STATUS присутствует во всех банках но имеет разный адрес 0x0003, 0x0083, 0x0103, 0x0183. Здесь и сомнения, он сквозной для всех банков или нужно при переходе из одного банка в другой задавать изменения в текущем банке. Я уже запутался. Как мне зажечь светодиод, я уже не говорю о мигании.

Re: "Hello world!" на pic16f877a

Добавлено: Вс дек 04, 2016 11:59:03
Zhuk72
Во-первых, на ресет надо повесить подтяжку. Оригинальный ДШ на стр. 148.
Во-вторых, не надо расписывать адреса регистров. Нужно только в начале исходника написать include p16f877a.inc
В-третьих, чтобы не мучиться с комбинациями битов для выбора банка, можно писать, скажем,

Код: Выделить всё

  banksel TRISC
  bcf TRISC,3
Препроцессор потом заменит banksel на нужную комбинацию битов в регистре STATUS, который, как вы верно заметили, "сквозной" во всех банках. А можно и свои макросы использовать, типа таких:
Спойлер

Код: Выделить всё

bank0	macro
	bcf STATUS,IRP
	bcf STATUS,RP1
	bcf STATUS,RP0
	endm

bank1	macro
	bcf STATUS,IRP
	bcf STATUS,RP1
	bsf STATUS,RP0
	endm
	
bank2	macro
	bsf STATUS,IRP
	bsf STATUS,RP1
	bcf STATUS,RP0
	endm
	
bank3	macro
	bsf STATUS,IRP
	bsf STATUS,RP1
	bsf STATUS,RP0
	endm
Чтобы засветить светодиод, напишите

Код: Выделить всё

  banksel PORTC
  bsf PORTC,3
А вообще желательно инициалищировать всю периферию, она может влиять (и влияет) на работу портов. В случае RC3 вроде ничего нет, но для проверять нужно. В конце каждого раздела в мануалах написано, какие регистры и биты в них играют роль в данном разделе (SUMMARY OF REGISTERS ASSOCIATED WITH xxx).

Добавлено after 6 minutes 54 seconds:
Забыл еще один момент: конфиг-биты пишите в таком виде:

Код: Выделить всё

 __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_OFF & _CP_OFF & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_ENABLE_OFF & _DEBUG_OFF
Их список в том же inc файле, но средствами МПлаба можно это автоматизировать. Для этого в меню выбираете Window - PIC memory views - Configuration Bits. В нем выставляете нужное, потом жмете Generate Sorce Code, копируете и вставляете в исходник.

Re: "Hello world!" на pic16f877a

Добавлено: Вс дек 04, 2016 12:17:09
Gurvinok
include p16f877a.inc
Уже пробовал, пишет что такой файл не найден. Поэтому расписывал все вручную.
У меня по ходу что-то в железе, а что не могу понять. В протеусе работает, а на железе нет, хотя MPLAB пишет что все залил и верификация прошла удачно.
Оригинальный ДШ на стр. 148.
Хотят резистор не более 40К, поставил на 20К. Теперь MPLAB перестала видеть МК.

Re: "Hello world!" на pic16f877a

Добавлено: Вс дек 04, 2016 12:38:08
otest
#include
10k прямо на MCLR

Re: "Hello world!" на pic16f877a

Добавлено: Вс дек 04, 2016 13:08:57
Gurvinok
#include
Ну не дурак. Чай AVR рограммирую, там та же песня. :))
Window - PIC memory views - Configuration Bits
Вот это тема. Он сам мне все сделал.
10k прямо на MCLR
Не помогает. Причем если отсоединяю программатор и запитываю от внешнего источника, то светодиод промаргивает один раз.

Добавлено after 22 minutes 51 second:
Все, разобрался. В конфигурационном регистре нужно вместо _FOSC_XT поставить _FOSC_HS, тем самым разрешить работу быстрых кварцев. Очень напоминает фьюз биты в Мегах)))

Re: "Hello world!" на pic16f877a

Добавлено: Вс дек 04, 2016 13:16:14
Zhuk72
Gurvinok писал(а):
include p16f877a.inc
Уже пробовал, пишет что такой файл не найден.
Как же так? Я именно так и писал всегда,все видит.
Он здесь сидит : C:\Program Files (x86)\Microchip\MPLABX\v3.40\mpasmx

Проект целым архивом можно увидеть?

Re: "Hello world!" на pic16f877a

Добавлено: Вс дек 04, 2016 13:39:34
Gurvinok
Вот весь код.

Код: Выделить всё

    LIST p=16F877A
    
    #include "p16F877A.inc"

    __CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_ON & _BOREN_ON & _LVP_ON & _CPD_OFF & _WRT_OFF & _CP_OFF
    
    ERRORLEVEL -302
   
    RP0	 equ  5
    PC3	 equ  3
    
    org 0
    
    clrf STATUS
    
    bsf STATUS,RP0
    bcf TRISC,PC3

    bcf STATUS,RP0
    bsf PORTC,PC3
    
    end

Это я дурак. По не внимательности создал проект не под 16F877A, а под 16LF877A. Вот он и не видел.