Tonen generen met PIC16F628A

Nu ik met MikroBasic ben gestart, een eerste programmaatje gemaakt om middels de PIC16F1826 een melodietje te laten spelen.

En wat aanloop-probleempjes:

- Het melodietje speelt wel, maar reageert niet op de schakelaar S1, op poort A.0 (die is dus blijkbaar altijd een '0 ', Hierdoor herhaalt het liedje zich steeds

- De frequentie en de tijden kloppen niet (frequentie te laag, duur te lang). Hie zit dus iets niet goed met de kloksnelheid o.i.d

De code:

pic basic code:

'==============================================================================
program Midsomer_1826
'-------------------------------------------------------------------------

'==============================================================================
main:

'==============================================================================
  PortA = %11111111
  TRISA.0 = 1
  TRISB.3 = 0
                                     '
  OSCCON = %11110000                            '32MHz internal

  Sound_Init(PORTB, 3)

while true
  if porta.0 = 0 then
     delay_ms(20)
     if porta.0 = 0 then
      Sound_Play(622, 250)
      Sound_Play(587, 250)
      Sound_Play(622, 250)
      Sound_Play(587, 250)
      Sound_Play(523, 375)
      Sound_Play(466, 125)
      Sound_Play(587, 250)
      Sound_Play(523, 1000)
      delay_ms(1000)
     END IF
  END IF
wend
                                        '
end. 

Edit Post:

Vwb de S1 ben ik er al uit; Poort A.0 moet als digitaal worden gedefinieerd!

ANSELA.0 = 0 '
TRISA.0 = 1

Vwb de snelheid: dat lag aan de Project instellingen.

Dus opgelost!

[Bericht gewijzigd door Bavelt op 15 oktober 2019 00:58:34 (18%)]

Hierbij het programma voor het afspelen van een meoldietje na het indrukken van een schakelaar.
Het is gemaakt dmv MikroBasic en de microcontroller is de PIC16F1826.

Er wordt gebruik gemaakt van het commando Sound_Play.
Voor de toonhoogte en duur worden 2 constanten-tabellen gebruikt.

De code:

pic basic code:

 '==============================================================================
program Midsomer_1826
'Het programma speelt na het indrukken van S1 de tune uit de serie Misomer Murders
'------------------------------------------------------------------------------
 Dim Toon as byte
 Const PLUS as byte = 100                                                       'Extra vertraging, hiermee kan melodie trager worden afgespeeld)
 Const FREQ as WORD [25] = (622,587,622,587,523,466,587,523,622,784,1047,987,784,698,622,554,466,554,698,784,523,622,587,392,587)
 Const DUUR as Word [25] = (250,250,250,250,375,125,250,1000,250,750,500,250,1250,250,250,250,250,375,125,750,500,750,500,250,1250)
 
 '==============================================================================
main:

'==============================================================================
  PortA = %11111111
  ANSELA.0 = 0                                                                   'Poort A Digitaal
  TRISA.0  = 1                                                                   'Poort A Hoog
  OSCCON = %11110000                                                             '32MHz internal
  Sound_Init(PORTB, 3)

  while true
        if porta.0 = 0 then
           delay_ms(20)
            if porta.0 = 0 then
               For Toon = 0 to 24
                   Sound_Play(Freq[Toon], (Duur[Toon] + Plus))
               Next Toon
            END IF
          END IF
  wend

end. 

Voor aanbevelingen en suggesties voor verbetering van het programma hou ik me graag aanbevolen!

Waar ik zelf nog aan zat te denken is om de constanten op te slaan in het EEprom-gedeelte.

Ik kan de waarden daar naar toe schrijven; edoch wanneer ik het melodie programma opnieuw schrijf, zijn alle EEprom waarden weer 'FF'

edoch wanneer ik het melodie programma opnieuw schrijf, zijn alle EEprom waarden weer 'FF'

Vinkje uitzetten:

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

Ik weet nog niet goed wat nou de juiste manier is van het progrogrammeren van de data in de Eeprom.
Ik gebruik nu de EEProm Editor in MikroBasic. Na het inbrengen van de data en Save, wordt het standaard als een .ihex file opgeslagen.
Pickit3 kent deze niet, dus hernoem ik het naar .HEX.

Als ik deze Hex file schrijf met Pickit3, dan staat de data in de EEprom.

Maar wanneer ik dat later over wil doen (bv omdat ik het vinkje ben vergeten uit te zetten en alles op FF staat), dan herschrijf hij hem niet opnieuw.

Ik doe iets niet goed.

Je kunt het vinkje aanzetten: eeprom wordt gewist of uitzetten: eeprom wordt niet gewist. Meer smaken zijn er niet... ;)
(wat wou je dan nog meer zien?)

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

Nou, als ik de .Hex, waarin de EEprom wordt geschreven importeer en "Write", dan zie ik de geschreven waarden van de EePROM in Pickit niet. Ook niet na "Read".
Je ziet ze pas als je Pickit hebt afgesloten en opnieuw opgestart en dan "Read".

