Omcoderen van 4 naar 3 bits

Bavelt

Golden Member

Op 24 juni 2019 20:48:50 schreef ohm pi:
Is T1 523Hz volgens '1', '2' en vele andere cijfers of 493Hz volgens cijfer '4' en hoe zit het met de overige frequenties?
Volgens mij kan je beter de data selector (74ls251) er tussen uit gooien en rechtstreeks van de 5-bits code naar 6 verschillende uitgangen gaan, dus iedere toon zijn eigen uitgang

Ik snap je vraag. Komt omdat er nóg een foutje zat in de tabel (grr).
Iedere T heeft zijn eigen frequentie

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Klopt. Ik heb ook al gedacht om die 74LS251 er uit te laten. Maar je moet dan inderdaad de 6 toongeneratoren per stuk 'enabelen' en vervolgens samenvoegen naar 1 uitgang die naar de audio gaat. Er mag immers maar 1 toon tegelijk worden weergegeven.
Dat kost dan weer 6 2-input AND gates en uiteindelijk een 6-input OR Gate.

De hele constructie zou volgens mij ook met een (20-bits) schuifregister kunnen.
Het blijft puzzelen,

[Bericht gewijzigd door Bavelt op maandag 24 juni 2019 22:16:15 (32%)

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Met 1 eprom gaat dat simpel en is ook simpel aan te passen (ander of langer melodietje). Voorbeeld:

Je sluit de teller aan op A0...A4, en de 6 oscillatoruitgangen op A5...A10. De toon komt er dan uit op DO van de eprom...
Geen extra poorten, multiplexers, of schuifregisters nodig...

Past zelfs in een 2716... ;)

(volgens mij klopt waarde 21 in je tabel nog niet...)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Je toongenerator maak je niet met een 74LS14, maar met twee 74LS24 (quad schmittrigger NAND). Een ingang gebruik je voor het RC-netwerk en de andere ingang gebruik je om de toongenerator aan of uit te zetten. De 6 uitgangen van de 6 generatoren knoop je via 6 weerstanden van bijv 10kΩ aan elkaar. Dat knooppunt belast je met bijv 1kΩ en het signaal op dat punt voer je je audioversterker in.

NB:
7424 schijn toch problemen te geven of niet te bestaan. Je kunt op die plaats ook een CD4093 (CMOS-IC) zetten.

[Bericht gewijzigd door ohm pi op maandag 24 juni 2019 23:02:41 (13%)

Op 24 juni 2019 22:30:29 schreef Arco:
Voorbeeld:

Je sluit de teller aan op A0...A4, en de 6 oscillatoruitgangen op A5...A10. De toon komt er dan uit op DO van de eprom...
Geen extra poorten, multiplexers, of schuifregisters nodig...

Ik kan me niet voorstellen hoe dat werkt. Bijvoorbeeld als de teller (A0...A4) op '11' staat. hoe weet de Prom dat hij het signaal van T4 (A8?) op D0 moet zetten?

Arco

Special Member

Als bijv. adres 0x01 op de lage 5 bits staat, 'weet' de eprom dat toon 1 moet worden weergegeven.

A5 is de input van toongenerator 1
Als A5 laag is, wordt inhoud van geheugenplaats 0x0001 op D0 gezet, als A5 hoog is, de inhoud van geheugenplaats 0x0021. ('0' resp '1')
Epromfile maken is een fluitje van een cent (wel niet getest uiteraard)

Basic code om de file te genereren:

code:


#Compile Exe
#Dim All
%EPROM_2716 = 2048 : %EPROM_2732 = 4096 : %EPROM_2764 = 8192 : %EPROM_27128 = 16384 
%EPROM_27256 = 32768 : %EPROM_27512 = 65536 

Function PBMain () As Long
  Dim Cnt As Long, Tone As Byte, Dat As Byte, hFile As Long
  hFile = FreeFile
  Open "Eprom5_6t.bin" For Binary As #hFile
  For Cnt = 0 To %EPROM_27512 -1
    Tone = Choose((Cnt+1 And &H001F), 0,1,1,2,1,2,3,3,3,3,0,4,4,5,4,6,1,1,1,1,1 Else 0)
    If Cnt > &H001F Then 
      If ((Bit(Cnt,5)) And (Tone = 1)) Or _
         ((Bit(Cnt,6)) And (Tone = 2)) Or _ 
         ((Bit(Cnt,7)) And (Tone = 3)) Or _ 
         ((Bit(Cnt,8)) And (Tone = 4)) Or _ 
         ((Bit(Cnt,9)) And (Tone = 5)) Or _ 
         ((Bit(Cnt,10)) And (Tone = 6)) Then 
        Dat = 1 
      Else 
        Dat = 0
      End If  
    Else
      Dat = 0
    End If  
    Put #hFile,, dat
  Next
  Close #hFile
End Function
'==================================================================================================
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Frederick E. Terman

Honourable Member

Persoonlijk zou ik gewoon twee stuks 4515 (1-of-16 decoder) nemen. Bit E gebruik je om de ene of de andere chip te selecteren; bits A...D zet je op de ingangen van beide IC's.
Je krijgt dan een '0' die netjes van begin tot einde loopt, in 32 stappen. De laatste tien gebruik je gewoon niet (misschien later, met een ander melodietje, wel).

Met diodes verbind je een toon met elke uitgang waarop die toon moet klinken (rekening houdend met de 'negatieve' logica: laag = klinken).
Dit doe je voor alle tonen.

Je kunt zo gemakkelijk nog eens wijzigingen in het melodietje maken, en je kunt zoveel verschillende tonen gebruiken als je wilt.

Keramisch, kalibratie, parasitair: woordenlijst.org
Bavelt

Golden Member

Op 24 juni 2019 23:16:08 schreef Arco:
Als bijv. adres 0x01 op de lage 5 bits staat, 'weet' de eprom dat toon 1 moet worden weergegeven.

A5 is de input van toongenerator 1
Als A5 laag is, wordt inhoud van geheugenplaats 0x0001 op D0 gezet, als A5 hoog is, de inhoud van geheugenplaats 0x0021. ('0' resp '1')
Epromfile maken is een fluitje van een cent (wel niet getest uiteraard)

Basic code om de file te genereren:

code:


#Compile Exe
#Dim All
%EPROM_2716 = 2048 : %EPROM_2732 = 4096 : %EPROM_2764 = 8192 : %EPROM_27128 = 16384 
%EPROM_27256 = 32768 : %EPROM_27512 = 65536 

Function PBMain () As Long
  Dim Cnt As Long, Tone As Byte, Dat As Byte, hFile As Long
  hFile = FreeFile
  Open "Eprom5_6t.bin" For Binary As #hFile
  For Cnt = 0 To %EPROM_27512 -1
    Tone = Choose((Cnt+1 And &H001F), 0,1,1,2,1,2,3,3,3,3,0,4,4,5,4,6,1,1,1,1,1 Else 0)
    If Cnt > &H001F Then 
      If ((Bit(Cnt,5)) And (Tone = 1)) Or _
         ((Bit(Cnt,6)) And (Tone = 2)) Or _ 
         ((Bit(Cnt,7)) And (Tone = 3)) Or _ 
         ((Bit(Cnt,8)) And (Tone = 4)) Or _ 
         ((Bit(Cnt,9)) And (Tone = 5)) Or _ 
         ((Bit(Cnt,10)) And (Tone = 6)) Then 
        Dat = 1 
      Else 
        Dat = 0
      End If  
    Else
      Dat = 0
    End If  
    Put #hFile,, dat
  Next
  Close #hFile
End Function
'==================================================================================================

Grappig...Vbasic. Ik ben wel redelijk bedreven in Visual Basic .NET (2010), maar heb nog nooit met een Eprom gewerkt. Ben benieuwd of dat veel voeten in de aarde heeft, of dat nog een beetje te doen is.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Op 24 juni 2019 22:49:53 schreef ohm pi:
Je toongenerator maak je niet met een 74LS14, maar met twee 74LS24 (quad schmittrigger NAND). Een ingang gebruik je voor het RC-netwerk en de andere ingang gebruik je om de toongenerator aan of uit te zetten. De 6 uitgangen van de 6 generatoren knoop je via 6 weerstanden van bijv 10kΩ aan elkaar. Dat knooppunt belast je met bijv 1kΩ en het signaal op dat punt voer je je audioversterker in.

NB:
7424 schijn toch problemen te geven of niet te bestaan. Je kunt op die plaats ook een CD4093 (CMOS-IC) zetten.

Ik dacht dat je alleen uitgangen met een open collector aan elkaar mocht knopen.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Op 24 juni 2019 23:16:42 schreef Frederick E. Terman:
Persoonlijk zou ik gewoon twee stuks 4515 (1-of-16 decoder) nemen. Bit E gebruik je om de ene of de andere chip te selecteren; bits A...D zet je op de ingangen van beide IC's.
Je krijgt dan een '0' die netjes van begin tot einde loopt, in 32 stappen. De laatste tien gebruik je gewoon niet (misschien later, met een ander melodietje, wel).

Met diodes verbind je een toon met elke uitgang waarop die toon moet klinken (rekening houdend met de 'negatieve' logica: laag = klinken).
Dit doe je voor alle tonen.

Je kunt zo gemakkelijk nog eens wijzigingen in het melodietje maken, en je kunt zoveel verschillende tonen gebruiken als je wilt.

Iets dergelijks had ik gemaakt met een proefopstelling, maar dan met gebruik van een 74HCT393, daar zit 2 keer een 4-bits teller in. De uitgangen gaan dan naar twee 74LS145 (zijn heel goedkoop te verkrijgen).
Dan heb je 20 verschillende keren een "laag". Bij tellerstand 21 reset je de boel.
Alleen moet ik dan de 6 generatoren daar aan koppelen.
Hoe je dat wilt doen met de diodes heb ik nog even niet door. Gebruik je die soms als een veredelde OR?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Grappig...Vbasic.

Nee, Powerbasic. Maar met VB is zoiets natuurlijk ook te doen...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 25 juni 2019 01:11:04 schreef Bavelt:
[...]
Ik dacht dat je alleen uitgangen met een open collector aan elkaar mocht knopen.

Hier zit er per uitgang een 10 kΩ weerstand tussen, hè? Da's wat anders dan uitgangen rechtstreeks aan elkaar knopen.

Overigens zijn er ook wel situaties waarin dat laatste zonder probleem kan. Bijv. als je een aantal poorten hebt waarvan alle ingangen ook aan elkaar hangen, en signaal op die ingangen voldoende steile flanken heeft dat alle ingangen zeg >99% v/d tijd hetzelfde logische niveau zien. Dan hebben uitgangen ook altijd hetzelfde logische niveau, en is er geen sprake van een conflict onderling.

Bijv. met Schmitt-trigger ingangen en een 'langzaam' veranderend ingangssignaal moet je dat niet doen. Maar zo'n signaal in een (1) Schmitt-trigger stoppen, en uitgang daarvan aan een aantal ingangen hangen (waarvan je uitgangen dáárvan aan elkaar knoopt), dat kan dan weer wel.

Open collector uitgangen aan elkaar + een passieve pull-up is een andere mogelijkheid.

Kortom: geen uitgangen aan elkaar knopen, is een (goede!) vuistregel. Geen 'harde' regel. Nou ja dat is, voor ontwerpers die weten wat ze doen... :)

