DTMF-avkodare -> AVR -> PC

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
maxxflow
Inlägg: 1150
Blev medlem: 17 mars 2004, 16:11:14

DTMF-avkodare -> AVR -> PC

Inlägg av maxxflow »

Tänkte fixa en "nummerpresentatör" kopplad till datorn mha. en HT9170 från en slaktad nummerpresentatör.
Verkar ju inte så knepigt.. Alla externa komponenter (kristall etc.) som krävs till avkodaren är ju bara att sno från dendär nummerpresentatören.
Avkodaren skickar output med 4 bitar, paralellt, se tabellen på sidan 10 i databladet..
Pin-beskrivning på sidan 2-3...

Dock undrar jag hur OE funkar... Tabellen på sidan 10 fick mig att tro att OE blir hög när det är "siffror på gång", men i pin-tabellen står ju att OE är "input"..? Och "pull-high", betyder det att den normalt är hög, att jag ska "jorda" den för att få den låg?
Frågan är om man ens behöver en mikroprocessor, borde väl gå bra att koppla direkt till datorns paralellport?
Vore ju kul om det funkar, då slipper man spendera en dag på att åka till ELFA eftersom den enda µC:n jag har hemma är en Tiny15, för få I/O på den är jag rädd..
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Dock undrar jag hur OE funkar...

Det är helt klart i databladet, och du beskriver det också på korrekt sätt.
Vad är problemet ?

> Och "pull-high", betyder det att den normalt är hög ?
> att jag ska "jorda" den för att få den låg?

Ja och ja.

> borde väl gå bra att koppla direkt till datorns paralellport?

Det verkar lite pyssligt att få till timing. Ska du polla porten ?
Jag skulle sätta en processor mellan som man fixa ett enkelt seriellt
"paket" med hela numret och skicka via RS232. Eller helt enkelt spara
numren "lokalt" och skita helt i PCn... :-)
Användarvisningsbild
strombom
Inlägg: 3305
Blev medlem: 27 maj 2003, 10:50:20
Ort: Västra Götaland
Kontakt:

Inlägg av strombom »

OE står för output enable. När du sätter en nolla på OE så kommer datapinnarna på kretsen att kopplas från (hög impedans), när du sätter en etta på OE kommer datapinnarna att fungera som utgångar. Det är användbart exempelvis om man har flera enheter som ska dela på samma ingång till en enchipsdator.

Eftersom det som du sa är pull-high så behöver du inte ens koppla in den.

/Johan
maxxflow
Inlägg: 1150
Blev medlem: 17 mars 2004, 16:11:14

Inlägg av maxxflow »

Ok, så det enda jag behöver koppla till "mottagaren" är D0-D3? Om man pollar paralellporten t.ex. så måste man väl ha någon signal för att "trigga" datorn så att den vet när det kommer data? Är det DV isf? Eller är jag helt på fel spår?

Anledningen till att jag vill koppla det till datorn är för att den ska slå upp numren direkt på eniro.se och visa *vem* det är som ringer istället för bara numret, dessutom ska den kolla numret mot en databas där jag kan lägga in nummer som t.ex. ska blockas (telelinan kopplas mha. ett relä bort efter första jacket (där bara ADSL-modemet sitter) så att ringsignalerna inte kommer fram) eller kopplas direkt till telefonsvarare..

Om jag bara skulle ha den direkt till en AVR med t.ex. en display, så hade jag ju lika gärna kunnat använda nummerpresentatören som jag snodde kretsen ur :roll: :wink:

Men om vi säger att jag skulle använda en AVR som "mellanstation", hur fixar jag enklast en RS232-länk mellan den och datorn? Ska man ha någon såndär MAX-vaddetnuärdeheter-IC?
Och behöver AVR:en någon "förvarning" om att data kommer från avkodaren, eller hur funkar det? Jag har fått för mig att man kan göra så att man har en loop (i µC:n) som hela tiden kollar input-portarna (D0-D3 från avkodaren) och skickar vidare till datorn om det kommer nåt.. Men... Hur ska den veta när det kommer 0-bitar? Då är ju den pinnen låg, precis som när det inte kommer nån data alls... Måste väl till nån timing där... Näh, nu får nån förklara hur det funkar istället för att jag ska sitta här och gissa (fel)... ;)
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

OK:
Du har en lämplig µC till att polla kretsen och samla in datan för alla siffren.

Om det har kommit siffror och det sedan går en viss tid där det inte kommer fler kan alla siffror anses ha mottagits.

Då startas "utskriftrutinen": varje siffer/data omvandlas till den motsvarande ASCII-karaktär: 0 blir '0', 1 blir '1' osv och dessa data skickas till UART'en allt eftersom den blir redo att skicka igen.

Sen när alla talen är skickade kan du skicka en CR (ASCII 13) eller liknande om du vill ha en "end of data" markering varpå PC programmet tar hand om resten.

I µC'n nollar du pekare osv och är klar till nästa drabbning.

Detta sätt kan utvidgas till att spara listor över inkommande samtal osv men det beror ju på vad du behöver.

För att "komma åt" serieporten duger en MAX232 eller liknande helt fint.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Du kan inte *enabart* kolla D0-D3. Då vet du ju inte om
det är samma siffra du läser igen o.s.v.

Läs beskrivningen av (t.ex) DV pinnen !
Och även "Functional Description" på sidan 7.

Enklast är att lägga DV till en interrupt ingång, sedan är det
bara att läsa av "knappen" i interrupt rutinen och sedan vänta
på nästa interrupt.

Med lite timers får man ha logik (som Icecap sa) som avgör om
ett nummer är slut o.s.v.