Net even geprobeerd. (gebruik de Pickit al zolang als 'ie bestaat, maar nooit voor eeprom nodig gehad. Parameters sla ik in flash op)
Ik krijg de eeprom waardes gewoon in 't Pickit programma te zien.
Je moet wel gewoon de .hex file gebruiken. (de .iHex file is alleen voor intern gebruik van de compiler)

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

Die .ihex kwam uit de EEprom Editor.

Ik schrijf nu de waarde in het MikroBasic programma. Dus geen íhex-en meer.

Dat vinkje is voor mij nog even een issue.
Want dat wissen: is dat bij aanvang van het programma of als laatste?

Stel dat ik in het programma ergens op adres $02 en adres $05 een waarde in de Eeprom wil veranderen, en de overigen moeten bewaard blijven. moet die dan aan- of uitgevinkt worden?

Je verandert de eeprom waardes in wat je wilt. Je slaat dat op als iHex file.
Als de compiler dan de hexfile maakt, wordt de inhoud van de ihex file daar automatisch bijgevoegd.

Wissen is uiteraard als eerste: het heeft weinig zin de eeprom na het programmeren te wissen... :)

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

Ik krijg het (nog) niet voor elkaar. Zie screenshot.

Ik heb de waarden mbv de EEprom Editor veranderd (eerste 4 adressen 01 t/m 04).
Daarna opgeslagen, wordt een .iHexfile
Als ik het hoofdprogramma vertaal en naar de PIC schrijf, verandert er niks in de EEprom.
Wat doe ik fout of mis ik?

Bij het aanmaken van de eepromfile de eerste keer kreeg je een vraag, (iets van 'use this in project?')
Daar had je wel ja op moeten zeggen...

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

Ik heb het project helemaal opnieuw aangemaakt en nu krijg ik inderdaad de melding. En netjes met Ja bevestigd.
Het schrijven gaat nu goed.

Die .Ihex file wordt dan wel iedere keer geladen bij het programmeren. Is die ook weer te verwijderen nadat de waarde is geschreven?

Dan heb ik een simpel programma gemaakt dat alleen een waarde wegschrijft in de eePROM.
Tenminste, dat is de bedoeling.

pic basic code:

EEPROM_Write(0x02,0xAA)

Het effect hiervan is een foutmelding "Programming failed at EE data address
x0002"

EEprom_Write is een firmware routine, wie/wat kan er dan een foutmelding geven???

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

Wat heeft dat met eeprom_write te maken???
(heb je vooraf een erase gedaan?)

[Bericht gewijzigd door Arco op 19 oktober 2019 00:22:53 (29%)]

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

Na Erase van de PIC is de melding weliswaar weg, maar het commando

pic basic code:

  EEPROM_Write(0x02,0xAA)  

doet niks.
De waarden blijven onveranderd.

Wat heeft dat met eeprom_write te maken???

In mijn MikroBasic Programma heb ik dit commando geplaatst. Als test om een waarde op een bepaald adres te krijgen.

Met PicKit3 programmeer ik dat programma in de PIC.

Maar hij schrijft de waarde niet weg.

Heb je CPD (data protection) soms aan staan in de config?

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

Nee, voor zover ik kan zien niet:

Aanvullende info: de 'fail' melding krijg ik wanneer ik het 'vinkje' aanzet bij EEprom Enabled in Pickit3.

Als ik het vinje uitzet, dan lijkt het goed te gaan maar er wordt geen waarde in de EEprom weggeschreven na:

pic basic code:

EEPROM_Write(0x01,0xAA)
  EEPROM_Write(0x02,0xBB) 

Daarnaast: Ik heb daarbij niet kunnen ontdekken hoe je de aangemaakte .ihex file door de EEProm Editor weer kan verwijderen.
Als ik die handmatig uit de programma-directory verwijder via de verkenner dan volgt bij compileren de foutmelding dat hij die file mist.

Eeprom file uit project verwijderen:

Die 'fail' en 'eeprom_write' hebben niets met elkaar te maken.
Write moet gewoon gaan (ik heb wel een pickit2, maar die zou hetzelfde moeten reageren)

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

De .ihex file heb ik verwijderd uit het project. Ik gebruik mmomenteel een laptop, en de project Manager zit helemaal weggestopt aan de rechterkant waar hij niet makkelijk zichtbaar was.
Maar dat is gelukt.

De 'fail' boodschap ben ik nu kwijt.

De EEProm_Write doet echter nog niks.

EEprom_Write moet gewoon werken, nog nooit problemen mee gehad...
Of de Project Manager altijd zichtbaar is of auto-hide kun je met de 'pin' toets instellen...

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

Of de Project Manager altijd zichtbaar is of auto-hide kun je met de 'pin' toets instellen...

Wéér wat geleerd, tjonge. De laptop waar ik nu op werk heeft een resolutie van 1377 * 768, dat is dus tamelijk klein.
Op mijn thuis PC (ben nu even elders) heb ik een groot 22"scherm, dan is dat allemaal fraaier).

Maar de EEPROM_Write werkt helaas nog niet.
Het MikroBasic programma is superklein:

pic basic code:

 program Eeprom

' Declarations section 

main:

'   Main program 
  EEPROM_Write(0x05,0x09)
end. 

Ik wil op adres 0x05 de waarde 0x09 wegschrijven.
Maar in de data die Pickit3 toont zie ik geen verandering.