Adres moet je altijd opgeven, anders ga je nooit antwoord krijgen...
Maar waar in je programmma staat dan dat adres (0x68) van de DS3231?
Golden Member
Adres moet je altijd opgeven, anders ga je nooit antwoord krijgen...
Maar waar in je programmma staat dan dat adres (0x68) van de DS3231?
Golden Member
Ik heb nu ook even een trial versie van MikroBasic Pro geïnstalleerd, Arco.
Maar ik krijg errors bij het compileren van je programma (LCD) omdat er een aantal zaken mist
(Programma heb ik Ds32311826 genoemd)
1 1015 Hint: Compiling unit "C:\Pic\TestSpul\Ds32311826.mbas" Ds32311826.mbas
26 303 Identifier "i2c1_Start" was not declared Ds32311826.mbas
26 303 Identifier "i2c1_Start" was not declared Ds32311826.mbas
26 304 Syntax error: Expected "end" but "i2c1_Start" found Ds32311826.mbas
26 304 Syntax error: Expected "sub" but "(" found Ds32311826.mbas
26 304 Syntax error: Expected "end" but ")" found Ds32311826.mbas
27 304 Syntax error: Expected "." but "i2c1_Wr" found Ds32311826.mbas
0 102 Finished (with errors): 06 okt 2019, 01:35:01 Ds32311826.mbppi
@Arco, ik zal er maar vanuitgaan dat je gelijk hebt want ik weet er te weinig over en alles wat ik weet is door datasheets te lezen.
Heb geen enkele ervaring in I2C, SPI, Picbasic ... maar we gaan dat leren in de toekomst
Special Member
Golden Member
Ah, dank je Arco.
Ik zag inmiddels ook dat je in de Library manager 'Conversion, moet aanvinken voor Bcd2Dec.
Wel een heel uitgebreid pakket, dat MikroBasic moet ik zeggen. Compleet met debugger.
Zal nog wel wat uurtjes stoeien worden, vermoed ik.
Special Member
Bij een error (met rode golfjes eronder) of gewoon een functienaam kun je altijd de cursor erop zetten en F1 drukken.
Als het een bestaande functie is, krijg je in de help te zien in welke library hij zit en hoe 'ie werkt.
Het 'messages' window van de compiler zet ik altijd bij de library manager, en de 'quick converter' sluit ik.
Dan heb je een stuk meer ruimte voor code op het scherm. (je junt alle windows met de muis beetpakken en verplaatsen naar een ander frame)
Je moet wel een andere layout kiezen als 'Default', want die kan niet veranderd worden. Ik heb 'MaxCode', na verplaatsen op 'Save layout' drukken.
Golden Member
Vertalen met MikroBasic lukt, Arco. Het resulteert in een Hex file.
Die wordt keurig opgepakt door PicKit 3.10 en automatisch in de PIC geprogrammeerd (alhoewel het ook mogelijk moet zijn om rechtstreeks vanuit MikroBasic te programmeren las ik, zoek ik nog uit).
De hexfile geeft echter een ander resultaat dan die ik van jou (Arco) kreeg; op de display wordt nl niets getoond.
Wellicht is daar nog iets extra's voor nodig? Vinkje, library?
(ik heb beide Hex files vergeleken en ze lijken 'bijna' op elkaar. Maar in dat 'bijna' zit hem hem natuurlijk... )
Special Member
Golden Member
Ik heb ingesteld zoals je opgaf en het werkt allemaal, Arco.
Was ik alleen niet uitgekomen. Heel erg fijn dat je zo snel respons geeft!
Golden Member
Ik ben wat aan het spelen geslagen met MikroBasic. En heb het programmaatje om datum en tijd te zetten en te tonen met de PIC16F1826 en RTC DS3231 wat gewijzigd (post ik later).
Er valt me een aantal dingen op in MB, als ik dat vergelijk met bv VB.NET:
- De Editor laat niet zien of hij variabelen of procedures kent. In VB wordt dat bij intypen direct getoond doordat ze dan worden opgemaakt zoals je ze hebt gedefinieerd. (bv 1e letter hoofdletter).
- Bij een While-Wend of andere elementen die bij elkaar horen, springt VB vanzelf netjes in. Dat zie ik hier niet en moet je oplossen door spaties voor de instructies te kloppen, wil je het netjes opmaken.
- Je mag blijkbaar geen expressie toekennen aan een variabele (string).
Zo wilde ik bijvoobeeld:
Dim Res as string
Res = BytoTostr (Time[0], str) opgeven.
Mag niet van de compiler.
Maar wellicht is het allemaal wel in te stellen.
Special Member
Mag niet van de compiler.
Maar goed ook!...
ByteToStr(Byte,String) is een gewone sub die geen waarde teruggeeft (een Functie doet dat wel).
Tekst wordt teruggegeven in de parameter 'String'.
Als je een functie zou hebben die een string teruggeeft, kun je die zo aan een string toekennen.
Als de editor een sub/functie of variabele niet kent komt er een rood golflijntje onder.
Auto-indent kan volgens mij wel, maar ik heb daar nooit naar gekeken (ik vind dat gruwelijk)
Golden Member
Hier is het (aangepaste) MikroBasic programma voor het zetten EN tonen van datum en tijd in een PIC16F1826 met een RTC DS3231.
[code="MikroBasic"] '==============================================================================
program Ds32311826
'------------------------------------------------------------------------------
dim LCD_RS as sbit at LATB3_bit
LCD_EN as sbit at LATB2_bit
LCD_D4 as sbit at LATA0_bit
LCD_D5 as sbit at LATA1_bit
LCD_D6 as sbit at LATA2_bit
LCD_D7 as sbit at LATA3_bit
dim LCD_RS_Direction as sbit at TRISB3_bit
LCD_EN_Direction as sbit at TRISB2_bit
LCD_D4_Direction as sbit at TRISA0_bit
LCD_D5_Direction as sbit at TRISA1_bit
LCD_D6_Direction as sbit at TRISA2_bit
LCD_D7_Direction as sbit at TRISA3_bit
dim Time As Byte[7]
Str As String[3]
'==============================================================================
Sub procedure Write_ds3231() 'Write RTCC registers
'------------------------------------------------------------------------------
i2c1_Start()
i2c1_Wr(0xD0)
i2c1_Wr(0x00)
i2c1_Repeated_Start()
i2c1_Wr(0xD0)
i2c1_Wr(0x01)
i2c1_Wr(0x59)
i2c1_Wr(0x23)
i2c1_Wr(0x25)
i2c1_Wr(0x31)
i2c1_Wr(0x12)
i2c1_Wr(0x99)
i2c1_Stop()
End Sub
'==============================================================================
Sub procedure Read_DS3231() 'Read RTCC 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
'==============================================================================
main:
'==============================================================================
ANSELB = 0 'All output/digital
ANSELA = 0 '
TRISA = 0 '
TRISB = 0 '
OSCCON = %11110000 '32MHz internal
i2c1_init(100000) 'Init i2c port 100kHz
Lcd_Init() '
Write_DS3231() 'Write values to RTCC
Lcd_Cmd(_LCD_CLEAR)
Lcd_Cmd(_LCD_CURSOR_OFF)
While True 'Endless display loop
Read_DS3231() 'Read RTCC
Delay_ms(100)
ByteTostr (Time[6], Str)
ltrim( Str)
LCD_Out(1,15, Str)
ByteTostr (Time[5], Str)
LCD_Out(1,11, Str + "-")
ByteTostr (Time[4], Str)
LCD_Out(1,8, Str + "-")
LCD_Out(1,1, "Datum:")
ByteTostr (Time[0], Str)
LCD_Out(2,14, Str)
ByteTostr (Time[1], Str)
LCD_Out(2,11, Str + ":")
ByteTostr (Time[2], Str)
LCD_Out(2,8, Str + ":")
LCD_Out(2,1, "Tijd:")
delay_ms(1000) '
Wend '
[/code]
De sub 'ByteToStr' is "right justified". Oftewel er worden spaties vóór de karakters geplaatst. Dat betekent wel even opletten wanneer je waardes op het display toont.
Het beste is dan om deze "van achteren naar voren" te plaatsen. OF gebruik maken van Ltrim (kost wel weer meer instructies).
Het programma werkt. Ik moet alleen nog uitzoeken hoe je de nulonderdrukking uitzet (dus '01' tonen ipv '1').
En er zit nog iets raars, wanneer je de datum 31-12-99 zet, dan is na 23:59:59 de nieuwe datum 1-81-09. Daar loopt dus iets uit de pas.
Special Member
[Code=mikrobasic] tags bestaan niet helaas, dus die werken ook niet...
De rare datum bij eeuwwisseling heeft te maken met het Century bit in het 'month' register...
Golden Member
Nou, voor die eeuwwisseling wacht ik wel 89 jaar en kijk er dan wel even naar..
Ik zit even te kijken naar het I2C gebeuren,
pic basic code:
'==============================================================================
Sub procedure Write_ds3231() 'Write RTCC registers
'------------------------------------------------------------------------------
i2c1_Start()
i2c1_Wr(0xD0)
i2c1_Wr(0x00)
i2c1_Repeated_Start()
i2c1_Wr(0xD0)
i2c1_Wr(0x01)
i2c1_Wr(0x59)
i2c1_Wr(0x23)
i2c1_Wr(0x25)
i2c1_Wr(0x31)
i2c1_Wr(0x12)
i2c1_Wr(0x99)
i2c1_Stop()
End Sub
Ik vroeg me af: Waarom de eerste drie instructies? Je schrijft 0xD0 en 0x00 weg (lezen), en met repeated-Start wordt dat nog eens overgedaan (maar dan om te schrijven). Waarom niet meteen schrijven?
Op 6 oktober 2019 01:39:54 schreef Bavelt:
Ik heb nu ook even een trial versie van MikroBasic Pro geïnstalleerd.
Zit je nog altijd niet aan die 2k codebeperking?
Golden Member
Zit je nog altijd niet aan die 2k codebeperking?
Nee, geen melding over gehad. Misschien komt dat nog. Of ik zit beneden de 2K.
Ik heb een 'free Version' gedownload.
Eerst maar eens kijken of dit bevalt. Als ik tegen beperkingen ga aanlopen en het bevalt, dan ga ik het (volledige) pakket aanschaffen.
Ik zie wel dat MikroBasic een stuk uitgebreider is dan PicBasic.
(maar kost ook wel weer tijd om in te verdiepen).
Special Member
Code limit voor demo versie is 4k(word)...
De eerste drie i2c bytes zijn de normale manier om bij een ic2 ic de interne registerpointer in te stellen (in dit geval op '0')
code:
Read van bus:
start 'Start
slave adres + write 'Zend slave adress (altijd een write)
register adres 'Interne register adres
restart 'Bus restart
slave adres + read 'Omschakelen naar read
data in 'Data lezen
... '
data in '
stop 'Einde
Ik weet niet zeker of de DS3231 dat ook kan (zelfs na een paar keer de datasheet lezen blijft het duister...)
(er staat een fig.5 in waarin ze dat doen, maar die fig.5 komt nergens in de datasheet ter sprake...)
pic basic code:
Symbol DSWrite = %11010000
Symbol DSRead = %11010001
Symbol cSec = 0
Symbol cMin = 1
Symbol cHou = 2
Symbol cDayNum = 3
Symbol cDay = 4
Symbol cMon = 5
Symbol cYea = 6
Symbol cA1M1 = 7
Symbol cA1M2 = 8
Symbol cA1M3 = 9
Symbol cA1M4 = 10
Symbol cA2M2 = 11
Symbol cA2M3 = 12
Symbol cA2M4 = 13
Symbol cControl= 14
Symbol cStatus = 15
Symbol cAge = 16
Symbol cTempH = 17
Symbol cTempL = 18
WriteAreg:
HBStart
HBusOut DSWrite
HBusOut aReg
HBusOut DSData[aReg]
HBStop
Return
ReadAreg:
HBStart
HBusOut DSWrite
HBusOut aReg
HBStop
DelayMS 20
HBStart
HBusOut DSRead
DSData[aReg] = HBusIn
HBusNack
HBStop
Return
Je moet eerst met WriteAReg de waarden in de registers van de DS3231 zetten.
Daarna kun je ze met ReadAReg uitlezen.
Dit is overigens gewoon werkende code.
[Bericht gewijzigd door Henry S. op dinsdag 8 oktober 2019 21:48:02 (0%)
Golden Member
Dit is overigens gewoon werkende code.
Echter:
areg en dsdata zijn niet gedefiniëerd.
Ik heb ze maar toegevoegd en gedefinieerd als Byte.
De compiler geeft voorts een error op:
dsdata[areg] = HBUSIN
Melding:
pic basic code:
"Assignment Operator '=' missing
Op 7 oktober 2019 11:45:05 schreef Arco:
Code limit voor demo versie is 4k(word)...
Dat is toch al de moeite, had ergens gelezen dat het maar 2K was.
Special Member
Die 2k was bij een hele oude versie van 2013 en eerder...
Golden Member
Op 7 oktober 2019 12:23:40 schreef Je moet eerst met WriteAReg de waarden in de registers van de DS3231 zetten.
Daarna kun je ze met ReadAReg uitlezen.
Dit is overigens gewoon werkende code.
@Hadv: Ik heb areg en dsdata als volgt gedefinieerd en krijg geen compilatie-errors meer:
pic basic code:
DIM areg AS BYTE
DIM dsdata[5] AS BYTE
Maar krijg niks op het display te zien.
Is de definitie van de velden fout?
Op 7 oktober 2019 13:11:41 schreef Bavelt:
[...]Echter:
areg en dsdata zijn niet gedefiniëerd.Ik heb ze maar toegevoegd en gedefinieerd als Byte.
De compiler geeft voorts een error op:
dsdata[areg] = HBUSINMelding:
pic basic code:
"Assignment Operator '=' missing
Areg is idd een byte, dsdata is een array van 19 bytes
Dat je nix op je scherm krijgt is heel iets anders, deze code is puur voor de communicatie met de DS3231
Harm
[Bericht gewijzigd door hadv op dinsdag 8 oktober 2019 12:51:26 (12%)
Golden Member
Ik neem aan dat de instructie
pic basic code:
SYMBOL cSec = 0
moet worden aangepast in :
pic basic code:
SYMBOL cSec = dsdata[0]
.
(En alle anderen ook t/m 18)
Anders zou dsdata niet zijn gevuld.
Toch?
Je moet eerst met WriteAReg de waarden in de registers van de DS3231 zetten.
Maar welke areg waarden horen nu bij de WriteAreg en ReadAreg?.
In het voorbeeld zijn deze nl ook niet gevuld.
Golden Member
pic basic code:
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
Waarom staan die And 0x3F en 0x7F erbij, Arco?
Ik probeer de datasheet van de DS3231 te doorgronden i.c.m. de code.
Maar kom er nog niet echt uit hoe het nu precies zit.