trafikk lysanlegg bruke MCU

Z

zh3ng

Guest
Jeg er en nybegynner med PIC programmering.Jeg prøver å programmere PIC16F628A for 10 sekunder forsinkelse etter forsinkelsen 10sec er gjort, vil det styre stafetten fra RA2's pinner.
Under dette er koden, men ikke virker, kan noen hjelpe meg og fortelle meg hva som er galt?

listen p = 16f628a
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF & _BODEN_ON & _MCLRE_OFF

# include <p16F628a.inc>

cblock
d1
d2
d3
endc; Programmet starter her

hovedsaklig
org 0x00

movlw 7
movwf CMCON

clrf PORTA
clrw
Tris PORTA; porta all produksjon
clrf PORTB
movlw 0xf0; pb4-7 innganger
Tris PORTB
bSF STATUS, RP0; Bank 1
BCF OPTION_REG, NOT_RBPU; interne pullups på port B aktivert
BCF STATUS, RP0; bank 0Ring Delay

movlw 0x04; RA2 er utgang
movwf PORTAUtsettelse
; 1999996 sykluser
movlw 0x11
movwf d1
movlw 0x5D
movwf d2
movlw 0x05
movwf d3
Delay_0
decfsz d1, f
goto $ 2
decfsz d2, f
goto $ 2
decfsz d3, f
goto Delay_0

, 4 sykluser (inkludert anrop)
returnslutt

 
Vurder å gjøre disse endringene:

1.bruke timer moduler, det er akkurat hva de er for.Alt du trenger å gjøre er å konfigurere dem og laste en startverdi i dem.Når innholdet når maksimum, ruller de over null og generere et avbrudd.Opprett en interrupt rutine som laster timeren igjen, klar for neste periode.Du kan enten bruke avbryte rutine å gjøre andre ting i tillegg, eller du kan bruke den til å øke en software disken hvis du trenger enda lengre forsinkelser.

2.Endre starten av koden din.For øyeblikket stedet du programmet på 0x00 med org direktivet.Men interrupt vektor er satt til adresse 0x04 så hvis en interruot oppstår, vil det gjøre programmet hoppe til clrw undervisning som ikke er hva du vil (særlig siden du har WDT disabled!).På org 0x00 sted en instruksjon "goto main", på org 0x04 plassere avbryte rutine eller hvis du bestemmer deg for ikke å bruke avbrudd, plassere en retfie instruksjon stedet og sett 'viktigste' ved neste gratis adressen.Så når programmet starter, hopper den over avbruddet koden til et bedre utgangspunkt.

3.Programvare forsinkelse looper er vanligvis ikke en god løsning, bruk tidtakere hvis det er mulig, men hvis du må bruke dem, må du passe på at WDT virkelig er slått av eller det vil tiden ut og forårsake en tilbakestille mens forsinkelsen looper.Remember the WDT forårsaker en reset omtrent hver 18mS men ikke klare det i det hele tatt i en 10 S loop.

Off topic:
hvis du limer inn koden på edaboard, er det mye lettere å lese hvis du legge det i koden koder.Like før koden, klikker du i boksen rett over meldingen vinduet med ordet "Code" i det.På slutten av programmet, klikk igjen for å gjenopprette normal drift.Det vil sikre at koden er igjen som det er og ikke re-formatert av styret programvare.

Brian.

 
Takk så mye brian, vil jeg prøve deg råd.Men jeg fremdeles forveksle med koding, trenger å lære hver eneste kommando.

 
ikke så sikker på om dette er riktig, men cblocks må ha en adresse hvor du skal begynne, fordi den første flere bytes i minnet, er forbeholdt.så prøv dette:
Code:

...cblock 0x20

d1

d2

d3

endc...
 
Takk smartie, den fungerer bra.Jeg prøver å legge til denne forsinkelsen til en annen 8 LED chaser prosjektet .. tror du kan hjelpe meg på dette?hvor du skal sette inn koden.
Takk bror!

 
Hei,
Her er den komplette koden (med noen endringer):
Code:

LIST P = 16F628A

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF & _BODEN_ON & _MCLRE_OFF# Include <P16F628A.inc>CBLOCK 0x20

d1, d2, d3

ENDCORG 0x00

GOTO MAIN

;=========================================

Utsettelse

; 1999996 sykluser

movlw 0x11

movwf d1

movlw 0x5D

movwf d2

movlw 0x05

movwf d3

Delay_0

decfsz d1, f

goto $ 2

decfsz d2, f

goto $ 2

decfsz d3, f

goto Delay_0, 4 sykluser (inkludert anrop)

return;============================================

MAIN

MOVLW ,7

MOVWF CMCON

CLRF CCP1CON

BANKSEL Trisa

CLRF Trisa

MOVLW 0xFF

MOVWF TRISB

BSF OPTION_REG, NOT_RBPU

BANKSEL PORTA

CLRF PORTA

CALL Delay

BSF PORTA, 2

GOTO $

slutt
 
Takk så mye Tamid Brother, takk for din oppriktige hjelp, jeg hadde vedlagt i zip-filen inneholder ledet chaser koden og skjematisk.Jeg villig til å endra den førte chaser koden, slik at pin port A RA2 kan sende signalet til å styre stafetten etter ca 3 minutter forsinkelse.Foreløpig kan jeg på stafetten når strømmen på uten forsinkelser.Behage hjelpe meg å endre koden.
Beklager, men du må logge inn for å vise dette vedlegget

 
Hei zh3ng,
Hvis jeg fikk deg riktig, dette er hva du vil, så snart strømmen er anvendt det vil være en 3 sekunders forsinkelse etter som stafetten er å være slått på.Her er koden for det:
Code:

LIST P = 16F84A

# Include <P16F84A.INC>

__CONFIG _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSCCBLOCK 0x20

D1, D2, D3

ENDCORG 0x00

GOTO MAIN; Forsinkelse 3 000 000 maskin sykluser

, Varighet av forsinkelsen 3000 millisekund

; Frekvens av pulserende oscillator 4 MHz

FORSINKELSE

MOVLW ,13

MOVWF D1

MOVLW ,57

MOVWF D2

MOVLW ,16

MOVWF D3

DECFSZ D1, F

GOTO $ -1

DECFSZ D2, F

GOTO $ -3

DECFSZ D3, F

GOTO $ -5

RETURN

;=================================================MAIN

BANKSEL Trisa; Flytt til Bank 1

CLRF Trisa; Clear tris biter og satt til utgang

BANKSEL PORTA; Flytt til banken 0

CLRF PORTA; Tøm innholdet i Porta

CALL DELAY; 3second forsinkelse

BSF PORTA, 2; Turn stafett på

GOTO $; Done

END

 
Har du sjekke LED chaser koden?Jeg trenger hjelp til å guide meg hvor skal jeg sette denne forsinkelsen koden i Led Chaser Program.Jeg prøvde, men fungerer ikke.Takk broLagt etter 18 minutter:LED Chaser programmet fungerer fint, jeg må bare legge til forsinkelsen stafetten modulen inne i programmet.Når makt brukes, vil Leds begynne, etter 3 minutter kjører, trenger jeg PIC å slå på stafetten ved å sende utgangssignalet gjennom RA2.Når stafetten er ON, vil den forbli på, og at lysene fortsatt kjører inntil strømmen er slått av.Jeg håper u kan forstå hva jeg mener.Takk

 
Hei zh3ng,
Her delay loop vil ikke være svært nyttig.Du må bruke den interne TMR0 å sjekk for tiden.Jeg har laget et program som fungerer fint.Prøv det:
Code:

LIST P = 16F84A

# Include <P16F84A.INC>

__CONFIG _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSCCBLOCK 0x20

D1, D2, INTC, LCOUNT, RCOUNT

ENDCORG 0x00

GOTO MAINORG 0x04

GOTO ISR

;================================================= =======

FORSINKELSE

MOVLW ,221

MOVWF D1

MOVLW ,130

MOVWF D2

DECFSZ D1, F

GOTO $ -1

DECFSZ D2, F

GOTO $ -3

RETURN

;================================================= ======

ISR

DECFSZ INTC; SJEKK FOR 46 GANGER Interrupt skjedde

GOTO $ 2; IKKE SLÅ PÅ RELAY

BSF PORTA, 2; RELAY TURN ON

BCF INTCON, T0IF; SLETT TMR0 Interrupt FLAG

RETFIE

;================================================= ======

MAIN

BANKSEL TRISB; BANK1

CLRF TRISB; PORTB alle utganger

CLRF Trisa; PORTA alle utganger

MOVLW 0XA0

MOVWF INTCON; globale og TMR0 Interrupt ENABLED

MOVLW 0x87

MOVWF OPTION_REG; PORTB PULL UP FUNKSJONSHEMMEDE, 1:256 PRESCALER

BANKSEL PORTB; BANK0

CLRF PORTB; SLETT INNHOLDET I PORTB

CLRF PORTA; SLETT INNHOLDET I PORTA

CLRF TMR0; hvile TMR0

MOVLW ,46

MOVWF INTC; FILL INNHOLDET I INTC

MOVLW ,8

