Sida 1 av 1

Presentation: Nummerpresentatör med USB anslutning.

Postat: 14 april 2009, 18:08:56
av haklu
Tänkte det kunde vara dags att presentera mitt första projekt här på forumet. Det är visserligen ett litet projekt men jag har i alla fall ett par bilder. :)

Det hela är alltså en liten nummerpresentatör utan display baserad på en attiny2313. Telelinjen tas in via en linjetrafo direkt in på den analoga komparatorn på MCU:n. Den höga ringsignalspänningen tas om hand av de interna skyddsdioderna på portarna och ett par 100k motstånd.i serie med signalen.
Bild

Nummerinformationen skickas till en PC med hjälp av en FT232R USB-TTL kabel. På PC:en snurrar ett litet program i bakgrunden som skickar upp ett litet fönster i nedre högra hörnet med nummer och namn på den som ringer. Namnet hämtas från http://www.118100.se.

Bild

Jag samplar signalen med strax under 8kHz och jämför den med internt genererade signaler för de önskade frekvenserna. Jag genererar två interna signaler för varje frekvens där den ena är förskjuten med 90 grader. Eftersom jag fick lite cykler och minne över passar jag på att jämföra med ett par frekvenser som inte är med i DTMF för att minska risken för falska träffar.

MCU-koden är skriven i C med undantag för interruptrutinen som genererar referensfrekvenserna, samplar insignalen och korrelerar den mot de genererade frekvenserna. Den är skriven i assembler. Programmet på PC-sidan är skrivet i C#.

Det var lurigare än jag trodde att generera DTMF frekvenserna. För att göra det behöver jag alltså dela ner samplingsfrekvensen till en massa olika frekvenser. Vi tar den första (697 Hz) som exempel:
Samplingsfrekvensen är 8 Mhz / 1024 = 7812,5 Hz

Jag vill ha en räknare som räknar från 0 till 3 under varje period av 697 Hz signalen för att lätt kunna generera även den fasförskjutna signalen.

Kod: Markera allt

    ___     ___
___|   |___|
  ___     ___
_|   |___|   |_
 
0|1|2|3|0|1|2|3
Helst skulle jag alltså dela ner samplingsfrekvensen med 7812,5/(4*697) = 2,802188. Det är ju inte direkt ett heltal och inte hjälper det att ändra samplingsfrekvensen så att det gör jämnt upp för då blir det någon annan frekvens som blir drabbad. Lösningen blev att dividera med något som är lätt, t.ex. 2^12. (Detta görs effektivt genom att skippa den minst signifikanta byten och sedan swappa nibbles på den höga byten samt maska fram de minst signifikanta bitarna) , Men då måste jag naturligtvis multiplicera med 2^12 / 2,802188 = 1462 först, men det görs enkelt genom att addera detta till en räknare varje gång interruptrutinen körs. Räknarna (en för varje frekvens) behöver bara var 16 bitar. Det gör inget att den rinner över eftersom resterande bitar aldrig används i alla fall.

Programmet ryms med lite marginal i de 2kB flashminne och 128 byte ram som finns tillgängligt:

Kod: Markera allt

avr-size DTMF.out

text data bss  dec hex filename

1758    0  84 1842 732 DTMF.out
Hur fungerar det då?

Jo, över förväntan faktiskt. Vid inkommande samtal har den hittills aldrig gjort fel. Vid något tillfälle kan den rapportera en falsk knapptryckning under tiden man pratar i telefon, men det är lätt att filtrera bort på PC-sidan så länge man bara är intresserad av nummerpresantation och inte använder den för att styra någon livsuppehållande utrustning med knapptelefonen. Kanske går det att justera tröskelvärdena för när en frekvens ska betraktas som närvarande lite. För tillfället gör jag så att jag summerar ”energierna” för alla frekvenserna och anser att en frekvens vars ”energi” är större än 25 % av totalen är närvarande och en frekvens med ett ”energiinnehåll” som är mindre än 12,5 % är frånvarande. För en träff ska det alltså vara två närvarande frekvenser och resten frånvarande och inga där emellan. För säkerhets skull har jag ett minimivärde för trösklarna också ifall den totala energin är mycket liten.

Schema har jag inget på digital form ännu, men om det finns intresse kan jag rita ihop ett.

Edit: Rubrik / blueint
Edit: stavning /haklu

Re: Nummerpresentatör till USB

Postat: 14 april 2009, 18:53:00
av PHermansson
Intressant bygge! Nu blev man ju sugen på att bygga en själv... Så kom gärna med mer information!

Re: Presentation: Nummerpresentatör med USB anslutning.

Postat: 14 april 2009, 19:59:20
av thepirateboy
Ett projekt helt i min smak. :tumupp:

Vill man gå vidare skulle man kunna etsa ett riktigt kort och använda t ex AT90USB162, får att få ner komponentkostnaden ytterligare.

Re: Presentation: Nummerpresentatör med USB anslutning.

Postat: 14 april 2009, 21:41:42
av slatte
Riktigt praktiskt! Det kanske man skulle ta och bygga mycekt man skulle vilja göra men men..

Bra projekt :-)

Re: Presentation: Nummerpresentatör med USB anslutning.

Postat: 14 april 2009, 22:13:36
av Mindmapper
En sån har jag alltid önskat mig! Bra gjort. Dessutom med min favorit MCU. 8)
Verkar vara ett bra jobb du lagt ner på att få funktionen så bra som möjligt.
Snyggt jobb!

Re: Presentation: Nummerpresentatör med USB anslutning.

Postat: 15 april 2009, 07:38:36
av haklu
Tackar för alla positiva kommentarer! Jag ska rita ihop ett litet schema när jag får lite tid över... Och när jag får ännu mer tid över så ska jag ta och snygga till koden lite och försöka hitta något bra ställe att lägga upp den.

Re: Presentation: Nummerpresentatör med USB anslutning.

Postat: 15 april 2009, 16:09:32
av MrMister
superintressant!
Har du planer pa att aven kunna visa bild pa den som ringer (efter att man lagt in egna bilder och kopplat mot telnr) och kanske en loggfunktion ocksa? sa man ser vem som har ringt nar man inte varit hemma/kunnat svara.

Vill aven jag jattegarna se ett schema! :)

Re: Presentation: Nummerpresentatör med USB anslutning.

Postat: 15 april 2009, 17:50:16
av haklu
Här kommer schemat:

Bild

Den övre delen är taget direkt ur databladet för trafon. R6-R9 är för att fixa en lagom DC-nivå på komparatoringångarna. De bör matcha ganska väl så att ingångarna ligger så nära varandra som möjligt när man inte har någon signal in. R1 och R2 är för att det inte ska gå för mycket ström genom de interna skyddsdioderna när ringsignalen kommer. JP1 är för programmering av MCU:n och JP2 är anslutningen till TTL-USB-kabeln.

Jag gissar att det skulle funka lika bra utan trafo med varsin konding i serie med R1 och R2 för att hålla likströmmen borta. Någon som har några åsikter om det?

Man kan naturligtvis bygla stift 1 och 2 respektive 3 och 4 i modularkontakten så att man inte bryter kaskadkopplingen av telejacken. Jag gjorde det i andra änden av sladden istället.

Loggning av inkommande samtal görs redan. Att lägga till bilder kopplat till nummer har jag inte funderat på, men det kan man i och för sig tänka sig. Däremot har jag tänkt lägga till cachning av nummer mot namn så att man får upp namn även om nätet skulle vara nere eller svara långsamt.