PIC16F1826 met HD44780 en PicBasic

Arco

Special Member

Zal wel aan de i2c of lcd library liggen, niet aan de pic...
(als je de boel rechtstreeks aanstuurt zal 't wel werken...)

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

Golden Member

Op 3 oktober 2019 14:37:36 schreef Arco:
Zal wel aan de i2c of lcd library liggen, niet aan de pic...
(als je de boel rechtstreeks aanstuurt zal 't wel werken...)

Maar wat bedoel je met de LCD Libray, Arco?
Waar zit dat ding dan?

En 'rechtreeeks' aansturen, wat bedoel je daarmee? Niet met PICBasic?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

LCD library is in dit geval 'verpakt' in "PRINT AT"
(die zorgt er voor dat data uit strings of variabelen omgezet wordt in voor het display begrijpelijke data en controlesignalen...)

Ik kan eens kijken of ik hier een testfiletje in elkaar kan steken (kan het alleen niet testen)

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

Golden Member

Zou al heel wat zijn, Ik kan uiteraard testen.

Ik rol wel van het ene in het andere. Ik had hier nog een I2C Oled display liggen (128*32), nooit gebruikt.
Ik dacht dan gebruik ik die voor het tonen ipv de HD44780

Maar de I2C Scanner vindt geen adres bij dat ding. Dan valt er ook weinig aan te sturen lijkt me.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Op 3 oktober 2019 16:06:25 schreef Bavelt:
Zou al heel wat zijn, Ik kan uiteraard testen.

Ik rol wel van het ene in het andere. Ik had hier nog een I2C Oled display liggen (128*32), nooit gebruikt.
Ik dacht dan gebruik ik die voor het tonen ipv de HD44780

Maar de I2C Scanner (op de Arduino) vindt geen adres bij dat ding. Dat had 03C moeten zijn.
Dan valt er ook weinig aan te sturen lijkt me.

Fouten zijn het bewijs dat je het probeert..

pic basic code:

 PRINT AT 1,1, "Tijd: ", DEC2, Uren,  ":", DEC2 Minuten, ":", DEC2 Seconden
  PRINT AT 2,1, "Dat: ", DEC2, Datumdag ,  "/", DEC2 Maand,     "/", DEC2 Jaar

Kan het zijn dat je die lijnen niet goed hebt gekopieerd ;) de komma's staan niet juist na DEC2 van de uren en datumdag

LDmicro user.
Arco

Special Member

Even vlug in elkaar gestoken (lcd werkt in ieder geval)...

Lcd.hex

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

Golden Member

Kan het zijn dat je die lijnen niet goed hebt gekopieerd ;) de komma's staan niet juist na DEC2 van de uren en datumdag

Deze had ik idd gezien, MGP en gecorrigeerd.
Maar het is nog niet opgelost.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Even vlug in elkaar gestoken (lcd werkt in ieder geval)...

Ga ik morgen proberen, Arco. Bedankt. (de pinnen van de LCD staan op Poort A.0 t/m Poort A.4?

ik ben zelf iets verder in de analyse:
Ik heb de LCD verwijderd en toon de output nu via een MAX7219 module met LED Matrix. Daar kan ik mijn vorige oefening mooi bij gebruiken.

Dan heb ik maar 3 Pinnen nodig, de Latch, de Data en de Clock.

En dan natuurlijk de SDa en SCL van de RTC.

Ik toon de waarden seconden, minuten en uren digitaal in afzonderlijke kolommen, plus een tellertje in kolom 8 die laat zien of de loop werkt.
Wat blijkt: Het commando HBUSIN laat de zaak crashen, of er nu een DS3231 in zit of niet.
De MAX7219 toont na de eerste HBUSIN helemaal niks meer en het programma lijkt 'dood'.

Haal ik het commando HBUSIN weg, dan zie je de teller weer lopen.

Daar gebeurt dus toch iets raars...

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

D4=RA0, D5-RA1, D6=RA2, D7=RA3, RS=RB3, EN=RB2.
Als 'ie in de i2c vastloopt, gebeurt er iets 'onnatuurlijks' op de bus... (pull-ups niet goed, SDA/SCL omgedraaid, sluiting...)
Sourcecode (mikrobasic):

pic basic code:


'==============================================================================
program Lcd
'------------------------------------------------------------------------------
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(0x02)
  i2c1_Wr(0x08)
  i2c1_Wr(0x29)
  i2c1_Wr(0x01)
  i2c1_Wr(0x09)
  i2c1_Wr(0x19)
  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] = i2c1_Rd(1)
  Time[1] = i2c1_Rd(1)
  Time[2] = i2c1_Rd(1)
  Time[3] = i2c1_Rd(1)
  Time[4] = i2c1_Rd(1)
  Time[5] = i2c1_Rd(1)
  Time[6] = 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
  
  While True                                    'Endless display loop
    delay_ms(100)                               '
    Lcd_Cmd(_LCD_CLEAR)                         '
    Lcd_Cmd(_LCD_CURSOR_OFF)                    '
    Lcd_Out(1,1,"Tijd test......")              '
    Read_DS3231()                               'Read RTCC
    Delay_ms(2000)                              '
    ByteTostr (Time[0], Str)                    '
    Lcd_Out(2,1,"Sec:   " + Str)                '
    delay_ms(1000)                              '
    ByteTostr (Time[1], Str)                    '
    Lcd_Out(2,1,"Min:   " + Str)                '
    delay_ms(1000)                              '
    ByteTostr (Time[2], Str)                    '
    Lcd_Out(2,1,"Hour:  " + Str)                '
    delay_ms(1000)                              '
    ByteTostr (Time[3], Str)                    '
    Lcd_Out(2,1,"Day:   " + Str)                '
    delay_ms(1000)                              '
    ByteTostr (Time[4], Str)                    '
    Lcd_Out(2,1,"Date:  " + Str)                '
    delay_ms(1000)                              '
    ByteTostr (Time[5], Str)                    '
    Lcd_Out(2,1,"Month: " + Str)                '
    delay_ms(1000)                              '
    ByteTostr (Time[6], Str)                    '
    Lcd_Out(2,1,"Year:  " + Str)                '
    delay_ms(1000)                              '
  Wend                                          '
end.
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Als 'ie in de i2c vastloopt, gebeurt er iets 'onnatuurlijks' op de bus... (pull-ups niet goed, SDA/SCL omgedraaid, sluiting...)

Maar als ik het moduultje met de DS3231 er uit haal, dan is er helemaal niets meer aangesloten op de SDA en SCL bus.
Toch crasht het programma op het commando

HBUSIN %11010001 , 0 , [Seconden, Minuten, Uren , Dag, Datumdag , Maand, Jaar, Ctrl]

Er is iets met de poorten aan de hand. Zo heb ik getest dat bijvoorbeeld Poort B.6 niet meer werkt wanneer de MAX7219 wordt aangestuurd, terwijl die alleen de poorten B.2, B.3 en B.5 gebruikt.

Dat Poort B.6 niet meer werkt kan ik zien doordat de Toggle niet meer werkt (altijd laag).

Het is wel vreemd allemaal.

Fouten zijn het bewijs dat je het probeert..

Volgende week komt mijn DS3231 module binnen, had allang eens iets willen doen met "tijd", misschien kunnen we die samen aan de praat krijgen als het u intussen niet gelukt is.
Ook goed om mijn Picbasic kennis wat te verbeteren.

Op 4 oktober 2019 11:39:38 schreef Bavelt:
Het is wel vreemd allemaal.

Werkt de controller wel op 32Mhz (is alles goed ingesteld?)

LDmicro user.
Bavelt

Golden Member

Even vlug in elkaar gestoken (lcd werkt in ieder geval)...

Hulde!

Dit werkt inderdaad. De seconden op de display 'lopen'.
Als Datum komt hij met Day: 1, Date: 1, Month: 9 Year:25

Het jaartal in de klok is echter 16 (getest met de Arduino).

Het programma vertaalt deze 16 naar 25 (25 is de decimale waarde van HEX 16).
Daar gaat dus nog iets niet goed.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Op 4 oktober 2019 11:45:50 schreef MGP:
Volgende week komt mijn DS3231 module binnen, had allang eens iets willen doen met "tijd", misschien kunnen we die samen aan de praat krijgen als het u intussen niet gelukt is.
Ook goed om mijn Picbasic kennis wat te verbeteren.

[...]
Werkt de controller wel op 32Mhz (is alles goed ingesteld?)

Zou wel heel erg fijn zijn om dit samen met PICbasic aan de praat te krijgen, MGP!
Het programma dat Arco met Mikrobasic snel in elkaar flanste, werkt. Dat zou dan toch ook met PICbasic moeten kunnen, lijkt me.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Ik las alleen de waarde uit zonder bewerking (registers zijn bcd, en er zitten ook nog flags in als AM/PM)
Heb dat aangepast (bcd2dec en AND mask):

pic basic code:


'==============================================================================
program Lcd
'------------------------------------------------------------------------------
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(0x02)
  i2c1_Wr(0x08)
  i2c1_Wr(0x29)
  i2c1_Wr(0x01)
  i2c1_Wr(0x09)
  i2c1_Wr(0x19)
  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
  
  While True                                    'Endless display loop
    delay_ms(100)                               '
    Lcd_Cmd(_LCD_CLEAR)                         '
    Lcd_Cmd(_LCD_CURSOR_OFF)                    '
    Lcd_Out(1,1,"Tijd test......")              '
    Read_DS3231()                               'Read RTCC
    Delay_ms(2000)                              '
    ByteTostr (Time[0], Str)                    '
    Lcd_Out(2,1,"Sec:   " + Str)                '
    delay_ms(1000)                              '
    ByteTostr (Time[1], Str)                    '
    Lcd_Out(2,1,"Min:   " + Str)                '
    delay_ms(1000)                              '
    ByteTostr (Time[2], Str)                    '
    Lcd_Out(2,1,"Hour:  " + Str)                '
    delay_ms(1000)                              '
    ByteTostr (Time[3], Str)                    '
    Lcd_Out(2,1,"Day:   " + Str)                '
    delay_ms(1000)                              '
    ByteTostr (Time[4], Str)                    '
    Lcd_Out(2,1,"Date:  " + Str)                '
    delay_ms(1000)                              '
    ByteTostr (Time[5], Str)                    '
    Lcd_Out(2,1,"Month: " + Str)                '
    delay_ms(1000)                              '
    ByteTostr (Time[6], Str)                    '
    Lcd_Out(2,1,"Year:  " + Str)                '
    delay_ms(1000)                              '
  Wend                                          '
end.
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Bedankt Arco!
Ja, het werkt nu gewoon.

Het is heel fijn om nu te weten dat de PIC goed is, evenals de DS3231 module .
Alle aansluitingen zijn goed, zoals de SCL, SDA en geen kortsluting of andere grappen.

En dan nu terug naar PICBasic om te kijken waarom dat daar allemaal niet werkt.

Het wijst in de richting dat er iets mis is met het BUSIN commando, dan wel dat dit niet geschikt is voor het aansturen van een DS3231 met zijn I2C protocol.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik zou natuurlijk kunnen switchen naar MikroBasic. Zijn daar nog redelijke tutorials van te vinden?
Er zitten veel herkenbare dingen in MikroBasic, en zoals al gezegd met Visual Basic.NET 2010 kan ik goed omgaan, dus een dergelijke 'move' zou moeten lukken.

Fouten zijn het bewijs dat je het probeert..

Mikrobasic is niet zo gangbaar bij hobbyisten maar ze hebben wel mooie voorbeelden en libraries op hun website.
Ik zat mij ook af te vragen wat ik ging gebruiken omdat ik ook beiden heb maar ga voorlopig bij Protonbasic blijven alhoewel Mikrobasic het professioneler heeft aangepakt.

LDmicro user.
Arco

Special Member

Ik heb gekeken naar Picbasic, Mikrobasic, en Swordfish.
Ik vond Mikrobasic de beste mogelijkheden en ondersteuning hebben.
(ook niet onbelangrijk: ze hebben versies voor PIC/PIC24/PIC32/dsPIC/ARM/AVR/8051/FT900)

Nadelen van picbasic vond ik o.a.:
- Ontbreken van subroutines. (gosub/return is niet meer van deze tijd...)
- Onduidelijke functies en beschrijvingen.

Mikrobasic leesvoer: http://download.mikroe.com/documents/compilers/mikrobasic/pic/mikrobas…

[Bericht gewijzigd door Arco op vrijdag 4 oktober 2019 18:41:55 (10%)

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

Golden Member

Ondertussen heb ik de laatste versie van PicBasis en de Proton Compiler gedownload.
De hele avond al aan het prutsen maar krijg het niet neer werkend.
De compiler werkt en ik heb de Programmer gekoppeld (PicKit3) met de paramters:

- device$ -Fhex$ -filename$ - E -M -B -V4.75

Maar bij aanroep van de programmer zie je in een flits een Command scherm voorbijkomen. Maar gaat zó snel dat je niets kan lezen.
En weg is het scherm weer.
Heel frustrerend.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Gebruik het programma wat bij de pickit hoort, dan zie je wat er gebeurt...

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

Golden Member

Doe ik ook volgens mij: Pk3cmd.exe

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

c:\Program Files(x86)\Microchip\MPLABX\V5.25\mplab-platform\mplab_ipe\pk3cmd.exe om precies te zijn

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Nee, de stand-alone GUI: http://ww1.microchip.com/downloads/en/DeviceDoc/PICkit3%20Programmer%2…
De bijgeleverde pk2devicefile.dat vervangen door deze: https://www.circuitsonline.net/forum/file/33363
(zitten wat meer MCU's in....)

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

Golden Member

Dan krijg ik een melding "The PICkit3 is in MPLAB mode, Use the tools menu to download an OS compatible with this application"....

Kijk, de MPLABX IDE, versie 5.25 die is geïnstalleerd op de PC werkt.
Ik kan daar een HEX file importeren en de PIC programmeren via PROTON IDE / PickKit3 programmer. Maar dat is heel omslachtig. Eerst compileren en daarna importeren.

Ik kon steeds vanuit PROTON IDE een programma via F10 compileren en meteen overbrengen naar de programmer en het programma ging meteen lopen.

De aanroep vanuit de PROTON IDE (versie 3.7.2.7) naar MPLABX werkt nu dus niet meer, resulterend in een Dos-commandscreen van ca 10ms.

Fouten zijn het bewijs dat je het probeert..