 |
Форум за електроника Български форум за електроника, ремонти, схеми, документация
|
| Предишната тема :: Следващата тема |
| Автор |
Съобщение |
hunterS Нов потребител

Регистриран на: 10 Яну 2009 Мнения: 36
|
Пуснато на: Съб Яну 10, 2009 19:46 Заглавие: pic 16f84a |
|
|
Здравейте, нов съм тука и искам да ви помоля за услуга написах си код за PIC16F84A и ме интересува дали е верен или имам грешка значи принципът на действие е следния: при подаване на захранване на PORTB1 и PORTB3 трябва да има 0 а на PORTB2 и PORTB4 да има 1 при постъпване на 0 на PORTB5 трябва PORTB1 да се установи в 1 а PORTB2 в 0 при което се задейства времезадръжка от 16ms след това портовете 1 и 2 се обръщат в първоначалното си състояние същия ефект е и с другите два порта 3 и 4 при постъпване на 0 на PORTB6. Кода е на Асемблер и моля ако някой има възможност за помощ защото които и да питам като чуе за Асемблер и се спича регнал съм се в друг форум ама там от умрял писмо да чакаш та ето го и кода и предварително ви благодаря
list p=16F84A ;ЗАДАВА ТИПА НА ПРОЦЕСОРА
#include <p16F84A.inc>; ДЕФИНИЦИИ НА SFR РЕГИСТРИТЕ
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;********************* Дефиниране на константи и променливи **************************
w EQU 0
f EQU 1
Counter EQU H'0C'
;--------------------- Дефиниране на входно-изходните портове ------------------------
#define Out_1 PORTB,1
#define Out_2 PORTB,2
#define Out_3 PORTB,3
#define Out_4 PORTB,4
#define In_l PORTB,5
#define In_r PORTB,6
;*************************************************************************************
; Потребителска програма
;*************************************************************************************
ORG H'0000' ;Вектор на начално установяване НУ
goto start ;Преход към начало на програмата
;*************************************************************************************
; Начало на програмата
;*************************************************************************************
start bsf STATUS,RP0 ;Избор на Банка 1
movlw B'00010100' ;Нулиране на 7 бит от регистър OPTION_REG-
movwf OPTION_REG ;разрешава включване на PULL-UP резистори
bcf STATUS,RP0 ;Избор на Банка 0
clrf PORTB ;Нулиране на PORTB
bsf STATUS,RP0 ;Избор на Банка 1
movlw B'11100000'
movwf TRISB ;RB7-RB5-Входове,RB0-RB4-Изход
bcf STATUS,RP0 ;Избор на Банка 0
goto main
;*************************************************************************************
; Използвани подпрограми
;*************************************************************************************
;--------------- Подпрограма "Wait" формира времезадръжка от 16ms --------------------
Wait movlw D'2' ;
movwf Counter ;
clrf TMR0 ;Нулира TMR0
again bcf INTCON,T0IF ;Нулира бит T0IF
loop btfss INTCON,T0IF ;Бит T0IF=1
goto loop ;Не,провери отново
decfsz Counter,f ;
goto again ;Изпълни цикъла отново
return
;*************************************************************************************
; Главна програма
;*************************************************************************************
main bcf Out_1 ;Установи PORTB,1 в 0
bsf Out_2 ;Установи PORTB,2 в 1
bcf Out_3 ;Установи PORTB,3 в 0
bsf Out_4 ;Установи PORTB,4 В 1
check_sensor
btfss In_l ;Провери PORTB,5 пропусни при 1
goto left ;Да,завой на дясно
btfss In_r ;Провери PORTB,6 пропусни при 1
goto right ;Да,завой на ляво
goto check_sensor ;Започни сканирането отначало
left
bsf Out_1 ;Установи PORTB,1 в 1
bcf Out_2 ;Установи PORTB,2 в 0
call Wait ;Изчакай 16ms
btfsc In_l ;Още ли иам препядствие
goto main ;Не,започни сканирането отначало
lsensor_release
btfss In_l ;Провери PORTB,5 пропусни при 1
goto lsensor_release ;Не,провери отново
call Wait ;Изчакай 16ms
goto main ;Започни сканирането отначало
right
bsf Out_3 ;Установи PORTB,3 в 1
bcf Out_4 ;Установи PORTB,4 в 0
call Wait ;Изчакай 16ms
btfsc In_r ;Още ли иам препядствие
goto main ;Не,започни сканирането отначало
rsensor_release
btfss In_r ;Провери PORTB,6 пропусни при 1
goto rsensor_release ;Не,провери отново
call Wait ;Изчакай 16ms
goto main ;Започни сканирането отначало
END |
|
| Върнете се в началото |
|
 |
andrey1988 Опитен потребител


