Frequenzmessung

Knickohr

BASCOM-Experte
29. Feb. 2008
465
0
16
Sprachen
Hallo zusammen :)

Hat jemand irgendeine Idee, wie man einfach und ohne viel Ressourcen zu verschwenden die Frequenz an einem Pin messen kann ? Ich habe schon von irgendwelchen Interrupts und ICP-Pin gelesen, so richtig schlau bin ich aber nicht daraus geworden.

Ich möchte zu dem Wolkensensor noch ein Sky-Quality-Meter dazu bauen. Ein Photosensor mißt die Himmelsaufhellung und gibt eine Frequenz in Abhängigkeit der Helligkeit aus. Ich verwende dazu den TAOS TSL237S.

Na hoffentlich bekomme ich den TLS237S auch hier irgendwo in Deutschland !

Die Frequenz liegt im Bereich von 2Hz bis ca. 50KHz. Wobei ich im unteren Bereich die höchste Genauigkeit erreichen möchte.

Hat jemand ein Codeschnippsel (BASCOM) zur Frequenzmessung ?

Thomas
 
[FONT=Helvetica, Arial, sans-serif]Hallo Thomas,

einen Bascom-Codeschnipsel habe ich leider nicht, aber vielleicht hilft dir folgendes weiter ...

Timer mit InputCapture initialisieren:
[/FONT]
  1. [FONT=Helvetica, Arial, sans-serif]Timer/Counter auf 0x0000 setzen[/FONT]
  2. Vorteiler des Timers so einstellen, dass deine kleinste zu messende Frequenz (2Hz=1/0,5s) gerade noch gemessen werden kann. Hier also so einstellen, dass es nach frühestens 0,5s einen Überlauf gibt. Ein Überlauf sollte natürlich möglichst nicht vorkommen[FONT=Helvetica, Arial, sans-serif].[/FONT]
  3. [FONT=Helvetica, Arial, sans-serif]InputCapture aktivieren, Flanke einstellen.[/FONT]
  4. [FONT=Helvetica, Arial, sans-serif]Zugehörigen InputCapture-Interrupt freigeben. In der Interruptservice-Routine setzt du das Timer/Counter-Register auf 0x0000 und kopierst den Inhalt des Registers ICR in eine von dir definierte Variable. Das Register ISR ist praktisch ein "Schnappschuss" des Timer/Counter-Registers zum Zeitpunkt des InputCapture-Ereignisses, dieser Wert entspricht der Periodendauer.[/FONT]
Zwei Fälle müssen ggf. berücksichtigt werden.

Fall A
Das erste InputCapture-Ereignis nach der Initialisierung ist ungültig, da der Timer nicht synchron (ab 0x0000) mit dem InputCapture-Ereignis gestartet wurde.

Fall B
Läuft der Timer/Counter über, ist die Frequenz des Signals am Pin ICP zu niedrig, das kann man abfangen. Hierzu nutzt du am besten den Timer-Overflow-Interrupt. Dieser Fall tritt dann nicht auf, wenn die minimale Frequenz garantiert ist und/oder wenn du die Überlaufzeit ausreichend hoch wählst (in deinem Fall vielleicht 1s).

Das hört sich vielleicht alles ein bisschen kompliziert an, ist es aber eigentlich nicht. Du musst nur den Timer initialisieren und in der ISR des InputCapture-Interrupts Punkt 4 abarbeiten. Fall A könntest du eventuell ignorieren, Fall B tritt vielleicht nicht auf, wenn du den Prescaler gut wählst.

Grüße,
Dirk
 
Hi Thomas,

gemäß TAOS Hompage gibt es nur den TSL237 oder den TSL237T. Von einem TSL237S wissen die nix :confused:

Ich befürchte allerdings, dass Du Dir in Deutschland etwas schwer tun könntest den TSL237 zu bekommen. Ich habe mal bei Farnell nachgefragt, die haben ihn nicht :(

Spoerle hat ihn nicht :(

RS Components hat ihn nicht :(

Frag mal bei GETRONIC (http://www.taosinc.de/) nach. Die scheinen die deutsche Niederlassugn zu sein.

Grüße,
Ma
 
Hallo Dirk,

Danke für die Unterstützung. ich denke, die Messung der Pulslänge ist bei niedrigeren Frequenzen die bessere Wahl, um eine höhere Genauigkeit zu bekommen. Muß mal schauen, wie ich das mit dem ICP hin bekomme. Ich kann leider nur BASCOM. Muß aber damit auch klappen.

Hallo Markus,

Getronic habe ich bereits angeschrieben. Mal sehen, ob die sich melden. Ja, leider hat fast niemand die Sensoren im Sortiment. Einzig 2 US-Distributoren bieten die an. Aber da kostet der Versand wieder mal mehr, als die Ware :(

Ich bräuchte einfach mal ein oder zwei Stück zum Ausprobieren. Wenns klappt, dann werden es sicher mehr. Genau die gleichen Sensoren werden übrigens in dem schweineteuren SQM von Unihedron verwendet. Was rechtfertigt 120 US$, bzw. 170€ für einen Sensor, der ca. 3€, und einen AVR, der genauso viel kostet ? Dann müßte ich eigentlich meine Timer für mind. 500€ verkaufen ?!

Ach ja, das S ist die Bauform. S für Single in Line und SM für Surface Mount ;)

Thomas
 
Hi Thomas,

sowas hier?:::

Declare function Lopulse() As Word

Dim Value As Word
Dim Time As Word

Inputpin Alias Pind.0

Config Portb = Output
Portb = &HFF


Do
Value = Lopulse()
Portb = Low(value)
Loop

End

Function Lopulse() As Word
' Local Time As Word

While Inputpin <> 0 : Wend
Time = 0 ' reset Timer0
While Inputpin = 0
Incr Time
Wend
Lopulse = Time
End function



oder die Subs in ASM:

Declare Function Lopulse() As Byte

Dim Value As Byte



Const Inputpin = $10 , 0 ' Inputpin Alias Pind.0

Config Portb = Output
Portb = &HFF

Config Timer0 = Timer , Prescale = 1

On Timer0 Overflow_isr Nosave

Enable Timer0
Enable Interrupts

Do
Value = Lopulse()
Portb = Value
Loop

End

Function Lopulse() As Byte
$asm
Hilo:
Sbic Inputpin ' wait for Hi-Lo on inputpin
Rjmp Hilo
$end Asm
Tcnt0 = 0 ' reset Timer0
Start Timer0
$asm
Lohi:
Sbis Inputpin ' wait for Hi-Lo on inputpin
Rjmp Lohi
$end Asm
Stop Timer0 ' stop Timer0 after 26 cycles minimum
Lopulse = Tcnt0
End Sub

' overflow isr stops timer0 and set tcnt0 to zero
Overflow_isr:
!push R24
Stop Timer0
Tcnt0 = 0
!pop R24
Return




Mit 4MHz liegt die maximale Torzeit bei 7,5µs
Frei nach Kühnel. (oh Gott was für ein schl.. Buch)

Späte Antwort und du hast sicher eine Lösung aber könnte auch andere Leuts interessieren.

Gruß Pit
 
Hallo Pit :)

Schau, schau. Treibst Du dich also auch hier rum ;)

Neee, ich hab noch keine Lösung. Allerdings liegt es nicht am Willen etwas zu machen, sondern schlicht und einfach an den Sensoren. Ich bekomme die doofen
Dinger einfach nicht her. Und aus dem Amiland für 25US$ oder mehr Porto mal 2 oder 3 kommen zu lassen, ist mir schlichtweg zu teuer.

Schade, dann gibts die Astro-Wetterstation wohl vorerst noch ohne das SQM.

Thomas
 
Ja ja und so langsam mutiert das AVR Forum zum Astronomie Forum :)
Willkommen im Club Pit!

Zur Rehabilitätion: Astronomie und Elektronik liegen schon sehr sehr nahe beinander. Aber, dachte heute Abend schon "Oh Gott" als ich Deinen Beitrag zur Astrologie gelesen habe:p

Alles wird gut und irgendwann bekomme ich auch noch ne Knickohr-Wetterstation ab, gell Thomas?
 
Hallo,

wollte heute mal wieder am SQM weiter machen, mußte aber eine herbe Überraschung hinnehmen. Ein Sensoren habe ich vor eine halben Jahr auftreiben können und auch schnell den Code dazu gestrickt.

Code:
$regfile = "m8def.dat"
$crystal = 1000000                                                              '
$hwstack = 32
$swstack = 32
$framesize = 40
$prog &HFF , &HA1 , &HD9 , &H00                                                 ' BODEN=2,7V sonst Standard

Config Clock = Soft , Gosub = Sectic
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Config Lcd = 16 * 2 , Chipset = Dogm162v3
Config Timer1 = Timer , Capture Edge = Rising , Prescale = 1024
On Capture1 Icp_isr

Cursor Off Noblink
Cls

Dim C As Word
Dim P As Word
Dim V As Word
Dim W As Word
Dim X As Long
Dim S As String * 8

Gosub Contrastset

Locate 1 , 5 : Lcd "Test SQM"
Wait 1
C = 0
P = 1024
Cls

Enable Timer1
Enable Capture1
Enable Interrupts

Do
   nop
Loop

End

Sectic:                                                                         ' Sekundenzähler
   Disable Timer1
   Disable Capture1
   Locate 1 , 1 : Lcd Time$
   S = Str(c)
   Locate 1 , 12 : Lcd Format(s , "00000")
   S = Str(p)
   Locate 2 , 1 : Lcd Format(s , "0000")
   X = C * P
   S = Str(x)
   Locate 2 , 9 : Lcd Format(s , "00000000")
   Select Case C
      Case Is < 5000
         Select Case P
            Case 1
               Nop
            Case 8
               P = 1
               Config Timer1 = Timer , Capture Edge = Rising , Prescale = 1
            Case 64
               P = 8
               Config Timer1 = Timer , Capture Edge = Rising , Prescale = 8
            Case 256
               P = 64
               Config Timer1 = Timer , Capture Edge = Rising , Prescale = 64
            Case 1024
               P = 256
               Config Timer1 = Timer , Capture Edge = Rising , Prescale = 256
         End Select
      Case Is > 60000
         Select Case P
            Case 1
               P = 8
               Config Timer1 = Timer , Capture Edge = Rising , Prescale = 8
            Case 8
               P = 64
               Config Timer1 = Timer , Capture Edge = Rising , Prescale = 64
            Case 64
               P = 256
               Config Timer1 = Timer , Capture Edge = Rising , Prescale = 256
            Case 256
               P = 1024
               Config Timer1 = Timer , Capture Edge = Rising , Prescale = 1024
            Case 1024
               Nop
         End Select
   End Select
   Enable Capture1
   Enable Timer1
   Return

Contrastset:
   V = 15
   V = V And &B00001111
   V = V + &B01110000
   W = 15
   Shift W , Right , 4
   W = W + &B01010100
   _temp1 = &B00101001
   !rCall _Lcd_control
   _temp1 = V
   !rCall _Lcd_control
   _temp1 = W
   !rCall _Lcd_control
   _temp1 = &B00101000
   !rCall _Lcd_control
   Return

Icp_isr:
   C = Capture1
   Timer1 = 0
   Return

Hat prima funktioniert, ich konnte die Frequenz, oder besser die Pulsweite von dem TSL237 auslesen. So jedenfalls vor einem halben Jahr. Dann habe ich heute den Code neu compiliert und nichts ging mehr. Jetzt weiß ich nicht, ob ich da irgendeinen Fehler rein bekommen habe, oder ob es vermutlich durch einen BASCOM-Softwareupdate nicht mehr klappt. Es scheint so, als ob der ICP nicht mehr kommt. Am ICP liegen aber die Impulse an, nur werden sie offensichtlich ignoriert.

Kanns mit jedenfalls nicht erklären.

Thomas
 
Hi Thomas,

könnte prinzipiell schon sein, dass mit einer neuen BASCOM-Version ein Bug reingerutscht ist.

Hast Du die alte noch? In einem Schritt 1 könntest Du exakt die Umgebung herstellen wei Du sie vor fast einem Jahr hattest und schauen ob es "wieder" funktioniert.

Zunächst würde ich aber erst einmal weniger an einen BASCOM-Fehler glauben sondern den Fehler im Programm oder am Aufbau suchen.

Wenn ich mir Deinen Code so ansehe so habe ich den Verdacht, dass Dir die SoftClock den Timer1 belegt welchen Du aber für ICP benötigst. Kann das sein.

Um jede Sekunde einen Interrupt zu haben würde ich zunächst nicht die SoftClock verwenden. Die ist zu langsam und erzeugt unnötigt Overhead. Ich würde also den Code so umbauen, dass Du ohne SoftClock zwei unabhängige Timer hast die laufen.
Hmmm ... ist zunächst nur eine Vermutung.

Hast Du am Code oder dem Aufbau etwas geändert? Anderer Mega usw?

Grüße,
Markus
 
Hallo Markus,

ist genau der gleiche Aufbau. War noch komplett so aufgebaut. Deshalb wundert mich das ja. Die Softclock läuft meines Wissens auf Timer2. Aber wer weiß, was MCS da verändert hat. Werde nachher mal das ohne die Uhr probieren.

Im Prinzip habe ich nur den Code neu compiliert.

Thomas
 
Hallo,

hab den Code mal so zusammen geschrumpt, das nur noch das Nötigste drin ist :

Code:
$regfile = "m8def.dat"
$crystal = 1000000                                                              '
$hwstack = 32
$swstack = 32
$framesize = 40
$prog &HFF , &HA1 , &HD9 , &H00                                                 ' BODEN=2,7V sonst Standard

Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Config Lcd = 16 * 2 , Chipset = Dogm162v3
Config Timer1 = Timer , Edge = Falling , Capture Edge = Falling , Prescale = 1 , Noise Cancel = 0
On Capture1 Icp_isr

Cursor Off Noblink
Cls

Config Portd.6 = Output                                                         ' GND TSL237
Portd.6 = 0
Config Portd.7 = Output                                                         ' VCC TSL237
Portd.7 = 1
Config Pinb.0 = Input                                                           ' Out TSL237
Portb = &B00000001                                                              ' PullUp aktivieren

Dim C As Word
Dim Z As Word
Dim V As Word
Dim W As Word

Gosub Contrastset

Locate 1 , 5 : Lcd "Test SQM"

Enable Capture1
Enable Interrupts

Do
   !nop
Loop

End

Icp_isr:
   C = Capture1
   Incr Z
   Locate 2 , 1 : Lcd Z
   Locate 2 , 10 : Lcd C
   Timer1 = 0
   Return

Contrastset:
   V = 15
   V = V And &B00001111
   V = V + &B01110000
   W = 15
   Shift W , Right , 4
   W = W + &B01010100
   _temp1 = &B00101001
   !rCall _Lcd_control
   _temp1 = V
   !rCall _Lcd_control
   _temp1 = W
   !rCall _Lcd_control
   _temp1 = &B00101000
   !rCall _Lcd_control
   Return

Lasse auch ein Zähler mitlaufen, damit ich sehe, ob das doofe Ding in den Capture-Interrupt spring. Funktioniert soweit ganz gut. Nur halt das er das Interrupt Capture Register nicht ausliest. Da ist immer Null drin. Bin mir jetzt sicher, das der Code auf jedem Fall funktioniert hat, nur es wird hald das Register nicht ausgelesen :(

Werde dazu mal im MCS-Forum schreiben !

Thomas
 
Mein Gott ! :eek:

Ich suche mir hier einen Wolf und innerhalb von 10 Minuten kommt dann die Antwort von MCS :

The Bascom Compiler build 1.11.9.3.001 has a serious bug in accessing timer1 (and maybe other) register in address range &H00..&H3F.

Use Bascom 1.11.9.2 or ask Support for Build 1.11.9.3.002

@ Dirk :
Kann man so etwas ganz groß an die Glocke im Forum hängen ? Da fallen bestimmt noch mehr drauf rein außer mit.

Thomas
 
Hallo Thomas,
Kann man so etwas ganz groß an die Glocke im Forum hängen ? Da fallen bestimmt noch mehr drauf rein außer mit.

ich könnte vielleicht ein Forum oder Unterforum "Errata" erstellen, in welches man festgestellte Fehler von Mikrocontrollern, Programmern/Emulatoren und Entwicklungsumgebungen eintragen kann, so eine Art universelle Fehlerliste?!

Was hältst du davon, was sagen die anderen User?

Grüße,
Dirk
 
was sagen die anderen User?
User? Ja das bin ich!:)

Ich bezweifle dass sich so eine Fehlerliste bei uns durchsetzen wird. Die 3 Fehler(meine Prognose) die sich da im Laufe eines halben Jahres ansammeln würden, würden den eigenen Themenberich nicht rechtfertigen. Nebenbeibemerkt sind solche Fehler, aufgrund von Softwareupdates, eh nie lange aktuell.
Das war aber nur meine bescheidene Meinung, andere können anders darüber denken.
 
Mein Verdacht auf Timer1 resultiert aus der Tatsache, dass die CONFIG DCF77 Routinen welche ja in großen Teilen die Softclock beinhalten nur mit dem Timer1 arbeiten. Soweit mir bekannt kann auch in der aktuellen BASCOM-Version der Timer noch nicht so ohne weiteres umkonfiguriert werden.

Daher habe ich das als hypotetische Fehlerquelle mal angenommen. Ich bin aber nach wie vor der Meinung, dass es ein wenig oversized ist wegen einem Sekunden-Tick die SoftClock zu verwenden.

Grüße,
Markus
 
Hallo Dirk,

ich könnte vielleicht ein Forum oder Unterforum "Errata" erstellen, in welches man festgestellte Fehler von Mikrocontrollern, Programmern/Emulatoren und Entwicklungsumgebungen eintragen kann, so eine Art universelle Fehlerliste?!
Wär nicht schlecht.


Grüsse,

Michael
 
Fehler-Datenbank

Hallo zusammen,

ich könnte vielleicht ein Forum oder Unterforum "Errata" erstellen, in welches man festgestellte Fehler von Mikrocontrollern, Programmern/Emulatoren und Entwicklungsumgebungen eintragen kann, so eine Art universelle Fehlerliste?!
von der Idee recht interessant, ...

Wär nicht schlecht.
wie gesagt, wenn es genug Fehler gibt ...

Ich bezweifle dass sich so eine Fehlerliste bei uns durchsetzen wird. Die 3 Fehler(meine Prognose) die sich da im Laufe eines halben Jahres ansammeln würden, würden den eigenen Themenberich nicht rechtfertigen. Nebenbeibemerkt sind solche Fehler, aufgrund von Softwareupdates, eh nie lange aktuell.
Das war aber nur meine bescheidene Meinung, andere können anders darüber denken.
... und da muß ich ihm irgendwie Recht geben.

Außerdem gibt es ja auch die Fehlerlisten der Hersteller, die ReleaseNotes, ...usw

Man läuft dabei Gefahr, das Forum zu stark zu zerteilen. Im Endeffekt hat
man für jeden Kleinkram eine eigene Rubrik und findet vor lauter Rubriken
die Beiträge nicht mehr. Das ist wie beim Partitionieren von Festplatten.
Man benötigt eine gewisse Anzahl von Rubriken im Forum. Aber zu viele sind
auch nicht gut. Man muß das gesunde Mittelmaß finden.

Und wenn ein Bastler/Programmierer/... etwas nicht zum laufen bekommt,
dann sucht er meißt nach Lösungen, die andere schon mal gemacht haben.
Damit landet er dann mit hoher Wahrscheinlichkeit sowieso in einem Beitrag,
wo das dann drin steht das da ein Fehler bei Version xyz existiert.

@Dirk - für deine Boards (ATmega128-USB, Bootloader, ...) die Du selber
im Shop anbietest würde ich es befürworten. Damit die Anwender der
Boards evtl auftretende Fehler mitbekommen. Diese Infos gibt es ja sonst
nirgendwo. Aber für die Atmels oder Bascom oder AVR-Studio wäre es
meiner Meinung nach doch zuviel des guten.

Gruß
Dino
 
Hallo Dino und Nomis,

ihr habt sicherlich recht, dass nicht genug Fehler gemeldet werden, dies rechtfertigt dann auch keine zusätzliche Forenkategorie. Also lasse ich es erst mal so wie es ist. Es gibt ja auch noch die Suche, mit den entsprechenden Suchbegriffen findet man dann bestimmt schon den richtigen Beitrag :)

Schönen Abend,
Dirk
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)