89S51 Interrupt problem. Vennligst Hjelp

J

joajas

Guest
Når jeg kjører koden på selve maskinvaren. Kontrolleren avbryte alltid utløse to ganger når jeg trykker på avbryter trigger knappen én gang, eller når jeg gjør en hardware reset. Nedenfor er koden. Vennligst råd hvordan jeg kan løse dette problemet, takk. Jeg bruker en Atmel 89S51 controller med noen lysdioder og par av trykknapper. # Include ORG 0000H LJMP MAIN ORG 0100H MAIN: SETB EA; ENABLE EKSTERN INTERRUPT 0 og INTERRUPT en SETB EX1 SETB IT0; SET TO EDGE utløst (NEGATIVE EDGE) SETB IT1; SET TO EDGE utløst (NEGATIVE EDGE) HER: LJMP HER EX0_ISR: MOV P2, # FFH LCALL MAKSIMALE CLR P2.2 LCALL MAKSIMALE CLR P2.3 LCALL MAKSIMALE CLR P2.4 LCALL MAKSIMALE RET FORSINKET: MOV TMOD, # 10H MOV R0, # 1EH NESTE: MOV TH1, # B1H MOV TL1, # E0H SETB TR1 WAIT1: JNB TF1, WAIT1 CLR TR1 CLR TF1 DJNZ R0, NEXT RET ORG 0013H LCALL EX0_ISR RETI END
 
Det er ikke klart om denne trykknappen conneted direkte til inngangen pin av avbruddet eller gjennom noen form for SR bistabilt logikk. Problemet med Direct Connect kan være at når du trykker på knappen inngangen logikk avbruddet kan "se" mer enn én negative edge (Prell-effekt). Fra koden kunne jeg ikke forstå hvordan du regne ut at din avbryter går to ganger på hvert trykk på knappen. Avbruddet klarner 3 biter av port 2 hver ene etter den andre plassere forsinkelser mellom dem. Men hvordan stiller disse pinnene tilbake? Du også aktivere INT1, men jeg kunne ikke se noen kode for det. Hvis en eller annen måte dette interrupt er også utløst enn Gud vet hva som er utføre. Noen del av INT0, antar jeg. Dette kan sees av deg som kjører Int0 to ganger. Hvis du ønsker noen hjelpe deg mer enn du være mer konkret om din HW. Belsugului
 
Knappen for tilbakestilling er koblet direkte til tilbakestille pin av kontrolleren, er knappen for å avbryte koblet til int0 pin. Begge knappen tillater meg å veksle mellom en logisk 1 og en logikk 0. int1 er aktivert for fremtidig bruk, har jeg ikke skrevet koden for det ennå. Jeg brukte lysdioder til å hjelpe meg å finne ut hvordan kontrolleren håndterer min kode. Slags indikator hvor det forteller meg når jeg trykker på int trigger knappen jeg burde se lysdiodene går av etter hverandre. Derfor i mitt tilfelle, når noen jeg trykker på reset-knappen eller int trigger-knappen, går lysdiodene av en etter en, tross alt LED går av, de straks vil alle lyse opp og slukkes en etter en igjen. Dette er hvordan jeg fastslått at int ble utløst to ganger. Vennligst råd takk
 
Jeg prøvde denne koden på 87C51, men det fungerte ikke i det hele tatt. Så jeg endret koden ved å legge timer1 interrupt og timer1 avbryter prioritet = 1, og nå denne koden fungerer korrekt .. Her er det:
ORG 0000H LJMP MAIN ORG 0003H LCALL EX0_ISR RETI ORG 001BH RETI ORG 0100H MAIN: SETB EA; ENABLE EKSTERN INTERRUPT 0 og INTERRUPT en SETB EX0 SETB ET1 SETB IT0; SET TO EDGE utløst (NEGATIVE EDGE); SETB IT1; SET TO EDGE utløst (NEGATIVE EDGE) SETB PT1 HER: LJMP HER EX0_ISR: MOV P2, # 0FFH LCALL MAKSIMALE CLR P2.2 LCALL MAKSIMALE CLR P2.3 LCALL MAKSIMALE CLR P2.4 LCALL MAKSIMALE RET FORSINKET: MOV TMOD, # 10H MOV R0, # 1Eh NESTE: MOV TH1, # 0B1H MOV TL1, # 0E0H SETB TR1 WAIT1: TF1 JNB, $ CLR TR1 CLR TF1 DJNZ R0, NEXT RET END
Lykke til og hilsen .. IanP
 
Salam, jeg tror det er bedre å bruke en kort forsinkelse (10mlS) etter hvert avbryte for å sjekke at avbruddet gjelder ikke støy, kan du gjøre det ved å deaktivere EX0 etter interrupt (under interrupt routin) deretter ringe forsinkelse for 10mlS og sjekk inngang for å være 0, så gjør hva du wamt, og husker ikke å kunne avbryte før RETI instruksjon. dette er gjort for det meste når en swich er koblet til pin, på grunn av sprett og rebounce funksjon av en nøkkel. hilsen.
 
Kanskje det er mange sprett når u trykk ur knappen. så sprette trigger ur MICROS mer enn en gang
 
Takk for alle forslag. Så hvordan gjør jeg sikker på at jeg eliminert muligheten av mikrokontroller bli utløse to ganger på grunn av knappen atferd? Eller hvordan skal jeg koble meg knappen til kontrolleren, direkte til pinnen eller med noe midt imellom? Vennligst råd, takk
 
Hvis du har edge utløst interrupt så det beste er å bruke en RS flip-flop mellom knappen og INT0 pin (som sikkert vil eliminere eventuelle problem knyttet til flere kanter med bare ett trykk). Deretter fra avbryte subrutin kan du tilbakestille RS flip-flop. Problemet kan være her at mens du fremdeles trykke på reset knappen avbruddet subrutine er allerede utført, så det vil prøve å nullstille, mens du setter RS ​​flip-flop. En annen løsning kan være tu bruke en gate med smed trigger. Selv om dette kanskje ikke like god som en RS flip-flop du ikke trenger å endre sin status fra subrutine. Jeg nevnte også at det ikke er bra i det hele tatt, thet du aktiverer et avbrudd uten å ha en subrutine skrevet for det. Hvis en støy utløser andre interrupt, vil da bli henrettet selv om du ikke har skrevet en kode for det. Det betyr at du har en inngangsport for avbruddet subrutine, enden fra der opcodes vil bli henrettet. Ønsker du å koden din, betyr det at noen del av INT0 koden vil bli henrettet. Hvis en eller annen måte når du trykker på knappen INT1 utløses også, så er dette kurset for å se deg din avbryter kjøres to ganger. Belsugului
 

Welcome to EDABoard.com

Sponsor

Back
Top