MOVWF LCOUNT; FILL INNHOLDET I LCOUNT

MOVWF RCOUNT; FILL INNHOLDET I RCOUNT

START

MOVLW ,1

MOVWF PORTB; RB0 = 1

LLOOP

DECFSZ LCOUNT

GOTO DOLEFT; SKIFT IT VENSTRE

RLOOP

DECFSZ RCOUNT

GOTO DORIGHT; SKIFT IT RIGHT

MOVLW ,8

MOVWF LCOUNT; ReLoad LCOUNT

MOVWF RCOUNT; ReLoad RCOUNT

GOTO START; omstarten

DOLEFT

RLF PORTB; SKIFT VENSTRE

CALL DELAY; FORSINKELSE

GOTO LLOOP; GÅ TILBAKE

DORIGHT

RRF PORTB; SKIFT HØYRE

CALL DELAY; FORSINKELSE

GOTO RLOOP; GÅ TILBAKE

END
 
Bare et ord av forsiktighet når du bruker 'direktivet $' in PIC assembler.Det betyr "den nåværende adresse" slik at en instruks som "goto $ -5 betyr gå tilbake fem instruksjoner.Det kan være vanskelig å bruke fordi hvis du legger til eller i enkelte tilfeller endre en instruks som faller innenfor hoppe plass, kan det føre til uforutsigbare resultater.Årsaken er at det ikke vil endre avstanden til hopp hvis det blir mindre eller større grunn av instruksjonene som hoppet over.for eksempel hvis du har lagt til en ekstra opplæring i forsinkelsen, kan koden må endres til "goto $ -6" i stedet.Over korte hopp det er ganske åpenbart hva vi skal gjøre, men over større avstander, eller når hopp begynner å krysse over hverandre, kan det være svært vanskelig å holde orden på dem alle.

En bedre metode er å gjøre dette:
Code:FORSINKELSE

MOVLW ,13

MOVWF D1

MOVLW ,57

MOVWF D2

MOVLW ,16

MOVWF D3

DelayLoop

DECFSZ D1, F

GOTO DelayLoop

DECFSZ D2, F

GOTO DelayLoop

DECFSZ D3, F

GOTO DelayLoop

RETURN

 
betwixt,
Godt forslag.Men jeg har blitt vant til å bruke $, det var derfor jeg skrev det.Men ja, det er vel bedre å bruke etiketter.

 
Hei Mr. Tahmid, Takk så mye, dens arbeider.Kan jeg bruke timer1 stedet for timer0, fordi koden i ledet chaser allerede bruker timer0 modul.

 
Ja, du kan bruke TMR1 stedet for TMR0 men koden må være litt endret.Først i initialisering delen sted load T1CON:
Code:

BANKSEL PIE1; BANK1

MOVLW 0xC0

MOVWF INTCON; GIE og PEIE valgt

MOVLW 0x01

MOVWF PIE1; Aktiver Timer1 avbryte

BANKSEL PIR1; BANK0

CLRF PIR1; Clear Interrupt flag

MOVLW 0x31

MOVWF T1CON; TMR1 på og prescaler 1:8
 
Tahmid,
Synes ikke arbeide for Timer1, ta kontrollere koden i allerede endret, vist nedenfor ,.... det førte ikke på, og stafetten ikke på når jeg søker makt.LIST P = 16F628A
# Include <P16F628A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF & _BODEN_ON & _MCLRE_OFF

CBLOCK 0x20
D1, D2, INTC, LCOUNT, RCOUNT
ENDC

ORG 0x00
GOTO MAIN

ORG 0x04
GOTO ISR;================================================= =======
FORSINKELSE
MOVLW ,221
MOVWF D1
MOVLW ,130
MOVWF D2
DECFSZ D1, F
GOTO $ -1
DECFSZ D2, F
GOTO $ -3
RETURN
;================================================= ======
ISR
DECFSZ INTC; SJEKK FOR 46 GANGER Interrupt skjedde
GOTO $ 2; IKKE SLÅ PÅ RELAY
BSF PORTA, 2; RELAY TURN ON
BCF PIR1, TMR1IF
RETFIE
;================================================= ======MAIN

BANKSEL PIE1; BANK1
MOVLW 0xC0
MOVWF INTCON; GIE og PEIE valgt
MOVLW 0x01
MOVWF PIE1; Aktiver Timer1 avbryte
BANKSEL PIR1; BANK0
CLRF PIR1; Clear Interrupt flag
MOVLW 0x31
MOVWF T1CON; TMR1 på og prescaler 1:8
MOVLW ,100
MOVWF INTC; FILL INNHOLDET I INTC
MOVLW ,8
MOVWF LCOUNT; FILL INNHOLDET I LCOUNT
MOVWF RCOUNT; FILL INNHOLDET I RCOUNT
START
MOVLW ,1
MOVWF PORTB; RB0 = 1
LLOOP
DECFSZ LCOUNT
GOTO DOLEFT; SKIFT IT VENSTRE
RLOOP
DECFSZ RCOUNT
GOTO DORIGHT; SKIFT IT RIGHT
MOVLW ,8
MOVWF LCOUNT; ReLoad LCOUNT
MOVWF RCOUNT; ReLoad RCOUNT
GOTO START; omstarten
DOLEFT
RLF PORTB; SKIFT VENSTRE
CALL DELAY; FORSINKELSE
GOTO LLOOP; GÅ TILBAKE
DORIGHT
RRF PORTB; SKIFT HØYRE
CALL DELAY; FORSINKELSE
GOTO RLOOP; GÅ TILBAKE
END

 
Hei,
Du glemte å sette Tris biter.
Den faste koden skal være:
Code:

LIST P = 16F628A

# Include <P16F628A.INC>

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF & _BODEN_ON & _MCLRE_OFFCBLOCK 0x20

D1, D2, INTC, LCOUNT, RCOUNT

ENDCORG 0x00

GOTO MAINORG 0x04

GOTO ISR;================================================= =======

FORSINKELSE

MOVLW ,221

MOVWF D1

MOVLW ,130

MOVWF D2

DECFSZ D1, F

GOTO $ -1

DECFSZ D2, F

GOTO $ -3

RETURN

;================================================= ======

ISR

DECFSZ INTC; SJEKK FOR 46 GANGER Interrupt skjedde

GOTO $ 2; IKKE SLÅ PÅ RELAY

BSF PORTA, 2; RELAY TURN ON

BCF PIR1, TMR1IF

RETFIE

;================================================= ======MAINBANKSEL PIE1; BANK1

CLRF Trisa ;----------- du gått glipp av denne

CLRF TRISB ;----------- du gått glipp av denne

MOVLW 0xC0

MOVWF INTCON; GIE og PEIE valgt

MOVLW 0x01

MOVWF PIE1; Aktiver Timer1 avbryte

BANKSEL PIR1; BANK0

CLRF PORTA ;----------- du gått glipp av denne

CLRF PORTB ;----------- du gått glipp av denne

CLRF PIR1; Clear Interrupt flag

MOVLW 0x31

MOVWF T1CON; TMR1 på og prescaler 1:8

MOVLW ,100

MOVWF INTC; FILL INNHOLDET I INTC

MOVLW ,8

MOVWF LCOUNT; FILL INNHOLDET I LCOUNT

MOVWF RCOUNT; FILL INNHOLDET I RCOUNT

START

MOVLW ,1

MOVWF PORTB; RB0 = 1

LLOOP

DECFSZ LCOUNT

GOTO DOLEFT; SKIFT IT VENSTRE

RLOOP

DECFSZ RCOUNT

GOTO DORIGHT; SKIFT IT RIGHT

MOVLW ,8

MOVWF LCOUNT; ReLoad LCOUNT

MOVWF RCOUNT; ReLoad RCOUNT

GOTO START; omstarten

DOLEFT

RLF PORTB; SKIFT VENSTRE

CALL DELAY; FORSINKELSE

GOTO LLOOP; GÅ TILBAKE

DORIGHT

RRF PORTB; SKIFT HØYRE

CALL DELAY; FORSINKELSE

GOTO RLOOP; GÅ TILBAKE

END
 
Takk, den fungerer nå.Jeg har tenkt å kombinere denne timer1 koden, med LED Chaser kode som er i vedlegget (hjelp me.zip).Hvor bør jeg plassere koden "GOTO ISR".
Kontroller fila pwmc_main107.asm og pwmc_start.inc.Etter at jeg la GOTO ISR under 0x04, stafetten og på svært raskt.Er det noe likevel må endre koden?
Beklager, men du må logge inn for å vise dette vedlegget

 
Hei,
Jeg har gjort noen endringer i koden, og det har vært festet.
Forhåpentligvis er det fint nå.
Beklager, men du må logge inn for å vise dette vedlegget

 
Yeah bravoo!!stor, er det fungerer nå.Forresten, hva er den maksimale forsinkelsen gang vi kan søke på INTC variabel?Jeg prøvde å putte mye lengre forsinkelse, men synes ikke fungerer bra?Slik er regnestykket for dette timer?

Hilsen,
Surianto Zheng

 

Welcome to EDABoard.com

Sponsor

Back
Top