Регистриран на: 30 Дек 2005 Мнения: 1263 Местожителство: Ботевград
|
Пуснато на: Съб Яну 10, 2009 19:52 Заглавие: |
|
|
| MPLAB нема ли симулация , пусни го там проследи къде какво става и ше видиш дали работи верно. |
|
| Върнете се в началото |
|
 |
hunterS Нов потребител

Регистриран на: 10 Яну 2009 Мнения: 36
|
Пуснато на: Съб Яну 10, 2009 20:03 Заглавие: |
|
|
| Ми аз го пуснах през дебъгера и искарах листа кадето наблюдавах портовете наистина постъпват изминения на портовете но както споменах съм нов тоест в програмирането съм неопитен и за това ви моля за съдействие по темата. |
|
| Върнете се в началото |
|
 |
emil74 Опитен потребител


Регистриран на: 16 Мар 2007 Мнения: 1111
|
Пуснато на: Съб Яну 10, 2009 21:43 Заглавие: |
|
|
Програмата трябва да работи коректно, така написана, доколкото виждам.
Последната промяна е направена от emil74 на Съб Яну 10, 2009 22:08; мнението е било променяно общо 1 път |
|
| Върнете се в началото |
|
 |
hunterS Нов потребител

Регистриран на: 10 Яну 2009 Мнения: 36
|
Пуснато на: Съб Яну 10, 2009 22:08 Заглавие: |
|
|
Да идеята е когато на PORTB,5 имам 0 да завие надясно а при 0 на PORTB,6 да е наляво. А що се отнася за птекъсванията от PORTB да чувал съм че е по добре за да не се осложнява програмата и да не се мъчи процесора да проверява постоянно портовете но не съм наясно с тези прекъсвания 
Последната промяна е направена от hunterS на Съб Яну 10, 2009 22:10; мнението е било променяно общо 1 път |
|
| Върнете се в началото |
|
 |
emil74 Опитен потребител


Регистриран на: 16 Мар 2007 Мнения: 1111
|
Пуснато на: Съб Яну 10, 2009 22:09 Заглавие: |
|
|
Извинявай, изтрих междувременно част от поста, защото прочетох обяснението най-отгоре.
Връщам го, за да разберат останалите защо ми отговаряш така:
Малко изпускам идеята тук:
Така написано:
btfss In_l ;Провери PORTB,5 пропусни при 1
goto left ;Да,завой на дясно
btfss In_r ;Провери PORTB,6 пропусни при 1
goto right ;Да,завой на ляво
ще имаш:
При PORTB,5=0 =>завой надясно
При PORTB,6=0 =>завой наляво
Логиката е:
btfss In_l ;PORTB,5=1?
goto left ; Не, завий наляво (т.е. ако не е 1, което значи, че е 0)
Същото е и за надясно.
При процедурите за наляво и надясно също при проверка за излизане
имаш обърната логика.
Това ли целиш?
Изтеглящите резистори на PORTB са pull-up, а не pull-down, нали знаеш? От OPTION REGISTER си ги разрешил, така че постоянно имаш високо ниво(1) на входовете на PORTB, когато не е натиснат бутон.
...
Мисля, че просто малко неясно си дал обясненията. Програмата трябва да работи коректно, така написана, доколкото виждам.
За прекъсванията, можеш да използваш готови програмки от същата книжка(на Н.Кенаров, струва ми се ). Ако използваш и "събуждане", ще намалиш консумацията.
Последната промяна е направена от emil74 на Съб Яну 10, 2009 22:14; мнението е било променяно общо 1 път |
|
| Върнете се в началото |
|
 |
hunterS Нов потребител

Регистриран на: 10 Яну 2009 Мнения: 36
|
Пуснато на: Съб Яну 10, 2009 22:12 Заглавие: |
|
|
Много ти благодаря можвш ли да ми кажеш нещо за прекъсванията как по лесно да ги асимилирам че нещо не мога да се ориантирам.
Да ти си прав логиката е както ти си я написъл просто съм се подвел вместо ДА е трябвало да е НЕ моя грешка
Събирам ти двата поста-друг път не пускай пост след пост,а ползвай бутона EDIT |
|
| Върнете се в началото |
|
 |
emil74 Опитен потребител


Регистриран на: 16 Мар 2007 Мнения: 1111
|
Пуснато на: Съб Яну 10, 2009 22:37 Заглавие: |
|
|
Изпълнението на всяка програма може да бъде прекратено при определени условия-настъпване на събитие от непрограмен характер в произволен момент(например натискане на бутон). При това може настъпването на такова събитие да се отрази на поведението на програмата като цяло. Един вид: Входно въздействие->изходна реакция. Разбира се, има дефинирани условия, които могат да предизвикват прекъсване. За промяна на PORTB това са: 1. При промяна фронта на сигнала на бит 0-> PORTB,0 или 2. Прекъсване при промяна на PORTB4,5,6,7 (не 0,1,2,3). За намалена консумация се ползва sleep, като се прави безкраен цикъл като основна програма:
main sleep
nop
goto main
Прави се програма за обслужване на прекъсванията, която проверява достоверността на прекъсването и насочва към съответна процедура.
Основното е да се запознаеш с кода на програми с прекъсвания. Обръщай внимание винаги да се възстановяват регистрите при излизане от прекъсването. |
|
| Върнете се в началото |
|
 |
