Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: PIC16F84A программы  (Прочитано 23017 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« : 07-06-2004 17:53 » 

Большая просьба, пожалуйста может ли кто-нибудь скинуть мне готовую программу для микроконтролера на Асемблере. Хочу узнать, примерно как она выглядит. Можно что-либо простенькое. Тут наклевывается проект для этого микроконтролера, Но я никогда не программировал их. И еше я тут скачал MPLAB. Достаточно ли будет его для написания и отладки программы? Заранее спасибо.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 07-06-2004 19:44 » 

Маленький примерчик: определение переменных, подпрограмма и настройки для компилятора.
Код:

 list p=16F84,r=HEX,mm=ON,st=ON,t=OFF,w=0,x=ON
; __idlocs 0121
 __config B'11111111110010'
 __maxram H'4F'

;
; RAM Variables
;
 cblock 0C
acc
acc1
_END_RAM_{0
 endc
_FREE_RAM_ equ 50-_END_RAM_

;
; convert number BIN<>ASCII NUMBER
;
asc2bin{ ; In{ w =ascii code
;Out{ w =bin
; acc -acc = acc*10+w
; acc1 -temp
addn 0D0
andn 0F
movw acc1
mov acc,w
bc status,c
rl acc
rl acc
add acc

rl acc,w
add acc1,w
movw acc
ret
;

Могу большую программку забросить на почту (~1.4k строк сюда заливать не хочется). Правда, не доделанную.
Набери в яндексе "pic16f84 программы" и получишь горы пртимеров.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 08-06-2004 14:17 » 

RXL,
Спасибо большое за отклик. Насчет программы конечно хочу. И еше один вопрос вдогонку. Сколько я не просматривал команды микроконтролера, никак не мог найти, как работать с ячейками памяти, если я хочу взять произвольную ячейку, а не ту которую я прописал в программе заранее. Спасибо еше раз
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #3 : 08-06-2004 15:39 » 

Цитата

никак не мог найти, как работать с ячейками памяти, если я хочу взять произвольную ячейку, а не ту которую я прописал в программе заранее.

Finch, Никак. есть хитрый способ организовать небольшую табличку с помощью RETLW, а так больше способа доступа к памяти програм я не знаю.
Записан

Megabyte be with you!
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 08-06-2004 15:43 » 

Lex,  Большое спасибо за информацию.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 08-06-2004 17:04 » 

Вот такой извращенные пример вывода сообщения. Подпрограмма put_pc здесь не приведена.  Обрати внимание на go_tab.
Код:

send_ERROR{
; Send "ERROR<CR><LF>"
movn _msg_ERROR/100
movw pclath
movn _msg_ERROR
jmp send_msg
;
send_msg{
; In{ pclath=page#
; w=mes ptr
movw fsr
btsc flags,verbose_level
jmp send_msg_2
call go_tab
addn 01
btsc status,z
jmp send_msg_2
addn 0FF
jmp send_msg_4
send_msg_3{
movn CR
send_msg_4{
clr pclath
jmp put_pc
send_msg_2{
inc fsr
btsc status,z
inc pclath
send_msg_1{
mov fsr,w
call go_tab
addn 0-CR
btsc status,z
jmp send_msg_3
addn CR
call put_pc
jmp send_msg_2
;
go_tab{
movw pcl
;
; Message table.
;
_msg_ID{
retn 0FF
retn "M"
retn "D"
retn "M"
retn "G"
retn "E"
retn "N"
retn "2"
retn "4"
retn CR
_msg_OK{
retn 00
retn "O"
retn "K"
retn CR
_msg_CONNECT{
retn 01
retn "C"
retn "O"
retn "N"
retn "N"
retn "E"
retn "C"
retn "T"
retn CR
_msg_RING{
retn 02
retn "R"
retn "I"
retn "N"
retn "G"
retn CR
_msg_NOCARRIER{
retn 03
retn "N"
retn "O"
retn " "
retn "C"
retn "A"
retn "R"
retn "R"
retn "I"
retn "E"
retn "R"
retn CR
_msg_ERROR{
retn 04
retn "E"
retn "R"
retn "R"
retn "O"
retn "R"
retn CR
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 08-06-2004 17:47 » 

вот ещё простые примеры
 :arrow:
Код:

;Сложение 1-байтных чисел
#include <p16f84.inc> ;Включаемый файл
__config b'11111111110001' ;Конфигурация
org 0 ;Вектор сброса
clrf PCLATH ;
bcf STATUS,RP1 ;
bcf STATUS,RP0 ;установка банка №0
goto start
org 4 ;Вектор прерывания
goto start ;
;Определение констант
S1 equ d'200' ;1-е слагаемое
S2 equ d'100' ;2-е слагаемое

;Определение переменных
;)присвоение имён двум РОН:
RESULT equ 0ch ;Переменная для хранения результата
CARRY equ 0dh ;Переменная для хранения переноса
start movlw S1 ;Сложение S1 и S2
addlw S2 ; )флаг переноса изменён:.
movwf RESULT ;Сохранение результата, оно
; не влияет на флаг переноса.
btfss STATUS,C ;Бит переноса установлен? –
goto no_car ; –нет{ Перейти на метку no_car.
clrf CARRY ; –да{ Запись единицы
incf CARRY,F ; в CARRY.
goto end_prog ;Переход на конец программы.
no_car clrf CARRY ;Запись нуля в CARRY.
end_prog nop ;Конец программы.
end


 :arrow:
Код:

;Умножение 1-байтных чисел)результат - 2 байта:
#include <p16f84.inc> ;Включаемый файл
__config b'11111111110001' ;Конфигурация
org 0 ;Вектор сброса
clrf PCLATH
bcf STATUS,RP1 ;
bcf STATUS,RP0 ;установка банка №0
goto start
org 4 ;Вектор прерывания
goto start ;
;Определение констант
number1 equ d'100' ;1-й множитель
number2 equ d'3' ;2-й множитель
;Определение переменных
cblock 00ch ;Блок переменных
N1 ;1-й множитель )адрес=00ch:
N2 ;2-й множитель )адрес=00ch+1 , т.е. 00dh:
RES_L ;Младший байт результата )адрес=00ch+2 , т.е. 00eh:
RES_H ;Старший байт результата )адрес=00ch+3 , т.е. 00fh:
endc ;Завершение блока переменных
start movlw number1 ;Запись
movwf N1 ;констант
movlw number2 ;в
movwf N2 ;ОЗУ.
clrf RES_L ;Очистка регистров
clrf RES_H ; хранения результата.
incf N1,F ;Для правильной работы алгоритма.
;Основной цикл
loop decf N1,F ;Уменьшение N1.
btfsc STATUS,Z ;Если N1 стал = 0,
goto end_prog ; то конец умножения
movf N2,W ;Складываем N2
addwf RES_L,W ; с младшим байтом результата
movwf RES_L ;
btfsc STATUS,C ;Если был перенос,
incf RES_H,F ; то увеличиваем старший байт результата на 1
goto loop ;
end_prog nop
end


 :arrow:
Код:

;Работа с портами
#include <p16f84.inc>
__config b'11111111110001'
org 0 ;Вектор сброса
clrf PCLATH
bcf STATUS,RP1 ;
bcf STATUS,RP0 ;установка банка №0
goto start
org 4 ;Вектор прерывания
goto start ;

start bsf STATUS,RP0 ;установка банка №1
movlw b'00000000' ;Настройка
movwf TRISA ;портов.
movlw b'00011111' ;
movwf TRISB ;
bcf STATUS,RP0 ;установка банка №0
loop movf PORTB,W ;Чтение из PORTB.
movwf PORTA ;Запись в PORTA.
goto loop ;
end


 :arrow:
Цитата

есть хитрый способ организовать небольшую табличку с помощью RETLW,


Код:

org 5
read_array
clrf PCLATH
addwf PCL,F

retlw 0x23
retlw 0x45
retlw 0xFF
retlw 0xAA
retlw 0x17
retlw 0x2D
retlw 0x2D
label1 retlw 0x6A
retlw 0x76
retlw 0x88


или то же самое
Код:

org 5
read_array;подпрограмма чтения из массива
;   Вход{ W= номер элемента.
;  Выход{ W= значение элемента.
clrf PCLATH
addwf PCL,F
dt 23, 45, 0ffh, 0xaa ;шестнадцатеричные константы
dt .23, .45, d’45’ ;десятичные константы
label1 dt 33+.55, .33+55, 33+55, ;смешанные константы



главное тут - чтобы массив не оказался в разных страницах - иначе в PCLATH будет указана не та страница. Поэтому в данном примере массив расположен в самом начале программы - тогда (так как он недлинный) гарантированно он окажется в нулевой странице - и мы просто очищаем PCLATH  (clrf PCLATH) перед тем как перейти на строку с адресом, загружаемым  в PCL.
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 08-06-2004 19:18 » 

Алексей1153, только что заметил, что мнемоники у нас различаются...
Вспомнил, что причесывал эти ужасные пиковские мнемоники в более удобоваримое. Я может и не я это сделал - не помню. Да, давно это было...
Это, imho, понятнее оригинальных - ближе к intel-овским:
Код:
; Alias of Instruction Mnemonic.
;#define a w
#define ind indf
;
#define add addwf
#define and andwf
#define clr clrf
;#define clrw clrw
#define not comf
#define dec decf
#define decsz decfsz
#define inc incf
#define incsz incfsz
#define or iorwf
#define mov movf
#define movw movwf
;#define nop nop
#define rl rlf
#define rr rrf
#define sub subwf
#define swap swapf
#define xor xorwf
; bit op
#define bc bcf
#define bs bsf
#define btsc btfsc
#define btss btfss
; const op
#define addn addlw
#define andn andlw
;#define call call
;#define clrwatchdog clrwd
#define jmp goto
#define orn iorlw
#define movn movlw
;#define ld movlw
#define reti retfie
#define retn retlw
#define ret return
;#define halt sleep
#define subn sublw
#define xorn xorlw
; end of alias
;
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 08-06-2004 20:42 » 

лепота Улыбаюсь
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #9 : 09-06-2004 16:08 » 

Насчет произвольного доступа к памяти. Я тут вычитал в доке к микроконтролеру
Цитата
2.5 Indirect Addressing; INDF and FSR Registers

The INDF register is not a physical register. Addressing INDF actually addresses the register whose address is contained in the FSR register (FSR is a pointer). This is indirect addressing.

EXAMPLE 2-1: INDIRECT ADDRESSING

Reading INDF itself indirectly (FSR = 0) will produce 00h. Writing to the INDF register indirectly results in a no-operation (although STATUS bits may be affected). A simple program to clear RAM locations 20h-2Fh using indirect addressing is shown in Example 2-2.

EXAMPLE 2-2: HOW TO CLEAR RAM USING INDIRECT ADDRESSING

An effective 9-bit address is obtained by concatenating the 8-bit FSR register and the IRP bit (STATUS<7>), as shown in Figure 2-3. However, IRP is not used in the PIC16F84A.

• Register file 05 contains the value 10h
• Register file 06 contains the value 0Ah
• Load the value 05 into the FSR register
• A read of the INDF register will return the value of 10h
• Increment the value of the FSR register by one (FSR = 06)
• A read of the INDF register now will return the value of 0Ah.

Код:

   movlw 0x20 ;initialize pointer
   movwf FSR   ;to RAM
NEXT
   clrf INDF       ;clear INDF register
   incf FSR        ;inc pointer
   btfss FSR,4    ;all done?
   goto NEXT     ;NO, clear next
CONTINUE
{ ;YES, continue


Это то, о чем я думаю?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 09-06-2004 18:55 » new

Finch, через FSR и INDF  - это к файлу регистров (чтение/запись), а не к памяти  программ (только чтение, в принципе (конечно если не программирование) )

это косвенная адресация регистров - в FSR записывается адрес регистра, а регистр INDF проецирует на себя регистр с этим адресом - при записи/чтении в/из INDF происходит работа с тем регистром, чей адрес в FSR
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines