PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : frequenzmessen über 100khz nicht möglich



kleinstar
14.05.2007, 21:27
Hi,
ich habe eine Routine, mit der ich die Frequenz messen kann:

Sub Messen()
Config Int0 = Falling

Flankenzahl = 0
Messzeit = 50000000 '20000000
Timervorgabe = 53036 'für 50ms ' 25536 für 20ms ' 55536 für 5ms

Do
Enable Interrupts
Enable Int0
Enable Timer1
Portd.2 = 1

Config Timer1 = Timer , Prescale = 64 'für 50ms'8 für 20ms ' messzeit 5ms
Timer1 = Timervorgabe

On Timer1 Isr_von_timer1
On Int0 Irq

Waitms 500
Lcd_clr

Stemp = "imp=" + Str(flankenzahl)
Schreibe Stemp
Lcd_cursor 1 , 3
Stemp = "fre=" + Str(frequenz())
Schreibe Stemp

Flankenzahl = 0
Wait 2

Loop

Irq:
Incr Flankenzahl
Return


Isr_von_timer1:
'Timer1 = Timervorgabe
'Toggle Portc.0
Impulsepromesszeit = Flankenzahl
Disable Int0
Disable Interrupts
Return

ich messe mit einer Torzeit, die fallenden Flanken..

das Prog funktioniert gut bis auf:
-verzählt sich ganz klein wenig: bei 2000 Flanken verzählt sichs um ca 4
(das ist ganz wenig und scheint kein Grundlegender Fehler zu sein und ist scheinbar nicht Frequenzabhängig)-->das ergebnis weicht ca 50-150 Hz ab

- das Prog funzt nur bis ca 105khz, danach spinnt die anzeige rum (lcd ausgabe)

Hat da jemand vielleicht ne Idee,wie man das eine oder andere wegbekommt, würd mich sehr freuen..!
Grüße Roland

linux_80
14.05.2007, 22:17
Hallo,

hier kommt folgendes Problem hinzu, wenn eine ISR augerufen wird, sichert Bascom erstmal schön alle 32 Register auf dem Stack, was natürlich einiges an Zeit braucht. Am Ende der ISR kommen die 32 Register wieder vom Stack zurück.

Wenn Du dich mit Assembler auskennst, könntest Du oben den aufruf der ISR mit Nosave angeben, und in der ISR nur die Register sichern, die auch verwendet werden.



PS:
Den Code kann man zur bessern Lesbarkeit mit Code-Tags umschliessen.
Dazu einfach den geschriebenen Code-Text markieren, und auf den Code-Button oberhalb des Textfensters clicken. Fertig.

kleinstar
15.05.2007, 18:45
hmm, da nehm ich doch nen andern eingang und rufe nich die isr auf, da passiert eh nichts, außer, dassich ne Variable hochzähl, das kannich doch anders hinkriegen..
obwohls ja schon gut geht, bei 2000 flanken 4 mehr gezählt... geht schon, wär halt cool , wenns ganz genau wär..