interapt po zavrsetku upisa u eeprom kod pic16f84
Moderators: pedja089, stojke369, [eDo], trax
interapt po zavrsetku upisa u eeprom kod pic16f84
Pokusao sam da dobijem interapt po upisu u eeprom pic16f84,
setovao sam EEIE bit i izvrsio upis u eeprom PIC-a ali nakon
upisa nije otisao na interapt rutinu.Slabo je obradjena ova
tema uglavnom svuda pise da ako su istovremeno setovai EEIE i EEIF
dolazi do interapta, ali meni nije poslo za rukom.
Ima li neko ideju gde gresim.
Pozdrav!
setovao sam EEIE bit i izvrsio upis u eeprom PIC-a ali nakon
upisa nije otisao na interapt rutinu.Slabo je obradjena ova
tema uglavnom svuda pise da ako su istovremeno setovai EEIE i EEIF
dolazi do interapta, ali meni nije poslo za rukom.
Ima li neko ideju gde gresim.
Pozdrav!
Prekidi za upis u internu memoriju dali data dali programsku su u vecini slucajeva interne naravi , za te prekide cak nije bitno da je postavljen globalni prekidni bit [ omoguci ] vec samo lokalni prekidni bit .
Najcesce sam processor nakon inicijalizacije , interni sklop za samoprogramiranje, vodi citav postupak kao i timing , pa se prekid po vekotorskom nizu koji je cesto naznacen i ne koristi tj ne igra nikakvu ulogu , jer je ionako nebitan.
Ako ti je processor isprogrmirao data eprom onda se nebi trebao brinut oko toga ako nije onda posalji rutinu da vidimo gdije je greska.
A na koncu imas lijep primjer i u samoj dokumentaciji za processor ako si je uopce citao !??? i to u assembleru i C++ .
Najcesce sam processor nakon inicijalizacije , interni sklop za samoprogramiranje, vodi citav postupak kao i timing , pa se prekid po vekotorskom nizu koji je cesto naznacen i ne koristi tj ne igra nikakvu ulogu , jer je ionako nebitan.
Ako ti je processor isprogrmirao data eprom onda se nebi trebao brinut oko toga ako nije onda posalji rutinu da vidimo gdije je greska.
A na koncu imas lijep primjer i u samoj dokumentaciji za processor ako si je uopce citao !??? i to u assembleru i C++ .
Buco "pravi majstore" tvoja nadmenost je nepristojna,naravno da sam pročitao sve što mi je bilo na dohvat ruke,pre nego što sam postavio pitanje na forumu (uzgred rečeno programiranje uC višim programskim jezicima c,pic basic,pascal me u opšte ne zanima).
Ali TI nisi shvatio dobro pitanje,mene zanima skok na interapt rutinu po (posle,nakon) upisu u eeprom
Pozdrav !
Ali TI nisi shvatio dobro pitanje,mene zanima skok na interapt rutinu po (posle,nakon) upisu u eeprom
Pozdrav !
I sta preporuca proizvodjatj tj kako predlaze "izlaz " iz te neugodne situacije !?
Posto je upis u data eeprom i flash interno vremenski odredjen jesi li probao malo "sacekat" PIC da tio vrati kontrolu nad prekidnom maskom i opcenito opcim prekidnim bitom ?
Moj rad s PIC MCUima je davno zavrsio i detalja se ne sijecam , ali gotvo svi MCUi za interne prekide radi samoprogramiranja data mem ili prg mem koriste interni timer i mislim da se status operacije moze izcitat iz prekidne maske tj bita koji oznacava kraj operacije . Ako si sve to napravio i ne slusa te probaj mu dat malo vremena [koju NOP operaciju ] !
Inace zar ti se ne cini da iscitavanjem EEIF-a[ EEprom Interrupt Flag, oli ti zastavica statusa prekidne rutine EEproma] trebas dobit status operacije , i tek kad citenjem EEIFa utvrdis da je sve ok tad tek trebo otic dalje tj "igrat" se s drugim prekidnim rutima . Kod nekih MCUa stausni Flag bitovi se moraju pobrisat[postavit] prije pokretanja prekida kod nekih je to automatski rijeseno za vecinu prekida .
Uza svu moju nadmenost i aroganciju mislim da nisi dobro ili razumio ili procitao dokumentacu processora s kojim radis !!!! Pokusaj ponovo !!
Inace EEIE EEprom Interrupt Eneable [ omoguci prekid za EEprom] i s nijm pokreces prekindnu rutinu [internu] za upis u EEprom a EEIF-om bi treba procitat status pokrenute rutine i napisat petlju koja cita EEIF dok rutina ne zavrsi posao upisa , kad to obavi setirat ce EEIF zastavicu i tvoj program ce ti vratit kontrolu nad prekidima . Kod nekih MCUa moras zastavicu sam postavit [ izgleda da je to slucaj s PICom].
Posto je upis u data eeprom i flash interno vremenski odredjen jesi li probao malo "sacekat" PIC da tio vrati kontrolu nad prekidnom maskom i opcenito opcim prekidnim bitom ?
Moj rad s PIC MCUima je davno zavrsio i detalja se ne sijecam , ali gotvo svi MCUi za interne prekide radi samoprogramiranja data mem ili prg mem koriste interni timer i mislim da se status operacije moze izcitat iz prekidne maske tj bita koji oznacava kraj operacije . Ako si sve to napravio i ne slusa te probaj mu dat malo vremena [koju NOP operaciju ] !
Inace zar ti se ne cini da iscitavanjem EEIF-a[ EEprom Interrupt Flag, oli ti zastavica statusa prekidne rutine EEproma] trebas dobit status operacije , i tek kad citenjem EEIFa utvrdis da je sve ok tad tek trebo otic dalje tj "igrat" se s drugim prekidnim rutima . Kod nekih MCUa stausni Flag bitovi se moraju pobrisat[postavit] prije pokretanja prekida kod nekih je to automatski rijeseno za vecinu prekida .
Uza svu moju nadmenost i aroganciju mislim da nisi dobro ili razumio ili procitao dokumentacu processora s kojim radis !!!! Pokusaj ponovo !!
Inace EEIE EEprom Interrupt Eneable [ omoguci prekid za EEprom] i s nijm pokreces prekindnu rutinu [internu] za upis u EEprom a EEIF-om bi treba procitat status pokrenute rutine i napisat petlju koja cita EEIF dok rutina ne zavrsi posao upisa , kad to obavi setirat ce EEIF zastavicu i tvoj program ce ti vratit kontrolu nad prekidima . Kod nekih MCUa moras zastavicu sam postavit [ izgleda da je to slucaj s PICom].
Mislim da si sada vec otisao predaleko sa svojim lupetanjima i ako si
jako davno radio sa MCU-ima mooooooolim te neeeeemoj vise da mi pomazes.
EEIE bit NE omogucava "internu" interapt rutinu i setovanjem tog bita
NE zapocinje upis u eeprom ( za to postoji WR bit ) u svoj dostupnoj
literaturi pise (a procitao sam sve bar 5 puta veruj mi) da kada su
istovremeno setovani EEIE bit (koji sam ja setovao u programu) i EEIF
koji se automatski setuje po zavrsenom upisu
u eeprom, uC skace na unapred odredjenu interapt rutinu koja je
definisana na adresi 0004 kao i pri drugim zahtevima za interapt
( sa RB0, RB 4-7 ili prekoracenje TMR0 ) i ja sam to dosta jasno
objasnio u pitanju samo ga je trebalo pazljivo procitati. Meni treba
pomoc DOBRONAMERNOG strucnjaka koji ima znanja, a ne trebaju mi prevodi
engleskih skracenica koji bi tvom odgovoru trebali da daju "tezinu".
Ako neko drugi moze da mi poomogne neka to ucini ako ne, ZABORAVITE.
jako davno radio sa MCU-ima mooooooolim te neeeeemoj vise da mi pomazes.
EEIE bit NE omogucava "internu" interapt rutinu i setovanjem tog bita
NE zapocinje upis u eeprom ( za to postoji WR bit ) u svoj dostupnoj
literaturi pise (a procitao sam sve bar 5 puta veruj mi) da kada su
istovremeno setovani EEIE bit (koji sam ja setovao u programu) i EEIF
koji se automatski setuje po zavrsenom upisu
u eeprom, uC skace na unapred odredjenu interapt rutinu koja je
definisana na adresi 0004 kao i pri drugim zahtevima za interapt
( sa RB0, RB 4-7 ili prekoracenje TMR0 ) i ja sam to dosta jasno
objasnio u pitanju samo ga je trebalo pazljivo procitati. Meni treba
pomoc DOBRONAMERNOG strucnjaka koji ima znanja, a ne trebaju mi prevodi
engleskih skracenica koji bi tvom odgovoru trebali da daju "tezinu".
Ako neko drugi moze da mi poomogne neka to ucini ako ne, ZABORAVITE.
Ja konkretno nisam nikad koristio takav interrupt nego sam cekao da se pisanje zavrsi nakon sto ga pokrenem.
Bilo bi dobro kada bi nam dao segment koda koji koristis pa da probam debugirati.
Code: Select all
EE_Pisi bsf STATUS, RP0 ; banka 1 ... prije ovog trebali smo ubaciti podatke u EEDAT i EEADR :) pa tek onda doletit u ovu proceduru ! :)
bsf EECON1, WREN ; dozvoli upis u eeprom
movlw h'55' ; kljuc1
movwf EECON2 ; --- unlock
movlw h'AA' ; kljuc2
movwf EECON2 ; --- unlock
bsf EECON1, WR ; PISI
EE_Pis1 btfsc EECON1, WR ; ako se nije zavrsio upis
GOTO EE_Pis1 ; vrati se i cekaj da se zavrsi vala
bcf EECON1, WREN ; onemoguci upise u eeprom na dalje
bcf STATUS, RP0 ; banka 0
RETURN ; vrati se...
@aolingen Iz traxovog primjera se vidi bas ono sto sam ti i rekao da setiranjem bita prekine rutine , u ovom slucaju za eeprom, pocinjes sam prekid koji je specifican za sve MCUe upis u interne memorije [memorju] .
Kao sto vidis EEcon1,WRE ; write eneable bit omogucava start same rutine
A EEcon, Wr nije nikakv pisi vec flag bit , sto se vidi is programske petlje , ceka ga da se postavi i zavrsi upis u mem . Posto mikrochipova serija 16 koristi stari model za inicijalizacju upisa u memoriju kako programsku tako i podataka inicijalizaciju tj sam upis se aktivira sekvencom 55AA , tko je ikad pisao algoritme za programiranje flash memorija prepoznace standardni AMDov algoritam kojeg je mikrochip koristio u svojim starijm MCUima [ tu spada i serija 16F ] .
A ono EEIE i EEIF i to stoji i ocito si otisao na replay gdije se prica o ATMELu tj jezgrama AVR i ATm klase. Tamo se koriste bas ti oblici naredbi za upis u interni eprom ..itd.. !!
Neznam sto si ti citao al ovo sto ti je trax poslao na board je zapisano u svim mikrochipovim dokumentima o progrmiranju interne memorije tj dano u formi rutine za asembler ili C++ !!!!!!!
I dalje mislim da nisi ili procitao ili razumio tekst .
Kao sto vidis EEcon1,WRE ; write eneable bit omogucava start same rutine
A EEcon, Wr nije nikakv pisi vec flag bit , sto se vidi is programske petlje , ceka ga da se postavi i zavrsi upis u mem . Posto mikrochipova serija 16 koristi stari model za inicijalizacju upisa u memoriju kako programsku tako i podataka inicijalizaciju tj sam upis se aktivira sekvencom 55AA , tko je ikad pisao algoritme za programiranje flash memorija prepoznace standardni AMDov algoritam kojeg je mikrochip koristio u svojim starijm MCUima [ tu spada i serija 16F ] .
A ono EEIE i EEIF i to stoji i ocito si otisao na replay gdije se prica o ATMELu tj jezgrama AVR i ATm klase. Tamo se koriste bas ti oblici naredbi za upis u interni eprom ..itd.. !!
Neznam sto si ti citao al ovo sto ti je trax poslao na board je zapisano u svim mikrochipovim dokumentima o progrmiranju interne memorije tj dano u formi rutine za asembler ili C++ !!!!!!!
I dalje mislim da nisi ili procitao ili razumio tekst .
IPAK NIJE TAKO
; OVO JE PROGRAMCIC KOJI KORISTI PREKID PO ZAVRSENOM UPISU U EEPROM
; ( PRIZNAJEM DA MU JE DOSTA TESKO NACI PRIMENU ALI PROFA JE IZMEDJU
; OSTALOG TO TRAZIO )
; PROGRAM PO PRITISKU NA TIPKU IZVRSI UPIS U EEPROM PIC-a PA ONDA NASTUPI
; INTERAPT, A U INTERAPT RUTINI SE NA 7-SEG DISPLEJU ISPISE BROJ 4
; NIJE BAS NESTO INTERESANTNA TEMA ALI AKO NEKOGA INTERESUJE NESTO VISE
; NEKA SE JAVI NA ZOLIGEN@YAHOO.COM
;
; 7 SEG DISPLEJ JE POVEZAN NA SLEDECI NACIN
; a-RA0, b-RA1, c-RA2, d-RA3, e-RB5, f-RB6, g-RB7
; TIPKA JE NA RB1
LIST P=16F84, R=DEC
include "p16f84.inc"
#DEFINE BANK0 BCF STATUS,5
#DEFINE BANK1 BSF STATUS,5
E: EQU D'3'
Z: EQU D'2'
C: EQU D'0'
GIE: EQU D'7'
TMR0: EQU D'1'
TOIE: EQU D'5'
TOIF: EQU D'2'
PORTA: EQU D'5'
PORTB: EQU D'6'
OPTIO: EQU D'1'
STATUS: EQU D'3'
INTCON: EQU D'11'
BROJAC: EQU D'12'
BROJAC2: EQU D'13'
BROJAC3: EQU D'14'
MF: EQU D'15'
STATUS_TEMP EQU D'16'
W_TEMP EQU D'17'
_CP_ON EQU H'000F'
_CP_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FF7'
_PWRTE_OFF EQU H'3FFF'
_WDT_ON EQU H'3FFF'
_WDT_OFF EQU H'3FFB'
_LP_OSC EQU H'3FFC'
_XT_OSC EQU H'3FFD'
_HS_OSC EQU H'3FFE'
_RC_OSC EQU H'3FFF'
__CONFIG _CP_OFF & _XT_OSC & _PWRTE_ON &_WDT_OFF
;CODE PROTECTION-OFF OSCILATOR=XT POWER UP TIMER-ON WATCHDOG TIMER-OF
ORG 0000
GOTO MAIN
ORG 0004
GOTO ISR
MAIN:
BANK1
MOVLW B'10000'
MOVWF TRISA ; PORTA IZLAZNI OSIM PORTA,4
MOVLW B'00011111'
MOVWF TRISB ; PORTB ULAZNI OSIM PORTB,5 6 I 7 KOJI SU IZLAZNI
BANK0
MOVLW B'10000'
MOVWF PORTA
CLRF PORTB
LOOP: BSF INTCON,EEIE ; OMOGUCI INTERAPT NAKON ZAVRSETKA UPISA U EEPROM
BSF INTCON,GIE ; OMOGUCI SVE PREKIDE
BTFSS PORTB,1 ; AKO JE TIPKA NA PORTB,1 PRITISNUTA IDI I UPISI NESTO U EEPROM DA BI
CALL EEUPIS ; IZAZVAO EEINTERAPT NAKON UPISA U EEPROM
MOVLW B'1111'
MOVWF PORTA
MOVLW B'01100000'
MOVWF PORTB
GOTO LOOP
;**************************************************************
ISR: BANK0 ; VEOMA JE VAZNO ZNATI DA SE UPIS U EEPROM VRSI IZ BANK1
; (JER SU TAMO REGISTRI I BITOVI KOJI INICIRAJU UPIS) PA
; SAMIM TIM I KAD NASTUPI INTERAPT MI SE NALAZIMO U BANK1
; A DA BI UTICALI NA PORTB MORAMO BITI U BANK0 I ZATO
; PRELAZIMO U BANK0
BCF INTCON,EEIE
MOVLW B'1001'
MOVWF PORTA ; ISPISI 4
MOVLW B'00100000'
MOVWF PORTB
CALL PAUZA1S
BANK1 ; VRATIMO SE U BANK1 JER SMO TAMO BILI KADA JE NASTUPIO INTERAPT
RETFIE
;***************************************************************
; NAMERNO NISAM ONEMOGUCIO GIE
EEUPIS: CLRF EEADR ; RUTINA ZA UPIS U EEPROM, U EEADR JE ADRESA GDE SE UPISUJE PODATAK
BANK1
BSF EECON1,WREN
BANK0
MOVLW D'77'
MOVWF EEDATA ; U EEDATA JE PODATAK KOJI SE UPISUJE
BANK1
MOVLW 0X55 ; OBAVEZNA RUTINA ZA ONEMOGUCAVANJE NEZELJENOG UPISA U EEPROM
MOVWF EECON2 ;
MOVLW 0XAA ;
MOVWF EECON2 ; DOVDE
BSF EECON1,WR ; I ONDA SAMO SIGNALIZIRAMO DA SE IZVRSI UPIS
KK3: BTFSS EECON1,EEIF ; CEKAMO DA PRODJE VREME POTREBNO DA SE IZVRSI UPIS
GOTO KK3 ; * VIDI OBJASNJENJE ISPOD
BCF EECON1,WREN
BCF EECON1,EEIF ; BRISEMO EEIF DA ODMAH PO IZLASKU IZ INTERAPT RUTINE NE BI IMALI USLOV
; ZA JOS JEDAN INTERAPT
BANK0
BCF INTCON,EEIE
CALL PAUZA1S
RETURN
PAUZA1S: ;RUTINA KOJA TERA uC DA SE VRTI U PETLJI NE RADECI NISTA PA
MOVLW D'15' ;USTVARI DOBIJAMO PAUZU (OKO 1 SEKUNDE).
MOVWF BROJAC3 ;I MOZE SE MENJATI
L14: MOVLW D'60' ;AKO PROMENIMO VREDNOST KOJA SE UNOSI U REGISTAR "BROJAC3"
MOVWF BROJAC
L12: MOVLW D'255'
MOVWF BROJAC2
L13: DECFSZ BROJAC2,F
GOTO L13
DECFSZ BROJAC,F
GOTO L12
DECFSZ BROJAC3,F
GOTO L14
RETURN
; * OBJASNJENJE
; OVDE JE KLJUCNI MOMENAT JER IZ OVE PETLJE uC SKACE NA INTERAPT RUTINU
; ( I TU SAM GRESIO )JER AKO JA RESETUJEM EEIF BIT U INTERAPT RUTINI
; KADA SE uC VRATI, VRTI SE BESKONACMNO DUGO JER CEKA DA EEIF BUDE SETOVAN
; A TO SE NIKADA NE DESI. S DRUGE STRANE AKO GA NE RESETUJEM CIM IZADJE IZ
; INTERAPT RUTINE ODMAH SE VRATI U NJU JER SU SETOVANI I EEIE I EEIF BIT
; E SAD GDE JE TU IZLAZ PA JA SAM U INTERAPT RUTINI RESETOVAO EEIE BIT
; I ONDA JE IZ KK3 PETLJE LEPO IZASAO JER JE EEIF BIT OSTAO SETOVAN
; A OPET NIJE BIO ZADOVOLJEN USLOV ZA PONOVNI INTERAPT JER EEIE NIJE SETOVAN
END
; OVO JE PROGRAMCIC KOJI KORISTI PREKID PO ZAVRSENOM UPISU U EEPROM
; ( PRIZNAJEM DA MU JE DOSTA TESKO NACI PRIMENU ALI PROFA JE IZMEDJU
; OSTALOG TO TRAZIO )
; PROGRAM PO PRITISKU NA TIPKU IZVRSI UPIS U EEPROM PIC-a PA ONDA NASTUPI
; INTERAPT, A U INTERAPT RUTINI SE NA 7-SEG DISPLEJU ISPISE BROJ 4
; NIJE BAS NESTO INTERESANTNA TEMA ALI AKO NEKOGA INTERESUJE NESTO VISE
; NEKA SE JAVI NA ZOLIGEN@YAHOO.COM
;
; 7 SEG DISPLEJ JE POVEZAN NA SLEDECI NACIN
; a-RA0, b-RA1, c-RA2, d-RA3, e-RB5, f-RB6, g-RB7
; TIPKA JE NA RB1
LIST P=16F84, R=DEC
include "p16f84.inc"
#DEFINE BANK0 BCF STATUS,5
#DEFINE BANK1 BSF STATUS,5
E: EQU D'3'
Z: EQU D'2'
C: EQU D'0'
GIE: EQU D'7'
TMR0: EQU D'1'
TOIE: EQU D'5'
TOIF: EQU D'2'
PORTA: EQU D'5'
PORTB: EQU D'6'
OPTIO: EQU D'1'
STATUS: EQU D'3'
INTCON: EQU D'11'
BROJAC: EQU D'12'
BROJAC2: EQU D'13'
BROJAC3: EQU D'14'
MF: EQU D'15'
STATUS_TEMP EQU D'16'
W_TEMP EQU D'17'
_CP_ON EQU H'000F'
_CP_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FF7'
_PWRTE_OFF EQU H'3FFF'
_WDT_ON EQU H'3FFF'
_WDT_OFF EQU H'3FFB'
_LP_OSC EQU H'3FFC'
_XT_OSC EQU H'3FFD'
_HS_OSC EQU H'3FFE'
_RC_OSC EQU H'3FFF'
__CONFIG _CP_OFF & _XT_OSC & _PWRTE_ON &_WDT_OFF
;CODE PROTECTION-OFF OSCILATOR=XT POWER UP TIMER-ON WATCHDOG TIMER-OF
ORG 0000
GOTO MAIN
ORG 0004
GOTO ISR
MAIN:
BANK1
MOVLW B'10000'
MOVWF TRISA ; PORTA IZLAZNI OSIM PORTA,4
MOVLW B'00011111'
MOVWF TRISB ; PORTB ULAZNI OSIM PORTB,5 6 I 7 KOJI SU IZLAZNI
BANK0
MOVLW B'10000'
MOVWF PORTA
CLRF PORTB
LOOP: BSF INTCON,EEIE ; OMOGUCI INTERAPT NAKON ZAVRSETKA UPISA U EEPROM
BSF INTCON,GIE ; OMOGUCI SVE PREKIDE
BTFSS PORTB,1 ; AKO JE TIPKA NA PORTB,1 PRITISNUTA IDI I UPISI NESTO U EEPROM DA BI
CALL EEUPIS ; IZAZVAO EEINTERAPT NAKON UPISA U EEPROM
MOVLW B'1111'
MOVWF PORTA
MOVLW B'01100000'
MOVWF PORTB
GOTO LOOP
;**************************************************************
ISR: BANK0 ; VEOMA JE VAZNO ZNATI DA SE UPIS U EEPROM VRSI IZ BANK1
; (JER SU TAMO REGISTRI I BITOVI KOJI INICIRAJU UPIS) PA
; SAMIM TIM I KAD NASTUPI INTERAPT MI SE NALAZIMO U BANK1
; A DA BI UTICALI NA PORTB MORAMO BITI U BANK0 I ZATO
; PRELAZIMO U BANK0
BCF INTCON,EEIE
MOVLW B'1001'
MOVWF PORTA ; ISPISI 4
MOVLW B'00100000'
MOVWF PORTB
CALL PAUZA1S
BANK1 ; VRATIMO SE U BANK1 JER SMO TAMO BILI KADA JE NASTUPIO INTERAPT
RETFIE
;***************************************************************
; NAMERNO NISAM ONEMOGUCIO GIE
EEUPIS: CLRF EEADR ; RUTINA ZA UPIS U EEPROM, U EEADR JE ADRESA GDE SE UPISUJE PODATAK
BANK1
BSF EECON1,WREN
BANK0
MOVLW D'77'
MOVWF EEDATA ; U EEDATA JE PODATAK KOJI SE UPISUJE
BANK1
MOVLW 0X55 ; OBAVEZNA RUTINA ZA ONEMOGUCAVANJE NEZELJENOG UPISA U EEPROM
MOVWF EECON2 ;
MOVLW 0XAA ;
MOVWF EECON2 ; DOVDE
BSF EECON1,WR ; I ONDA SAMO SIGNALIZIRAMO DA SE IZVRSI UPIS
KK3: BTFSS EECON1,EEIF ; CEKAMO DA PRODJE VREME POTREBNO DA SE IZVRSI UPIS
GOTO KK3 ; * VIDI OBJASNJENJE ISPOD
BCF EECON1,WREN
BCF EECON1,EEIF ; BRISEMO EEIF DA ODMAH PO IZLASKU IZ INTERAPT RUTINE NE BI IMALI USLOV
; ZA JOS JEDAN INTERAPT
BANK0
BCF INTCON,EEIE
CALL PAUZA1S
RETURN
PAUZA1S: ;RUTINA KOJA TERA uC DA SE VRTI U PETLJI NE RADECI NISTA PA
MOVLW D'15' ;USTVARI DOBIJAMO PAUZU (OKO 1 SEKUNDE).
MOVWF BROJAC3 ;I MOZE SE MENJATI
L14: MOVLW D'60' ;AKO PROMENIMO VREDNOST KOJA SE UNOSI U REGISTAR "BROJAC3"
MOVWF BROJAC
L12: MOVLW D'255'
MOVWF BROJAC2
L13: DECFSZ BROJAC2,F
GOTO L13
DECFSZ BROJAC,F
GOTO L12
DECFSZ BROJAC3,F
GOTO L14
RETURN
; * OBJASNJENJE
; OVDE JE KLJUCNI MOMENAT JER IZ OVE PETLJE uC SKACE NA INTERAPT RUTINU
; ( I TU SAM GRESIO )JER AKO JA RESETUJEM EEIF BIT U INTERAPT RUTINI
; KADA SE uC VRATI, VRTI SE BESKONACMNO DUGO JER CEKA DA EEIF BUDE SETOVAN
; A TO SE NIKADA NE DESI. S DRUGE STRANE AKO GA NE RESETUJEM CIM IZADJE IZ
; INTERAPT RUTINE ODMAH SE VRATI U NJU JER SU SETOVANI I EEIE I EEIF BIT
; E SAD GDE JE TU IZLAZ PA JA SAM U INTERAPT RUTINI RESETOVAO EEIE BIT
; I ONDA JE IZ KK3 PETLJE LEPO IZASAO JER JE EEIF BIT OSTAO SETOVAN
; A OPET NIJE BIO ZADOVOLJEN USLOV ZA PONOVNI INTERAPT JER EEIE NIJE SETOVAN
END
Evo ti primjer rutine za upis u EEprom koju sam koristio na jednom demo projektu ..
IEPWR MOVWF EEDATA
IEPWX BSF STATUS,RP0 ; UPIS U INTERNI EEPROM
BSF EECON1,WREN
BCF INTCON, GIE
MOVLW 0X55
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2
BSF EECON1,WR
NOP ; OVO JE MIJESTO CEKANJA !!!!
BCF EECON1,WREN ; A ZASTAVICA SE MORA SAMA RESETIRAT
BSF INTCON,GIE ; AKO JE SVE UREDU
BCF STATUS,RP0
RETURN
;
Flag ti nemas sta resetirat !!!!!!!!!!!!!!!To radi interna logika MCUa!!
Lako ces provijerit jel sve uredu . Takat MCLK je bia 6 MHz !!!!!
Pozdrav
IEPWR MOVWF EEDATA
IEPWX BSF STATUS,RP0 ; UPIS U INTERNI EEPROM
BSF EECON1,WREN
BCF INTCON, GIE
MOVLW 0X55
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2
BSF EECON1,WR
NOP ; OVO JE MIJESTO CEKANJA !!!!
BCF EECON1,WREN ; A ZASTAVICA SE MORA SAMA RESETIRAT
BSF INTCON,GIE ; AKO JE SVE UREDU
BCF STATUS,RP0
RETURN
;
Flag ti nemas sta resetirat !!!!!!!!!!!!!!!To radi interna logika MCUa!!
Lako ces provijerit jel sve uredu . Takat MCLK je bia 6 MHz !!!!!
Pozdrav
Code: Select all
LIST P=16F84, R=DEC
include "p16f84.inc"
#DEFINE BANK0 BCF STATUS,5
#DEFINE BANK1 BSF STATUS,5
E: EQU D'3'
Z: EQU D'2'
C: EQU D'0'
GIE: EQU D'7'
TMR0: EQU D'1'
TOIE: EQU D'5'
TOIF: EQU D'2'
PORTA: EQU D'5'
PORTB: EQU D'6'
OPTIO: EQU D'1'
STATUS: EQU D'3'
INTCON: EQU D'11'
BROJAC: EQU D'12'
BROJAC2: EQU D'13'
BROJAC3: EQU D'14'
MF: EQU D'15'
STATUS_TEMP EQU D'16'
W_TEMP EQU D'17'
_CP_ON EQU H'000F'
_CP_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FF7'
_PWRTE_OFF EQU H'3FFF'
_WDT_ON EQU H'3FFF'
_WDT_OFF EQU H'3FFB'
_LP_OSC EQU H'3FFC'
_XT_OSC EQU H'3FFD'
_HS_OSC EQU H'3FFE'
_RC_OSC EQU H'3FFF'
__CONFIG _CP_OFF & _XT_OSC & _PWRTE_ON &_WDT_OFF
;CODE PROTECTION-OFF OSCILATOR=XT POWER UP TIMER-ON WATCHDOG TIMER-OF
ORG 0000
GOTO MAIN
ORG 0004
GOTO ISR
;***********************************************************
MAIN:
clrf INTCON ; pogasi sve moguce interrupte
bsf INTCON, EEIE ; sad odma ovo omoguci
BANK1
MOVLW B'10000'
MOVWF TRISA ; PORTA IZLAZNI OSIM PORTA,4
MOVLW B'00011111'
MOVWF TRISB ; PORTB ULAZNI OSIM PORTB,5 6 I 7 KOJI SU IZLAZNI
BANK0
MOVLW B'10000'
MOVWF PORTA
CLRF PORTB
;***********************************************************
LOOP: BSF INTCON,GIE ; omoguci sve omogucene prekide
MOVLW B'00001111'
MOVWF PORTA
MOVLW B'01100000'
MOVWF PORTB
LOOP1:
BTFSC PORTB,1 ; tipka nije pritisnuta?
GOTO LOOP1 ; opet...
; jeste pritisnuta je konacno i pisi u eeprom
CALL EEUPIS ; pisi u eeprom
LOOP2: GOTO LOOP2 ; cekaj ovdje, interrupt ce upisati 4ku na display kad zavrsi... ovdje takodje mozes napraviti cekanje jos jednog pritiska dugmeta pa da se krene iz pocetka na LOOP. nemoj odma ici na LOOP odavdje.
;***********************************************************
ISR: bcf INTCON, GIE ; nek ti ova linija bude praksa od sad!!!
BANK1
bcf EECON1, EEIF ; moras!
BANK0
MOVLW B'1001'
MOVWF PORTA ; ISPISI 4
MOVLW B'00100000'
MOVWF PORTB
RETFIE
;************************************************************
EEUPIS: CLRF EEADR
MOVLW D'77'
MOVWF EEDATA ; podatak za eeprom
BANK1
;BCF EECON1,EEIF ; eeif=0 - visak
BSF EECON1,WREN
MOVLW 0X55 ;
MOVWF EECON2 ;
MOVLW 0XAA ;
MOVWF EECON2 ; DOVDE
BSF EECON1,WR ;
;KK3: BTFSS EECON1,EEIF ; cekaj da se zavrsi upis
; GOTO KK3 ;
;o ovome se sad brine interrupt
BCF EECON1,WREN
BANK0
RETURN
END
Nisam ovo probao ali vjerovatno ce raditi. Nisam siguran zbog ove EEUPIS rutine jer sam zakomentirao ono cekanje zavrsetka upisa. Mrsko mi zaviriti u dokumentaciju radi ovoga:
jer se desi odma jedno poslije drugog!
Code: Select all
BSF EECON1,WR ;
BCF EECON1,WREN
@trax
Nemora brisat cijeli registar dovoljno je samo resetirat GIE bit !
@zolingen Sve to skupa pise lijepo i na Mikrochipovoj dokumentaciji o programiranju EEproma i PRG MEMORIJE i date su gotove rutine , no izgleda da je problem cak i prepisat gotovo [ copy/paste source koda].
No izgleda da je jos veci problem setiranje cofiguracionih registara tj pravilna postavka inicijalizacione rutine .
Neki ljudi je olako shvacaju pa nerijetko FW cak nece ni da se pokrene , ali to je sve zbog "lakocemo" tehnologije ucenja i citanja dokumentacije !!
Kako god bilo , problem s upisom u eeprom se nije smio dogodit onome koji ozbiljno shvaca i cita dokumentaciju .
Mos' ti procitat i 50 x text ali bi ga bar jednom trebao razumijet !!!!
Imas cak i primjer bootloadera s rutinom za upis i u flash , sto moze bit zanimljivije onima koji razvijaju novi FW jer veoma lako i puno brze mogu isprogramirat, testirat u pravom debug modu programsku memoriju, eeprom i sram bez programatora na samoj radnoj ploci .
Moze se koristit bilo koji od komunikacionih standarda , uart ,spi , usb , eth...itd..ili koji vec tip komunikacije preferirate ! Ali to je vec ... nesto drugo!
Nemora brisat cijeli registar dovoljno je samo resetirat GIE bit !
@zolingen Sve to skupa pise lijepo i na Mikrochipovoj dokumentaciji o programiranju EEproma i PRG MEMORIJE i date su gotove rutine , no izgleda da je problem cak i prepisat gotovo [ copy/paste source koda].
No izgleda da je jos veci problem setiranje cofiguracionih registara tj pravilna postavka inicijalizacione rutine .
Neki ljudi je olako shvacaju pa nerijetko FW cak nece ni da se pokrene , ali to je sve zbog "lakocemo" tehnologije ucenja i citanja dokumentacije !!
Kako god bilo , problem s upisom u eeprom se nije smio dogodit onome koji ozbiljno shvaca i cita dokumentaciju .
Mos' ti procitat i 50 x text ali bi ga bar jednom trebao razumijet !!!!
Imas cak i primjer bootloadera s rutinom za upis i u flash , sto moze bit zanimljivije onima koji razvijaju novi FW jer veoma lako i puno brze mogu isprogramirat, testirat u pravom debug modu programsku memoriju, eeprom i sram bez programatora na samoj radnoj ploci .
Moze se koristit bilo koji od komunikacionih standarda , uart ,spi , usb , eth...itd..ili koji vec tip komunikacije preferirate ! Ali to je vec ... nesto drugo!
Nisam siguran da li je Microchip napravio da se ovaj registar automatski ocisti pri dovodjenju napajanja, jer pri startupu ko zna sta je u njemu upisano pa mu mozda bude pravilo probleme.buco wrote:@trax
Nemora brisat cijeli registar dovoljno je samo resetirat GIE bit !
Opet, nisam 100% siguran jer ko ce ga znati sta je u apsolutnoj jezgri chipa na tom mjestu i kako je to realizovano.
Istina da ponekad pri inicijalizaciji samog HW MCUa moze doc do neobicnih
"pojava" , no zato bi trebali kod kreacije FW prvo definirat inicijalizacionu rutinu tako da ona postavi sve pocetne parametre koji nama trenutno trebaju za "startnu" poziciju za nas buduci FW.
Sto se GIE bita tice on da je definiran u ini rutini tj pobrisan HW bi blokirao bilo koji buduci pokusaj prekida do daljnjeg...
Ja neznam dali si ti primjetio ali u pocetku rada s pisanjem programa za MCUe ljudi su skloni najcesce "preskocit" definicije inicijalizacione rutine jer to gotovo po pravilu smatraju "nevaznom" rutinom tj koriste sablone koju su negdje jednom vidjeli i tu zapravo nastaje cest uzrok buducih problema s radom FW tj pojedinih ruitina jer nemaju zadovoljene pocetne uvijete za pravilan rad.
Vidim da ima puno ljubitelja microchipovih MCUa [ serije 16 pogotovo] nebi bilo lose da napravis jedan tecaj jer je ocito da dokumentaciju ljudi ili ne citaju ili su im dijelovi iste nerazumljivi .
Razmisli o tome .. !!!!!??!!
Ako bude zainteresiranih za Atmel serije AVR i ATmega mogao bih i ja pomoc ljudima .
Naravno mislim na princip i nacin definicija ili rada pojedinih programskih odsjecaka [rutina] a ne da drugima rijesavamo "skolsku zadacu" ili debbugg-iramo projekte !!
Pozdrav
"pojava" , no zato bi trebali kod kreacije FW prvo definirat inicijalizacionu rutinu tako da ona postavi sve pocetne parametre koji nama trenutno trebaju za "startnu" poziciju za nas buduci FW.
Sto se GIE bita tice on da je definiran u ini rutini tj pobrisan HW bi blokirao bilo koji buduci pokusaj prekida do daljnjeg...
Ja neznam dali si ti primjetio ali u pocetku rada s pisanjem programa za MCUe ljudi su skloni najcesce "preskocit" definicije inicijalizacione rutine jer to gotovo po pravilu smatraju "nevaznom" rutinom tj koriste sablone koju su negdje jednom vidjeli i tu zapravo nastaje cest uzrok buducih problema s radom FW tj pojedinih ruitina jer nemaju zadovoljene pocetne uvijete za pravilan rad.
Vidim da ima puno ljubitelja microchipovih MCUa [ serije 16 pogotovo] nebi bilo lose da napravis jedan tecaj jer je ocito da dokumentaciju ljudi ili ne citaju ili su im dijelovi iste nerazumljivi .
Razmisli o tome .. !!!!!??!!
Ako bude zainteresiranih za Atmel serije AVR i ATmega mogao bih i ja pomoc ljudima .
Naravno mislim na princip i nacin definicija ili rada pojedinih programskih odsjecaka [rutina] a ne da drugima rijesavamo "skolsku zadacu" ili debbugg-iramo projekte !!
Pozdrav