Tonen generen met PIC16F628A

Bavelt

Golden Member

Nou, Pull up weerstand aangebracht van 4K7 naar de +5V. De schakelaar S1 op Poort A0 gezet ipv een B-poort.
En toch gaat af en toe het melodietje lopen, als ware het dat S1 even gesloten is.
rara...

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Punt is dat het heel gevoelig blijft op de poort waar S1 op is aangesloten.
Ik heb de Pull-Up weerstand aangebracht. Als je nu bv de spanning controleer op Poort A.0 (waar S1 op zit), dan is het aanraken van de Poort met een multimeter al voldoende om het programma in werking te zetten (m.a.w hij komt dan even in de modus dat S1 0 is).

Zou het eventueel een oplossing kunnen zijn dat S1 een minimum tijd gesloten moet zijn het om te laten werken (Waardoor je een heel kortstondige "0" vanwege storingspieken o.i.d. elimineert)?

Fouten zijn het bewijs dat je het probeert..

Ik vermoed dat je ergens een fout hebt gemaakt in de soft- en/of hardware, een poort met externe pullup laat zich niet zo gauw in de luren leggen als alles netjes gemaakt is.

LDmicro user.
Bavelt

Golden Member

Op 31 augustus 2019 10:19:45 schreef Lucky Luke:
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).

Dit lijkt idd wat verbetering te geven. Ik heb C=2n2 en R=150 gekozen.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Op 5 september 2019 17:29:13 schreef MGP:
Ik vermoed dat je ergens een fout hebt gemaakt in de soft- en/of hardware, een poort met externe pullup laat zich niet zo gauw in de luren leggen als alles netjes gemaakt is.

Tja, dit is het programma
DEVICE 16F628A ; 16F628A PIC Microcontroller
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF ; Interne oscilator aangezet

DECLARE XTAL 4 ; Kristal 4 Mhz

ALL_DIGITAL TRUE ; All inputs digital
DECLARE CCP1_PIN PORTB.3 ; Hardware pwm pin portb.3 = pin9 on chip
SYMBOL S1 = PORTA.0 ; Drukknop op Poort A0 om te starten.

; 76543210
TRISA = %11111111 ; PoortA = input
TRISB = %11110111 ; poortB = input , pwm_pin = output 9

CLEAR ; Wis geheugen
CMCON = 0x07 ; Schakel Comperator uit
; Wis geheugen
DIM i1 AS WORD ; Met i1 kan extra vertraging worden ingesteld
DIM j1 AS BYTE
DIM z1 AS BYTE 'Z1 bepaalt welk melodietje wordt afgespeeld
z1 = 0
i1=100

DELAYMS 2000 ;Dit delay is om de schakeling even niks te laten doen bij inschakelen.
START:
IF S1 = 0 THEN
z1 = z1 + 1
IF z1 > 3 THEN
z1 = 1
END IF

SELECT z1
CASE 1
HPWM 1, 127, 523 ; channel 1 , duty 50, 523Hz
DELAYMS 1000 + i1
HPWM 1, 127, 493
DELAYMS 250 + i1
HPWM 1, 127, 523
DELAYMS 250 + i1
HPWM 1, 127, 493
DELAYMS 250 + i1
HPWM 1, 127, 440
DELAYMS 750 + i1
HPWM 1, 127, 0
DELAYMS 250 + i1
HPWM 1, 127, 659
DELAYMS 875 + i1
HPWM 1, 127, 698
DELAYMS 250 + i1
HPWM 1, 127, 659
DELAYMS 250 + i1
HPWM 1, 127, 587
DELAYMS 200 + i1
HPWM 1, 127, 523
DELAYMS 1125 + i1
HPWM 1, 0, 0
CASE 2
; Inclusief Toegift NWNC
HPWM 1, 127, 523 ; channel 1 , duty 50, 523Hz
DELAYMS 1000 + i1
HPWM 1, 127, 493
DELAYMS 250 + i1
HPWM 1, 127, 523
DELAYMS 250 + i1
HPWM 1, 127, 493
DELAYMS 250 + i1
HPWM 1, 127, 440
DELAYMS 750 + i1
HPWM 1, 127, 0
DELAYMS 250 + i1
HPWM 1, 127, 659
DELAYMS 875 + i1
HPWM 1, 127, 698
DELAYMS 250 + i1
HPWM 1, 127, 659
DELAYMS 250 + i1
HPWM 1, 127, 587
DELAYMS 200 + i1
HPWM 1, 127, 523
DELAYMS 1125 + i1
HPWM 1, 0, 0
DELAYMS 800 + i1
HPWM 1, 127, 659
DELAYMS 1075 + i1
HPWM 1, 127, 698
DELAYMS 550 + i1
HPWM 1, 127, 659
DELAYMS 650 + i1
HPWM 1, 127, 587
DELAYMS 700 + i1
HPWM 1, 127, 523
DELAYMS 1500 + i1
j1 = 127
REPEAT
HPWM 1, j1, 523
DELAYMS 15
DEC j1
UNTIL j1 = 0