Hm, så nummerpresentationen skickas alltså med vanlig DTMF
ssignalering ? Har inte tänkt på det, men har funderat på hur det
fungerar. Hur kodas sådant som "Okänt nummer" o.s.v ?

> Hur ska den veta när det kommer 0-bitar? Då är ju den pinnen låg,
> precis som när det inte kommer nån data alls...

Vad menar du med "0-bitar" ? Det enda fall där alla D0-D3 är "0" är
om det kommer ett "D", vad nu det är. Men som sagt, DV synkroniserar
det hela, så det är inget problem.
maxxflow
Inlägg: 1150
Blev medlem: 17 mars 2004, 16:11:14

Inlägg av maxxflow »

> Vad menar du med "0-bitar" ?
Ah, tänkte helt fel, tänkte att det var seriellt.. Men man läser ju av alla samtidigt när DV blir hög ja såklart.

Caller-ID skickas med DTMF ja, före första ringsignalen. Det är bra, då hinner man blocka "spärrade" nummer innan det börjar ringa.. I vissa länder kommer CID efter första ringsignalen, det är ju inte lika bra..
Förutom 0-9*# så finns ju DTMF-tonerna ABCD.. En CID-sekvens tror jag ser ut såhär:
A<telefonnummer>D
A markerar alltså början på numret och D slutet. Jag tror att B och C står för "okänt nummer" och sånt, så att t.ex. ABD skulle betyda "okänt nummer", men det är jag inte helt säker på, var ett tag sedan jag läste om det där...

edit:
> Det enda fall där alla D0-D3 är "0" är om det kommer ett "D", vad nu det är.
Det är inte heller något problem, eftersom A-D normalt inte avkodas (eller jo, det gör de naturligtvis, men de skickas inte ut dådå..), om man inte aktiverar INH
A-D är ju inte intressanta för "mottagaren"...
Fast iofs... Undras hur det blir med "okänt nummer" då... Jaja, får väl testa..
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Det är bra, då hinner man blocka "spärrade" nummer innan det börjar ringa..

Hur lång tid har du på dig mellan caller-ID och första ringsignalen ??
Användarvisningsbild
SvenPon
Utsparkad, på semester
Inlägg: 724
Blev medlem: 26 augusti 2004, 10:53:39
Ort: Haninge

Underlag för DTMF koppling

Inlägg av SvenPon »

Du kan kolla mitt gamla projekt
http://www.pellesoft.se/communicate/use ... px?tid=797

Där finns säkert något matnyttigt för ditt projekt.
Millox
Inlägg: 559
Blev medlem: 10 december 2005, 22:10:43
Ort: Östhammar

Inlägg av Millox »

Hmm, det finns nån spec på cid ute på nätet, har för mig att det är såhär dock:

A<telefonnummer>C
B10C hemligt nummer
B01C okänt nummer (icke axe-station sannolikt mycket ovanlig)
D<telefonnummer>A<telefonnummer>C omstyrt nummer

Jag kan dock ha blandat ihop 10 och 01 samt D och A vid omstyrt nummer, men det är ju lätt att testa från en mobiltelefon exempelvis.
Användarvisningsbild
SvenPon
Utsparkad, på semester
Inlägg: 724
Blev medlem: 26 augusti 2004, 10:53:39
Ort: Haninge

Så här ser protokollet ut

Inlägg av SvenPon »

Programmet bygger på pollningsprincipen. Det som driver programmet är en TTimer. Timern är inställd att gå med intervallet 1 ms, vilket i praktiken ger 18,2 timerinterrupts per sekund (intervall 55 ms), eftersom PC:ns timer jobbar på just den frekvensen.

Varje gång timerinterruptet körs kontrolleras om pinne S från DTMF-avkodaren signalerar att det kommit en ny siffra. Om så är fallet tolkas denna m.h.a. de fyra databitarna Q1-Q4 och en tabell (DTMF[0..15]) över de sexton kombinationer som kan förekomma (0-9, *, #, A, B, C, D). Parallellportens status avläses med funktionen Port[$379].

Ett A betyder att ett telefonnummer följer.
Ett B betyder okänt/hemligt nummer. Det som följer efter B är en tvåsiffrig kod; 00-okänt, 10-hemligt.
Ett D betyder att ett omstyrt nummer följer.
Alla nummer/koder avslutas med C.

Ett vanligt anrop ser således ut så här: A043554570C
maxxflow
Inlägg: 1150
Blev medlem: 17 mars 2004, 16:11:14

Inlägg av maxxflow »

SvenPon, nu fattar jag inte vad du snackar om.. Programmet? TTimer? Pinne S? Berättar du hur ditt program från -97 funkar, eller vad menar du?
Btw, jag skriver hellre programmet i BF än i visual basic, usch för VB! Det är helt värdelöst, funkar dessutom inte det OS:et jag kör.
sebastiannielsen
Inlägg: 3663
Blev medlem: 11 september 2004, 09:30:42
Ort: gbg
Kontakt:

Inlägg av sebastiannielsen »

men varför inte leta upp ett fint basicspråk till linux som liknar VB.... Jag vet inte om det finns något men det borde finnas....
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

"Hello world" med BF:

++++++++[->+++++++++<]>.<+++++++[->++++<]>+.+++++++..
+++.>++++++++[->++++<]>.<<++++++++.--------.+++.-----
-.--------.>>+.---[---<+>]<.


Samma program fast i Basic:

print "Hello world"


Hm.. undrar vilket som är lättast? :D
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Och i C:
printf("Hello world\r\n");

Och läs sedan vad maxxflow skriver: "jag skriver hellre programmet i BF än i visual basic..."
Detta betyder inte att han verkligen ANVÄNDER BF, bara att VB suger hundpung i hans mening. (jag håller med om att BASIC suger...)
Skriv svar