Tonen generen met PIC16F628A

Ik wilde de frequentie wat precieser maken. Ik heb een Kristal van 20 Mhz gemonteerd aan de PIC16F628A (pin 15 en 16 met keurig 2 condensatoren van 22pF).

In het programma heb ik de interne oscillator uitgeschakeld en opgegeven dat ik een kristal van 20Mhz gebruik.

Het vreemde is dat er nu ipv een frequentie van 523 Hz (zie testprogrammaatje onder) een puls krijg van 3,677 Khz
(ongeveer 7 keer te hoog).

Ik heb lopen puzzelen maar kan niks ontdekken. Wat doe ik fout?

DEVICE 16F628A
CONFIG WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC

XTAL 20

ALL_DIGITAL TRUE
DECLARE PORTB_PULLUPS ON
DECLARE CCP1_PIN PORTB.3
SYMBOL AUDIO = PORTA.0

TRISA = %00000000
TRISB = %11110111

CLEAR
CMCON = 0x07

HPWM 1, 127, 523 ; channel 1 , duty 50, 523Hz[/quote]

[Bericht gewijzigd door Bavelt op 16 augustus 2019 23:34:56 (15%)]

Kijk eens in de manual op blz 239, daar zie je de minimum frequentie op 20Mhz en andere kristallen.

LDmicro user.

Welke manual bedoel je? Van de Proton compiler? Daar kan ik het niet vinden op pag 239.
De datasheet van de PIC16F628A gaat niet verder dan pag 180..

Ja in de manual van Proton.

Ik heb die lijst al eerder gepost in dit topic op 1 aug om 23:13:09
Scroll naar boven.

Daar staat dat je met een 20Mhz kristal niet lager kunt gaan dan 1221Hz.
Als je lager gaat is de uitkomst onvoorspelbaar.

[Bericht gewijzigd door MGP op 17 augustus 2019 08:54:33 (35%)]

LDmicro user.

Je hebt helemaal gelijk, ik heb het gevonden.
(Bij mij is dat pagina 233 in de Manual).

Ik heb het getest en inderdaad, tot 1221Hz (van hoog naar laag) werkt het, daaronder is het resultaat onvoorspelbaar).

Weer wat geleerd!

Het grappige is dat op dezelfde pagina van de manual, waar de minimum frequenties staan, een voorbeeld wordt gegeven van 1000Hz.
Dus ónder het minimum.

Xtal frequency Lowest useable Pwm frequency
4MHz 145Hz
8MHz 489Hz
10MHz 611Hz
12MHz 733Hz
16MHz 977Hz
20MHz 1221Hz
24MHz 1465Hz
33MHz 2015Hz
40MHz 2442Hz

Example
Device = 16F877
Declare Xtal = 20
Hpwm 1,127,1000 ' Send a 50% duty cycle Pwm signal at 1KHz

Ik ga nu gebruik maken van een 4Mhz kristal om een stabiele frequentie te krijgen.
Als je in de winkel hier een 4Mhz kristal koopt,dan krijg je een 4.19Mhz kristal.

In de cursus leerde ik dat je exact het kristal moet gebruiken dat je opgeeft.
Zou het verschil tussen 4.0 en 4.19 dan ook een onverwacht resultaat kunnen opleveren?

Een 16F628a heeft een interne oscillator (1%), je moet geen kristal kopen.
Natuurlijk is de clock verantwoordelijk voor alle afwijkingen in de timers.

1000Hz is een foutje in de manual, goed opgemerkt.

edit: raar dat Proton geen foutmelding geeft op 1000Hz, LDmicro doet dat wel.

LDmicro user.

Ik ben al een poosje aan het speuren naar een geschikte simpele Midi Editor.
Er is wel wat van te vinden en te downloaden, maar ze zijn al gauw te complex (voor mij althans).

Wat ik zoek is een simpel programmaatje waarmee je tonen uit de toonladder (bv A4, E4 of D4#) kan toevoegen aan een bestandje, waarbij de vastgelegde tonen worden afgespeeld. Het mooiste is natuurlijk een virtueel toetsenbord.
De meeste Midi Editors en virtuele piano's tonen de noten niet.
Voor een expert hoeft dat natuurlijk niet, maar voor een beginner is dat heel lastig.

Het doel is om een bekend liedje (of afkomstig van een midi file) om te zetten naar tonen (en dus frequenties). Die kan ik dan met de PIC16F628 programmeren en het liedje wordt dan afgespeeld.

Ik zou het tonen-programma zelf kunnen maken met VB.net, maar is heel tijdrovend. Ik vermoed dat er vast wel iets in deze geest al is.
Mocht iemand dat weten, dan heel graag!

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Deze had ik inderdaad geïnstalleerd, en ben er wat mee aan het stoeien geweest. Maar ik kon er niet mee uit de voeten.

Op het toetsenbord zie je bijvoorbeeld niet de toonletters. (je ziet wel de notenbalk maar dat zou muzieklessen betekenen..).
Daarbij lukte het me niet om tonen één voor één toe te voegen met elk zijn eigen duur.

Zodat ik het eindresultaat eenvoudig in mijn PIC programmaatje kan opnemen.

MidEditor kwam nog het meest in de buurt. Daarmee kan ik een bestaande Midi file inlezen en met wat stoeien de toonletters achterhalen.
Wellicht is er een programma die een .Mid inleest en het 'vertaalt' naar de letters. Ik heb het echter niet kunnen vinden.

Op het toetsenbord zie je bijvoorbeeld niet de toonletters.

Volgens mij wel:

[Bericht gewijzigd door Arco op 30 augustus 2019 23:46:24 (17%)]

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Je hebt gelijk, Arco.
Na wat speurwerk kwam ik er achter dat je in de keyboard instellingen met een vinkje de letters kan tonen.

Ondertussen had ik een vbasic.net programma gemaakt waarbij ik op maat iets dergelijks kon doen. Ook weer even een goede oefening...

Ik heb het deurbelletje met programmeerbare melodietjes een paar keer gebouwd en mensen er blij mee gemaakt.

Tenminste...bij een tweetal ervan gaat het belletje spontaan af, soms helaas op de verkeerde momenten (bv 's morgens heel vroeg).

Het programma is in principe heel simpel.
De pull-up resistors op port B staan on.
De song gaat pas werken als S1 = 0.

Snippet:

START:
IF S1 = 0 THEN
< speel melodie>
ENDIF
GOTO START

Op de een of andere manier gaat de melodie spelen, ondanks dat S1 niet op 0 wordt gezet door de drukknop.
Iemand een idee wat zou er meer kunnen spelen? Pieken op het lichtnet?
(Voeding is een deurbeltrafo, brugcel, afgevlakt met 2200 uF, 7905 er achter om de 5 volt te krijgen, weer afgevlakt, etc.
Ook een C van 100 nf direct tussen de voedingspennen van de PIC16F628A.
Heel vreemd...

Die 7905 zal wel een 7805 zijn denk ik.

Als je in zo'n stoorgevoelige omgeving zit plaats dan een extra pullup weerstand (1k) zodat je tenminste enkele mA trekt.
En de schakeling NIET parallel zetten met de bel, die 2 moeten volledig gescheiden zijn.

LDmicro user.

Zit er wel een fatsoenlijke pull-up/down aan die schakelaar input? )de interne pull-ups zijn veel te hoog voor dit doel...)
Iets van 4k7...10k nemen.

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Ik zat inderdaad ook te denken aan een extra pull_up weerstand. Ik wist niet of de interne toereikend zou zijn.
Dit ga ik uiteraard proberen.

Wat bedoel je met de schakeling niet parallel aan de bel? De oorspronkelijke bel is uitgeschakeld.
Enkel de trafo wordt gebruikt voor de voeding.

...

[Bericht gewijzigd door Arco op 31 augustus 2019 01:52:44 (96%)]

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Ik zie dat je port A gebruikt voor de switch. Die heeft helemaal geen interne pull-ups, dur er moet *altijd* een externe weerstand aan...
(port B heeft wel pull-ups, maar die is weer minder geschikt omdat het TTL poorten zijn. (port A is een S/T poort)

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Op 31 augustus 2019 00:31:46 schreef Bavelt:
Wat bedoel je met de schakeling niet parallel aan de bel? De oorspronkelijke bel is uitgeschakeld.
Enkel de trafo wordt gebruikt voor de voeding.

Dan is het OK, een bel maakt veel storingen en doet de spanning op de trafo redelijk veel zakken zodat je met moeite nog een bruikbare AC spanning over hebt.

Zoals Arco schrijft, PORTA heeft geen pullups dus een externe weerstand is noodzakelijk, ook bij PORTB moet je er één plaatsen als de knop zich niet op de print bevindt.

LDmicro user.

Je kunt ook nog een klein c-tje parallel met de ingang zetten, om hoogfrequent storing kort te sluiten (en lading op te nemen bij ESD). Met een klein serieweerstandje:

code:


              +
               |
              [ ] RPU
               |
i/o pin -------+------[SERIE]-----oTo---|
               |
              = C
               |
             gnd

hmm, ik hoop dat dat een leesbaar ascii schema oplevert, ik edit het met een niet-fixed-width lettertype... EDIT@Arco: ja, na het posten wel, maar voor het posten bakt mijn browser er wat anders van

RPU iets van 4k7 - 15k oid.
C iets van 1n--100n
SERIE iets van 100R - 1k oid.
oTo is je schakelaar die naar GND schakelt. Naar + schakelen kan ook, dan RPU en C ook omdraaien. (Wordt het een pulldown en een Ctje naar voeding)

Je hebt dan kans dat ' ie bij aanzetten gelijk reageert, omdat de C nog niet vol is. Een kleine delay bij opstarten kan dat voorkomen (Of als je programma alvast wat " nuttige dingen" doet voor het de schakelaar checkt).

Eluke.nl // Backwards Lightspeed Bus: i*i=-1, so iic=-c.

Ik had de schakelaar inmiddels al op een Poort B gezet, er van uitgaande dat ik dan geen externe pullUp nodig had (uit de Picbasic cursus).
Ik maak er een exerne pull up van. Dan hoef ik dus ook niet Pullups ON op te geven neem ik aan. Of is het zelfs onwenselijk om dit op te geven als je zelf een externe weerstand plaatst?

Maakt niet uit. Zoals gezegd is PortA (ST) beter geschikt voor switch input als PortB (TTL). TTL is veel gevoeliger voor stoorpulsen.

hmm, ik hoop dat dat een leesbaar ascii schema oplevert, ik edit het met een niet-fixed-width lettertype...

Lettertype is altijd fixed-width in een [Code] block...

[Bericht gewijzigd door Arco op 31 augustus 2019 12:15:25 (43%)]

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Wat is eigenlijk de toepassing voor een internal pullup weerstand? Voor TTL is het dus blijkbaar niet geschikt.

Ik had ook liever wat zwaardere interne pull-ups gezien...
Maar voor bijv. jumpers of dipswitches zijn ze prima te gebruiken.

Bij nieuwere pics als de 16F1709 heb je ook veel meer mogelijkheden:
Iedere input kan ST of TTL zijn, slew rate instelbaar, push-pull of OD output (sommigen hebben ook nog interne pull-downs)

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com