Hallo ik heb een klein vraag je
wil graag als er op een pic 16f628 op .ik weet niet hoe je dat moet doen in picbasic

wel met een schakelaar

Dan is het .

if s1= 1 then
porta.1 = 1
endif

hoe kan ik nu een toon op vangen van 98.HZ en dat dan de led aan gaat

alvast bedankt
gr richard

Met een toondecoder. Een NE567 deed dat altijd prima; die zijn er nog.
http://www.datasheetcatalog.org/datasheet/philips/SE567N.pdf
Het aansluitschema staat op p1. Behalve het IC heb je nog een weerstand en drie condensatoren nodig.

Je kunt die toon ook gewoon versterken en dan aanbieden op een digitale ingang. Dan kun je de tijd tussen 2 nuldoorgangen meten en zo de frequentie bepalen.

Als het signaal waarin de toon voorkomt veel 'ruis', dus andere geluiden bevat, dan gaat dit niet zo goed werken. In dat geval kun je misschien het signaal samplen via een ADC en vervolgens een eenvoudige FFT er op los laten. Je kunt hiervoor inspiratie opdoen bij DTMF decoders voor de PIC. Hierin wordt iets soortgelijks gedaan.

Een ander alternatief is een bandfilter voor de PIC plaatsen die heel strak op die frequentie is ingesteld. Dan hoef je alleen nog maar de amplitude van het uitgangssignaal te meten.

oke bedankt voor de uitleg ga er mee aan de gang
en ja wat laat ge reageerd maar was even een paar dagen weg

vriendelijk bedankt gr

Dat lijkt me nu precies een taakje voor een FIR filter; om zo'n lage frequentie te meten, hoef je niet hard te samplen, en is het berekenen van een dergelijk filter ook nog goed te doen in een PIC. Natuurlijk wel een anti-aliassing filtertje voor de analoge ingang zetten.

Als ik me goed herinner, kun/moet je voor zo'n bandpass filter het gewenste signaal als filterconstanten gebruiken.

pfffttir. FFT, FIR filters... allemaal moeilijkdoenerij voor niks.

Bied dat signaal gewoon aan op een van de interne counters.

Lees die counter om de seconde uit en reset hem dan.
Als der 98 in de counter staat dan was het 98 hertz.
staat er 72 dan was het 72 hertz...

tis toch makkelijk he ...


counter=0
wait (1000)
x= counter

blablabla

repeat

en als je met iets minder precisie toekomt : je kan na 1/2 of 1/4 seconde uitlezen en kijken offie respectievelijk op 49 of 24 staat..

[Bericht gewijzigd door free_electron op (29%)]

Dat kost inderdaad óók geen extra chippie.
Maar als het signaal zo schoon is dat dat werkt, kun je nog mooier @mbbneon's methode toepassen.
Die heeft het voordeel van veel sneller te zijn, omdat je maar één periode hoeft te wachten, wat veel korter is dan een seconde, of zelfs een kwart seconde.
En zijn methode is een stuk nauwkeuriger, mocht dat belangrijk zijn.

hallo free_electron.
heb even een vraag is dit alles van de code
en moet ik bij X = counter , het ook zo neer zetten in picbasic

snap het niet dezen code
?????

[Bericht gewijzigd door ricardo12345 op (23%)]

Is ook maar een duwtje in de goede richting... ("blablabla" is geen PIC instructie ;) )
Je kunt bijvoorbeeld de portb interrupts gebruiken om een teller te verhogen. Dan na 1 seconde de waarde van de teller checken. Bij 98 Hz zou die dan op 98 moeten staan... Je moet natuurlijk wel een logisch signaal aanbieden. (blokgolf)

oke badankt !!

[Bericht gewijzigd door ricardo12345 op (14%)]

@FE: nu kun je wel gelijk gaan zeuren dat het allemaal te ingewikkeld is, maar die methode van jouw is echt alleen toepasbaar als je behalve dat ene signaal niets anders ontvangt. Met een FIR filter kun je die bepaalde frequentie uit een ongedefinieerde mix van signalen plukken. Ik wil dat systeem van jouw nog wel zien werken als er een aantal andere sinussen van diverse frequenties en amplitudes op het ingangssignaal staan, naast een al dan niet aanwezig 98Hz sinus.

Een FFT of DFT berekenen in een PIC met enige vorm van sample rate lijkt me een uitdaging.

@free, dat had ik in het begin van het topic ook al gemeld, tijd tussen nuldoorgangen meten (en dat het alleen kan bij een schoon signaal).

#sparky, ook dat had ik in dezelfde post genoemd.

Hier even iets uitgebreider.
Als je al weet wat de frequentie is, en dat weet de TS, dan kun je het "Göertzel algoritme" gebruiken.
Zoals ik al eerder heb vermeld, kom je de uitleg tegen in diverse topics over DTMF decoderen.
Bijvoorbeeld:
http://dtmf.voipintouch.net/content/dtmf.htm

The software DTMF Decoder is based on a modified Goertzel algorithm. A good source of explanation for the this algorithm and how to implement it using a DSP can be found in "Modified Goertzel Algorithm in DTMF Detection Using the TMS320C80" – Application Report from Texas Instruments.

In order to implement this algorithm on a such small processor like a 16 series PIC it was necessary to switch to integers, an finally to work with bits. A good source of inspiration was DTMF - Decoding with a 1-bit A/D converter by Scott Datallo - http://www.dattalo.com/technical/theory/dtmf.html

Goertzel assembly code werkt inderdaad goed, heb het een tijdje terug nog voor een 1955Hz detector gebruikt...
De LM567 werkt ook goed, maar is nogal erg temperatuurgevoelig.