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

Помогите с 16F628A (hello world на нём не получается)

Добавлено: Сб дек 26, 2009 18:01:01
FlySnake
Всем привет! Нужна помощь опытных коллег в освоении PIC
Сделал простенький девайс для тренировок:
Изображение
Изначально под 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 
Настраивается RA5 как MCLR и RA6/RA7 для кварца? Вообще как правильно понимать MCLRE OFF/ON в конфигурации и в настройке RA5 в TRISA? Из даташита я это плохо понял :oops:

Заранее спасибо, особенно дочитавшим до конца :))

Добавлено: Сб дек 26, 2009 20:19:40
otest
У вас нет конфигурации PORTB.

Добавлено: Сб дек 26, 2009 22:47:33
FlySnake
Не с бумажки, просто "интуитивность команд" и плохое знание их :) Ассемблер скушал эту команду без запинок и в симуляторе оно заработало как надо, чесслово :) И, кстати, если погуглить, то её можно много где встретить. Может специально для таких нубов предусмотрели, хз. На всякий случай поправил как должно быть (movf dcode,0 - ведь так?) результат тот же. В симуляторе всё как надо инкрементируется, в порты уходит.

Подобные программы без проблем получались на F84, поэтому не думаю что она слишком сложна. Просто помигать светодиодом тоже не работает. Я её сразу набросал на скорую руку, а потом, когда не заработала, решил обдуманно написать эту с комментариями и на свежую голову. Опять не работает. Значит я что-то упускаю.

Про Си пока речи не идёт. Говорят первый серьёзный проект надо сделать на ассемблере :)

Картинка кликабельна

Добавлено: Сб дек 26, 2009 22:58:51
otest
Виноват TRISB проглядел. Тогда другая причина- ваш программатор не шъет 628.

Re: Помогите с 16F628A (hello world на нём не получается)

Добавлено: Вс дек 27, 2009 19:19:47
uldemir
FlySnake писал(а):Всем привет! Нужна помощь опытных коллег в освоении PIC
И правильно ли в тексте программы:

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

movlw b'00110000'
movwf TRISA 
Настраивается RA5 как MCLR и RA6/RA7 для кварца? Вообще как правильно понимать MCLRE OFF/ON в конфигурации и в настройке RA5 в TRISA? Из даташита я это плохо понял
Если в слове конфигурации не разрешено использование RA5-7 как порты ввода/вывода, то значение TRISA ни на что не влияет.
В Вашем случае проблема может быть от "не запускается кварц". попробуйте вместо кварца RC-осцилятор. Еще, не думаю, что в этом может быть проблема, но я компараторы отключаю перед тем как конфигурировать TRISA. И вы не сказали, КАК у вас не работает схема. Хотя бы логическим пробником потыкайтесь в выводы - есть там потенциал или они стоят в высокооимпедансном состоянии? Это уже сразу укажет какой кусок кода не идёт и не надо гадать, в чем проблема. И еще: нормальную динамическую индикацию на 32kHz кварце на PIC сделать затруднительно - так как в секунду можно выполнить только 8192 инструкции.

Добавлено: Вс дек 27, 2009 20:55:08
FlySnake
Значит на счёт программатора. Ипользую ICProg и AN589. Всё шьётся, проверяется без ошибок. Но вспомнил интересный случай с 628-ми. Товарищу надо было обновить прошивку на каких-то хитровыпуклых девайсах как раз на 628. Не долго думая воспользовался фирменным Phyton ChipProg что имеется на работе. Всё прошилось и проверилось, но девайсы не заработали, ни один из 5 штук. Автор прошивок (в другом городе находившийся) утверждал что всё 100 пудов рабочее и мы что-то косячим. Достал свой самопальный программатор, зашил на нём и всё заработало. Руки не дошли разбиратся почему так получилось и сроки поджимали, но факт остался. На том же фитоне позже успешно прошивал 84-е, а 628 завтра попробую. Спасибо за совет.

Насчёт неработающей схемы извиняюсь, сразу не додумался описать. Не делает ничего. Ни один сегмент ни одного индикатора не загорается т.е. вообще никаких признаков жизни. Завтра на работе осциллографом потыкаю его. Спасибо за совет.

Я то больше всего смущался насчёт конфигурации ибо не понял _MCLRE_ON в конфигурации означает что 4 нога будет использоватся для сброса? По идеи 1 (в даташите) значит ON, но в приведенной выше схеме часов в конфигурации _MCLRE_OFF, а 4 вывод также через резистор притянут к питанию. И выбор источника такта задаётся только в конфигурации ведь? Т.е. _LP_OSC и больше пофиг на настройку портаА и всё остальное?

Добавлено: Вс дек 27, 2009 23:27:13
uldemir
FlySnake писал(а):Я то больше всего смущался насчёт конфигурации ибо не понял _MCLRE_ON в конфигурации означает что 4 нога будет использоватся для сброса? По идеи 1 (в даташите) значит ON, но в приведенной выше схеме часов в конфигурации _MCLRE_OFF, а 4 вывод также через резистор притянут к питанию.
По идее, читаем даташит внимательно.
bit 5: MCLRE: RA5/MCLR/VPP Pin Function Select bit
1 = RA5/MCLR/VPP pin function is MCLR
0 = RA5/MCLR/VPP pin function is digital Input, MCLR internally tied to VDD
1 - работает как MCLR, 0 - работает как порт ввода/вывода.
Вот выписка из /usr/local/share/gputils/header/p16f628a.inc

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

