Tonen generen met PIC16F628A

Bavelt

Golden Member

Voor RTCC gebruik ik de pic zelf; die heeft tijd genoeg over om wat countertjes bij te houden... ;)

is dat zo? Maar hoe hou je dan de datum bij, ook als de voeding wegvalt?

Fouten zijn het bewijs dat je het probeert..

In de subroutine Read_DS3231() doe je niks anders dan schrijven nooit lezen.

LDmicro user.
Arco

Special Member

is dat zo? Maar hoe hou je dan de datum bij, ook als de voeding wegvalt?

Backup batterij...

Er wordt wel gelezen ( i2c1_Wr(0xD1) ), maar verder geen data... (ik weet niet of die chip dat begrijpt...)

[Bericht gewijzigd door Arco op vrijdag 25 oktober 2019 18:08:51 (34%)

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

Ik veronderstel dat, als je de chip de opdracht geeft dat je iets gaat lezen dat je die data dan ook inleest.

LDmicro user.
Bavelt

Golden Member

Dat stond er ook, maar omdat het niet werkte heb ik alles wat even niet nodig was verder verwijderd.
Om dingen uit te sluiten.
Ik zou het al heel wat vinden als het programma gewoon doorloopt na de Read.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Backup batterij..

Ok..., maar dan nog moet je een kalendertje bouwen. Wellicht gebruik makend van de EEprom om de datum in vast te leggen. Of werken met dagnummers vanaf een bepaalde datum.

Tja...

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Je weet hoeveel dagen er in een maand zitten enz..., verder is 't alleen een kwestie van countertjes ophogen...
(enige iets lastige is schrikkeljaar en zomer/wintertijd, maar dan valt ook mee)
Meeste PIC24's (die ik meestal gebruik) hebben al een interne RTCC...

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

Golden Member

Meeste PIC24's (die ik meestal gebruik) hebben al een interne RTCC...

Noem er eens eentje, een populair en makkelijk te verkrijgen type?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ondertussen heb ik een PiC16F887 binnen. Daar kan ik natuurlijk ook eens mee gaan testen.
Wat me alleen een beetje tegenstaat is om na een probleem te snel te switchen naar een andere microcontroller.
Het liefste wil je natuurlijk weten waaróm het niet werkt. En als blijkt dat je tegen beperkingen aanloopt, dan weet je dat.
Wat is wijsheid..

Fouten zijn het bewijs dat je het probeert..

Je moet omgekeerd werken, eerst maken dat dat je alles uitgebreid kunt maken zonder teveel poespas (pin selectie enz..) daarna kun je reduceren indien nodig en kun je terugvallen op iets dat werkte (als je dit aan de praat krijgt natuurlijk) ;)

Edit:
Ik ben bv. bezig met een lichtflitser (2 x 210 leds) en het programma wordt op een 16F876a geschreven en ik heb maar 1 analoge en 2 pwm pinnen nodig.
De bedoeling is van dat in een 12F675 te steken, maar nu heb ik alle vrijheid, kom ik pinnen te kort dan neem ik een 16F88 enz...

[Bericht gewijzigd door MGP op vrijdag 25 oktober 2019 19:15:33 (36%)

LDmicro user.
Arco

Special Member

Noem er eens eentje, een populair en makkelijk te verkrijgen type?

Ik gebruik de PIC24FJ256GA106/108/110 vaak...
https://nl.farnell.com/search?st=pic24fj256ga1

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

@Bavelt, je hebt al onnoemelijk veel problemen met de 16Fxxxx reeks en je denkt al aan en 24Fxxx reeks, zoals ik al in het begin van dit topic schreef toen je die 16F1826 bestelde, als je een 16F8xx niet aan de praat krijgt zul je dat met een 24Fxxxx ook niet kunnen.

Straks smijt je nog de boel aan de kant en ga je gaan vissen ;)

LDmicro user.
Arco

Special Member

Bij zo'n probleem moet je jezelf daar inderdaad in vastbijten.
Als je het dan oplost geeft dat veel meer voldoening als opgeven en wat anders beginnen...

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

Golden Member

Bij zo'n probleem moet je jezelf daar inderdaad in vastbijten.
Als je het dan oplost geeft dat veel meer voldoening als opgeven en wat anders beginnen...

Dat is helemaal waar. Sterker nog: ik kan het heuglijke feit melden dat ik het voor elkaar heb. O-)
Wat heb ik gedaan?

Ik heb het project opnieuw van scratch aangemaakt en de werkende onderdelen uit vorige sessies er in opgenomen.

En nu gaat het dus wel goed.
Ik moet het programma nog wat verfraaien en als het klaar is zal ik het hier plaatsen!
Wellicht heeft een ander er dan ook wat aan.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Straks smijt je nog de boel aan de kant en ga je gaan vissen

