Tonen generen met PIC16F628A

Bavelt

Golden Member

Ik ben begonnen met het programmeren van uc's. Daarvoor koos ik een PIC16F628A. Blijkbaar een populair type.

Ledje's e.d. aansturen lukt al wel, de programmer (PICKit3) werkt, etc.

Wie helpt me op weg om via PICBasic een toonvolgorde af te spelen:

C5-C5-B4-C5-B4-A4-A4-A4-A4-0-E5-E5-F5-E5-D5-C5-C5-C5-C5-C5.
Waarbij C5=523 Hz, B4=493, A4=440, E5=659, F5=698, D5=587. 0 = pauze (geen toon).
De duur van elke puls is 250ms

Dank alvast!

Fouten zijn het bewijs dat je het probeert..
Sjoerd Kreyns

Golden Member

Heb je deze site gezien?
http://www.picbasic.nl/

Er is het commando SOUND, al wordt dat niet behandeld in de cursus.

In Beginners mini-cursus (deel 7) wordt geluid gemaakt met PWM.

[Bericht gewijzigd door Sjoerd Kreyns op vrijdag 26 juli 2019 16:01:09 (22%)

SMD weerstandjes zoeken in grijze vloerbedekking is ook een uitdaging ... 8*1=255 ... Het nadeel van ruimte: Als je het hebt, staat het binnen de kortste keren weer vol.
Arco

Special Member

Hangt er ook van af of het sinus moet zijn, of ook blokgolf mag wezen...

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

Ik had deze link nog ergens staan.
Je kunt onmiddellijk beginnen, hexfile en schema staan erbij.

LDmicro user.
Lambiek

Special Member

Het kan op verschillende manieren. Bijv. met "Freqout".

code:


Freqout Pin, Period, Freq1 {, Freq2}
Overview
Generate one or two sine-wave tones, of differing or the same frequencies, for a specified period.
Operators
Pin is a Port-Bit combination that specifies which I/O pin to use.
Period may be a variable, constant, or expression (0 - 65535) specifying the amount of time to
generate the tone(s).
Freq1 may be a variable, constant, or expression (0 - 32767) specifying frequency of the first
tone.
Freq2 may be a variable, constant, or expression (0 - 32767) specifying frequency of the second
tone. When specified, two frequencies will be mixed together on the same I/O pin.
Example
' Generate a 2500Hz (2.5KHz) tone for 1 second (1000 ms) on bit 0 of PORTA.
Freqout PORTA.0, 1000, 2500
' Play two tones at once for 1000ms. One at 2.5KHz, the other at 3KHz.
Freqout PORTA.0, 1000, 2500, 30000
Notes
Freqout generates one or two sine waves using a pulse-width modulation algorithm. Freqout
will work with a 4MHz crystal, however, it is best used with higher frequency crystals, and operates
accurately with a 20MHz crystal. The raw output from Freqout requires filtering, to eliminate
most of the switching noise. The circuits shown below will filter the signal in order to play
the tones through a speaker or audio amplifier.

Of met bijv. "Sound".

code:


Syntax
Sound Pin, [ Note,Duration {,Note,Duration...} ]
Overview
Generates tone and/or white noise on the specified Pin. Pin is automatically made an output.
Operators
Pin is a Port.Pin constant that specifies the output pin on the device.
Note can be an 8-bit variable or constant. 0 is silence. Notes 1-127 are tones. Notes 128-255
are white noise. Tones and white noises are in ascending order (i.e. 1 and 128 are the lowest
frequencies, 127 and 255 are the highest). Note 1 is approx 78.74Hz and Note 127 is approx
10,000Hz.
Duration can be an 8-bit variable or constant that determines how long the Note is played in
approx 10ms increments.
Example
' Star Trek The Next Generation...Theme and ship take-off
Device = 16F877
Declare Xtal = 4
Dim Loop as Byte
Symbol Pin = PORTB.0
Theme:
Sound Pin,_
[50,60,70,20,85,120,83,40,70,20,50,20,70,20,90,120,90,20,98,160]
DelayMs 500
For Loop = 128 to 255 ' Ascending white noises
Sound Pin, [Loop,2] ' For warp drive sound
Next
Sound Pin, [43,80,63,20,77,20,71,80,51,20,_
90,20,85,140,77,20,80,20,85,20,_
90,20,80,20,85,60,90,60,92,60,87,_
60,96,70,0,10,96,10,0,10,96,10,0,_
10,96,30,0,10,92,30,0,10,87,30,0,_
10,96,40,0,20,63,10,0,10,63,10,0,_
10,63,10,0,10,63,20]
DelayMs 10000
Goto Theme

Of met bijv. "Sound2".

code:


Syntax
Sound2 Pin2, Pin2, [ Note1\Note2\Duration {,Note1,Note2\Duration...} ]
Overview
Generate specific notes on each of the two defined pins. With the Sound2 command more
complex notes can be played by the microcontroller.
Operators
Pin1 and Pin2 are Port.Pin constants that specify the output pins on the PICmicro™.
Note is a variable or constant specifying frequency in Hertz (Hz, 0 to 16000) of the tones.
Duration can be a variable or constant that determines how long the Notes are played. In
approx 1ms increments (0 to 65535).
Example 1
' Generate a 2500Hz tone and a 3500Hz tone for 1 second.
' The 2500Hz note is played from the first pin specified (PORTB.0),
' and the 3500Hz note is played from the second pin specified (PORTB.1).
Device = 16F877
Declare Xtal = 20
Symbol Pin1 = PORTB.0
Symbol Pin2 = PORTB.1
Sound2 Pin1, Pin2, [2500\3500\1000]
Stop
Example 2
' Play two sets of notes 2500Hz and 3500Hz for 1 second
' and the second two notes, 2500Hz and 3500Hz for 2 seconds.
Device = 16F877
Declare Xtal = 20
Symbol Pin1 = PORTB.0
Symbol Pin2 = PORTB.1
Sound2 Pin1, Pin2, [2500\3500 1000, 2500\3500\2000]
Stop

Het is maar net wat je wil. En dan kun je het ook nog via pwm doen als je wil. Met Freqout en een klein filter krijg je een sinus vormig signaal.

Als je haar maar goed zit, GROETEN LAMBIEK.
Bavelt

Golden Member

Op 26 juli 2019 15:59:08 schreef Sjoerd Kreyns:
Heb je deze site gezien?
http://www.picbasic.nl/

In Beginners mini-cursus (deel 7) wordt geluid gemaakt met PWM.

Deze had ik al geprobeerd, maar er komt geen geluid (behoudens wat heel zacht gepruttel uit de speaker).
Zelfs na het programma te hebben vereenvoudigd naar een minimale instructie (1 toon):

WHILE 1 = 1
HPWM 1, 127, 440
WEND

Komt er geen geluid op (PortB.3, pin 9).

Op 26 juli 2019 16:20:44 schreef MGP:
Ik had deze link nog ergens staan.
Je kunt onmiddellijk beginnen, hexfile en schema staan erbij.

Dit is inderdaad een heel grappige en hij werkt meteen!
De source is echter niet bruikbaar in Proton Pic Basic.
De compiler kent dit formaat .pbp niet. Een andere variant van Basis neem ik aan.

Is dat nog een beetje 'om' te zetten?

Op 26 juli 2019 17:34:06 schreef Lambiek:

Het is maar net wat je wil. En dan kun je het ook nog via pwm doen als je wil. Met Freqout en een klein filter krijg je een sinus vormig signaal.

PWM krijg ik niet aan de praat om een of andere reden.
Geeft geen geluid op de output.

WHILE 1 = 1
HPWM 1, 127, 440
WEND

[Bericht gewijzigd door Henry S. op zaterdag 27 juli 2019 15:02:04 (45%)

Fouten zijn het bewijs dat je het probeert..
Lambiek

Special Member

Hier heb je een voorbeeld. Met S1 kun je de melodieën starten.
Als je het via een speaker wil doen moet er een condensator tussen de uitgang en de speaker en als je een piezo gebruikt kan die direct aan de uitgang.

pic basic code:


Symbol  R	=	0
Symbol	C	=	82
Symbol  Db0	=	85
Symbol	D	=	87
Symbol  Eb	=	89
Symbol  E	=	92
Symbol  F	=	94
Symbol  Gb	=	95
Symbol  G	=	97
Symbol	Ab1	=	99
Symbol  A1	=	73
Symbol  Bb1	=	76
Symbol  BE1	=	79
Symbol	C1	=	82
Symbol  Db1	=	85
Symbol	D1	=	87
Symbol  Eb1	=	89
Symbol  E1	=	92
Symbol  F1	=	94
Symbol  Gb1	=	95
Symbol  G1	=	97
Symbol	Ab2	=	99
Symbol	A2	=	101
Symbol	Bb2	=	102
Symbol	BE2	=	104
Symbol	C2	=	105
Symbol	Db2	=	106
Symbol	D2	=	108
Symbol	E2	=	110
Symbol	F2	=	111
Symbol	Gb2	=	112
Symbol	G2	=	113
Symbol	Bb3	=	115
Symbol	Bm3	=	116
Symbol	C3	=	117
Symbol	D3	=	118

Symbol PIN = PORTB.0

Symbol S1 = PORTA.0

Clear                                       ; Wis geheugen

         ;543210                            ; Hulpregel poort A
PORTA  = %000000                            ; Maak poort A laag
TRISA  = %111111                            ; Poort_A I/O

         ;543210                            ; Hulpregel poort B
PORTB  = %000000                            ; Maak poort B laag
TRISB  = %000000                            ; Poort_B I/O

;------------------------------
; SONG1 IS STARWARS
; SONG2 IS DEATH MARCH
; SONG3 IS SHAVE AND A HAIRCUT
; SONG4 IS CHARGE
; SONG5 IS HEART AND SOUL
;------------------------------

START:	

    If S1 = 1 Then GoTo SONG1
    GoTo START
        
SONG1:	

    Sound PIN,[G,80,D2,80,C2,20,BE2,20,A2,20,G2,80,D2,80,C2,20,BE2,20,A2,20,G2,80,D2,80,C2,20,BE2,20,C2,20,A2,80]
    DelayMS 1000
    GoTo SONG2
				
SONG2:	

    Sound PIN,[F,80,R,2,F,70,R,2,F,10,R,2,F,80,Ab1,60,R,2,G,10,R,2,G,60,R,5,F,10,R,2,F,50,R,2,E,20,R,1,F,40]
    DelayMS 1000
    GoTo SONG3
		
SONG3:	

    Sound PIN,[F2,40,R,2,C2,20,R,2,C2,20,R,5,D2,50,R,3,C2,30,R,40,E2,40,F2,50]
    DelayMS 1000
    GoTo SONG4
				
SONG4:	

    Sound PIN,[Db2,20,Gb2,20,Bb3,15,C3,30,R,5,Bb3,20,C3,75]
    DelayMS 1000
    GoTo SONG5
			
SONG5:	

    Sound PIN,[C2,30,R,10,C2,30,R,10,C2,80,R,3,C2,20,BE2,30,A2,20,BE2,30,C2,20,D2,30,R,5,C2,10,E2,30,R,15,E2,30,R,15,E2,80]
    DelayMS 1000
    GoTo START
		
End

Als je haar maar goed zit, GROETEN LAMBIEK.

@Lambiek, ik ben totaal niet vertrouwd met Basic maar ik was bezig met het programma om te zetten naar Proton basic, alle compilerfouten werden opgelost uitgenomen 1.
De compiler herkent CMCON niet en in de manual staat deze wel uitgelegd, wat gaat er hier verkeerd?

Zie screenshot:

edit: het .BAS toegevoegd

LDmicro user.
Lambiek

Special Member

Op 27 juli 2019 10:09:00 schreef MGP:
@Lambiek, ik ben totaal niet vertrouwd met Basic maar ik was bezig met het programma om te zetten naar Proton basic, alle compilerfouten werden opgelost uitgenomen 1.
De compiler herkent CMCON niet en in de manual staat deze wel uitgelegd, wat gaat er hier verkeerd?

Ik kan het ook niet compileren.
Er wordt hier gezegd dat het geen Proton syntax is.

Dit gaat wel.

pic basic code:


Symbol C0 = 60 'DO
Symbol CX0 = 61
Symbol D0 = 62 'RE
Symbol DX0 = 63
Symbol E0 = 64 'MI
Symbol F0 = 65 'FA
Symbol FX0 = 66
Symbol G0 = 67 'SOL
Symbol GX0 = 68 'SOL
Als je haar maar goed zit, GROETEN LAMBIEK.

Ik heb wat voor je aangepast, dit is een Proton Basic file nu

Guus@Sint-Michielsgestel
Lambiek

Special Member

Dat geeft de zelfde fouten, is niet te compileren.

Als je haar maar goed zit, GROETEN LAMBIEK.

Hier kan ik Waters versie wel compileren, of het werkt zal de TS moeten proberen.

LDmicro user.
Bavelt

Golden Member

Fijn dat jullie meehelpen.

Ik kan het echter ook niet compileren. De compiler geeft aan dat er errors zijn. Het venstertje is daarna zelfs niet meer te sluiten, ook niet na taakbeheer en programma verwijderen.
Rest de PC te herstarten.

En nog even een vraagje in het kielzog:
Als ik compileer, zie je heel even een schermpje voorbij flitsen met het resultaat in groen of errors in rood. Het schermpje is daarna meteen weer weg.

Waar kan ik nu de compiler resultaten zien?

[Bericht gewijzigd door Henry S. op zaterdag 27 juli 2019 15:03:26 (32%)

Fouten zijn het bewijs dat je het probeert..

Onderaan de editor zie je een window Results, als dat er niet staat moet je in het menu VIEW bovenaan dat aanvinken.

Hier de hexfile (Waters versie) als je eens wilt proberen

LDmicro user.
Bavelt

Golden Member

Op 27 juli 2019 11:41:11 schreef MGP:
Onderaan de editor zie je een window Results, als dat er niet staat moet je in het menu VIEW bovenaan dat aanvinken.

Hier de hexfile (Waters versie) als je eens wilt proberen

Heb deze HEX zojuist getest. Er komt wel een melodietje uit, maar
- Het volume is heel zacht
- Hij speelt onafhankelijk van schakelaar S1 en blijft doorlopen (blijft in een loop)

Fouten zijn het bewijs dat je het probeert..

Kan u niet echt helpen, weet er teweinig vanaf maar ga toch eens kijken.

LDmicro user.
Lambiek

Special Member

Op 27 juli 2019 12:10:28 schreef Bavelt:
Heb deze HEX zojuist getest. Er komt wel een melodietje uit, maar
- Het volume is heel zacht
- Hij speelt onafhankelijk van schakelaar S1 en blijft doorlopen (blijft in een loop)

Wat heb je nu gebruikt? MGP heeft S1 er niet instaan.

Als je een speaker gebruikt, heb je daar een condensator tussen gezet? Erg hard is het geluid sowieso niet, als je meer volume wil moet je het signaal versterken.

https://www.circuitsonline.net/schakelingen/4/audio/1-watt-versterker.…

Het stukje code van mij werk gewoon, je hoeft alleen het type pic er boven te zetten met de bijbehorende config.

Als je haar maar goed zit, GROETEN LAMBIEK.

Op 27 juli 2019 13:12:05 schreef Lambiek:
Het stukje code van mij werk gewoon, je hoeft alleen het type pic er boven te zetten met de bijbehorende config.

Lambiek, kun je de volledige code erop (als BAS file) zetten en eventueel de HEX file, want de TS is een absolute beginner zoals ik ;)

LDmicro user.
Lambiek

Special Member

Op 27 juli 2019 13:37:48 schreef MGP:
..... beginner zoals ik ;)

Natuurlijk. :)

pic basic code:


Device 16F628A                         ; Processor type

Xtal 10                                ; Cristal 10Mhz

Config HS_OSC,_                        ; Entern kristal
       WDT_OFF,_                       ; WatchDog Timer uit
       PWRTE_ON,_                      ; Power-up Timer Enable aan
       MCLRE_OFF,_                     ; Externe Master Reset Enable uit
       BODEN_OFF,_                     ; Brown Out Detectie Enable uit
       LVP_OFF,_                       ; Low-Voltage Programming uit
       CP_OFF                          ; Code Protection uit

All_Digital true                       ; Alle poorten digitaal

Symbol PIN = PORTB.0                   ; Sound - pin

Symbol S1 = PORTA.0                    ; Schakelaar

;-------------------------------------------------
; MELODIE - SONG1 - SONG2 - SONG3 - SONG4 - SONG5.
;-------------------------------------------------

Symbol  R	=	0
Symbol	C	=	82
Symbol  Db0	=	85
Symbol	D	=	87
Symbol  Eb	=	89
Symbol  E	=	92
Symbol  F	=	94
Symbol  Gb	=	95
Symbol  G	=	97
Symbol	Ab1	=	99
Symbol  A1	=	73
Symbol  Bb1	=	76
Symbol  BE1	=	79
Symbol	C1	=	82
Symbol  Db1	=	85
Symbol	D1	=	87
Symbol  Eb1	=	89
Symbol  E1	=	92
Symbol  F1	=	94
Symbol  Gb1	=	95
Symbol  G1	=	97
Symbol	Ab2	=	99
Symbol	A2	=	101
Symbol	Bb2	=	102
Symbol	BE2	=	104
Symbol	C2	=	105
Symbol	Db2	=	106
Symbol	D2	=	108
Symbol	E2	=	110
Symbol	F2	=	111
Symbol	Gb2	=	112
Symbol	G2	=	113
Symbol	Bb3	=	115
Symbol	Bm3	=	116
Symbol	C3	=	117
Symbol	D3	=	118