_MCLRE_ON                    EQU     H'3FFF'
_MCLRE_OFF                   EQU     H'3FDF'
Так что тут и голову ломать нечего - компилятор сам составит нули и единицы так как надо.
И выбор источника такта задаётся только в конфигурации ведь? Т.е. _LP_OSC и больше пофиг на настройку портаА и всё остальное?
Угум.

Добавлено: Пн дек 28, 2009 13:18:14
FlySnake
Спасибо всем за помощь!
Проблема локализована и изначально была не в софте.
Тыкаю скопешником на кварц - нет генерации. Пробую в конфигурации внутренний RC генератор и, опа, заработало. Меняю кварц - 0 эмоций. Ещё один - тоже самое. Методом тыка выявил что без одного из кондёрчиков оно таки работает, но стоит его подключить - генерации нет. КЗ на кондёре нет, но сунул в китайский тестер - 72 пика вместо 28. Второй кондёр не мерял, но т.к. они очень древние есть мысль что такой же галимый или метод измерения у меня такой, хз. Очень странно что это случилось одновременно со смертью крайнего контроллера по переполюсовке питания :)

Re: Помогите с 16F628A (hello world на нём не получается)

Добавлено: Ср мар 16, 2011 15:40:39
Aaantonnn15
FlySnake писал(а):Всем привет! Нужна помощь опытных коллег в освоении PIC
Сделал простенький девайс для тренировок:
Изображение
Изначально под 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	                movf dcode,W			; 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 
Настраивается RA5 как MCLR и RA6/RA7 для кварца? Вообще как правильно понимать MCLRE OFF/ON в конфигурации и в настройке RA5 в TRISA? Из даташита я это плохо понял :oops:

Заранее спасибо, особенно дочитавшим до конца :))

Привет FlySnake и всем котам!!!! Бегло посмотрел твой код и почитал сообщения и уже нашел несколько ошибок.

1. Разряды и сегменты никак не могут вместе включатся единичками !!!!!!! семисегментные индикаторы бывают либо с общим катодом(ОК), либо с общим анодом(ОА). если взять с ОК, то сегменты включаются единичками, разряды нулями. Если с ОА - наоборот.

2. Ошибка с вычисляемым переходом. смотри исправление. Пометил восклицательными знаками.

Пробуй!!!!

Re: Помогите с 16F628A (hello world на нём не получается)

Добавлено: Ср мар 16, 2011 16:07:28
FlySnake
Ой было то это как давно :) Я с тех пор "вырос" немного и забыл чего тут было
1. Разряды и сегменты никак не могут вместе включатся единичками !!!!!!! семисегментные индикаторы бывают либо с общим катодом(ОК), либо с общим анодом(ОА). если взять с ОК, то сегменты включаются единичками, разряды нулями. Если с ОА - наоборот.
С n-p-n транзисторами в анодах - могут. см.схему. Это при посегментной индикации и общим напрямую на ноге контроллера не могут, а тут запросто
2. Ошибка с вычисляемым переходом. смотри исправление. Пометил восклицательными знаками.
А это баян :) Команды такой действительно нет и макросом она не сделана, но фирменный ассемблер её проглатывает как надо. Просто интуитивность команд :shock:

Re: Помогите с 16F628A (hello world на нём не получается)

Добавлено: Чт мар 17, 2011 20:57:19
Aaantonnn15
FlySnake писал(а):Ой было то это как давно :) Я с тех пор "вырос" немного и забыл чего тут было
1. Разряды и сегменты никак не могут вместе включатся единичками !!!!!!! семисегментные индикаторы бывают либо с общим катодом(ОК), либо с общим анодом(ОА). если взять с ОК, то сегменты включаются единичками, разряды нулями. Если с ОА - наоборот.
С n-p-n транзисторами в анодах - могут. см.схему. Это при посегментной индикации и общим напрямую на ноге контроллера не могут, а тут запросто
2. Ошибка с вычисляемым переходом. смотри исправление. Пометил восклицательными знаками.
А это баян :) Команды такой действительно нет и макросом она не сделана, но фирменный ассемблер её проглатывает как надо. Просто интуитивность команд :shock:

А в железе проверенно??? Команда эта проходит??? Моя практика с микроконтроллерами не сильно большая. Пока 2-разработанных и отлаженых устройства(часы с функцией 2-х специализированных таймеров и термометр). Но мне пришлось столкнуться с рядом всеобразных трудностей. Даже рабочая отлаженная программа в мплабе и смоделированная в протеусе не запускалась в железе. Все надо пробовать. Мне интересно проходит ли эта команда нормально????

Re: Помогите с 16F628A (hello world на нём не получается)

Добавлено: Чт мар 17, 2011 21:11:45
uldemir
А зачем вам в железе? Вы в курсе, что компиляторы умеют генерить листинг, где написан исходный текст и соответственно сгенеренные ему коды.

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

013E 0803      00470         movfw   status
013F 0803      00471         movf    status, w
Теперь можете попробовать дизассемблировать, и убедиться, что скомпилирован код соответствующий команде movf status, w. И, кстати, в спорных местах полезно посмотреть, что компилятор вам накомпилил.