Форум за електроника Форуми Форум за електроника

Форум за електроника
Български форум за електроника, ремонти, схеми, документация
 
 Въпроси/ОтговориВъпроси/Отговори   ТърсенеТърсене   ГрупиГрупи   Регистрирайте сеРегистрирайте се 
 ПрофилПрофил   Влезте, за да видите съобщенията сиВлезте, за да видите съобщенията си   ВходВход 

Service Manual Search :   Enhanced by: Jabse.com : българската търсачка
pic 16f84a
Иди на страница 1, 2, 3, 4, 5  Следваща
 
Създайте нова тема   Напишете отговор    Форум за електроника Форуми -> Обща електроника - General Electronics
Предишната тема :: Следващата тема  
Автор Съобщение
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
Мнения: 1106

МнениеПуснато на: Съб Яну 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 да чувал съм че е по добре за да не се осложнява програмата и да не се мъчи процесора да проверява постоянно портовете но не съм наясно с тези прекъсвания Crying or Very sad

Последната промяна е направена от hunterS на Съб Яну 10, 2009 22:10; мнението е било променяно общо 1 път
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
emil74
Опитен потребител
Опитен потребител


Регистриран на: 16 Мар 2007
Мнения: 1106

МнениеПуснато на: Съб Яну 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, когато не е натиснат бутон.

...
Мисля, че просто малко неясно си дал обясненията. Програмата трябва да работи коректно, така написана, доколкото виждам.


За прекъсванията, можеш да използваш готови програмки от същата книжка(на Н.Кенаров, струва ми се Smile ). Ако използваш и "събуждане", ще намалиш консумацията.


Последната промяна е направена от emil74 на Съб Яну 10, 2009 22:14; мнението е било променяно общо 1 път
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла Посетете сайта на потребителя
hunterS
Нов потребител
Нов потребител


Регистриран на: 10 Яну 2009
Мнения: 36

МнениеПуснато на: Съб Яну 10, 2009 22:12    Заглавие: Отговорете с цитат

Много ти благодаря можвш ли да ми кажеш нещо за прекъсванията как по лесно да ги асимилирам че нещо не мога да се ориантирам.

Да ти си прав логиката е както ти си я написъл просто съм се подвел вместо ДА е трябвало да е НЕ моя грешка

Exclamation Събирам ти двата поста-друг път не пускай пост след пост,а ползвай бутона EDIT Exclamation
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
emil74
Опитен потребител
Опитен потребител


Регистриран на: 16 Мар 2007
Мнения: 1106

МнениеПуснато на: Съб Яну 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    Заглавие: Отговорете с цитат

Много ти благодаря Smile Евала на хора като теб които искат да помогнат.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
RM
Опитен потребител
Опитен потребител


Регистриран на: 16 Сеп 2008
Мнения: 650

МнениеПуснато на: Съб Яну 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 пъти
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла
Потърси "pic 16f84a" в магазин за електроника Pulsator.bg : БЕЗПЛАТНА ДОСТАВКА над 90 лв.

Покажи мнения от преди:   
Потърси "pic 16f84a" в Интернет



Създайте нова тема   Напишете отговор    Форум за електроника Форуми -> Обща електроника - General Electronics Часовете са според зоната GMT + 2 Часа
Иди на страница 1, 2, 3, 4, 5  Следваща
Страница 1 от 5

 
Към:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети