Отговори на тема  [ 11 мнения ] 
ново въпросче 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 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-а. Благодарим за вниманието !!!


Прикачени файлове:
Schematic.gif
Schematic.gif [ 6.6 KiB | Прегледано 2665 пъти ]
PICprog.rar [202.59 KiB]
153 пъти
Пет Окт 20, 2006 11:42 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
Цитат:
В част от програмата за обслужване на прекъсванията трябва да се извърши запис в EEPROM
Къде е прекъсването? Постни целия сорс - всичко!


Пет Окт 20, 2006 12:52 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 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 всичко си се записва , но като го вкарам в пика не се извършва никаква промяна


Прикачени файлове:
sled_obrabotka.jpg
sled_obrabotka.jpg [ 48.13 KiB | Прегледано 1626 пъти ]
clip_image002.jpg
clip_image002.jpg [ 49.24 KiB | Прегледано 1609 пъти ]
Съб Окт 21, 2006 5:12 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 11, 2006 5:30 pm
Мнения: 39
Мнение 
показал съм пример прикойто се зареждат стойностите :
1 ,6 ,6, 6,2

записът в първия адрес (1) определя колко подред стойности ще се запишат 1 + 4


Съб Окт 21, 2006 5:20 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
Според мене, записа в еепрома трябва да си работи. Какво става като качиш програмата в пика? Дали изобщо тръгва? Как си свързал кварца - кондензаторите към него, ресета...?


Съб Окт 21, 2006 6:46 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 11, 2006 5:30 pm
Мнения: 39
Мнение 
zna4i , 4ast ot sorsa na programata koito sam ne sam pokazal v momenta raboti normalno.
Tova poredica ot miga6ti svetodiodi (bqga6ti svetlini)(RB4,RB5,RB6), razdeleni na nqkolko podprogrami. Efektite koito sam zalijil rabotqt. Tiq promenlivi za koito sam pisal t1,t2,t3 sa za vremena koito opredelqt kolko dalgo da sveti edin svetodiod, a p1,p2....p9 za opredlqneto posledovatelnost ot 3 programi. rabotqt poneje nali predvaritelno zalagamm stoinosti v pametta. Shemata na svarzvane sam q vzel ot mlad konstruktor knigata. v momenta ne moga da postna shemata.
Vzema da si kupq ot tehniq sait edin ima6e edin programator za okolo 25 kinta , 6toto nqmam na ideq za6to ne stava zapisa . vazmojno li da e ot programatora? Kato se ima v predvid 4e golama 4ast ot koda si raboti normalno.


Нед Окт 22, 2006 7:07 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Яну 30, 2006 2:48 am
Мнения: 1248
Местоположение: София
Мнение 
При писане в ЕЕPROM-ь трябва да са забранени прекъсванията


Пон Окт 23, 2006 12:33 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Окт 10, 2004 9:55 am
Мнения: 1718
Мнение Mda
Syrius-B написа:
При писане в ЕЕPROM-ь трябва да са забранени прекъсванията

Провери дали не изчакваш стария запис дали е приключил и тогава да правиш нов запис ?
Записа по принцип си е бавен процес и трябва се изчаква докато се запише има си и флаг за прекъсване и когато приключи записа се вдига !


Пон Окт 23, 2006 3:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
Записа се прави при обработка на прекусване - т.е. INTCON,GIE = 0 . Също, след 55,АА и вдигане на WR бита, се изчаква същия бит да стане"0" - т.е. записа да завърши.
Емо, драсни една програмка с която да запишеш няколко променливи (или статични :-)) в еепрома, но без да си в прекъсване! Ако стане, помисли да промениш програмата си така, че да не записваш по време на прекъсването.


Пон Окт 23, 2006 4:09 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 11, 2006 5:30 pm
Мнения: 39
Мнение 
благодарим за вниманието и съветите .Ще пробвам днеска да направя някои промени.
В подпрограмата за запис -WRITE_EEPROM , правя проверка за завършил запис чрез флаг за запис :

CHECK_WRITE
BTFSC EECON1,WR
GOTO CHECK_WRITE

А това за пробата със статичните променливи съм го пробвал вече в примера описан най- горе :

WRITE_EEPROM
BCF STATUS,RP0
movlw H'00'
MOVWF EEADR
MOVLW H'01' ; при първоначално инициализиране това е 3
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


Вто Окт 24, 2006 11:09 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 11, 2006 5:30 pm
Мнения: 39
Мнение 
Но ще пробвам да ги повартя тия флагове. все пак използвам само едно прекъсване (RB0/INT),но щом казвате , уж всичко това не съм го мислил аз а го взимам от книга , ама на....


Вто Окт 24, 2006 11:17 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 11 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни