# PIC mikrokontrolleri >  PIC16F628A probleema

## sharps

Man radaas shaada probleema ar PIC16F628A.
pie RB0 piesleegts IR uztveereejs. pamat programma savu darbu veic bez aizkjershanaas. tikko ar pulti suutam komandu, taa PIC programmaa tiek izsaukts paartraukums, kura laikaa tiek testeets RB0 pina staavoklji. gala rezultaataa tiek atpaziits komandas kods un programma atgriezhas no paartraukuma galvenajaa programmaa.
lieta taada. peec nezinaama skaita (cik konstateeju tas ir dazhaads) IR datu pakaam programma "nokaraas". tas izpauzhaas taa. galvenaa programma turpina straadaat, bet netiek vairs izsaukti paartraukumi. dotajaa gadiijumaa WDT pilniigi neder. meegjinaaju galvenaas programmas darba gaitaa veelreiz ierakstiit veertiibas INTCON un OPTION regjistros, lai izsauktu paatraukumu. bet bez panaakumiem.
vai kaads ir saskaaries ar ko liidziigu? kur vareetu buut probleema?

----------


## next

Problēma ir tavā programā kuru mēs neesam redzējuši.
Mēģini lokalizēt izmetot no progas visu bez kā var iztikt testēšanas laikā.
Ja arī tad neiet, iepostē kodu, varbūt kāds ar svaigu aci ko ieraudzīs.
Tikai saproti pats ka kodam jābūt nelielam, garus penterus analizēt tautai būs slinkums.

----------


## Epis

Varbūt ka problēma ir nevis PIC programmā bet gan pūltī un ik pa brīdīm pults sūtītie dati nogļuko līdz ar to PIC programma iekšēji uzkarās, man vakar bīj tāds gadījums kad sūtīju atmegai8535 cepeškrāsns komandas un mega gļukaini sāka strādāt, domāju ka mega vainīga, pārprogrammēju bet nekā tad izgāju no kompja progas un pa jaunu iegāju un viss strādāja tākā vaina bīj nevis mikrenē bet kompja progā, varbūt ka tev vaina arī ir datu sūtītājā ! 
Kā tu pārbaudi vai tev tā programma strādā ?
 skatos JTAG pinu šam picam nav  ::  līdz ar to kāds ir mehānisms kā tu pārbaudi PIC darbu darbībā ?

----------


## Velko

Uzreiz gan atruna, ka PICus esmu tikai pa gabalu redzējis, tā ka šī būs tikai spriedelēšana vadoties no manām zināšanām par AVRiem. Bet varbūt tomēr noder.

Izpildot interruptu procis atslēdz citu interruptu izpildi, pēc tam atgriežoties no tā, interupti atkal jāieslēdz.  Atmelī to dara izmantojot "reti" instrukciju "ret" vietā. Varbūt PICam ir kas līdzīgs?

No pārtraukuma atgiezies tikai vienā vietā, vai (pēc nosacījumiem) vairākās? Tādā gadījumā pastāv iespēja, ka esi kļūdījies tikai vienā no tām.

----------


## dmd

es biki par amteliem un interaptiem pajautāšu. atvainojiet oftopiku.

velko, vaitad nav tā, ka interapti tiek nevis atslēgti, bet gan karājas rindiņā un tiek izpildīti kad atgriezies ar reti?

----------


## Velko

Drusku neprecīzi izteicos - biju domājis interruptu izpildi (I bits SREGā). Pēc atgriešanās tie tiek izpildīti. Protams, nevar "iekrāties" vairāk par vienu no katra veida.

----------


## sharps

Velko
PICaa ir diezgan liidziigi. manaa gadiijumaa tiek izmantots tikai viens INTERRUPT avots (aareejais) tas ir RB0 pins.
pati programma man ir diezgan liels palags. iisumaa varu izklaasiit.
visa programma man sastaav no divaam lielaam daljaam. pamat programmas un interrupt daljas.
intterupt daljaa tiek analizeets RB0 staavoklis, t.i. kaads signaals pienaak no IR uztveereeja. buutiibaa uz to suutu RC5 pakas. interrupts ilgst visas shiis pakas garumaa, t.i. 2 START, 1TG, 5 ADDR un 6 COM biti. tas viss kopaa aiznjem kaut kaadas 25ms. viena pusbita ilgums ir 889us. bet ne tur taa probleema. dazhreiz atgriezhoties no interrupta, suutot jaunu pacinju programma nepaariet uz interrupt dalju. pie tam interruptam saakoties tiek izsleegts RB0 INTERRUPT un taalaak jau notiek signaala analiize noteiktajos laika momentos, t.i. ik peec 889us. Beidzoties INTERRUPTam, regjistraa INTCON iestaadu atpakalj bitu INTE un atgriezhos pie pamatprogrammas ar RETIE.
drusku veelaak doshu siikaaku aprakstu algoritma veidaa, jo tajos palagos buus diezgan gruuti iedziljinaaties.

----------


## 0xDEAD BEEF

Es ari iespamosu!  :: 
Tur ir daudzi veidi, kā interuptam neizpildīties. Vispār tas ir ļoti slikts stils rakstīt porgramu, kas kaut ko dara galvenajā ciklā un arī pārāvumos, jo reģistru vērtības netiek saglabātas un tas nozīmē, ka tev tās ir jāsaglabā pašam.

Negribu arī sablefot, bet iespējams, ka lasīšana no atsevišķiem reģistriem notīra interuptu un vel pārliecinies, ka pārāvuma beigās tā porta vērtība ir 0 (vai kaut kā tamlīdzīgi).

Vienu es tav pateikšu - atstāj galvenajā programā tikai "main goto main" un noķer savu problēmu ar dedukciju.
Beefs

----------


## Velko

Kas notiek, ja kāds bits pa vidu pazūd?

Mana pieeja IR atpazīšanā ir drusku savādāka - izmantoju pin change pārtraukumu un taimeri. Uz pin change tiek nolasīta taimera vērtība un pina stāvoklis. Uz galveno ciklu tiek padots cik garš bija impulss vai pauze. Interruptu handlerus rakstu tik īsus cik vien iespējams. Galvenais cikls apstrādā tālāk.

----------


## sharps

BEAF tieshi otraadi. regjistru veertiibas tiek saglabaatas atsevishkjos TEMP regjistros. un izejot aaraa no interrupta tie tiek ielaadeeti vajadziigajos sisteemas regjistros - INTCON, OPTION utt.
tad kad netiek suutiita RC5 paka, tad uz RB0 ir 1 liimenis. kad pakas nosuutiishana pabeigta, tad uz RB0 atkal iestaadaas 1 liimenis. respektiivi interrupts tiek izsaukts peec signaala krituma uz RB0 pina. taatad pirmais iznaak START1 pusbits, tad START2 bits un treshais ir TOGGLE bits (kas mainaas ja atkaartoti nospiezh pults pogu). Taalaak jau visi paareejie biti. njemot veeraa otro grafiku testeejot pirmo pusbitu un otro pusbitu abi vienlaikus nevar buut ne 1 ne 0. shajaa gadiijumaa tiek dots kljuudas pazinjojums un tiek izsaukts interrupta beigas (ISR_END_) notiirot visas pierakstiitaas sho bitu testeeshanas rezultaatu veertiibas un tikai tad veic priekshdarbus izejai no INTERRUPT, t.i. atjauno STATUS, INCON un citus regjistrus, taadi kaadi tie bija pirms ieieshanas interrruptaa. ja netiek konstateeta kljuuda tad nonaakt pie ISR_END.
BEAF biju jau meegjinaajis tevis ieteikto variantu MAIN GOTO MAIN. rezultaats tas pats. Meegjinaaju INTCON regjistrus galvenaas programmas gaitaa iestaadiit, bez rezultaata.






```
ISR		
		MOVWF	W_TEMP		
		SWAPF	STATUS,			W
		MOVWF	STATUS_TEMP
		MOVF	PCLATH,			W
		MOVWF	PCLATH_TEMP


		MOVFW	PORTB
		MOVWF	PORTB_TEMP
		CLRF	PORTB
;===================================================
;Test interrupt source
;===================================================
ISR_RB0_TEST
	BANKSEL	INTCON
		BTFSS	INTCON,			INTF				;intterupt from RB0?
	GOTO	ISR_END
	GOTO	IR
;===================================================
ISR_END_
		CLRF	START_BYTE
		CLRF	COMMAND_BYTE
		CLRF	BIT_VALUE
;===================================================
ISR_END
	BANKSEL	INTCON
		BCF		INTCON,			INTF				;iztira RB0 partraukuma iezimes bitu
		BSF		INTCON,			INTE				;enable RB0 (IR) interrupts
;===================================================
		MOVFW	PORTB_TEMP
		MOVWF	PORTB

		MOVF	PCLATH_TEMP,	W
		MOVWF	PCLATH
		SWAPF	STATUS_TEMP,	W
		MOVWF	STATUS
		SWAPF	W_TEMP,			F
		SWAPF	W_TEMP,			W
	RETFIE
```

----------


## Epis

Kādas programmas pārbaudes metodes tu izmanto ?? 
gribu zināt ar kādu tieši metodi tu noteici kad nestrādā tas pārtraukuma vektors, jo barbū vaina nav tur.

----------


## abergs

Datašītā rekomendēts interrupta laikā saglabāt arī PCLATH ( ja izmanto vairākas "bundžas"):
INT:		bcf		INTCON,7
	       	MOVWF	W_TEMP		;Copy W to TEMP register
        	SWAPF	STATUS,W		;Swap status to be saved into W 
        	CLRF		STATUS		;bank 0, , Clears IRP,RP1,RP0
        	MOVWF	STATUS_TEMP	;Save status to STATUS_TEMP register
        	MOVF		PCLATH,W		;Only required if using pages 1, 2  3
        	MOVWF	PCLATH_TEMP	;Save PCLATH
        	btfss		PIR1,0		; check TMR1 overflow
        	goto		POP         
INT1:        call		DEL01
        	bcf		PIR1,0
POP:	     MOVF		PCLATH_TEMP, W	;Restore PCLATH
        	MOVWF	PCLATH		;Move W into PCLATH
        	SWAPF	STATUS_TEMP,W	;Swap STATUS_TEMP register into W 
        	MOVWF	STATUS		;Move W into STATUS register
        	SWAPF	W_TEMP,F		;Swap W_TEMP
        	SWAPF	W_TEMP,W		;Swap W_TEMP into W
        	bsf		INTCON,GIE
        	retfie

----------


## sharps

epi viss vienkaarshaakais veids kaa to paarbaudiit ir pacilaat innterrupt laikaa kaadu no portu piniem un ar oscilu pastraadaat. pameeriit laikus cik ilgi bija pacelts un cik ilgi nolaists attieciigais pins. biezhi naakas izliist ar dazhaadaam netieshaam metodeem, kaa noteikt ir vai nav izpildiijies kaads process.
aberg papeetiishu tevis ieteikto variantu dziljaak.

----------


## dmd

es uzdošu tādu pavisam pavisam naivu jautājumu - a pull-up vai pull-down ira?

----------


## sharps

ja tu domaa par programmisko dalju tad OPTION regaa #RBPU iestaadiits kaa nulle jeb iesleegts pull-ups. jaanjem veeraa ka RB0 man ir INPUT paareejie RB1 - RB7 outputi. IR uztveereejaa ir pullupots bipolaarais tranis.

----------


## Epis

Ar oscilu ir viss vienkāršākais veids kā skatītes vai proga strādā, bet tas arī dod minimālu priekštatu, viss labāk tomēr ir izmantot kādu RS232, kas sūta datus uz kompi un tad patiešām var ieskatīties iekšā visos Status reģistros (interupt enable bitos) + citos reģistros un visu to pārbaudīt kā pienākās tad arī varēsi veikt iekšējo programmas darbības izmeklēšanu,
 es varu pateikt ka tajā SMD krāsns kodā būtu vēljoprojām kļūdas meklējis ja nebūtu tās RS232 test progrmmas kur varēju redzēt kurā vietā kas strādā un kas atkal nestrādā, un pats saproti jo lielāka programma jo grūtāk atrast kļūdu tākā ir nopietni jādomā par mehānismiem kā meklēt kļūdas ar papild kodu palīdzību. 

un caur com portu saņemto datu pētīšanai vari izmantot kādu Termināl programmu, nav obligāti jātaisa vesela programma ar grafikiem, datu šķirotājiem utt. tas ir kā papildus bonus, kurš ir labs bet bez kura arī var iztikt.

----------


## 0xDEAD BEEF

ok! kjersimies tam versim pie ragiem!  :: 

no tavas programas neko daudz nesapratu. Varetu ludzu saprotamaku versiju ar skaidri redzamu interupta sakuma punktu. Ari IR labeli nevareju atrast. Un uz ko tu esi uzlicis parravumu? Uz port high vai port low vai change?

Es tiesam negribu samelot, bet liekas, ka tur bija svarigi nolasit no ta porta stavokli un pec tam paravums notiek uz izmaninu no pedeja nolasita stavokla (bet es varu kluditie, jo nesmu 100 gadus to datasheetu lasijis! ::  ) (vai ari lasisana no porta notirija no stavokli)

Kads tev ir kristals? cik jaudigs?

Lai nu ka - dari ta - ieliec galvenaja main cikla parastu blinking led uz kadu citu rb portu un ieliec parastu pazi ar delajiem.
Uz paravuma (kad tas sakas), neaizmirsti parliecinaties, ka tas ir paravums uz rb08 izmainas. Liekas, ka kautkada paravumu registra tad bija jabut uzliktam flagam un vel viena registra flags, kurs pasaka, kurs tiesi ports ir mainijies. visi tie flagi ir janotira.

BTW - (jau pirms tam rakstiju) - atkal negribu samelot, bet varbut atrodoties paravuma un lasot no porta vertibu, tu notiri paravuma flagu, un paravums velreiz izsauc pats sevi, atrodoties jau paravuma iekspuse. TB - pamegini paravumam sakoties izslegt paravumus (negribu samelot - vienkarsi neatceros, ka taja datashiita bija rakstits, bet kaut kas atmina saistas ar to, ka vareja izveidoties situacija, kad paravums izsaucas paravuma)

Beefs

----------


## 0xDEAD BEEF

atvainojos par dubult postu, bet runajot par debugesanu - uzliec main cikla blinking led apmeram sadi
:main
set 1
delay
clear 1
clear 2
delay
goto main

un interupta ieliec set 2. TAd vajadzetu but ta, ka viena lampina mirksinas, bet otra iespidas, kad tiek izsaukts paravums. Neaizmirsti paravuma atjaunot delay konteru registrus. vai vismaz uzliec tos uz 255.

Tev ir svarigi saprast - vai paravums neizpildas, vai ari izpildas, bet nestrada pareizi. Man kaut kur majas metajas kods, kurs uz paravuma lasa no seriala porta. Tur bija smaga magjija patiesiba, jo nacas skaitit instrukcijas, lai precizi nolasitu istaja momenta, bet baigi negribu meklet to kodu!  :: 

Beefs

----------


## sharps

0xDEAD BEEF rekur buus interrupta turpinaajums.
main kodaa jau man straadaa LED blinkoshana. arii interruptaa biju ielicis led blinkoshanu uz citas kaajas. tikko programma nokaraas tad interrupt led blinkoshana vairs nestraadaa, bet main straadaa.
izmantoju ieksheejo 4MHz clocku. kaa redzi IR pashaa sakumaa es izsleedzu interruptu no RB0 un taa ieziimes bitu, lai interrupt laikaa netiktu izsaukts atkaartots interrupts. izejot aaraa no interrupt peec ISR_END ieziimes paartraukums no RB0 atkal tiek iesleegts.
ticu ka ir gruuti tajaa kodaa iebraukt.



```
IR
		BCF		INTCON,			INTF				;iztira RB0 partraukuma iezimes bitu
		BCF		INTCON,			INTE				;disable RB0 (IR) interrupts
;***************************************************
;START BITS
;***************************************************
START_BIT12
		BTFSC	PORTB,			000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BSF		START_BYTE,		000h
;===================================================
START_BIT21
		CALL	TIME
		BTFSS	PORTB,			000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
;---------------------------------------------------
START_BIT22
		CALL	TIME
		BTFSC	PORTB,			000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BSF		START_BYTE,		001h
;***************************************************
;TOGGLE BIT
;***************************************************
TOGGLE_BIT11
		CALL	TIME_2
		BTFSS	PORTB,			000h
		GOTO	SET0_TG11
		GOTO	SET1_TG11
SET0_TG11
		BCF		BIT_VALUE,		000h
		GOTO	TOGGLE_BIT12
SET1_TG11
		BSF		BIT_VALUE,		000h
;---------------------------------------------------
TOGGLE_BIT12
		CALL	TIME_2
		BTFSS	PORTB,			000h
		GOTO	SET0_TG
		GOTO	SET1_TG
SET0_TG
		BTFSS	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BSF		START_BYTE,		002h
		GOTO	ADDRESS_BIT11
SET1_TG
		BTFSC	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BCF		START_BYTE,		002h
		GOTO	ADDRESS_BIT11
;***************************************************
;ADDRESS BYTE - 5 BITS
;***************************************************
ADDRESS_BIT11
		CALL	TIME_1
		BTFSS	PORTB,			000h
		GOTO	SET0_AD11
		GOTO	SET1_AD11
SET0_AD11
		BCF		BIT_VALUE,		000h
		GOTO	AD_BIT12
SET1_AD11
		BSF		BIT_VALUE,		000h
;---------------------------------------------------
AD_BIT12
		CALL	TIME_1

		BTFSS	PORTB,			000h
		GOTO	SET0_AD12
		GOTO	SET1_AD12
SET0_AD12
		BTFSS	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BSF		START_BYTE,		003h
		GOTO		ADDRESS_BIT21
SET1_AD12
		BTFSC	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BCF		START_BYTE,		003h
		GOTO		ADDRESS_BIT21
;===================================================
ADDRESS_BIT21
		CALL	TIME_1
		BTFSS	PORTB,			000h
		GOTO	SET0_AD21
		GOTO	SET1_AD21
SET0_AD21
		BCF		BIT_VALUE,		000h
		GOTO	AD_BIT22
SET1_AD21
		BSF		BIT_VALUE,		000h
;---------------------------------------------------
AD_BIT22
		CALL	TIME_1

		BTFSS	PORTB,			000h
		GOTO	SET0_AD22
		GOTO	SET1_AD22
SET0_AD22
		BTFSS	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BSF		START_BYTE,		004h
		GOTO		ADDRESS_BIT31
SET1_AD22
		BTFSC	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BCF		START_BYTE,		004h
		GOTO		ADDRESS_BIT31
;===================================================
ADDRESS_BIT31
		CALL	TIME_1
		BTFSS	PORTB,			000h
		GOTO	SET0_AD31
		GOTO	SET1_AD31
SET0_AD31
		BCF		BIT_VALUE,		000h
		GOTO	AD_BIT32
SET1_AD31
		BSF		BIT_VALUE,		000h
;---------------------------------------------------
AD_BIT32
		CALL	TIME_1

		BTFSS	PORTB,			000h
		GOTO	SET0_AD32
		GOTO	SET1_AD32
SET0_AD32
		BTFSS	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BSF		START_BYTE,		005h
		GOTO		ADDRESS_BIT41
SET1_AD32
		BTFSC	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BCF		START_BYTE,		005h
		GOTO		ADDRESS_BIT41
;===================================================
ADDRESS_BIT41
		CALL	TIME_1
		BTFSS	PORTB,			000h
		GOTO	SET0_AD41
		GOTO	SET1_AD41
SET0_AD41
		BCF		BIT_VALUE,		000h
		GOTO	AD_BIT42
SET1_AD41
		BSF		BIT_VALUE,		000h
;---------------------------------------------------
AD_BIT42
		CALL	TIME_2

		BTFSS	PORTB,			000h
		GOTO	SET0_AD42
		GOTO	SET1_AD42
SET0_AD42
		BTFSS	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BSF		START_BYTE,		006h
		GOTO		ADDRESS_BIT51
SET1_AD42
		BTFSC	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BCF		START_BYTE,		006h
		GOTO		ADDRESS_BIT51
;===================================================
ADDRESS_BIT51
		CALL	TIME_2
		BTFSS	PORTB,			000h
		GOTO	SET0_AD51
		GOTO	SET1_AD51
SET0_AD51
		BCF		BIT_VALUE,		000h
		GOTO	AD_BIT52
SET1_AD51
		BSF		BIT_VALUE,		000h
;---------------------------------------------------
AD_BIT52
		CALL	TIME_2

		BTFSS	PORTB,			000h
		GOTO	SET0_AD52
		GOTO	SET1_AD52
SET0_AD52
		BTFSS	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BSF		START_BYTE,		007h
		GOTO 	COMMAND_BIT11
SET1_AD52
		BTFSC	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BCF		START_BYTE,		007h
		GOTO	COMMAND_BIT11
;***************************************************
;COMMAND BYTE - 6 BITS
;***************************************************
COMMAND_BIT11
		CALL	TIME_2
		BTFSS	PORTB,			000h
		GOTO	SET0_CO11
		GOTO	SET1_CO11
SET0_CO11
		BCF		BIT_VALUE,		000h
		GOTO	CO_BIT12
SET1_CO11
		BSF		BIT_VALUE,		000h
;---------------------------------------------------
CO_BIT12
		CALL	TIME_2
		BTFSS	PORTB,			000h
		GOTO	SET0_CO12
		GOTO	SET1_CO12
SET0_CO12
		BTFSS	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BSF		COMMAND_BYTE,		005h
		GOTO		COMMAND_BIT21
SET1_CO12
		BTFSC	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BCF		COMMAND_BYTE,		005h
		GOTO		COMMAND_BIT21
;===================================================
COMMAND_BIT21
		CALL	TIME_2
		BTFSS	PORTB,			000h
		GOTO	SET0_CO21
		GOTO	SET1_CO21
SET0_CO21
		BCF		BIT_VALUE,		000h
		GOTO	CO_BIT22
SET1_CO21
		BSF		BIT_VALUE,		000h
;---------------------------------------------------
CO_BIT22
		CALL	TIME_2
		BTFSS	PORTB,			000h
		GOTO	SET0_CO22
		GOTO	SET1_CO22
SET0_CO22
		BTFSS	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BSF		COMMAND_BYTE,		004h
		GOTO		COMMAND_BIT31
SET1_CO22
		BTFSC	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BCF		COMMAND_BYTE,		004h
		GOTO		COMMAND_BIT31
;===================================================
COMMAND_BIT31
		CALL	TIME_2
		BTFSS	PORTB,			000h
		GOTO	SET0_CO31
		GOTO	SET1_CO31
SET0_CO31
		BCF		BIT_VALUE,		000h
		GOTO	CO_BIT32
SET1_CO31
		BSF		BIT_VALUE,		000h
;---------------------------------------------------
CO_BIT32
		CALL	TIME_2
		BTFSS	PORTB,			000h
		GOTO	SET0_CO32
		GOTO	SET1_CO32
SET0_CO32
		BTFSS	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BSF		COMMAND_BYTE,		003h
		GOTO		COMMAND_BIT41
SET1_CO32
		BTFSC	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BCF		COMMAND_BYTE,		003h
		GOTO		COMMAND_BIT41
;===================================================
COMMAND_BIT41
		CALL	TIME_2
		BTFSS	PORTB,			000h
		GOTO	SET0_CO41
		GOTO	SET1_CO41
SET0_CO41
		BCF		BIT_VALUE,		000h
		GOTO	CO_BIT42
SET1_CO41
		BSF		BIT_VALUE,		000h
;---------------------------------------------------
CO_BIT42
		CALL	TIME_2
		BTFSS	PORTB,			000h
		GOTO	SET0_CO42
		GOTO	SET1_CO42
SET0_CO42
		BTFSS	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BSF		COMMAND_BYTE,		002h
		GOTO	COMMAND_BIT51
SET1_CO42
		BTFSC	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BCF		COMMAND_BYTE,		002h
		GOTO	COMMAND_BIT51
;===================================================
COMMAND_BIT51
		CALL	TIME_2
		BTFSS	PORTB,			000h
		GOTO	SET0_CO51
		GOTO	SET1_CO51
SET0_CO51
		BCF		BIT_VALUE,		000h
		GOTO	CO_BIT52
SET1_CO51
		BSF		BIT_VALUE,		000h
;---------------------------------------------------
CO_BIT52
		CALL	TIME_2
		BTFSS	PORTB,			000h
		GOTO	SET0_CO52
		GOTO	SET1_CO52
SET0_CO52
		BTFSS	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BSF		COMMAND_BYTE,		001h
		GOTO		COMMAND_BIT61
SET1_CO52
		BTFSC	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BCF		COMMAND_BYTE,		001h
		GOTO		COMMAND_BIT61
;===================================================
COMMAND_BIT61
		CALL	TIME_2
		BTFSS	PORTB,			000h
		GOTO	SET0_CO61
		GOTO	SET1_CO61
SET0_CO61
		BCF		BIT_VALUE,		000h
		GOTO	CO_BIT62
SET1_CO61
		BSF		BIT_VALUE,		000h
;---------------------------------------------------
CO_BIT62
		CALL	TIME_2

		BTFSS	PORTB,			000h
		GOTO	SET0_CO62
		GOTO	SET1_CO62
SET0_CO62
		BTFSS	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BSF		COMMAND_BYTE,		000h
		GOTO	WRITE_START
SET1_CO62
		BTFSC	BIT_VALUE,		000h
		GOTO	ISR_END_							;kaut kur bija kljuuda
		BCF		COMMAND_BYTE,		000h
		GOTO	WRITE_START
;***************************************************
WRITE_START
BANKSEL	COMMAND_BYTE
		MOVFW	START_BYTE
BANKSEL	EEADR
		MOVWF	EEDATA
		MOVLW	005h
		MOVWF	EEADR
	CALL	EEPROM_WRITE

WRITE_COMMAND
BANKSEL	COMMAND_BYTE
		MOVFW	COMMAND_BYTE
BANKSEL	EEADR
		MOVWF	EEDATA
		MOVLW	006h
		MOVWF	EEADR
	CALL	EEPROM_WRITE
goto	ISR_END
```

 arberg izmeegjinaaju tevis ieteikto variantu (skatiit ieprieksh interrupt koda papildinaajums) ar PCLATH. bet kaa jau biju domaajis, tad tas nepaliidzeeja.

----------


## abergs

Vēl iekrita acīs rindiņa:
banksel   INTCON - tā kā INTCON pieejams no visām "bundžām" ,tad šī rindiņa varētu neko neveikt....

----------


## sharps

Tikpat labi es vareeju rakstiit INTCON vietaa BANK0. faktiski ja STATUSa ir BANK1 un lieto BANKSEL INTCON, tad tiek STATUSa ierakstiits BANK0.

----------


## abergs

Tiešām, tagad zināšu!  ::

----------


## sharps

vispaar jau jaaieveero taads siikums ka jaanodefinee taas bankas BANK0, BANK1...

#define	BANK0		000h
#define	BANK1		080h
#define	BANK2		106h
#define	BANK3		186h

un tikai tad izpilda

BANKSEL    BANK0
...
...

bet ja nezini kuraa BANKaa atrodas konkreetais regjistrs ar kuru gribi opereet, tad raksti vienkaarshi piemeeram

BANKSEL   EEDATA

----------


## abergs

Cik skatījos, esi izracies cauri visam netam gan uz austrumiem , gan rietumiem.
Te Edabordā vienīgi atradu pēc izskata sakarīgu RC5 recivera programmiņu, (gan pic16F877)
http://www.edaboard.com/viewtopic.ph...&highlight=rc5
Pārbaudījis neesu  ::  un varbūt jau zināma....

----------


## sharps

links redzeets. aatrumaa uzmetu aci kodam. cik nopratu, tad tas nav uz paartraukumiem balstiits. bet paartraukumi ir svariigi. protams no shitaa visa var kaadu ideju pasmelties.
te buus mazliet par RC5 krievu valodaa
http://www.platan.ru/shem/pdf/prim.pdf
http://www.platan.ru/shem/pdf/rc5-2.pdf

----------


## abergs

> interrupts ilgst visas shiis pakas garumaa, t.i. 2 START, 1TG, 5 ADDR un 6 COM biti.


 Biju arī domājis - visu šo programmiņu interruptā.