CASE 3
;LEMONTREE:
HPWM 1, 127, 340
DELAYMS 250 + i1

HPWM 1, 127, 392
DELAYMS 250 + i1

HPWM 1, 127, 440
DELAYMS 500 + i1

HPWM 1, 127, 466
DELAYMS 250 + i1

HPWM 1, 127, 440
DELAYMS 150 + i1

HPWM 1, 0, 0
DELAYMS 10

HPWM 1, 127, 440
DELAYMS 150 + i1

HPWM 1, 127, 349
DELAYMS 350 + i1

HPWM 1, 127, 466
DELAYMS 200 + i1

HPWM 1, 127, 440
DELAYMS 150 + i1

HPWM 1, 0, 0
DELAYMS 10

HPWM 1, 127, 440
DELAYMS 200 + i1

HPWM 1, 127, 349
DELAYMS 350 + i1

HPWM 1, 127, 466
DELAYMS 250 + i1

HPWM 1, 127, 440
DELAYMS 250 + i1

HPWM 1, 127, 392
DELAYMS 750 + i1

HPWM 1, 127, 329
DELAYMS 250 + i1

HPWM 1, 127, 349
DELAYMS 150 + i1

HPWM 1, 127, 392
DELAYMS 500 + i1

HPWM 1, 127, 440
DELAYMS 250 + i1

HPWM 1, 127, 392
DELAYMS 150 + i1

HPWM 1, 0, 0
DELAYMS 10

HPWM 1, 127, 392
DELAYMS 150 + i1

HPWM 1, 127, 329
DELAYMS 250 + i1

HPWM 1, 127, 440
DELAYMS 250 + i1

HPWM 1, 127, 392
DELAYMS 150 + i1

HPWM 1, 0, 0
DELAYMS 10

HPWM 1, 127, 392
DELAYMS 250 + i1

HPWM 1, 127, 329
DELAYMS 350 + i1

HPWM 1, 127, 440
DELAYMS 250 + i1

HPWM 1, 127, 392
DELAYMS 250 + i1

HPWM 1, 127, 349
DELAYMS 1000 + i1
END SELECT

HPWM 1, 0, 0
DELAYMS 250
ENDIF

GOTO START

En zo ziet het er uit

Achterkant met teflon draadjes

Fouten zijn het bewijs dat je het probeert..

Plaats uw code tussen code tags

pic basic code:

DEVICE 16F628A ; 16F628A PIC Microcontroller
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF ; Interne oscilator aangezet

DECLARE XTAL 4 ; Kristal 4 Mhz

ALL_DIGITAL TRUE ; All inputs digital
DECLARE CCP1_PIN PORTB.3 ; Hardware pwm pin portb.3 = pin9 on chip
SYMBOL S1 = PORTA.0 ; Drukknop op Poort A0 om te starten.

; 76543210
TRISA = %11111111 ; PoortA = input
TRISB = %11110111 ; poortB = input , pwm_pin = output 9

CLEAR ; Wis geheugen
CMCON = 0x07 ; Schakel Comperator uit
; Wis geheugen
DIM i1 AS WORD ; Met i1 kan extra vertraging worden ingesteld
DIM j1 AS BYTE
DIM z1 AS BYTE 'Z1 bepaalt welk melodietje wordt afgespeeld
z1 = 0
i1=100

DELAYMS 2000 ;Dit delay is om de schakeling even niks te laten doen bij inschakelen.
START:

IF S1 = 0 THEN
z1 = z1 + 1
IF z1 > 3 THEN
z1 = 1
END IF

SELECT z1
CASE 1
HPWM 1, 127, 523 ; channel 1 , duty 50, 523Hz
DELAYMS 1000 + i1
HPWM 1, 127, 493
DELAYMS 250 + i1
HPWM 1, 127, 523
DELAYMS 250 + i1
HPWM 1, 127, 493
DELAYMS 250 + i1
HPWM 1, 127, 440
DELAYMS 750 + i1
HPWM 1, 127, 0
DELAYMS 250 + i1
HPWM 1, 127, 659
DELAYMS 875 + i1
HPWM 1, 127, 698
DELAYMS 250 + i1
HPWM 1, 127, 659
DELAYMS 250 + i1
HPWM 1, 127, 587
DELAYMS 200 + i1
HPWM 1, 127, 523
DELAYMS 1125 + i1
HPWM 1, 0, 0
CASE 2
; Inclusief Toegift NWNC
HPWM 1, 127, 523 ; channel 1 , duty 50, 523Hz
DELAYMS 1000 + i1
HPWM 1, 127, 493
DELAYMS 250 + i1
HPWM 1, 127, 523
DELAYMS 250 + i1
HPWM 1, 127, 493
DELAYMS 250 + i1
HPWM 1, 127, 440
DELAYMS 750 + i1
HPWM 1, 127, 0
DELAYMS 250 + i1
HPWM 1, 127, 659
DELAYMS 875 + i1
HPWM 1, 127, 698
DELAYMS 250 + i1
HPWM 1, 127, 659
DELAYMS 250 + i1
HPWM 1, 127, 587
DELAYMS 200 + i1
HPWM 1, 127, 523
DELAYMS 1125 + i1
HPWM 1, 0, 0
DELAYMS 800 + i1
HPWM 1, 127, 659
DELAYMS 1075 + i1
HPWM 1, 127, 698
DELAYMS 550 + i1
HPWM 1, 127, 659
DELAYMS 650 + i1
HPWM 1, 127, 587
DELAYMS 700 + i1
HPWM 1, 127, 523
DELAYMS 1500 + i1
j1 = 127
REPEAT
HPWM 1, j1, 523
DELAYMS 15
DEC j1
UNTIL j1 = 0

CASE 3
;LEMONTREE:
HPWM 1, 127, 340
DELAYMS 250 + i1

HPWM 1, 127, 392
DELAYMS 250 + i1

HPWM 1, 127, 440
DELAYMS 500 + i1

HPWM 1, 127, 466
DELAYMS 250 + i1

HPWM 1, 127, 440
DELAYMS 150 + i1

HPWM 1, 0, 0
DELAYMS 10

HPWM 1, 127, 440
DELAYMS 150 + i1

HPWM 1, 127, 349
DELAYMS 350 + i1

HPWM 1, 127, 466
DELAYMS 200 + i1

HPWM 1, 127, 440
DELAYMS 150 + i1

HPWM 1, 0, 0
DELAYMS 10

HPWM 1, 127, 440
DELAYMS 200 + i1

HPWM 1, 127, 349
DELAYMS 350 + i1

HPWM 1, 127, 466
DELAYMS 250 + i1

HPWM 1, 127, 440
DELAYMS 250 + i1

HPWM 1, 127, 392
DELAYMS 750 + i1

HPWM 1, 127, 329
DELAYMS 250 + i1

HPWM 1, 127, 349
DELAYMS 150 + i1

HPWM 1, 127, 392
DELAYMS 500 + i1

HPWM 1, 127, 440
DELAYMS 250 + i1

HPWM 1, 127, 392
DELAYMS 150 + i1

HPWM 1, 0, 0
DELAYMS 10

HPWM 1, 127, 392
DELAYMS 150 + i1

HPWM 1, 127, 329
DELAYMS 250 + i1

HPWM 1, 127, 440
DELAYMS 250 + i1

HPWM 1, 127, 392
DELAYMS 150 + i1

HPWM 1, 0, 0
DELAYMS 10

HPWM 1, 127, 392
DELAYMS 250 + i1

HPWM 1, 127, 329
DELAYMS 350 + i1