DelayMS 500                                 ; Pauze 0.5 sec 

Clear                                       ; Wis geheugen

         ;543210                            ; Hulpregel poort A
PORTA  = %000000                            ; Maak poort A laag
TRISA  = %111111                            ; Poort_A I/O

         ;543210                            ; Hulpregel poort B
PORTB  = %000000                            ; Maak poort B laag
TRISB  = %000000                            ; Poort_B I/O

;------------------------------
; SONG1 IS STARWARS
; SONG2 IS DEATH MARCH
; SONG3 IS SHAVE AND A HAIRCUT
; SONG4 IS CHARGE
; SONG5 IS HEART AND SOUL
;------------------------------

START:	

    If S1 = 1 Then GoTo SONG1
    GoTo START
        
SONG1:	

    Sound PIN,[G,80,D2,80,C2,20,BE2,20,A2,20,G2,80,D2,80,C2,20,BE2,20,A2,20,G2,80,D2,80,C2,20,BE2,20,C2,20,A2,80]
    DelayMS 1000
    GoTo SONG2
				
SONG2:	

    Sound PIN,[F,80,R,2,F,70,R,2,F,10,R,2,F,80,Ab1,60,R,2,G,10,R,2,G,60,R,5,F,10,R,2,F,50,R,2,E,20,R,1,F,40]
    DelayMS 1000
    GoTo SONG3
		
SONG3:	

    Sound PIN,[F2,40,R,2,C2,20,R,2,C2,20,R,5,D2,50,R,3,C2,30,R,40,E2,40,F2,50]
    DelayMS 1000
    GoTo SONG4
				
SONG4:	

    Sound PIN,[Db2,20,Gb2,20,Bb3,15,C3,30,R,5,Bb3,20,C3,75]
    DelayMS 1000
    GoTo SONG5
			
SONG5:	

    Sound PIN,[C2,30,R,10,C2,30,R,10,C2,80,R,3,C2,20,BE2,30,A2,20,BE2,30,C2,20,D2,30,R,5,C2,10,E2,30,R,15,E2,30,R,15,E2,80]
    DelayMS 1000
    GoTo START
		
End
Als je haar maar goed zit, GROETEN LAMBIEK.

@TS hier Lambieks hex file, ik zie dat je problemen hebt met windows en dat je werkt met de lite versie (?), nu kun je eens proberen.

edit:

Op 27 juli 2019 14:07:03 schreef Lambiek:
Natuurlijk. :)

Ik bedoelde in Proton basic... ;) en als dit draadje afgewerkt is zal het daarbij blijven :p

[Bericht gewijzigd door MGP op zaterdag 27 juli 2019 14:31:51 (45%)

LDmicro user.
Bavelt

Golden Member

Op 27 juli 2019 13:12:05 schreef Lambiek:
[...]
Wat heb je nu gebruikt? MGP heeft S1 er niet instaan.

Als je een speaker gebruikt, heb je daar een condensator tussen gezet? Erg hard is het geluid sowieso niet, als je meer volume wil moet je het signaal versterken.

https://www.circuitsonline.net/schakelingen/4/audio/1-watt-versterker.…

Het stukje code van mij werk gewoon, je hoeft alleen het type pic er boven te zetten met de bijbehorende config.

Ik heb er een versterkertje (tor) tussen gezet volgens het oorspronkelijke schema. Dat geeft een redelijk geluid.

Ik ga je Bas proberen!

Fouten zijn het bewijs dat je het probeert..
Lambiek

Special Member

Op 27 juli 2019 15:17:04 schreef Bavelt:
Ik heb er een versterkertje (tor) tussen gezet volgens het oorspronkelijke schema. Dat geeft een redelijk geluid.

Dat kan ook al voldoende zijn.

Bij S1 moet nog wel een pull-down weerstand van 10K.

Als je haar maar goed zit, GROETEN LAMBIEK.
Bavelt

Golden Member

Pull down? Dan zou de schakelaar S1 dus aan de +VCC hangen.

Of bedoel je Pull Up?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik zie dat deze configuratie een kristal van 10Mhz verlangt. Die heb ik even niet.

Wel eentje van 20Mhz en een heleboel van 32.768 Khz
Kunnen die ook worden gebruikt?

Dan moet er vast eea worden gewijzigd in de frequenties?

Fouten zijn het bewijs dat je het probeert..
Lambiek

Special Member

Op 27 juli 2019 15:47:52 schreef Bavelt:
Pull down?

Ja, ik werk altijd met positieve logica. :)

Dan zou de schakelaar S1 dus aan de +VCC hangen.

Ja, als je naar de code kijkt dan zie je dat S1 "1" moet zijn om naar het eerste deuntje te gaan. Maar je kunt het ook op jou manier doen. Maar dan moet je de "1" in een "0" veranderen in het programma.

Of bedoel je Pull Up?

En als je S1 aan de gnd legt, dan heb je een pull-up nodig.

Als je haar maar goed zit, GROETEN LAMBIEK.