Dat gebeurt niet zo gauw bij mij hoor, MGP. ;)

Maar er waren wel momenten bij dat ik dacht... jeetje :X

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Ik heb het project opnieuw van scratch aangemaakt en de werkende onderdelen uit vorige sessies er in opgenomen.

Nu nog uitzoeken wat het probleem veroorzaakte. Dan kun je dat in de toekomst vermijden...

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

Golden Member

Hier is mijn werkend programaatje.
Het is een elektronische deurbel dat een melodietje speelt op basis van de datum.

De Micro Controller: PIC16F1826
RTC: DS3231, module
Programmeertaal: Mikro Basic (versie 7.6.0)

De tonen zijn opgenomen in het Ram geheugen, daar is nog plaats. Alternatief: tonen in de EEPROM programmeren.
Tevens kan de datum/tijd met dit programma wordt geschreven in de RTC.

De schakelaar zit op Poort A6 (pin 15).

pic basic code:

'==============================================================================
Program Deurbel
'------------------------------------------------------------------------------
 'Notes       Frequency (Hz)
 Const E4  =  329
 Const G4  =  392
 Const A4h =  466
 Const C5  =  523
 Const C5h =  554
 Const D5  =  587
 Const D5h =  622
 Const E5  =  659
 Const F5  =  698
 Const G5  =  784
 Const B5a =  987
 Const C6  = 1047

'Midsomer Murders
 Const NOTE as WORD [25] = (D5h, D5, D5h,D5, C5,A4h, D5,  C5,D5h, G5, C6,B5a,  G5, F5,D5h,C5h,A4h,C5h, F5, G5, C5,D5h, D5, G4,  D5)
 Const DUR  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)

'Lang zal ze leven
 Const NOTE1 as WORD [19] = (C5,  0,  C5, 0,  C5, 0,  C5, 0, G4, 0,  E5, 0, E5, 0, E5, 0,  E5, 0,  C5)
 Const DUR1  as Word [19] = (500, 5, 200, 5, 200, 5, 500,10,700,5, 500,5,200,5,200,5, 500,10,750)

 Const PLUS as byte = 60                           'Extra vertraging, hiermee kan melodie trager worden afgespeeld)
 Dim Time  As Byte[7]
 Dim Toon As Byte

 Dim Switch1 as sbit at PORTA.6

'==============================================================================
Sub procedure Write_DS3231()                       'Write Date in RTC registers
'------------------------------------------------------------------------------
  i2c1_Start()
  i2c1_Wr(0xD0)
  i2c1_Wr(0x00)
  i2c1_Repeated_Start()
  i2c1_Wr(0xD0)
  
  i2c1_Wr(0x01)   'Seconds
  i2c1_Wr(0x20)   'Minutes
  i2c1_Wr(0x11)   'Hour
  i2c1_Wr(0x1)    'Daynr
  i2c1_Wr(0x13)   'Day
  i2c1_Wr(0x06)   'Month
  i2c1_Wr(0x19)   'Year
  i2c1_Stop()
End Sub

'==============================================================================
Sub procedure Read_DS3231()                         'Read Date in RTC registers
'------------------------------------------------------------------------------
  i2c1_Start()
  i2c1_Wr(0xD0)
  i2c1_Wr(0x00)
  i2c1_Repeated_Start()
  i2c1_Wr(0xD1)
  
  Time[0] = Bcd2Dec(i2c1_Rd(1))
  Time[1] = Bcd2Dec(i2c1_Rd(1))
  Time[2] = Bcd2Dec(i2c1_Rd(1)) And 0x3F
  Time[3] = Bcd2Dec(i2c1_Rd(1))
  Time[4] = Bcd2Dec(i2c1_Rd(1))
  Time[5] = Bcd2Dec(i2c1_Rd(1)) And 0x7F
  Time[6] = Bcd2Dec(i2c1_Rd(0))
  i2c1_Stop()
End Sub

Sub Procedure Midsomer
   For Toon = 0 to 24
     Sound_Play(Note[Toon], (Dur[Toon] + Plus))
   Next Toon
 End Sub

 Sub Procedure Verjaardag
   For Toon = 0 to 18
     Sound_Play(Note1[Toon], (Dur1[Toon] + Plus))
  Next Toon
 End sub

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