HPWM 1, 127, 440
DELAYMS 250 + i1

HPWM 1, 127, 392
DELAYMS 250 + i1

HPWM 1, 127, 349
DELAYMS 1000 + i1
END SELECT

HPWM 1, 0, 0
DELAYMS 250
ENDIF

GOTO START

dat leest makkelijker

Misschien moet je er eens aan denken om de instructie BUTTON te gebruiken want ik denk dat de variabele Z1 veel last heeft van contactdender, niet dat dat de oorzaak is.
Heb je een schema? zou ik ook eens graag zien..even belangrijk als de geposte code.

[Bericht gewijzigd door MGP op donderdag 5 september 2019 18:23:32 (84%)

LDmicro user.
Arco

Special Member

Een extra delay zou al een boel bounce opvangen:

pic basic code:


IF S1 = 0 THEN
  delay_ms(20)
  IF S1 = 0 THEN
  z1 = z1 + 1
  ...
  ...

Heeft picbasic geen constants arrays? (dan kan het programma 95% korter... ;) )

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

Golden Member

werkt iets als dim BierBar[42] as byte? Zoja, dan heb je arrays en kan het dus wat simpeler :)

Overigens doe ik debounce vaak zo:

code:


// pseudo-C, zelf vertalen ;)
if(button == 0){
   While(button==0){
    delay_ms(150);
   }
}

Uiteraard niet op plekken waar vasthouden herhalen betekend, maar wel waar ik echt 1x indrukken wil hebben. Voor een deurbel dus prima.

In picbasic wordt dat dus zoiets:

pic basic code:


IF S1 = 0 THEN
   WHILE S1 = 0
       DELAYMS 150
   WEND
ENDIF
Eluke.nl | De mens onderscheid zich van (andere) dieren door o.a. complexe gereedschappen en bouwwerken te maken. Mens zijn is nerd zijn. Blijf Maken. (Of wordt, bijvoorbeeld, cultuurhistoricus)
Arco

Special Member