----------


## sharps

tad tik vajadzees papeetiit dziljaak. nemaniiju kodaa kaads ir clocks?

man bija viena cita doma attieciibaa uz to laiku (889us) kameer tiek gaidiits liidz mainaas liimenis uz RB0 kaajas. apmeeram shitaa:
tad kad interrupts izaukts no pirmaa RB0 notikuma notesteet staavokli uz pina un tad no interrupt atgriezties pamatprogrammaa.
naakamo interruptu izsaukt peec taimera paarpildiishanaas, t.i. peec taam 889us un notesteet RB0 staavokli. un taa iziet cauri visus tos bitus. pie pashas peedeejaa atgrieshanaas no interrupta tiek iesleegts atpakalj RB0 innterrupts.

----------


## abergs

Clock = 4MHz ( pašā augšā)
Un vēl - varbūt nepamaniju - RB0 interuptu vajag iestādīt nepieciešmai frontei - gan augošai, gan krītošai.
Varbūt tāpēc izskatās ,ka neizpildas katrs otrais interrupts.OPTION,6

----------


## Epis

ieskatījos es arī PIC16F628 dokumentā un ir tur tas INTEDG bits kas par to Rising/falling līmeni iestata uz kā tad reaģēs tas pārtraukums, bet es kautkā skatos un kodā neredzu nevienu vietu kur tu to INTEDG bitu iestatītu, kā īsti ir tu to bitu esi uzstādīsi sharp ??

a tev tā programma iet tajā MPLAB simulātorā kad to PB0 maina pārtraukums ģenerējās, ja jā tad velns viņu zin kur ir tā problēma

----------


## sharps

epi pie Inicializaacijas OPTION regjistraa INTEDG es iestaadu kaa 0, t.i. interrupts tiek izsaukts peec krituma. simuleejot programmu nekaadas kljuudas neuzraadaas. dziivee protams ir zinaams gadiijuma raksturs.
taatad epi atkaartoshu. interrupts nostraadaa pie IR sanjemshanas. kods tiek atpaziits un ierakstiits speciaalaa TEMP regjistraa. tad atgriezhamies no interrupt pie pamatprogrammas, kuraa kods tiek apstraadaats un veikts noteikts uzdevums. iesleegts LED uz kompi aizsuutiita datu paka utml. bet peec kaada interrupta peekshnji notiek "uzkaarshanaas" un vari suutiit IR cik gribi interrupts netiks izsaukts, pat tad ja meegjini ciltaa ar to sasitiitos regjistrus. bet pamatprogramma turpina darboties, midzinaat LEDu utt. uzkaarshanaas var notikt reizi minuutee un taa var notikt tikai reizi dienaa.
izejot no shitaa vai nevareetu buut taa ka paarpildaas kaads skaitiitaajs deelj noteikta skaita kljuudaam bitu testeeshanas laikaa.

----------


## Epis

man liekās ka tāda tipa kļūdu atrast var tikai pētot PIC iekšējo reģistru un datu vērtības darbībā un skatoties kas ir izmaninījies pirms PIC uzkarās un salīdzināt ar tiem datiem kas ir tad kad PIC vairs neiet, un tākā Picam nav JTAga tad atliek likt iekšā papild kodu kas piemēram tos datus sūtīs uz kompja un tad skatītes gaidīt kamēr tā programma uzkarās un analizēt iegūtos datus pirms uzkāriena es to saku pēc paša pieredzes ar to SMD krāsns programmas taisīšanu tur tik daudz to kļūdu bīj kuras vienkārši skatoties uz koda nevar redzēt jo kods izskatās un debaggojās perfekti, bet realitātē nekas negāja un programma kārās augšā. 

Viss smagākā kļūda kuru es atradu bīj pēc tās atņemšanas operācija Negatīvā karoga Pārbaude es uz to kodu skatījos kādu puss stundu un domāju, kur tajā koda gabalā ir problēma un tad man pieleca, bet lai atrastu to kļūdaino koda gabalu es liku programmā iekšā pirms tā koda un pēc tā koda UART sūtīšanas kodu un skatījos komī kādi dati ieiet un kas iziet pēc atņemšanas un arī programmas plūsmu, un tā sašaurinot meklēšanas posmus es arī nonācu līdz tam bojātjam koda gabalam kurš izskatījās vesels, līdz ar to es gribu teikt ka savu kļūdu bez ieskatīšanās PIC16 reģistros atrast būs baigi grūti, vai pat neiespējami, jo tava kļūda ir vispār ļoti dīvaina jo itkā viss strādā bet pēc kāda laika vairs nestrādā, līdz ar to ir jālien iekšā Pic reģistros un visādos programmas darbības bitos, vārdsakot jo vairāk informācijas par to kas notiek PIC iekšās tu sūtīsi kompim jo ātrāk tu to kļūdu atradīsi  :: 
ja atrodi kļūdu tad pasaki kas tur īsti bīj pa kļūdu.

----------


## abergs

Vēl varētu kāda "X" iemesla dēļ katastrofali izmainīties takts frekvence pultij.
Ja nestrādāja pults , tad katrā otrajā gadījumā pie vainas bija tas s**a rezonators pultī.
Sen gan pēdējoreiz tas bija...

----------


## sharps

aberg izmantoju RC5 pultis. latgaliitee taa kuras pa 2Ls gabalaa. melnaas ar "saiisinaatu" pogu skaiti. visu laiku vienu tipu. esmu jau kaadas 20 pultis izgaajis cauri. jo vienam citam projektam bija jaatestee shitaas. rezultaats viens un tas pats. domaajams ka pultii nav vainas.
epi taas kljuudas atrashana man ir diezgan vitaali svariiga, pateikshu kad buus probleema atrasta.

