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?
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?
In de subroutine Read_DS3231() doe je niks anders dan schrijven nooit lezen.
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%)
Ik veronderstel dat, als je de chip de opdracht geeft dat je iets gaat lezen dat je die data dan ook inleest.
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.
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...
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...
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?
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..
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%)
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
@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
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...
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.
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.
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
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...
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.
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?
Special Member
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.
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)
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.
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.
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...
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