• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

PIC16F84A, таблица и счётчик команд

  • Автор темы Автор темы Slava_D
  • Дата начала Дата начала

Slava_D

Новые
Регистрация
20 Июн 2011
Сообщения
15
Реакции
0
Баллы
0
PIC16F84A, таблица и счётчик команд

Здравствуйте, уважаемые форумчане! Создаю проект на 16-м пике, наткнулся на камень. Не приятный такой. Дело вот в чём- нужно создать таблицу, большую таблицу, занимающую более половины памяти программ, программирую на асме, от того мои друзья- инструкции retlw и de. Всё бы ничего (знающий уже наверное понял, к чему я клоню), но прыгать средствами регистра pcl и pclath корректно не получается. Никак не могу перепрыгнуть через первые 256 строк, чтобы попасть на 257-ю. Заношу в рег-р pcl нули, а в pclath нулевой бит ставлю 1, и попадаю в аккурат на 356 строку. Меняю последовательность бит в pcl на 00000001, -соответственно, 357-я, опять мимо ((( Код примерно такой-

bsf 0x0a
movlw b'00000000'
movwf 0x02

Подскажите, что не так делаю?

И ещё вопрос- как мне отследить, переполнился ли регистр, перепрыгнув через 255, чтобы, например, прибавить старший разряд. Взять, например, команду addwf, где прибавление может быть любым числом до 255 (в моём случае даже намнооого меньше).

Может есть где почитать по поводу подобных длинных переходов по таблице с применением счётчика команд и задействования pcl и pclath? Что- то сам искать убился ((

Пожалуйста, выручайте.
 
Товарищи! Ну что, прям таки нет гуру в этом деле? Нашёл в нете, задав поиск pclath, но понятного увидел мало. Хотелось бы пару вопросов задать!
 
Вот те бук (кинул в личку). Смотри параграф 6, точнее 6.2, 6.2.4, 6.2.6 и 6.5.
У меня проблем не возникало.
 
Будуть питання, питай :)
 
Спасибо, но этот мануал у меня и так перед глазами находится, как ни кручу, никак в механизм не "въеду", постоянно получаю неожиданный результат, т.е. прыжки в такие места, что понять не могу, почему там, а не тут оказались. Именно с применением рег-ра pclath.

Если не затруднит, объясните подробнее, пожалуйста.
 
Кинь проэктик я посмотрю и скажу что не так.
Можно в дебуге все посмотреть и станет ясно.
 
посмотри AN556.PDF
 
Приветствую! Спасибо за помощь! Но пока не до этого. Перешел на другой пик, и возникли непонядки. С прошлым пиком такой проблемы не возникало, сделал скрин mplab.
Выходит куча предупреждений, хотя банки переключаю как положено. Почему?
 

Вложения

  • 33853fdfd69e.webp
    33853fdfd69e.webp
    56.9 KB · Просмотры: 256
Извиняюсь за "миниатюру", отправлял с коммуникатора. Вот нормальное изображение

Немного "догнал", что надо использовать адреса нулевого банка, только, соответственно, сами банки менять (rp биты). Но, если оставить как есть, то видно, что в Program memory пишется всё верно, а вот мнемоника- указывает на неправильный регистр (в пятой строчке- adcon0,хотя адрессация происходит на adcon1). Странно.
 

Вложения

  • quest.webp
    quest.webp
    112.1 KB · Просмотры: 163
Вот именно из-за костыля под названием БАНКИ я бросил PIC в пользу AVR.
:tehnari_ru_864:
 
Ууу... Ну теперь я вообще ничего не понимаю. Вот пример-
org 0
bsf 0x03,5 ;идём в 1 банк
bcf 0x03,6
clrf 0x05. ;обнуляем trisa

И что мы видим в program memory окне?
Что попадаем на porta, а не на trisa!!!
Даже указав 0x85...

Уже убился и выпил йаду... Мой глюк? Или программы?
Помогите пожалуйста и проверьте у себя, мне нужно контролировать, правильно ли переключил банки, всё ли туда, куда запланировано пишется. И вообще, с таким контролем удобнЕе, а он, чертяга, не работает. Проц- 16f876a, в конфиге и в лабе он прописан. Версия лаба- 7.42
 
Вот именно из-за костыля под названием БАНКИ я бросил PIC в пользу AVR.
:tehnari_ru_864:

Охотно верю, но так уж карты легли. И си я никогда не учил. За асм взялся от того, что предыдущий пик был скромен на память и много чего впихнуть нужно было самому логически расставляя команды.
 
Уважаемые! Ну неужели так трудно запустить мплаб, вбить 4 строчки, в опциях выставить pic16f876a и ассемблировать на вашей версии, затем открыть view->program memory и отписать, что там получилось?
 
Только MPLAB поставлю, подождите.
 
Спасибо! Жду в не терпении ))
 
Не обращай внимания, это предупреждение. Все будет работать. Это мплаб не видит что ты переключил банк.
 
Вот нашел, оказалось все еще проще!
 

Вложения

  • Безымянный.webp
    Безымянный.webp
    31.6 KB · Просмотры: 140
Ерунду замутили, блин... так трудно отследить и в памяти программ по уму, нормально вывести... А было-б так удобно...

Тут вот ещё вопросец назрел... С сегоднешнего начал ковырять шину I2C, пытаюсь общаться с датчиком DS1631 (термометр), ковырял даташит к пику, даташит к далласу. Вроде как получается с божьей помощью и AN735. НО никак без НО. Не получается отправить сигнал NACK от мастера. ну не отпускает линию после. Ниже приведу код, с которым эксперементирую:
Код:
			list p=16f876a
			__CONFIG 3F39h
#include p16f876a.inc

;Определение переменных==============================================
			CBLOCK	0x70
			temp				;Временная переменная.
			ENDC

;status		equ		0x03		;Регистр STATUS и его биты.
;rp0			equ		0x05
;rp1			equ		0x06

portc		equ		0x07
trisc		equ		0x07

sspcon1		equ		0x14
sspcon2		equ		0x91
	sen		equ		0x00
	rcen	equ		0x03
	pen		equ		0x02
	ackdt	equ		0x05
	acken	equ		0x04
sspadd		equ		0x93
sspstat		equ		0x94
	r_w		equ		0x02
sspbuf		equ		0x13


#define  FOSC        D'8000000'          ;Частота кварца (Гц)
#define  I2CClock    D'400000'           ;Частота шины I2C (Гц)
#define  ClockValue  (((FOSC/I2CClock)/4) -1) ;

;Инициализация портов, регистров=====================================

;Режим I2C, установка MASTER.
			movlw	b'00101000'	; setup value
								; into W register
			banksel	sspcon1 	; select SFR
								; bank
			movwf	sspcon1		; configure for
								; Master I2C

;Установка битрейта I2C
			movlw	0x0A		; setup value
								; into W register
			banksel	sspadd		; select SFR bank
			movwf	sspadd		; baud rate =
								; 400KHz @ 18MHz

;Опять настройка I2C.
			movlw	b'00000000'	; setup value
								; into W register
			movwf	sspstat		; slew rate
								; enabled
			banksel sspstat		; select SFR bank

;SCL/SDA Настройка выводов на вход.
			movlw	b'00011000'	; setup value
								; into W register
			banksel	trisc		; select SFR bank
			iorwf	trisc,f		; SCL and SDA
								; are inputs


;Программа========================================================
			call	START		;Инициируем старт
			movlw	b'10011110'	;Адресом с битом "принять"
			call	I2CWRITE
			movlw	0xAC		;Отправляем	ему код
			call	I2CWRITE


			call	START		;Делаем RE-START
			movlw	b'10011111'	;Адрес с битом "передать"
			call	I2CWRITE
			call	I2CREAD
			call	I2CNACK
			bsf		sspcon2,pen	; Стоп.

			goto	$


;=================================================================
;Инициализация запроса START
START
			banksel	sspcon2		; select SFR
								; bank
			bsf 	sspcon2,sen	; initiate
								; I2C start
		; Код ниже проверит завершение START запроса.
			btfsc	sspcon2,sen	; test start
								; bit state
			goto	$-1			; module busy
								; so wait
			return

;Этот код инициирует I2C чтение
I2CREAD
			banksel	sspcon2		; select SFR
								; bank
			bsf		sspcon2,rcen	; initiate
								; I2C read
		;Этот код проверяет окончание чтения I2C.
			btfsc	sspcon2,rcen	; test read
								; bit state
			goto	$-1			; module busy
								; so wait


;Этот код инициирует I2C запись
I2CWRITE
			banksel	sspbuf		; select SFR bank
;			movlw	b'10011110'	; load value
								; into W (Бит 0 говорит после
								;запроса START
								;том, что будет делать SLAVE на
								;следующем байте- принимать(0)
								;или передавать данные(1), осталь-
								;ные указывают адрес устр-ва.)
			movwf	sspbuf		; initiate I2C
								; write cycle
		;Этот код проверяет окончание записи I2C
			banksel	sspstat		; select SFR bank
			btfsc	sspstat,r_w	; test write bit
								; state
			goto	$-1			; module busy
								; so wait
			return

;Генерация NACK от MASTER
I2CNACK
			banksel	sspcon2		; select SFR
								; bank
			bsf		sspcon2,ackdt	; set ack bit
								; state to 1
			bsf		sspcon2,acken	; initiate ack
			return

Кроме пары- тройки строчек "мусора" всё скопипастено из AN735. В протеусе запустил с анализатором I2C шины и вот что получаю-

S-9E-A-AC-A-9F-A-FF-A

Ну, с S-A и так понятно.
9E- это адрес с битом W.
AC- команда далласа.

Тут делаем restart, он тоже почему- то не отмечен протеусом (а есть ли он вообще?)

9F- адрес с битом R.
FF- пришла цифра не понятная (в регистре далласа другая сидит)

Собственно и трабла заключается в том, что не отпускается шина, нет сигнала N(ACK) от мастера. Или я что- то недопонял, или что- то не допонял я. Кстати, и P (стопа) тоже нет. Хотя я их кидаю.

Чего тут недомудрёно? отключение прерывания? ещё что- то? (( где- то рядом- же порыто!
 
1. Разбираться с железом нужно на железе, а не в симуляторе.
2. А резисторы подтягивающие у вас есть?
 
Да, конечно, на 10ком. Схема включения стандартная, дело в том, что другую команду-посылаю, не требующую NACK, а только стоп- выполняется, линия свободна и датчик в режиме ожидания обращения к нему по его адресу. С NACK "косяк" какой-то. В коде- то правильно я его применяю?
 
Назад
Сверху