Die 150mS is wel wat grof... ;)   (ik vind 20mS meer als genoeg. Als de bounce meer is wordt 't tijd voor een nieuwe schakelaar...)

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

Golden Member

Op 5 september 2019 19:31:16 schreef Arco:
Die 150mS is wel wat grof... ;)   (ik vind 20mS meer als genoeg. Als de bounce meer is wordt 't tijd voor een nieuwe schakelaar...)

Het probleem zit hem niet eens zozeer in de schakelaar. Wat ik merk is dat wanneer je Port A.0 maar even met een klein pincetje of schroevendraaiertje aantikt, het wordt gezien als een kortstondige "0", waardoor het programma in beweging komt.
1 keer een 0 is al voldoende om het programma helemaal af te maken, dus bounce van de schakelaar is, mede gezien de duur van het programma, daarmee wel geëlimineerd.

Maar die Poort A is dus súpergevoelig, ondanks een 4k7 PullUp weerstand.

Fouten zijn het bewijs dat je het probeert..

Er loopt iets verkeerd, normaal gezien kan dat niet, spanning meten is de boodschap.
Ik denk dat er iets mis is met de speakerschakeling, vandaar de vraag naar een schema.

LDmicro user.
Arco

Special Member

Mag niet erg gevoelig zijn. Dat aanraken met een metalen voorwerp een start triggert is niet bijzonder, je lichaam is tenslotte ook geladen.
Daarvoor werkt nu juist die 20mS. Als de pin '0' is, wacht je 20mS en test nog eens of 'ie nog steeds '0' is. Stoorpulsen duren niet zo lang meestal.

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

Special Member

Op 6 september 2019 12:28:23 schreef Bavelt:
Maar die Poort A is dus súpergevoelig, ondanks een 4k7 PullUp weerstand.

Dan zet je zoiets voor je ingang van je controller, optocoupler dicht bij controller houden en het mooiste is om je schakelaar uit een andere voeding te voeden.

En wat heb je met je MCLR_pin gedaan? Netjes via 10K aan de 5VDC met een 100nF naar de GND?

Als je haar maar goed zit, GROETEN LAMBIEK.
Bavelt

Golden Member

Op 6 september 2019 13:09:23 schreef Lambiek:
[...]
Dan zet je zoiets voor je ingang van je controller, optocoupler dicht bij controller houden en het mooiste is om je schakelaar uit een andere voeding te voeden.

[bijlage]

En wat heb je met je MCLR_pin gedaan? Netjes via 10K aan de 5VDC met een 100nF naar de GND?

Oops, nee. De MCLR hangt los (niet aangesloten)

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Ingang is niet 'supergevoelig' met een 4k7 pull-up, dat kan niet.
Aanraken met een metalen voorwerp blijf je wel merken. (je lichaam is tenslotte een condensator, die zich via de pin dan ontlaadt)

Optocoupler kan wel, maar het blijft een omslachtige manier, en zou met schakelaars op korte afstand totaal onnodig moeten zijn.
Goede debounce lost het zeker op.

@lambiek: TS gebruikt MCLRE_OFF, dus daar kan 't ook niet aan liggen...

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

Golden Member

Op 6 september 2019 12:36:52 schreef Arco:
Mag niet erg gevoelig zijn. Dat aanraken met een metalen voorwerp een start triggert is niet bijzonder, je lichaam is tenslotte ook geladen.
Daarvoor werkt nu juist die 20mS. Als de pin '0' is, wacht je 20mS en test nog eens of 'ie nog steeds '0' is. Stoorpulsen duren niet zo lang meestal.

Ik heb de delay van 20ms opgenomen. En inderdaad reageert het programma niet meer op kortstondig aantikken.
Nu eens kijken hoe het zich allemaal houdt.

Het versimpelen van het programma ga ik ook naar kijken; het is idd allemaal wel recht-toe-recht-aan geef ik toe.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Op 6 september 2019 12:34:27 schreef MGP:
Er loopt iets verkeerd, normaal gezien kan dat niet, spanning meten is de boodschap.
Ik denk dat er iets mis is met de speakerschakeling, vandaar de vraag naar een schema.

Hieronder even met de pen het schema geschetst

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Griezelig...
Als RB3 ooit 'hoog' blijft, is het snel afgelopen met de BD137 en/of luidspreker, daar gaat een aanzienlijke stroom door lopen...
(schets even 'croppen' dan ben je al dat wit kwijt...)

[Bericht gewijzigd door Arco op vrijdag 6 september 2019 13:55:27 (16%)

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

..En uw programma spreekt nochtans over een interne oscillator, waarom dat kristal dan?

Plaats uw speaker tussen de emitter en de GND, dat is veel beter en veiliger.

[Bericht gewijzigd door MGP op vrijdag 6 september 2019 14:44:06 (32%)

LDmicro user.
Bavelt

Golden Member

Op 6 september 2019 13:54:38 schreef Arco:
Griezelig...
Als RB3 ooit 'hoog' blijft, is het snel afgelopen met de BD137 en/of luidspreker, daar gaat een aanzienlijke stroom door lopen...
(schets even 'croppen' dan ben je al dat wit kwijt...)

Er is een weerstand van 1K in serie met basis van de eindtor. (Niet goed zichtbaar op schemaatje).
Dat leek me afdoende om de stroom te begrenzen.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Dan krijg je nog een stroom van bijna een half ampere door de speaker...

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

Special Member

Op 6 september 2019 12:36:52 schreef Arco:
Mag niet erg gevoelig zijn.

Maar dat is het wel. :)

Dat aanraken met een metalen voorwerp een start triggert is niet bijzonder, je lichaam is tenslotte ook geladen.

Niet alleen het aanraken van de pin, maar ook lange bedrading direct aan de ingang geeft vaak problemen.

Daarvoor werkt nu juist die 20mS. Als de pin '0' is, wacht je 20mS en test nog eens of 'ie nog steeds '0' is.

Voor korte bedrading kan het een goede oplossing zijn.

Stoorpulsen duren niet zo lang meestal.

Daar zou ik niet van uitgaan.

Als je haar maar goed zit, GROETEN LAMBIEK.
Bavelt

Golden Member

Heeft picbasic geen constants arrays? (dan kan het programma 95% korter... ;) )

Kan ik niet zo goed ontdekken. Eigenlijk zou je een 2-dimensionale tabel moeten hebben en die dan via een Lookup of iets dergelijks doorlopen.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

In MikroBasic zou 't zoiets zijn:

code:


..
..
Const Melody_1 As Word[22] = (523,1100,493,350,523,350,493,350,440,850,0,350, 659,975,698,350,659,350,587,300,523,1225)
While True
  For Cnt = 0 to Length(Melody_1) Step 2
    PWM1_Init(Melody_1[Cnt]
    PWM1_Set_Duty (127)
    PWM1_Start()
    VDelay_ms(Melody_1[Cnt+1])
    PWM1_Stop()
  Next Cnt
  Delay_ms(2000)
Wend
..
..
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

ter info:
Ik heb het programma een stuk kunnen verkorten door gebruik te maken van LOOKUPL

pic basic code:


; Melodie No Woman No Cry en Lemon Tree MET INTERNE OSCILLATOR

DEVICE 16F628A                      ; 16F628A PIC Microcontroller
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF     ; Interne oscilator aangezet
DECLARE XTAL 4                      ; Kristal 4 Mhz
ALL_DIGITAL TRUE                    ; All inputs digital
DECLARE CCP1_PIN PORTB.3            ; Hardware pwm pin portb.3 = pin9 on chip
SYMBOL S1 = PORTA.0                 ; Drukknop op Poort A0 om te starten.
     
;        76543210 
TRISA = %11111111                   ; PoortA = input 
TRISB = %11110111                   ; poortB = input , pwm_pin  = output 9
   
CLEAR                               ; Wis geheugen
CMCON = 0x07                        ; Schakel Comperator uit  
                                    ; Wis geheugen
DIM I1 AS WORD                      
DIM J1 AS BYTE
DIM Z1 AS BYTE  
DIM Cnt AS BYTE  
DIM Toon AS WORD
DIM Duur AS WORD                    
               
Z1 = 0                              ; Z1 bepaalt welk melodietje wordt afgespeeld
I1 = 60                             ; Met I1 kan extra vertraging worden ingesteld
       
WHILE 1 =1     
  IF S1 = 0 THEN
    DELAYMS 20
    IF S1 = 0 THEN
      Z1 = Z1 + 1
    END IF
    IF Z1 > 3 THEN
      Z1 = 1
    END IF       
    SELECT Z1
    CASE 1                          ; No Woman No Cry
      FOR Cnt = 0 TO 11 STEP 1
        Toon = LOOKUPL Cnt,[523, 493,523,493,440, 0,  659,698,659,587,523]
        Duur = LOOKUPL Cnt,[1100,350,350,350,850, 350,975,350,350,300,1225] 
        HPWM 1, 127, Toon
        DELAYMS Duur + I1
      NEXT Cnt                      ; No Woman No Cry + toegift
    CASE 2
      FOR Cnt = 0 TO 11 STEP 1
        Toon = LOOKUPL Cnt,[523, 493,523,493,440, 0,  659,698,659,587,523]
        Duur = LOOKUPL Cnt,[1100,350,350,350,850, 350,975,350,350,300,750] 
        HPWM 1, 127, Toon
        DELAYMS Duur + I1
      NEXT Cnt
      FOR Cnt = 0 TO 6 STEP 1
        Toon = LOOKUPL Cnt,[0,   659,698,659,587,523]
        Duur = LOOKUPL Cnt,[800,1075,550,650,700, 1500] 
        HPWM 1, 127, Toon
        DELAYMS Duur + I1
      NEXT Cnt      
    CASE 3 
      I1 = 60                       ; Lemon Tree
      FOR Cnt = 0 TO 32 STEP 1
        Toon = LOOKUPL Cnt,[340, 392,440,466,440,0, 440,349,466,440,0, 440,349,466,440,392,329,349,392,440,392,0, 392,329,440,392,0, 392,329,440,392,349]
        Duur = LOOKUPL Cnt,[250,250,500,250,150, 10,150,350,200,150,10,200,350,250,250,750,250,150,500,250,150,10,150,250,250,150,10,250,350,250,250,750] 
        HPWM 1, 127, Toon
        DELAYMS Duur + I1
      NEXT Cnt      
    END SELECT
    HPWM 1, 0, 0               
  END IF
WEND
END
Fouten zijn het bewijs dat je het probeert..