PIC16F1826 met HD44780 en PicBasic

Bavelt

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?

Fouten zijn het bewijs dat je het probeert..
Bavelt

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

Fouten zijn het bewijs dat je het probeert..

@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 ;)

LDmicro user.
Arco

Special Member

In library manager 'i2c' aanvinken...
 

 

Maar waar in je programmma staat dan dat adres (0x68) van de DS3231?

 

 

D0 is 0x68+WR(0) , D1 = 0x68+RD(1)

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

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.

Fouten zijn het bewijs dat je het probeert..
Arco

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.

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

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... )

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Er staat waarschijnlijk bij Project -> Edit Project wat verkeerd:

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

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!

Fouten zijn het bewijs dat je het probeert..
Bavelt

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.

Fouten zijn het bewijs dat je het probeert..
Arco

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)

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

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.

Fouten zijn het bewijs dat je het probeert..
Arco

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...

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

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?

Fouten zijn het bewijs dat je het probeert..

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?

LDmicro user.
Bavelt

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).

Fouten zijn het bewijs dat je het probeert..
Arco

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...)

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

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%)

Just find out what you like and let it kill you
Bavelt

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 
Fouten zijn het bewijs dat je het probeert..

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.

LDmicro user.
Arco

Special Member

Die 2k was bij een hele oude versie van 2013 en eerder...

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

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?

Fouten zijn het bewijs dat je het probeert..

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] = HBUSIN

Melding:

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%)

Just find out what you like and let it kill you
Bavelt

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.

Fouten zijn het bewijs dat je het probeert..
Bavelt

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.

Fouten zijn het bewijs dat je het probeert..