'==============================================================================
  ANSELB = 0                                    'All output/digital
  ANSELA = 0                                    '
  TRISA  = 0                                    '
  TRISB  = 0
  PORTA =  %11111111                            'Port A to high
  OSCCON = %11110000                            '32MHz internal

  i2c1_init(100000)                             'Init i2c port 100kHz
  Sound_Init(PORTB, 3)                          'Init Sound Port (B.3)
  Write_DS3231()

  While True                                    'Endless loop waiting for S1
   if Switch1 = 0 then
     delay_ms(20)                               'Delay for depressing disturb
     if Switch1 = 0 then
        Read_DS3231()                           'Read RTCC
        Delay_ms(100)
        if (Time[4] = 13) AND (Time[5] = 06) then
           Verjaardag()
        else
           Midsomer()
        end if
    Delay_ms(100)
    end if
  end if
  Wend

end. 
Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

@Arco, het werkt weliswaar, maar zie jij nog mogelijke verbeteringen voor het programma?
Daar houd ik me voor aanbevolen.
Daarbij had ik iets vreemds bij de declaratie

pic basic code:

Const B5a =  987 

Ik wilde B5 definiëren, maar de compiler gaf aan "Already declared".
Vandaar dat ik het maar B5a heb genoemd.

Is B5 soms een reserved word?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Is bij de 1826/27/47 al gedeclareerd in de include file (P16F1826.MBAS)

Weet je nu al wat het probleem veroorzaakte?

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

Golden Member

pic basic code:

 Weet je nu al wat het probleem veroorzaakte?

Nee, dan moet ik weer even terug naar het vorige spul.
Op een gegeven moment is na al het probeer-en uitzoekwerk het een rommeltje geworden.

In tegenstelling tot PicBasic kun je in MikroBasic niet zomaar even een programmaatje kopiëren en renamen begreep ik.

MB werkt met 'projects' waar na vertaling een heleboel in komt te staan.
Het gecompileerde programma krijgt ook de naam van het project, niet die van het programma.

Ik ben daarom nu maar overgestapt om voor iedere variant een project te maken met zijn eigen map.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Da's ook weer niet nodig. Wat ik altijd doe als ik een 'huidige versie' van een project wil bewaren is:
De .mbppi, .hex. .mbas files in een zipfile stoppen en die nummeren (bijv. deurbel_v100.zip, deurbel_V101.zip,...)
Kun je altijd de boel snel terugzetten...

Meer als die 3 files heb je niet nodig. (als je include files gemaakt hebt en gebruikt moeten die er ook bij)

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

Golden Member

Ik ben de hele morgen bezig geweest, maar kan niet meer herleiden waarom het de afgelopen tijd mis ging met het uitlezen van de RTC.
Als ik een nieuw project aanmaak en het vereenvoudigde programma er in
opneem, werkt het gewoon.
Zoals het hoort.. :)

Voortaan maak ik eerst backups als er iets niet werkt zodat ik nog kan 'trouble shooten'

Nu maar verder met de volgende uitdagingen.

Fouten zijn het bewijs dat je het probeert..

Wat ik niet begrijp in uw programma is hoe Mikrobasic de variabelen Time[1]..[6] vult met de juiste info uit die DS3231.

Geen enkele procedure in de I2C instructies die je gebruikt geeft die waarden terug, behalve als het fout gelopen is.

LDmicro user.
Lucky Luke

Golden Member

Op 26 oktober 2019 18:42:57 schreef Arco:
Da's ook weer niet nodig. Wat ik altijd doe als ik een 'huidige versie' van een project wil bewaren is:
De .mbppi, .hex. .mbas files in een zipfile stoppen en die nummeren (bijv. deurbel_v100.zip, deurbel_V101.zip,...)
Kun je altijd de boel snel terugzetten...

Meer als die 3 files heb je niet nodig. (als je include files gemaakt hebt en gebruikt moeten die er ook bij)

Of gebruik git...

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

In Read_DS3231() wordt de Time[] array met de 7 waardes gevuld... (de i2c1_rd() functie)

pic basic code:


'==============================================================================
Sub procedure Read_DS3231()                         'Read Date in RTC registers
'------------------------------------------------------------------------------
  i2c1_Start()
  i2c1_Wr(0xD0)
  i2c1_Wr(0x00)
  i2c1_Repeated_Start()
  i2c1_Wr(0xD1)
  
  Time[0] = Bcd2Dec(i2c1_Rd(1))
  Time[1] = Bcd2Dec(i2c1_Rd(1))
  Time[2] = Bcd2Dec(i2c1_Rd(1)) And 0x3F
  Time[3] = Bcd2Dec(i2c1_Rd(1))
  Time[4] = Bcd2Dec(i2c1_Rd(1))
  Time[5] = Bcd2Dec(i2c1_Rd(1)) And 0x7F
  Time[6] = Bcd2Dec(i2c1_Rd(0))
  i2c1_Stop()
End Sub
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com