----------


## Epis

Es bīju iedomājies ka moš WDT varētu to problēmu atrisināt bet tu jau pats pateici sākumā ka tas tev neder, a kāpēc  neder ??

----------


## sharps

WDT neder taapeec, ka pamatprogrammaa ir daljas kuru izpildei nepiecieshamas zinaams un cikls saakas no saakuma. piem tiek aatri aizskaitiits no 0 liidz 100, peec tam leenaam no 100 liidz 0. ja notiek resetoshanaas piemeeram pie 50, tad viss shis cikls saakas no nulles. sho metodi vareetu pielietot ja buutu viens taads skaitiishanas algoritms, bet taadu ir vairaaki. iestaadiit WDT katram no tiem ir gandriiz vai neiespeejami. skaitiishanas algoritmu mineeju tikai kaa piemeeru.

----------


## Epis

Njā nu tad mēģini taisīt to kodu uz 2 piciem kur tas kas uztver pūlts signālu uzkāriena gadījumā Resetosies ar WDT, bet otrs pics turpinās darbu tālāk un gaidīs kamēr pirmais pēc resta atkal sāks sūtīt datus.
a tu esi mēģinājis palaist tikai to Signāl saņēmēj kodu no pūlts, bez pārējā lielā koda, ja kods nekarās tad vaina nav tajā kodā līdz ar to tā jāmeklē lielajā, ja karās tad iemēģini WDT. un pasaki pa rezultātiem, ja WDT kļūdu izlabo tad ir divi ceļi izmantot papildus picu ar to WDT vai kodēt tādu kodu kas detektē pūlts kļūdaino signālu un nekarina programmu  ::

----------


## sharps

taa vien shkjiet ka buushu problemaatisko vietu atradis.
pamat programmaa kraameeju moduli pa modulim kopaa un veicu ilgstoshus testus. liidz nenonaacu liidz moduljiem ka izmanto EEPROM lasiishanu un rakstiishu. tad saakaas briinumi. programma saaka kaarties un paatraukums no pults netika izsaukts. bet nesaprotu kur vareetu buut probleema shajaa daljaa. te buus kodinjs. varbuut kaads ko uzkjer. aizdomas ka kaut kur uzpled paartraukums no EEPROM lasiishanas/rakstiishanas.



```
		MOVLW	002h
		CALL	EEPROM_READ
```

 

```
	BANKSEL	DUTYCYCLE
		MOVFW	DUTYCYCLE
	BANKSEL	EEADR
		MOVWF	EEDATA
		MOVLW	002h
		MOVWF	EEADR
	CALL	EEPROM_WRITE
```

 

```
;=======================================================
EEPROM_READ
;=======================================================
	BANKSEL		EEADR	
		MOVWF	EEADR
		BSF		EECON1,	RD								;EE READ
		MOVF	EEDATA, W
	BANKSEL		BANK0
	RETURN
;=======================================================
EEPROM_WRITE
;=======================================================
	BANKSEL	EECON1
		BSF		EECON1,	WREN
		BCF		INTCON,	GIE
		MOVLW	055h
		MOVWF	EECON2
		MOVLW	0AAh
		MOVWF	EECON2
		BSF		EECON1,	WR
EEPROM_WR_BEGIN
		BTFSC	EECON1,	WR								;wait for write to complete
		GOTO	EEPROM_WR_BEGIN
		BCF 	EECON1,	WREN 
	BANKSEL	INTCON 
		BSF INTCON,GIE 		
	RETURN
;=======================================================
```

----------


## abergs

1.   BANKSEL      BANK0 -    ja sākumā definēts: nekādu problēmu un kompilātōram arī vajadzētu "lamāties"
2.       BCF      INTCON,   GIE -   datašītā rekomendēts:


```
BCFINTCON, GIE;Disable INTs.
BTFSCINTCON,GIE;See AN576
GOTO$-2
```

 pašam gan nekad nav iznācis saskarties (ar tādu gļuku), pielikumā tas AN 576:

----------


## Epis

Tu esi skatījies PIC16F628 errate sheetu (defektu lapa), pagoglējot uzgāju ka dažiem bīj problēma ar tā PIc EEPROM rakstīsānu un nolasīšanu, kā tev EEPROMS strmāli ?? 
 šeit no viena foruma tās EEPROM problēmas atrisinājums, un paskaidrojums. 
http://www.motherboardpoint.com/t89000- ... eprom.html



> Since you say that it works with one PIC and not the other, I have
> seen this problem. I don't have a manual in front of me, but there is
> a bit in EECON1 that needs to be cleared. I forgot the name of the
> bit, but a '1' writes to flash, and a '0' writes to EEPROM.
> 
> Many times people can do eeprom operations without any problems
> because the power-up values "usually" default to 0. However, on some
> parts, this particular bit is an unknown power-up value. So for 70% of
> the chips of one particular family, you might not have problems, but
> ...

----------


## sharps

aberg izskataas ka tevis piedaavaatais variants straadaa. pie EEPROM lasiishanas ieliku globaalaa interrupta izsleegshanu un peec tam iesleegshanu, bet pie EEPROM rakstiishanas tas jau bija. pagaidaam izskataas ka nekaraas.
izskataas tas tagad shitaa:



```
;=======================================================
EEPROM_READ
;=======================================================
	BANKSEL		BANK0

		BCF	INTCON, GIE
		BTFSC	INTCON,GIE
	GOTO$-2

	BANKSEL		EEADR	
		MOVWF	EEADR
		BSF		EECON1,	RD		;EE READ
		MOVF	EEDATA, W
	BANKSEL		BANK0

		BSF	INTCON, GIE			;Enable INTs.

	RETURN
```

----------


## rengens

Man sanāca ar pārtraukumiem iebrist purvā, jo 0lle nebija īsti nozemēta - nebija kārtīga 0...

