Помогите с 16F628A (hello world на нём не получается)
Добавлено: Сб дек 26, 2009 18:01:01
Всем привет! Нужна помощь опытных коллег в освоении PIC
Сделал простенький девайс для тренировок:

Изначально под 16F84A. В ходе этих самых тренировок "кривыми ручками" регулярно убивались контроллеры. И при очередной покупке новой микрухи решил для пробы взять 628A ибо он круче и дешевле. Но вот не получается заставить его работать. Софт переписал заново. Вот:
Подпрограмму прерываний и инициализацию еепром не стал удалять из шаблона на будущее, а сейчас они не используются.
Вобщем должен он побежать в младшем разряде циферками от 0 до 9 и по кругу. На F84 с подобными прогами небыло проблем. В MPLAB SIM разумеется всё работает, но в железе никаких признаков работы.
Разряды и сегменты включаются единичкой. Кварц 32КГц. Поскольку в отличии от 84-го тут куча периферийных свистелок, то есть мысль что я косячу с инициализацией периферии, источником такта или сбросом. Подсмотрел исходники Часы - будильник на микроконтроллере PIC16F628A (kaligraf, спасибо за подробные комментарии) и подправил у себя, но видимо не всё. В частноти мне не понятно почему в этой схеме часов MCLR используется по назначению (приятнут к питанию), а в конфигурации _MCLRE_OFF ведь по даташиту:Настраивается RA5 как MCLR и RA6/RA7 для кварца? Вообще как правильно понимать MCLRE OFF/ON в конфигурации и в настройке RA5 в TRISA? Из даташита я это плохо понял
Заранее спасибо, особенно дочитавшим до конца
Сделал простенький девайс для тренировок:

Изначально под 16F84A. В ходе этих самых тренировок "кривыми ручками" регулярно убивались контроллеры. И при очередной покупке новой микрухи решил для пробы взять 628A ибо он круче и дешевле. Но вот не получается заставить его работать. Софт переписал заново. Вот:
Код: Выделить всё
list p=16f628A ; list directive to define processor
#include <p16F628A> ; processor specific variable definitions
errorlevel -302 ; suppress message 302 from list file
__CONFIG _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _LP_OSC
;***** VARIABLE DEFINITIONS
w_temp EQU 0x7E ; variable used for context saving
status_temp EQU 0x7F ; variable used for context saving
count1 EQU 0x30 ; time delay count value
count2 EQU 0x31 ; decimal counter
dcode EQU 0x32 ; digit value to convert
;**** Digits codes
; 0 - b'00111111' - 0x3F
; 1 - b'00001100' - 0x0C
; 2 - b'01011011' - 0x5B
; 3 - b'01011110' - 0x5E
; 4 - b'01101100' - 0x6C
; 5 - b'01110110' - 0x76
; 6 - b'01110111' - 0x77
; 7 - b'00011100' - 0x1C
; 8 - b'01111111' - 0x7F
; 9 - b'01111110' - 0x7E
;**********************************************************************
ORG 0x000 ; processor reset vector
goto main ; go to beginning of program
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
; isr code can go here or be located as a call subroutine elsewhere
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
; init device
main clrf PORTA
clrf PORTB
clrf INTCON ; disable all interputs
clrf PIR1 ; reset all interput flags
bsf STATUS,RP0 ; bank 1
clrf PIE1 ; disable all interputs by peripherals
clrf VRCON ; disable Vref module
clrf TRISB ; PORTB all outputs
movlw b'00110000' ; PORTA RA0-RA3 outputs, MCLR on, external OSC
movwf TRISA ;
bcf STATUS,RP0 ; bank 0
movlw 0x07 ; disable comparators
movwf CMCON ;
clrf RCSTA ; USART off
clrf CCP1CON ; ccp off
; main code
bsf PORTA,3 ; digit 4 turn on
movlw 0x00 ; load '0' to W
movwf dcode ; and copy it to dcode - init digit counter
movlw 0x0A ; load decimal '10' to W
movwf count2 ; and copy it to count2 - init decimal counter
dcount movfw dcode ; load digit value to W
call dset ; convert W to digit code
movwf PORTB ; converted digit value to PORTB
call delay ; time delay
incf dcode,f ; incremet 'dcode' digit value
decfsz count2,f ; decrement decimal counter
goto dcount ; not zero result? display next digit
goto main ; loop programm
; digits set values subroutine
dset addwf PCL,f
retlw 0x3F ; 0
retlw 0x0C
retlw 0x5B
retlw 0x5E
retlw 0x6C
retlw 0x76
retlw 0x77
retlw 0x1C
retlw 0x7F
retlw 0x7E ; 9
; time delay subroutine
delay movlw 0xFF ; load counter value
movwf count1 ;
loop1 decfsz count1,f ; decrement counter value
goto loop1 ; not zero result? decrement again
return ; zero result - return from subroutine
; initialize eeprom locations
ORG 0x2100
DE 0x00, 0x01, 0x02, 0x03
END ; directive 'end of program'Вобщем должен он побежать в младшем разряде циферками от 0 до 9 и по кругу. На F84 с подобными прогами небыло проблем. В MPLAB SIM разумеется всё работает, но в железе никаких признаков работы.
Разряды и сегменты включаются единичкой. Кварц 32КГц. Поскольку в отличии от 84-го тут куча периферийных свистелок, то есть мысль что я косячу с инициализацией периферии, источником такта или сбросом. Подсмотрел исходники Часы - будильник на микроконтроллере PIC16F628A (kaligraf, спасибо за подробные комментарии) и подправил у себя, но видимо не всё. В частноти мне не понятно почему в этой схеме часов MCLR используется по назначению (приятнут к питанию), а в конфигурации _MCLRE_OFF ведь по даташиту:
Пробовал включать и выключать эту опцию в конфигурации, но результат одинаковый в обоих случаях. И правильно ли в тексте программы:MCLRE: RA5/MCLR pin function select
1 = RA5/MCLR pin function is MCLR
0 = RA5/MCLR pin function is digital Input, MCLR internally tied to VDD
Код: Выделить всё
movlw b'00110000'
movwf TRISA Заранее спасибо, особенно дочитавшим до конца