Sida 1 av 2
DTMF-avkodare -> AVR -> PC
Postat: 9 augusti 2006, 12:08:13
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..
Postat: 9 augusti 2006, 12:53:45
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...

Postat: 9 augusti 2006, 12:56:59
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
Postat: 9 augusti 2006, 13:16:31
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
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)...

Postat: 9 augusti 2006, 13:24:36
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.
Postat: 9 augusti 2006, 13:41:57
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.
Postat: 9 augusti 2006, 13:55:57
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..
Postat: 9 augusti 2006, 14:20:17
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 ??
Underlag för DTMF koppling
Postat: 9 augusti 2006, 14:36:58
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.
Postat: 9 augusti 2006, 15:16:02
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.
Så här ser protokollet ut
Postat: 9 augusti 2006, 16:12:45
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
Postat: 9 augusti 2006, 16:45:22
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.
Postat: 9 augusti 2006, 17:56:56
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....
Postat: 9 augusti 2006, 18:50:05
av JimmyAndersson
"Hello world" med BF:
++++++++[->+++++++++<]>.<+++++++[->++++<]>+.+++++++..
+++.>++++++++[->++++<]>.<<++++++++.--------.+++.-----
-.--------.>>+.---[---<+>]<.
Samma program fast i Basic:
print "Hello world"
Hm.. undrar vilket som är lättast?

Postat: 9 augusti 2006, 18:56:20
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...)