Tæller med PIC16F84

Jeg tæller indkommende pulser på RB0/INT og den interrupter og dette laver en simpel increment af en variabel, som i hovedloopet blot vises på et 4X7-segment LED display - det kører tilsyne- ladende fnt nok op til omkring 30kHz, hvor dis- playet går "bazerk" og viser nogle

1) 2-3 segmenter kraftigt lysende i et ciffer eller 2) et helt ciffer kraftig lysende eller 3) displayet slukker helt Når frekvense af pulserne sænkes igen kommer den IKKE tilbage i en normal funktion, men fryser eller slukker displayet helt.

Jeg mener at kunne forstå hvor der begynder at gå galt ved stigende frekvens, idet jeg går ud fra, at det gentagne interrupt (trigget af de hurtige pulser) optager så meget tid, at displayfunktionen i hovedloopet ikke får tid til at opdatere displayet, men jeg synes det er underligt, at den af og til viser nogle få SEGMENTER i et ciffer - hvorfor ikke hele cifferet som i andre situationer - jeg sætter jo hele PORTB på én gang, og ikke de enkelte segmenter ?

Hvorfor går displayet til sidst helt ud og tilsyneladende kommer i et uendeligt loop, som kun kan afbrydes med MCLR ?

Nu kommer den i praksis aldrig over 10kHz, men vil typisk skulle operere helt nede fra 0 Hz, så jeg tester den manuelt med en FLIPFLOP som jeg bare setter/resetter - det kører fint så hurtigt jeg nu kan gøre det. Sætter jeg så en firkantgenerator på kører det også fint fra ca. 10 kHz og ned til ca. 200 Hz. (Så kan generatoren ikke gå længere ned) - her kører tælleren fint i et vilkårligt stykke tid, hvorefter displayet slukkes helt ! Kun MCLR kan få den til at tælle igen, og der er ikke noget klart "mønster" i hvor land tid den kører inden displayet slukker.

Har nogen ideer til, hvad jag kan gøre, for at finde fejlen ?

(Jeg ville prøve at simulere situationen i MPLAB, men har problemer med at lave en SCL-fil ! - se evt anden tråd)

Mvh KS

Reply to
KS
Loading thread data ...

Husker du at disable interupts i starten ar ISR'en ? Og cleare evt. flag inden du enabler interupt igen? Hvilken frekvens kører du PIC'en ved?

Tror dog ikke det kan være et problem af ovenstående type da din ISR skal være ret lang for at blive hængende ved 30KHz pulser....

-- Morten

Reply to
Morten M. Jørgensen

"Morten M. Jørgensen" skrev i en meddelelse news:41f4d52f$ snipped-for-privacy@news.wineasy.se...

Det mener jeg, men jeg check'er liiige igen !

Jeg kører ved 4MHz, og mit interrupt varer kun 60-70 uS.

Du har ingen ide til, hvad der kan være galt med MPLAB ?

Mvh KS

Reply to
KS

"KS" skrev i en meddelelse news:41f4d784$0$33697$ snipped-for-privacy@dread16.news.tele.dk...

Her er min intr-kode:

Org 4 call DisableIntr call StoreWorld ; for at vende tilbage ; til sammen BANK, W og STATUS call ServicerInt call SetupInt call RestoreWorld retfie

og disablingen foregår med:

DisableIntr bsf STATUS,RP0 ; select Bank1 bcf INTCON,GIE bcf STATUS,RP0 ; select Bank0 return

og jeg sætter intr op igen med:

SetupInt bsf STATUS,RP0 ; select Bank1 clrf INTCON ; clear alle int movlw B'10010000' ; enable RB0-intr ; OG interrupts generelt movwf INTCON bcf STATUS,RP0 ; select Bank0 return

DET er vel rigtigt nok - eller ?

Mvh KS

Reply to
KS

Nu er det ret længe siden jeg har arbejdet med netop 16F84, så jeg kan ikke huske hvilke registre der er i de forskellige banker. Men hvis du før interupt kommer fra bank 1 vil du efter ISR have bank0, så hvis det er nødvendigt skal du nok lave en test på current_bank og sætte den tilbage til den efter bcf INTCON,GIE i DisableIntr. Ellers kan det da i mine øjne ikke se anderledes ud!

Hvad er det for et signal du tæller pulser på ?

-- Morten

Reply to
Morten M. Jørgensen

"Morten M. Jørgensen" skrev i en meddelelse news: snipped-for-privacy@news.wineasy.se...

ikke

til

DET har du ret i StoreWorld skal FØR DisableIntr - meeeeen det forklarer vel ikke at displayet slukker når man kommer ned på 150-200 Hz - og det iøvrigt virker ved manuelt at trigge pulser op til 3-4 Hz.

Men helt klart skal de 2 kald byttes om.

Mvh KS

Reply to
KS

"KS" skrev i news:41f4d784$0$33697$ snipped-for-privacy@dread16.news.tele.dk

Hvis dit int. vare 70uS så kan du ikke tælle hurtigere end 1/70u = 14,28KHz.

-- Hilsen Peter N Petersen

formatting link
Privat
formatting link
Firma

Reply to
15kw

"KS" skrev i en meddelelse news:41f524b2$0$33720$ snipped-for-privacy@dread16.news.tele.dk...

ikke

Jeg glemte at sige, at jeg tæller på nogle rimeligt pæne firkanter fra et gammelt "generator projekt" (20-30 år !) men de ser nu pæne ud og iøvrigt er der Smith Trigger på indgang RB0/INT.

Jeg har nu prøvet at bytte de 2 kald om, og det hjælper ikke synderligt .....

hvordan F..... finder man ud af hvilket uendeligt loop den fræser rundt i, når displayet slukker ? Clocken kører fint, og hvorfor er det lige et interval lige under 150-200 Hz det går galt på .....

Mvh KS

Reply to
KS

Hvis koden ikke er alt for lang så er du da velkommen til at maile den til mig....måske et par friske øjne vil hjælpe lidt på det. Er meget interesseret i at se hvordan du driver dit display. Hvis du mailer noget så husk at fjerne det nødvendige spam blokkere i min adresse!

Den bedste fejlfindings metode have været hvis du kunne få fat i en ICE der kan køres under MPLAP.

-- Morten

Reply to
Morten M. Jørgensen

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.