Op 25 juni 2019 01:18:55 schreef Bavelt:
Hoe je dat wilt doen met de diodes heb ik nog even niet door. Gebruik je die soms als een veredelde OR?

Door een 5->22 decoder te maken, krijg je een "one hot" codering. De "tel tot 22" kan je ook direct "one-hot" maken, dat zou in een FPGA mogelijk handiger zijn dan de compacte codering in 5 bits.

Vervolgens moet je je realiseren dat "toon 3" moet activeren als de teller op 6,7,8 of 9 staat. Je maakt dan met vier diodes een signaal teller is 6,7,8 of 9, door de diodes tussen de vier teller-signalen en het toon-3-signaal.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Bavelt

Golden Member

Op 25 juni 2019 06:21:02 schreef rew:
[...]
Door een 5->22 decoder te maken, krijg je een "one hot" codering. De "tel tot 22" kan je ook direct "one-hot" maken, dat zou in een FPGA mogelijk handiger zijn dan de compacte codering in 5 bits.

Vervolgens moet je je realiseren dat "toon 3" moet activeren als de teller op 6,7,8 of 9 staat. Je maakt dan met vier diodes een signaal teller is 6,7,8 of 9, door de diodes tussen de vier teller-signalen en het toon-3-signaal.

Met 4 diodes een signaal teller maken?
Ik vat het nog niet helemaal hoe je je dit voorstelt.