----------


## sharps

baroshanu jau pashu pirmo paarbaudit vajag. vai ir lodeejumi labi. vai ir kondnsatori pietiekoshi tuvu pie kaajaam pielodeeti. utt

----------


## rengens

šo norakstu uz pieredzes trūkumu  :: 
Mikrokontrolieri/Elektronika vēl pārāk svešas tēmas... Nav tas, kas VS2005 kodēt  ::

----------


## marizo

Jau labu laiku atpakaļ salodēju brālim pie datora COM porta slēdzamu IR RC5 uztvērēju Winampa un citu lietu kontrolēšanai. Viss jau darbojās, tikai švaki bija ar uztveršanas precizitāti - bieži juka pēdējais bits (laika nobīdes radīta kļūda). Toreiz vēl ar PIC biju pilnīgs iesācējs un viss palika tā kā bija.
Kaut arī varbūt Internetā ir pa pilnam ar programmu paraugiem, interesantāk tomēr ir uztaisīt pa savam, saprast un pārzināt, nevis lietot taustiņu kombinācijas Ctrl+C un Ctrl+V.
Tagad programmu pārstrādāju, jo radusies vēlme papildus iekodēt arī releja ieslēgšanu/izslēgšanu u.c. "fīčas". Biju aizmirsis, ka forumā ir šī tēma, kādreiz gan sekoju līdzi. Tagad skatos, sharp, ka Tava pieeja ir līdzīga manai: IR RC5 uztveršanas apakšprogrammu izsaucu pēc pārtraukuma un katru bitu pārbaudu 2x - pirms un pēc 1<->0 maiņas (iepriekš tikai 1x), kam līdz minimumam vajadzētu izslēgt kļūdainu uztveršanu. Man gan izrādījās, ka RC5 paka ir nedaudz īsāka, nekā aprakstos, salīdzinot ar PIC delayu, kas būtiski ietekmē signāla nolasīšanu, it īpaši pēdējos baitus. Tas pats ir arī ar vēl divām citām pultīm, tā ka varētu būt saistīts ar PIC programmu (itkā nevarētu nekur rasties tik daudz lieku ciklu) vai takts frekvences precizitāti (ārējais 4MHz trijkājainais oscilators). To tā arī nenoskaidroju, tik piedzinu pareizo bita garumu. rc5V11.zip ir arī programma, kur testē bitu garumus ar TMR.

Tiesa, pārtraukuma kodiņš nav nekāds īsais - 24ms + 30ms nekā nedarīšanas delays, lai pēc kļūdaini/daļēji saņemtas RC5 pakas, pārtraukums droši sanāktu uz jaunās pakas sākumu. Ja ir pieļaujams, ka Main programma uz šādu brīdi iebremzē (ilgstoši turot nospiestu kādu pults pogu, iespaido arī LED mirkšķināšanu ar delayiem), tad jau nekā traka nav.  :: 

Bet es kāreiz gribētu uzkodēt versiju, kas bitus ķertu uz TMR pārtraukumiem, tādējādi vairāk laika atlicinot Main programmai - RC5 pakas sākumu noķerot uz RB0 INT, bet pārējos bitus pēc TMR INT. Neesi domājis par šādu variantu? Kaut gan tas varētu būt piņķerīgi tādā ziņā, ka droši vien nevarēs programmā likt vēl kādu pārtraukumu (lai tas neielīstu tieši tad, kad jāizpildās RC5 uztveršanai), jo PICā laikam neizdosies izpildīt (tā ir?) pārtraukumu pārtraukumā. 

Īstenībā baigi reāla lieta ir ICD2 debuggers. Tā dēļ kodu testēju uz PIC16F877A nevis PIC16F628, kurā tas pēcāk skries. Programmā var uzlikt Breakpointu (žēl, ka 877 PICam tikai vienu), līdz kuram nokļūsot, PIC programma tiek apturēta un iespējams nolasīt visas mainīgo un reģistru vērtības. Tā var, piemēram, pārbaudīt līdz kuram bitam RC5 paka tiek pareizi saņemta un kad rodas kļūda, nerakstot nekādu papildus kodu, vai arī tieši no PIC nolasīt saņemtos adreses un komandas bitus.

----------


## next

Paartraukums paartraukumaa Midrange picos protams nav dabuujams.
Bet ja sapraatiigi kodee to apstraadi tad viss sanaak, RC5 tak ir pavisam leens process, maza aizkjershnaas neko nemaina.
Taisiiju ar IR pulti vadaamu dimmeri, bija tur 3 paartraukumi (int tmr0 tmr1).
Darbojas jau 5 gadus.
Procis PIC12F629.

----------


## marizo

Jā, nu RC5 nav nekas ātrs. Bet, ja visu RC5 uztveršanas apakšprogrammu taisa uz vienu RB0 pārtraukumu, tad tas pārtraukums ievelkas un cits process tajā laikā izpildīts netiek. Tāpēc jau es domāju pirmo bitu saņemt ar INT no RB0, bet pārējos pēc TMR pārtraukuma.
Droši vien, ka var uzkodēt arī ar 3 pārtraukumiem - RB0 un TMR priekš RC5 un otru TMR, piemēram, LED PWM. Tāpat arī kaut ko saņemt caur UART nav ātri un RGB LEDu PWM man ar esošo programmu nepatīkami iebremzē.

----------


## sharps

Man jau galu galaa izdevaas RC5 uztaisiit uz sho PICu. Taisiju uz vienu INT paartraukumu. Paartraukums man ilga visu RC5 datu pakas laiku.
Taisiiju arii variantu ka pirmais bits ir peec INT, bet paareejie peec TMR. Straadaaja, bet gljukaini. Ljoti preciizi jaaieveero taimingi. Katram bitam pat skanjoju atsevishkji.

----------