hunterS Нов потребител

Регистриран на: 10 Яну 2009 Мнения: 36
|
Пуснато на: Съб Яну 10, 2009 22:51 Заглавие: |
|
|
Много ти благодаря Евала на хора като теб които искат да помогнат. |
|
| Върнете се в началото |
|
 |
RM Опитен потребител

Регистриран на: 16 Сеп 2008 Мнения: 680
|
Пуснато на: Съб Яну 10, 2009 23:09 Заглавие: |
|
|
Ето ти верния код:
| Код: |
processor 16F84A
#include <P16F84A.INC>
__config _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC ; 0x3FF9
; EEPROM-Data
Org 0x2100
DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
; RAM-Variable
LRAM_0x0C equ 0x0C
LRAM_0x0D equ 0x0D
LRAM_0x0E equ 0x0E
LRAM_0x0F equ 0x0F
LRAM_0x10 equ 0x10
LRAM_0x11 equ 0x11
LRAM_0x12 equ 0x12
LRAM_0x13 equ 0x13
LRAM_0x14 equ 0x14
LRAM_0x15 equ 0x15
LRAM_0x16 equ 0x16
LRAM_0x17 equ 0x17
LRAM_0x18 equ 0x18
LRAM_0x19 equ 0x19
LRAM_0x1A equ 0x1A
; Program
Org 0x0000
; Reset-Vector
MOVLW 0x00
MOVWF PCLATH ; !!Bank Program-Page-Select
GOTO LADR_0x0074
NOP
; Interrupt-Vector
BTFSC STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
GOTO LADR_0x000A
MOVWF LRAM_0x11
SWAPF STATUS,W
MOVWF LRAM_0x12
GOTO LADR_0x000F
LADR_0x000A
BCF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
MOVWF LRAM_0x11
SWAPF STATUS,W
MOVWF LRAM_0x12
BSF LRAM_0x12,1
LADR_0x000F
MOVF PCLATH,W ; !!Bank Program-Page-Select
MOVWF LRAM_0x19
CLRF PCLATH ; !!Bank Program-Page-Select
BCF STATUS,IRP
SWAPF LRAM_0x11,F
MOVF FSR,W
MOVWF LRAM_0x13
MOVF LRAM_0x0C,W
MOVWF LRAM_0x14
MOVF LRAM_0x0D,W
MOVWF LRAM_0x15
MOVF LRAM_0x0E,W
MOVWF LRAM_0x16
MOVF LRAM_0x0F,W
MOVWF LRAM_0x17
MOVF LRAM_0x10,W
MOVWF LRAM_0x18
BCF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BTFSS INTCON,T0IE
GOTO LADR_0x0025
BTFSC INTCON,T0IF
GOTO LADR_0x003E
LADR_0x0025
BTFSS INTCON,RBIE
GOTO LADR_0x0029
BTFSC INTCON,RBIF
GOTO LADR_0x0057
LADR_0x0029
MOVF LRAM_0x13,W
MOVWF FSR
MOVF LRAM_0x14,W
MOVWF LRAM_0x0C
MOVF LRAM_0x15,W
MOVWF LRAM_0x0D
MOVF LRAM_0x16,W
MOVWF LRAM_0x0E
MOVF LRAM_0x17,W
MOVWF LRAM_0x0F
MOVF LRAM_0x18,W
MOVWF LRAM_0x10
MOVF LRAM_0x19,W
MOVWF PCLATH ; !!Bank Program-Page-Select
SWAPF LRAM_0x12,W
MOVWF STATUS
BCF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
SWAPF LRAM_0x11,W
BTFSC LRAM_0x12,1
BSF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
RETFIE
LADR_0x003E
BTFSS LRAM_0x1A,2
GOTO LADR_0x0049
BSF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BCF PORTB,1 ; !!Bank!! PORTB - TRISB
BCF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BCF PORTB,1 ; !!Bank!! PORTB - TRISB
BSF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BCF PORTB,2 ; !!Bank!! PORTB - TRISB
BCF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BSF PORTB,2 ; !!Bank!! PORTB - TRISB
BCF LRAM_0x1A,2
LADR_0x0049
BTFSS LRAM_0x1A,3
GOTO LADR_0x0054
BSF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BCF PORTB,3 ; !!Bank!! PORTB - TRISB
BCF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BCF PORTB,3 ; !!Bank!! PORTB - TRISB
BSF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BCF PORTB,4 ; !!Bank!! PORTB - TRISB
BCF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BSF PORTB,4 ; !!Bank!! PORTB - TRISB
BCF LRAM_0x1A,3
LADR_0x0054
BCF INTCON,T0IF
BCF PCLATH,3 ; !!Bank Program-Page-Select
GOTO LADR_0x0029
LADR_0x0057
BSF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BSF PORTB,5 ; !!Bank!! PORTB - TRISB
BCF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BTFSC PORTB,5 ; !!Bank!! PORTB - TRISB
GOTO LADR_0x0062
BTFSS LRAM_0x1A,6
GOTO LADR_0x0062
BSF LRAM_0x1A,0
BSF LRAM_0x1A,4
BCF LRAM_0x1A,6
GOTO LADR_0x0064
LADR_0x0062
BSF LRAM_0x1A,6
BCF LRAM_0x1A,0
LADR_0x0064
BSF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BSF PORTB,6 ; !!Bank!! PORTB - TRISB
BCF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BTFSC PORTB,6 ; !!Bank!! PORTB - TRISB
GOTO LADR_0x006F
BTFSS LRAM_0x1A,7
GOTO LADR_0x006F
BSF LRAM_0x1A,1
BSF LRAM_0x1A,5
BCF LRAM_0x1A,7
GOTO LADR_0x0071
LADR_0x006F
BSF LRAM_0x1A,7
BCF LRAM_0x1A,1
LADR_0x0071
BCF INTCON,RBIF
BCF PCLATH,3 ; !!Bank Program-Page-Select
GOTO LADR_0x0029
LADR_0x0074
CLRF FSR
MOVLW 0x1F
ANDWF STATUS,F
CLRF LRAM_0x1A
BSF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BCF TMR0,7 ; !!Bank!! TMR0 - OPTION_REG
MOVF TMR0,W ; !!Bank!! TMR0 - OPTION_REG
ANDLW 0xC0
IORLW 0x05
MOVWF TMR0 ; !!Bank!! TMR0 - OPTION_REG
BCF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BSF INTCON,T0IE
BSF INTCON,RBIE
BSF INTCON,GIE
BSF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BCF PORTB,1 ; !!Bank!! PORTB - TRISB
BCF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BCF PORTB,1 ; !!Bank!! PORTB - TRISB
BSF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BCF PORTB,2 ; !!Bank!! PORTB - TRISB
BCF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BSF PORTB,2 ; !!Bank!! PORTB - TRISB
BSF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BCF PORTB,3 ; !!Bank!! PORTB - TRISB
BCF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BCF PORTB,3 ; !!Bank!! PORTB - TRISB
BSF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BCF PORTB,4 ; !!Bank!! PORTB - TRISB
BCF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BSF PORTB,4 ; !!Bank!! PORTB - TRISB
LADR_0x0092
CLRWDT
BTFSS LRAM_0x1A,0
GOTO LADR_0x00A2
BTFSS LRAM_0x1A,4
GOTO LADR_0x00A2
CLRF TMR0 ; !!Bank!! TMR0 - OPTION_REG
BSF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BCF PORTB,2 ; !!Bank!! PORTB - TRISB
BCF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BCF PORTB,2 ; !!Bank!! PORTB - TRISB
BSF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BCF PORTB,1 ; !!Bank!! PORTB - TRISB
BCF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BSF PORTB,1 ; !!Bank!! PORTB - TRISB
BSF LRAM_0x1A,2
BCF LRAM_0x1A,4
LADR_0x00A2
BTFSS LRAM_0x1A,1
GOTO LADR_0x00B1
BTFSS LRAM_0x1A,5
GOTO LADR_0x00B1
CLRF TMR0 ; !!Bank!! TMR0 - OPTION_REG
BSF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BCF PORTB,4 ; !!Bank!! PORTB - TRISB
BCF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BCF PORTB,4 ; !!Bank!! PORTB - TRISB
BSF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BCF PORTB,3 ; !!Bank!! PORTB - TRISB
BCF STATUS,RP0 ; !!Bank Register-Bank(0/1)-Select
BSF PORTB,3 ; !!Bank!! PORTB - TRISB
BSF LRAM_0x1A,3
BCF LRAM_0x1A,5
LADR_0x00B1
GOTO LADR_0x0092
SLEEP
End
|
И симулацията в атача
Последната промяна е направена от RM на Нед Яну 11, 2009 0:54; мнението е било променяно общо 5 пъти |
|
| Върнете се в началото |
|
 |
|
|
Не Можете да пускате нови теми Не Можете да отговаряте на темите Не Можете да променяте съобщенията си Не Можете да изтривате съобщенията си Не Можете да гласувате в анкети
|
|