|
Emo
Ранг: Минаващ
Регистриран на: Пон Сеп 11, 2006 5:30 pm Мнения: 39
|
 ново въпросче
ЗДР на всички
С риск да досадим искам да питам 2, 3 дребни нещица
(16ф84А & mplab). Направена от мен програмка при симулация работи както трябва , обаче когато я кача на PIC-а нещо куца на едно място.В част от програмата за обслужване на прекъсванията трябва да се извърши запис в EEPROM , ама нищо не става. Докато при симулация като наблюдавам EEPROM всичко се записва както и където трябва
Значи ето и кода който съм вкарал :
(взаимстван от книгата на млад конструктор)
WRITE_EEPROM
BCF STATUS,RP0
MOVF III,W
CALL TABLE_READ
MOVWF EEADR
MOVF KKK,W
MOVWF EEDATA
BSF STATUS,RP0
BSF EECON1,WREN
MOVLW H'55'
MOVWF EECON2
MOVLW H'AA'
MOVWF EECON2
BSF EECON1,WR
CHECK_WRITE
BTFSC EECON1,WR
GOTO CHECK_WRITE
; BCF EECON1,WREN
BCF STATUS,RP0
RETURN
TABLE_READ
ADDWF PCL,1
RETLW H'00' ; KKK (БРОЙ ПРОГРАМИ)
RETLW H'01' ; T1
RETLW H'02' ; T2
RETLW H'03' ; T3
RETLW H'04' ; ПРОГРАМА №1
RETLW H'05' ; ПРОГРАМА №2
RETLW H'06' ; .
RETLW H'07' ; .
RETLW H'08' ; .
RETLW H'09' ;
RETLW H'0A' ;
RETLW H'0B' ;
RETLW H'0C' ;ПРОГРАМА №9
като III дава адреса , а KKK съдържанието и понеже почти всеки би се усъмнил да не би в тия променливи да присвоявам стойности които са неправилни (проверявал съм ги по време на симулация - добре са си),
направо промених сорса като сложих директно константи :
WRITE_EEPROM
BCF STATUS,RP0
movlw H'00'
MOVWF EEADR
MOVLW H'01'
MOVWF EEDATA
BSF STATUS,RP0
BSF EECON1,WREN
MOVLW H'55'
MOVWF EECON2
MOVLW H'AA'
MOVWF EECON2
BSF EECON1,WR
CHECK_WRITE
BTFSC EECON1,WR
GOTO CHECK_WRITE
; BCF EECON1,WREN
BCF STATUS,RP0
RETURN
т.е. трябва в първата клетка да се запише "1" , да ама не става.
първоначално в първата клетка е записано числото "3" :
ORG H'2100'
DE D'3',D'7',D'7',D'7',D'1',D'2',D'3',D'1',D'1',D'1',D'1',D'1',D'1',D'1'
(използвани при първоначално четене и TABLE_READ)
числото 3 си остава след записа в паметта.
Дайте един акъл къде греша !?
пак ще повторя при симулация всичко се записва правилно в паметта.
да не е от програматора и софтуера щото той не е за 84А а за 84 . Супер простичка схема веднъж я постнах .... ето и софтуера . Да не те да бъркат нещо работите? Иначе 80 % от записания код се изпълнява нормално от PIC-а. Благодарим за вниманието !!!
|
|
Emo
Ранг: Минаващ
Регистриран на: Пон Сеп 11, 2006 5:30 pm Мнения: 39
|
list p=16F84A
#include <p16F84A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
W EQU 0
F EQU 1
BUTONS EQU H'0C'
TIME EQU H'0D'
III EQU H'0E'
KKK EQU H'0F'
TEMP EQU H'10'
END_CYC EQU H'11'
J EQU H'12'
T1 EQU H'13'
T2 EQU H'14'
T3 EQU H'15'
P1 EQU H'16'
P2 EQU H'17'
P3 EQU H'18'
P4 EQU H'19'
P5 EQU H'1A'
P6 EQU H'1B'
P7 EQU H'1C'
P8 EQU H'1D'
P9 EQU H'1E'
KKK1 EQU H'1F'
#DEFINE RESET PORTB,0 ;ВХОД
#DEFINE UP PORTB,1 ;ВХОД
#DEFINE DOWN PORTB,2 ;ВХОД
#DEFINE ENTER PORTB,3 ;ВХОД
#DEFINE ERR PORTB,4 ;ИЗХОД
#DEFINE PUMP_1 PORTB,5 ;ИЗХОД
#DEFINE PUMP_2 PORTB,6 ;ИЗХОД
#DEFINE PUMP_3 PORTB,7 ;ИЗХОД
ORG H'2100'
DE D'3',D'7',D'7',D'7',D'1',D'2',D'3',D'1',D'1',D'1',D'1',D'1',D'1',D'1'
ORG H'0000'
goto START
ORG H'0004'
goto Int_Service
START
MOVLW B'00010111'
BSF STATUS,RP0
MOVWF OPTION_REG
BCF STATUS,RP0
CLRF PORTB
BCF STATUS,RP0
CLRF PORTA
BSF STATUS,RP0
MOVLW B'00001111'
MOVWF TRISB
BSF STATUS,RP0
MOVLW B'00000'
MOVWF TRISA
BCF STATUS,RP0
BCF INTCON,INTF
BCF STATUS,RP0
MOVLW B'10010000'
MOVWF INTCON
BCF STATUS,RP0
MOVF PORTB,1
BCF ERR
GOTO MAIN
Int_Service
BTFSS INTCON,INTF
GOTO END_INT
BCF STATUS,RP0
CLRF PORTB
PUSH_B ;proverka za natisnat buton
BCF STATUS,RP0
BTFSC RESET
GOTO PUSH_B
; CALL WAIT
BTFSC RESET
GOTO PUSH_B
PULL_B ; proverka za otpusnat buton
BTFSS RESET
GOTO PULL_B
; CALL WAIT
BTFSS RESET
GOTO PULL_B
MOVLW D'0' ; pokazva teku6ta zapisana stoinost ot parvata kletka
MOVWF III
CALL READ_EEPROM
BCF STATUS,RP0
MOVWF KKK
MOVWF PORTA
AGAIN_1
CALL CHECK_BUTTONS ; - proverka za 2 natisnati butona
BCF STATUS,Z
MOVF BUTONS,W
BTFSC STATUS,Z
GOTO AGAIN_1
BCF STATUS,Z
MOVLW D'1'
SUBWF BUTONS,W
BTFSC STATUS,Z
GOTO AAAA
BSF ERR ; ima 2 natisnati butona
; CALL WAIT3
BCF ERR
GOTO AGAIN_1
AAAA
MOVLW D'0'
MOVWF END_CYC
MOVLW D'0'
MOVWF III ; ПАРВОНАЧАЛНА ИНИЦИАЛИЗАЦЯ ZAPIS/4ETENE V
;EEPROM - ADRASA NA "K"
CYCLE_READ
BCF STATUS,Z
MOVLW D'1'
SUBWF END_CYC,W
BTFSC STATUS,Z ;PROVERKA ZA IZHOD OT CIKALA INT_SERVICE
GOTO END_INT
CALL READ_EEPROM;VZIMA ST-STA ZA BROI CIKLI t1,t2,t3,p1....p9
BCF STATUS,RP0
MOVWF KKK ;ZAPIS V PROMENLIVATA ZA CIKALA
MOVWF PORTA ;VIZUALIZACIQ "KKK"
CYCLE_K
BTFSS UP ;cikal za uveli4avane , namqlqvane , zapis na stoinosti
GOTO INCREMENT
BTFSS DOWN
GOTO DECREMENT
BTFSS ENTER
GOTO STORE
GOTO CYCLE_K
END_INT ;etiket za izhod ot zapisvane na stoinosti
BCF STATUS,RP0
CLRF PORTA
;--- ;zarejdane na promenlivite t1,t2,t3,p1....p9
MOVLW D'0'
MOVWF III
CALL READ_EEPROM
MOVWF KKK1
MOVWF III
MOVLW D'3'
ADDWF III,F
READ_PROGRAMS2
CALL READ_EEPROM
CALL TABLE_MENU
DECFSZ III,F
GOTO READ_PROGRAMS2
MOVLW D'1'
MOVF III,F
;---
BCF STATUS,RP0
BCF INTCON,INTF
RETFIE
;-----------------------------
CHECK_BUTTONS
CLRF BUTONS
BTFSS RESET
INCF BUTONS,1
BTFSS UP
INCF BUTONS,1
BTFSS DOWN
INCF BUTONS,1
BTFSS ENTER
INCF BUTONS,1
RETURN
;-----------------------------
READ_EEPROM
BCF STATUS,RP0
MOVF III,W
CALL TABLE_READ
BCF STATUS,RP0
MOVWF EEADR
BSF STATUS,RP0
BSF EECON1,RD
BCF STATUS,RP0
MOVF EEDATA,W
RETURN
;-----------------------------
WRITE_EEPROM
BCF STATUS,RP0
MOVF III,W
; CALL TABLE_READ
MOVWF EEADR
MOVF KKK,W
MOVWF EEDATA
; BCF INTCON,GIE
BSF STATUS,RP0
BSF EECON1,WREN
MOVLW H'55'
MOVWF EECON2
MOVLW H'AA'
MOVWF EECON2
BSF EECON1,WR
CHECK_WRITE
BTFSC EECON1,WR
GOTO CHECK_WRITE
; BCF EECON1,WREN
BCF STATUS,RP0
BSF ERR ;vizualizira 4e e izvar6en zapis
; CALL WAIT3
BCF ERR
BCF STATUS,Z
MOVLW D'0' ; VZIMA SE BROI PROGRAMI p1-p9
SUBWF III,W
BTFSS STATUS,Z
GOTO UUU4
MOVF KKK,W
MOVWF TEMP
MOVLW D'3'
ADDWF TEMP,F
UUU4
MOVF TEMP,W ; VZIMA SE ZA IZHOD OT INT_SERVICE
BCF STATUS,Z
SUBWF III,W
BTFSS STATUS,Z
GOTO UUU5
MOVLW D'1'
MOVWF END_CYC
UUU5
INCF III,1
RETURN
;-----------------------------
TABLE_READ ;izbor na adres za eeprom
ADDWF PCL,1
RETLW H'00' ; KKK
RETLW H'01' ; T1
RETLW H'02' ; T2
RETLW H'03' ; T3
RETLW H'04' ; ПРОГРАМА №1 P1
RETLW H'05' ; ПРОГРАМА №2 P2
RETLW H'06' ; .
RETLW H'07' ; .
RETLW H'08' ; .
RETLW H'09' ;
RETLW H'0A' ;
RETLW H'0B' ;
RETLW H'0C' ;ПРОГРАМА №9 P9
;------------------------------------
STORE
BCF STATUS,RP0
; CALL WAIT
BTFSC ENTER
GOTO CYCLE_K
BCF STATUS,Z
MOVLW D'0' ; BUTONI OT 1-9 ograni4enie
SUBWF KKK,W
BTFSS STATUS,Z
GOTO UUU3
GOTO CYCLE_K
UUU3
BCF STATUS,Z
MOVLW D'10' ; ograni4enie
SUBWF KKK,W
BTFSS STATUS,Z
GOTO UUU35
GOTO CYCLE_K
UUU35
CALL WRITE_EEPROM
STORE_OUT
BTFSS ENTER
GOTO STORE_OUT
; CALL WAIT
GOTO CYCLE_READ
;-----------------------------
INCREMENT
BCF STATUS,RP0
; CALL WAIT
BTFSC UP
GOTO CYCLE_K
BCF STATUS,Z
MOVLW D'9' ;ograni4eniq
SUBWF KKK,W
BTFSS STATUS,Z
GOTO UUU33
GOTO CYCLE_K
UUU33
BCF STATUS,C
MOVLW D'3' ; ograni4eniq PROGRAMITE 1-9
SUBWF III,W
BTFSS STATUS,C
GOTO EEE66
GOTO EEE
EEE
BCF STATUS,Z
MOVLW D'3' ; ograni4eniq VID PROGRAMI 1-3
SUBWF KKK,W
BTFSC STATUS,Z
GOTO CYCLE_K
EEE66
BCF STATUS,RP0
INCF PORTA,1
INCF KKK,1
INCR_OUT ;proverka za otpusnat buton
BTFSS UP
GOTO INCR_OUT
; CALL WAIT
GOTO CYCLE_K
;---------------------------
DECREMENT
BCF STATUS,RP0
; CALL WAIT
BTFSC DOWN
GOTO CYCLE_K
BCF STATUS,Z
MOVLW D'1' ; ogrsni4enie BUTONI OT 1-9
SUBWF KKK,W
BTFSS STATUS,Z
GOTO UUU2
GOTO CYCLE_K
UUU2
BCF STATUS,C
MOVLW D'3' ; ograni4eni PROGRAMITE 1-3
SUBWF III,W
BTFSS STATUS,C
GOTO EEE266
GOTO EEE2
EEE2
BCF STATUS,Z
MOVLW D'1'
SUBWF KKK,W
BTFSS STATUS,Z
GOTO EEE266
GOTO CYCLE_K
EEE266
BCF STATUS,RP0
DECF PORTA,1
DECF KKK,1
DECR_OUT
BTFSS DOWN
GOTO DECR_OUT ; proverka za otpusnat buton
; CALL WAIT
GOTO CYCLE_K
;--------------
TABLE_MENU ; zarejdane na t1,t2,t3,p1......p9
MOVWF TEMP
BCF STATUS,Z
MOVLW D'1'
SUBWF III,W
BTFSS STATUS,Z
GOTO M1
MOVF TEMP,W
MOVWF T1
GOTO M12
M1
MOVLW D'2'
SUBWF III,W
BTFSS STATUS,Z
GOTO M2
MOVF TEMP,W
MOVWF T2
GOTO M12
M2
MOVLW D'3'
SUBWF III,W
BTFSS STATUS,Z
GOTO M3
MOVF TEMP,W
MOVWF T3
GOTO M12
M3
MOVLW D'4'
SUBWF III,W
BTFSS STATUS,Z
GOTO M4
MOVF TEMP,W
MOVWF P1
GOTO M12
M4
MOVLW D'5'
SUBWF III,W
BTFSS STATUS,Z
GOTO M5
MOVF TEMP,W
MOVWF P2
GOTO M12
M5
MOVLW D'6'
SUBWF III,W
BTFSS STATUS,Z
GOTO M6
MOVF TEMP,W
MOVWF P3
GOTO M12
M6
MOVLW D'7'
SUBWF III,W
BTFSS STATUS,Z
GOTO M7
MOVF TEMP,W
MOVWF P4
GOTO M12
M7
MOVLW D'8'
SUBWF III,W
BTFSS STATUS,Z
GOTO M8
MOVF TEMP,W
MOVWF P5
GOTO M12
M8
MOVLW D'9'
SUBWF III,W
BTFSS STATUS,Z
GOTO M9
MOVF TEMP,W
MOVWF P6
GOTO M12
M9
MOVLW D'10'
SUBWF III,W
BTFSS STATUS,Z
GOTO M10
MOVF TEMP,W
MOVWF P7
GOTO M12
M10
MOVLW D'11'
SUBWF III,W
BTFSS STATUS,Z
GOTO M11
MOVF TEMP,W
MOVWF P8
GOTO M12
M11
MOVLW D'12'
SUBWF III,W
BTFSS STATUS,Z
GOTO M12
MOVF TEMP,W
MOVWF P9
M12
RETURN
MAIN
WW
GOTO WW
END
wait - подпрорами за изчакване (махнати)
проблемчето идва единствено при записа - всъщност данните в паметта не се обновяват. Умишленно съм махнал сорса в MAIN понеже мисля че вече достатъчно трудно може да се ориентирате в кода . Така написан пак може да бъде изпълнен - за симулация и за качване
С няколко думи:
1.porta - показва стойността на ККК (двоичен вид) при прочитане от EEPROM ,как се изменя при увеличаване и намалаване (increment, decrement) - тук съм вързал светодиоди към маса RA0,RA1,RA2,RA3
2. в нормалното си състояние на RB0,RB1,RB2,RB3 имат високо ниво(pull-up resistors) - това са обикновенни бутони с отворени контакти вързани към маса(има проверки за задържани бутони)
- програмата обслужваща прекъсванията се изпълнява при промяна състоянието на R0.
- RB1 увеличава стойността
- RB2 намалява стойността
- RB3 записва стойността
3.има ограничения в icrement и decrement както следва :
в 1-та клетка от ЕЕПРОМ може да се запише стойност от 1 до 9 адрес 00
в 2 -та 1-9 адрес 01
в 3 -та 1-9 адрес 02
в 4-та 1-3 адрес 03
в 5-та 1-3 адрес 04
-----
---
в 13-та 1-3 адрес 0C
т1 ,т2,т3,р1,р2,......р9 са съответно променливи които трябва да присвоят записаните стойности в паметта с адрес 01 до 0С (стойността на адрес 00 го ползвам отделно )
Записването става последователно за всяка стойност при всяко натискане на "enter" (portb,3)
като избора на адрес зависи от променливата III която се увеличава при всяко излизане от
WRITE_EEPROM. Стойността от първия адрес 00 определя колко от клетките от 01 до 0С да се направи промяна(като преминаването на първите 3 е задължителна) , примерно
ако в адрес 00 се запише 1 следва : (+4 )
от Int_service ще се излезе когато се запишат стойности в : t1,t2,t3 ,p1 (чрез етикета END_CYCLE)
тоест се натисне 5 пъти ''enter''
ако в адрес 00 се запише 3 следва : (+4)
от Int_service ще се излезе когато се запишат стойности в : t1,t2,t3 ,p1,p2,p3
тоест се натисне 7 пъти ''enter''
това е логиката която искам да се извърши при запис в паметта . при симулация всичко е наред , наблюдавам ЕЕПРОМ-а , променливите t1,t2,t3,p1,p2.....p9 всичко си се записва , но като го вкарам в пика не се извършва никаква промяна
|