Fouten zijn het bewijs dat je het probeert..
Frederick E. Terman

Honourable Member

Zo (willekeurig voorbeeld).
De uitgang is hoog, tenzij ingang 2, 11 of 12 laag wordt.
Inderdaad een diode-OR-functie (met actief=0).
De 'nul' uit de decoder wandelt langs alle uitgangen, en iedere toon is met diodes verbonden met de uitgangen waarop die toon moet klinken.

code:


         +---- 5V
         |
         R
         |
         +---->
 2 --|<--+
11 --|<--+
12 --|<--+
Keramisch, kalibratie, parasitair: woordenlijst.org
Arco

Special Member

Voorbeeld hoe simpel alles is met een eprom... ;)

Met alleen een counter + eprom kun je verrassend complexe schakelprogramma's maken.

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Frederick E. Terman

Honourable Member

Oho, jij stopt gewoon de complete tonen erin als deel van de adressering. Da's wel heel gemeen. :)
Ik zou nog netjes de uitgangen hebben gebruikt om de oscillatoren te schakelen, maar misschien is dat inderdaad niet eens nodig.

Keramisch, kalibratie, parasitair: woordenlijst.org
Arco

Special Member

Da's wel heel gemeen. :)

En heel effectief... :)
(als je toch een eprom gebruikt, moet je 'm ook zo veel mogelijk laten doen...)

[Bericht gewijzigd door Arco op dinsdag 25 juni 2019 16:44:49 (39%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Nog effectiever als je toch moet programmeren,
Hier een voorbeeld van Pibasic Frits Kieftenbelt voor een DTMF generator

DEVICE 16F628A ;Gebruik een 16F628A type
CONFIG HS_OSC, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE ;Alle ingangen digitaal
XTAL 20 ;Kristal van 20MHz

;Logische constanten
SYMBOL AAN = 0 ;Omgekeerd ON
SYMBOL LAAG = 0 ;Laag signaal
SYMBOL HOOG = 1 ;Hoog signaal
SYMBOL OFF = 0 ;UIT
SYMBOL ON = 1 ;AAN
SYMBOL UIT = 1 ;Omgekeerd OFF

;Muzieknoten met bijbehorende frequenties in Hertz
SYMBOL C = 2092 ;C noot
SYMBOL D = 2348 ;D noot
SYMBOL E = 2636 ;E noot
SYMBOL G = 3136 ;G noot
SYMBOL R = 0 ;Rust (stilte, pauze)

;Poortnamen
'YMBOL - = PORTA.0 ;Vrij bruikbaar als in/uitgang
'YMBOL - = PORTA.1 ;Vrij bruikbaar als in/uitgang
'YMBOL - = PORTA.2 ;Vrij bruikbaar als in/uitgang
'YMBOL - = PORTA.3 ;Vrij bruikbaar als in/uitgang
SYMBOL CM8870_StD = PORTA.4 ;
SYMBOL CM8870_Q1 = PORTA.5 ;
'YMBOL - = PORTA.6 ;Vrij bruikbaar als in/uitgang (of 20MHz kristal)
'YMBOL - = PORTA.7 ;Vrij bruikbaar als in/uitgang (of 20MHz kristal)
SYMBOL CM8870_Q4 = PORTB.0 ;
SYMBOL LED = PORTB.1 ;Vrij bruikbaar als in/uitgang (USART) tevens LED3
'YMBOL - = PORTB.2 ;Vrij bruikbaar als in/uitgang (USART)
SYMBOL Geluid = PORTB.3 ;Tonen zijn ook te versturen door de CCP/PWM module (HPWM)
SYMBOL Relais = PORTB.4 ;LAAG = relais actief = "telefoon opnemen"
SYMBOL BelSignaal = PORTB.5 ;LAAG als de telefoonbel gaat (er wordt gebeld)
SYMBOL CM8870_Q2 = PORTB.6 ;
SYMBOL CM8870_Q3 = PORTB.7 ;

;Variabelen declareren
;WORD
DIM Freq1 AS WORD ;Frequentie 1
DIM Freq2 AS WORD ;Frequentie 2
DIM WD1 AS WORD ;Word Dummy 1
;BYTE
DIM NootNr AS BYTE ;Teller die bijhoudt welke muzieknoot wordt afgespeeld
DIM TelefoonToets AS BYTE ;Toetsnummer (DTMF) die de opbeller op zijn telefoon indrukt
DIM Teller AS BYTE ;FOR...NEXT telvariabele
DIM Timer AS BYTE
DIM BD1 AS BYTE ;Byte Dummy 1
;BIT
DIM ID1 AS BIT ;bIt Dummy 1

; 76543210
PORTA = %00000000 ;PORTA poorten laag
PORTB = %00100000 ;PORTB poorten laag, (behalve B.5; HOOG = reedrelais uit)
TRISA = %11111111 ;
TRISB = %11100101 ;B.4 uitgang reedrelais, B.3 uitgang geluid, B.1 uitgang LED

Relais = AAN ;Maak verbinding met de telefoonlijn

GOTO Start ;Spring over de subroutine

;Subroutine
DTMF: ;Kijk welke telefoontoets de opbeller indrukt
TelefoonToets = CM8870_Q1 + (2 * CM8870_Q2) + (4 * CM8870_Q3) + (8 * CM8870_Q4)
WHILE CM8870_StD = HOOG : WEND ;Wacht tot de opbeller de telefoontoets los laat
DELAYMS 1 ;Wacht nog even tot CM8870_StD goed LAAG is
RETURN

;Hoofdprogramma
Start:
WHILE CM8870_StD = LAAG : WEND ;Wacht tot de opbeller op een toets drukt
GOSUB DTMF ;Ga kijken welke toets de opbeller heeft ingedrukt

SELECT TelefoonToets ;Afhankelijk van ingedrukte toets (eventueel) actie ondernemen
CASE 10 ;Bij telefoontoets '0' indrukken... LET OP: 10 staat voor '0'
LED = OFF ;...de rode LED uitzetten

CASE 1 ;Bij telefoontoets '1' indrukken...
LED = ON ;...de rode LED aanzetten

CASE 5 ;Als telefoontoets '5' wordt ingedrukt dan muziek afspelen
FOR NootNr = 0 TO 28 ;Speel de 29 noten na elkaar af (29 = 0 t/m 28)
Freq1 = LOOKUPL NootNr, [E,D,C,D,E,E,E,R,D,D,D,R,E,G,G,R,E,D,C,D,E,E,E,E,D,D,E,D,C]
IF Freq1 > 8 THEN Freq2 = Freq1 - 8 ;Dit geeft een speciaal geluidseffect
FREQOUT Geluid, 225, Freq1, Freq2 ;Speel de noten af op de telefoon
NEXT

CASE 9 ;Bij telefoontoets '9' indrukken...
Relais = UIT ;... de verbinding verbreken

ENDSELECT
GOTO Start

Guus@Sint-Michielsgestel
Bavelt

Golden Member

Op 25 juni 2019 14:31:29 schreef Frederick E. Terman:
Zo (willekeurig voorbeeld).
De uitgang is hoog, tenzij ingang 2, 11 of 12 laag wordt.
Inderdaad een diode-OR-functie (met actief=0).
De 'nul' uit de decoder wandelt langs alle uitgangen, en iedere toon is met diodes verbonden met de uitgangen waarop die toon moet klinken.

code:


         +---- 5V
         |
         R
         |
         +---->
 2 --|<--+
11 --|<--+
12 --|<--+

Ik snap nu wat je bedoelt; thx!
Je bouwt idd een 4-input OR gate met 4 diodes en een weerstand.
Maar dan nog moeten de tonen per stuk worden aan- of uitgezet. Dat zal dan in mijn ogen met een AND moeten gebeuren. Dat werkt met actief=1. 6 x inverteren dus.
De oscillatoren moeten dan worden gemaakt met een 2-input ST. (zou ook kunnen met twee keer een 74HCT132, zitten er per IC vier in.
Het voordeel van de data selector leek mij dat die meteen de toon weergeeft die op de audio kan worden aangesloten.
Je hoeft dan niks te 'mergen' en ook niet te inverteren.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Op 25 juni 2019 16:51:21 schreef Waters:
Nog effectiever als je toch moet programmeren,
Hier een voorbeeld van Pibasic Frits Kieftenbelt voor een DTMF generator

DEVICE 16F628A ;Gebruik een 16F628A type

Dit type IC zit ook in een goedkope frequentieteller van Alie zag ik..

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Op 25 juni 2019 15:07:35 schreef Arco:
Voorbeeld hoe simpel alles is met een eprom... ;)

[bijlage]

Met alleen een counter + eprom kun je verrassend complexe schakelprogramma's maken.

Dan moet ik toch maar snel beginnen met EProm's microprocessors, etc.

Waar zou ik het beste mee kunnen beginnen? (Ik heb de Arduino besteld).
Eprom's? Microcontroller?

Fouten zijn het bewijs dat je het probeert..

Dat gedoe met de (e)proms is een beetje omdat het originele probleem zo geformuleerd was dat het prima met een eprom kan. De laatste truuk-met-eeprom was een "en zo kan je NOG meer van je schakeling in de eeprom duwen". Geinig, maar niet geheel serieus.

Die oplossing zou ik alleen aanraden als je toch een berg van die dingen hebt liggen of zoiets.

EErpms waren vooral nuttig in de tijd dat je microcontroller nog niet zelf flash aan boord had. Dat is nu ongeveer 30 jaar geleden. Dus eeproms zijn dingen die nog steeds wel mondjesmaat gebruikt worden, maar toch ook steeds verder in de vergetelheid raken....

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Arco

Special Member

't Was omdat TS iets met TTL (en aanverwante) logica wilde maken (tenslotte ook al 50 jaar oud) en ook al grotendeels klaar had... ;)
Je hoeft ook verder geen programma's te schrijven: file in de eprom schieten en klaar...

Eeproms zie je trouwens nog heel veel. (wel meestal serieel tegenwoordig)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

@arco, waar maak jij een dergelijk schema mee? Speciaal tekenpaket?

Fouten zijn het bewijs dat je het probeert..