klok pic16f628

Arco

Special Member

De 16f877 is ook al zo'n museumstuk van ruim 20 jaar oud... ;) (er zit niet eens een interne oscillator in)
Als je een 40 pinner wilt, de 16F1939 is pin compatible met de 877(a)

Alle 20 pinners zijn trouwens minstens in DIP, SOIC, en SSOP te krijgen (dus ook de 1827)
Vroeger had Conrad veel, maar dat neemt helaas in rap tempo af. (bestelde er vroeger vaak, maar nu hebben ze driekwart van wat ik nodig heb niet meer)

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

In deze link staat er onderaan (3de laatste post) iets wat je zou kunnen gebruiken.
Let op het zijn allemaal subroutines en geen bruikbaar programma, dat moet je zelf schrijven en dat begint na de laatste regel.
In de eerste regel jump (goto) je naar de laatste regel waar uw programma begint.

Je zult nog wat werk hebben om dat allemaal uit te pluizen en ik weet niet of je al zover gevorderd bent ;)

Ik heb van het txt bestand al een basic bestand gemaakt maar lees zeker eens dat bericht.
Je moet daar een include (pbp) file van maken (save as) en in uw programma verwerken.

LDmicro user.
Bavelt

Golden Member

Dank MGP,

Ik had het bericht dat je aanhaalt inderdaad al gelezen, maar ik kreeg het niet voor elkaar om dit om te zetten naar PICBasic.

Ook nu niet; het is blijkbaar geschreven in een andere variant van BASIC die ik niet zo goed kan thuisbrengen.

Bijvoorbeeld de declaratie van de constante

"AL1_OpS CON %00001111 'once per second"

geeft de melding "No Proton syntax. Use DIM or Symbol instaed"

Wanneer ik dat probeer (in allerlei varianten) gaat het mis bij de waarden "%00001111".

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Waarschijnlijk heb ik net te snel gepost.
Ik kan inmiddels de declaraties omzetten naar PIC Basic. En dat is al aardig wat, scheelt heel veel errors bij het compileren...

Het ziet er nu zo uit:

pic basic code:

 
'****************************************************************
'*  Name    : ..\_INCLUDE\DS3231.PBP                            *
'*  test met PIC16F628A en RTC                                  *
'****************************************************************

GOTO OverDS3231

'ToDo: Alias pins
SYMBOL RTC_SDA PORTA.4
SYMBOL RTC_SCL PORTA.5


'------------ Const -------------------------
SYMBOL AL1_OpS   %00001111  'once per second
SYMBOL AL1_S        %00001110  'when seconds match
SYMBOL AL1_MS       %00001100  'when minutes and seconds match
SYMBOL AL1_HMS      %00001000  'when hours, minutes and seconds match
SYMBOL AL1_DtHMS    %00000000  'when DATE, hours, minutes and seconds match
SYMBOL AL1_DayHMS    %00010000  'when DAY, hours, minutes and seconds match
                   
SYMBOL AL2_OpM       %00001110  'once per minute
SYMBOL AL2_M         %00001100  'when minutes match
SYMBOL AL2_HM        %00001000  'when hours and minutes match
SYMBOL AL2_DtHM      %00000000  'when DATE, hours and minutes match
SYMBOL AL2_DayHM     %00010000  'when DAY, hours and minutes match


'------------ Variables -------------------------

DIM RTCYear AS  BYTE
DIM RTCMonth AS BYTE
DIM RTCDate  AS BYTE
DIM RTCDay   AS BYTE
DIM RTCHour  AS BYTE
DIM RTCMin   AS BYTE
DIM RTCSec   AS BYTE
DIM RTCCtrl  AS BYTE
DIM HexValue AS BYTE
DIM DecValue AS BYTE
DIM I2C_Adr  AS BYTE
DIM I2C_Flags AS BYTE
SYMBOL I2C_NACK  I2C_Flags.0

'General Register variable
DIM RTC_Reg AS BYTE

'Aliases for Control Register @ $0E
'EOSC BBSQW CONV RS2 RS1 INTCN A2IE A1IE
SYMBOL RTC_EOsc    RTC_Reg.7   'Enable Oscillator
SYMBOL RTC_BBSQW   RTC_Reg.6   'Battery-Backed Square-Wave Enable
SYMBOL RTC_CONV    RTC_Reg.5   'Convert Temperature
SYMBOL RTC_RS2     RTC_Reg.4   'Rate Select
SYMBOL RTC_RS1     RTC_Reg.3   'Rate Select
SYMBOL RTC_INTCN   RTC_Reg.2   'Interrupt Control
SYMBOL RTC_A2IE    RTC_Reg.1   'Alarm 2 Interrupt Enable
SYMBOL RTC_A1IE    RTC_Reg.0   'Alarm 1 Interrupt Enable

'Aliases for Status Register @ $0F
'OSF x x x EN32kHz BSY A2F A1F
SYMBOL RTC_OSF     RTC_Reg.7   'Oscillator Stop Flag
SYMBOL RTC_EN32kHz RTC_Reg.3   'Enable 32kHz Output
SYMBOL RTC_BSY     RTC_Reg.2   'Busy
SYMBOL RTC_A2F     RTC_Reg.1   'Alarm 2 Flag
SYMBOL RTC_A1F     RTC_Reg.0   'Alarm 1 Flag


' Set initial time to 2014-01-01 8:02:01, day 4
'RTCYear = $14
'RTCDay = $04
'RTCMonth = $01
'RTCDate = $01
'RTCHour = $08
'RTCMin = 2
'RTCSec = 1
'Gosub SetTime   ' Set the time

' Subroutine to write time to RTC
SetTime:

    I2C_NACK = 0
    I2C_Adr = $00
    I2CWrite RTC_SDA, RTC_SCL, $D0, I2C_Adr, [RTCSec, RTCMin, RTCHour, RTCDay, RTCDate, RTCMonth, RTCYear], I2CNACK

    RETURN

' Subroutine to read time from RTC
GetTime:

    I2C_NACK = 0
    I2C_Adr = $00
    I2CRead RTC_SDA, RTC_SCL, $D0, I2C_Adr, [RTCSec, RTCMin, RTCHour, RTCDay, RTCDate, RTCMonth, RTCYear], I2CNACK

    RETURN


SetAlarm1:

    'Usage:
    '
    '       set values to RTCSec, RTCMin, RTCHour, [RTCDay | RTCDate]
    '
    '       RTC_Reg = AL1_HMS     'Set alarm type
    '       gosub SetAlarm1
'    HSEROUT2 ["Alarm1 at: ", hex2 RTCDate, " ", hex2 RTCHour, ":", hex2 RTCMin, ":", hex2 RTCSec, 13, 10]
    'HSEROUT2 ["RTC_Reg = ", bin8 RTC_Reg, 13, 10]
    I2C_Adr = $07
    I2C_NACK = 0 
        
    RTCSec.7 = RTC_Reg.0    'A1M1
    RTCMin.7 = RTC_Reg.1    'A1M2
    RTCHour.7 = RTC_Reg.2   'A1M3
    
    'Test A1M4
    IF RTC_Reg.3 = 1 THEN
        'alarm by time only

        'Get the alarm1 date 
'        I2C_Adr = $0A
'        I2CRead SDA, RTC_SCL, $D0, I2C_Adr, [RTCDate], I2CNACK

        RTCDate.7 = RTC_Reg.3   'A1M4
        RTCDate.6 = 0           'DY/DT!

        I2CWrite RTC_SDA, RTC_SCL, $D0, I2C_Adr, [RTCSec, RTCMin, RTCHour, RTCDate], I2CNACK
'        HSEROUT2 ["alarm1 by time only", 13, 10]
        'HSEROUT2 [" at: ", bin8 RTCDate, " ", bin8 RTCHour, ":", bin8 RTCMin, ":", bin8 RTCSec, 13, 10]
        
    ELSE
        'alarm by time and (DAY or DATE)

            
        IF RTC_Reg.4 = 1 THEN
            'alarm by DAY
            RTCDay.7 = 0    'A1M4
            RTCDay.6 = 1    'DY/DT!
            I2CWrite RTC_SDA, RTC_SCL, $D0, I2C_Adr, [RTCSec, RTCMin, RTCHour, RTCDay], I2CNACK
'            HSEROUT2 ["alarm1 by DAY", 13, 10]
            'HSEROUT2 [" at: ", bin8 RTCDay, " ", bin8 RTCHour, ":", bin8 RTCMin, ":", bin8 RTCSec, 13, 10]
        ELSE
            'alarm by DATE
            RTCDate.7 = 0   'A1M4
            RTCDate.6 = 0   'DY/DT!
            I2CWrite RTC_SDA, RTC_SCL, $D0, I2C_Adr, [RTCSec, RTCMin, RTCHour, RTCDate], I2CNACK
'            HSEROUT2 ["alarm1 by DATE", 13, 10]
            'HSEROUT2 [" at: ", bin8 RTCDate, " ", bin8 RTCHour, ":", bin8 RTCMin, ":", bin8 RTCSec, 13, 10]
    
        ENDIF

    ENDIF

    
    
    RETURN


SetAlarm2:

    'Usage:
    '
    '       set values to RTCMin, RTCHour, [RTCDay | RTCDate]
    '
    '       RTC_Reg = AL1_HMS     'Set alarm type
    '       gosub SetAlarm2
'    HSEROUT2 ["Alarm2 at: ", hex2 RTCDate, " ", hex2 RTCHour, ":", hex2 RTCMin, 13, 10]
    I2C_Adr = $0B
    I2C_NACK = 0 
        
    RTCMin.7 = RTC_Reg.1    'A1M2
    RTCHour.7 = RTC_Reg.2   'A1M3
    
    'Test A1M4
    IF RTC_Reg.3 = 1 THEN
        'alarm by time only

        RTCDate.7 = RTC_Reg.3   'A1M4
        RTCDate.6 = 0           'DY/DT!

        I2CWrite RTC_SDA, RTC_SCL, $D0, I2C_Adr, [RTCMin, RTCHour, RTCDate], I2CNACK
'        HSEROUT2 ["alarm2 by time only", 13, 10]
'        HSEROUT2 [" at: ", bin8 RTCDate, " ", bin8 RTCHour, ":", bin8 RTCMin, 13, 10]
        
    ELSE
        'alarm by time and (DAY or DATE)
            
        IF RTC_Reg.4 = 1 THEN
            'alarm by DAY

            RTCDay.7 = 0    'A1M4
            RTCDay.6 = 1    'DY/DT!
            I2CWrite RTC_SDA, RTC_SCL, $D0, I2C_Adr, [RTCMin, RTCHour, RTCDay], I2CNACK
'            HSEROUT2 ["alarm2 by DAY", 13, 10]
'            HSEROUT2 [" at: ", bin8 RTCDay, " ", bin8 RTCHour, ":", bin8 RTCMin, 13, 10]
        ELSE
            'alarm by DATE
            RTCDate.7 = 0   'A1M4
            RTCDate.6 = 0   'DY/DT!
            I2CWrite RTC_SDA, RTC_SCL, $D0, I2C_Adr, [RTCMin, RTCHour, RTCDate], I2CNACK
'            HSEROUT2 ["alarm2 by DATE", 13, 10]
'            HSEROUT2 [" at: ", bin8 RTCDate, " ", bin8 RTCHour, ":", bin8 RTCMin, 13, 10]
    
        ENDIF

    ENDIF

    
    
    RETURN


'GetAlarm1:
'    I2C_Adr = $07
'    I2CRead RTC_SDA, RTC_SCL, $D0, I2C_Adr, [RTCSec, RTCMin, RTCHour, RTCDay, RTCDate], I2CNACK
    
'    RETURN


ReadControlRegister:

    I2C_Adr = $0E
    I2C_NACK = 0     
    I2CRead RTC_SDA, RTC_SCL, $D0, I2C_Adr, [RTC_Reg], I2CNACK

    RETURN

 WriteControlRegister:

    I2C_Adr = $0E
    I2C_NACK = 0     
    I2CWrite RTC_SDA, RTC_SCL, $D0, I2C_Adr, [RTC_Reg], I2CNACK

    RETURN

ReadStatusRegister:

    I2C_Adr = $0F
    I2C_NACK = 0     
    I2CRead RTC_SDA, RTC_SCL, $D0, I2C_Adr, [RTC_Reg], I2CNACK

    RETURN

WriteStatusRegister:

    I2C_Adr = $0F
    I2C_NACK = 0     
    I2CWrite RTC_SDA, RTC_SCL, $D0, I2C_Adr, [RTC_Reg], I2CNACK

    RETURN

I2CNACK:

    I2C_NACK = 1
    RETURN


Hex2BCD:

    DecValue = 10 * (HexValue >> 4)
    DecValue = DecValue + (HexValue & $0F)

    RETURN

BCD2Hex:

    HexValue = (DecValue DIG 0) + ((DecValue DIG 1) << 4)

    RETURN

OverDS3231:  

Wat blijft is:

[Bericht gewijzigd door Bavelt op zondag 22 september 2019 11:35:13 (95%)

Fouten zijn het bewijs dat je het probeert..
Lambiek

Special Member

Op 21 september 2019 14:02:55 schreef Bavelt:
Heb je toevallig die code nog?

Ik wil nl een DS3231 RTC koppelen aan een PIC16F628A

Ik heb wel iets voor een DS1307.

pic basic code:


Device 16F887                               ; Processor type
 
Xtal 10                                     ; Cristal 10Mhz
 
Asm                                         ; Config settings
CONFIG_REQ            
__CONFIG _CONFIG1, HS_OSC & WDT_OFF & DEBUG_OFF & FCMEN_OFF & LVP_OFF & IESO_OFF & BOR_OFF & CPD_OFF & CP_OFF & MCLRE_OFF & PWRTE_ON 
__CONFIG _CONFIG2, WRT_OFF & BOR40V 
EndAsm
 
All_Digital true                  ; Alle poorten digitaal
 
Declare LCD_RSPin PORTD.2         ; Reset display poort D.2
Declare LCD_ENPin PORTD.3         ; Enable display poort D.3
Declare LCD_DTPin PORTD.4         ; Data display poort D.4 t/m D.7
 
Declare SCL_Pin PORTC.3           ; I2C klok pin
Declare SDA_Pin PORTC.4           ; I2C data pin
Declare I2C_SLOW_BUS 1            ; I2C bus op 100KHz
 
Symbol MODE_KNOP  = PORTA.0       ; Ingang select uur, minuut, seconde
Symbol KNOP_OP    = PORTA.1       ; Ingang optellen uur, minuut, seconde
Symbol KNOP_NEER  = PORTA.2       ; Ingang aftellen uur, minuut, seconde
 
Dim SECONDE As Byte               ; Variabele seconde
Dim MINUUT As Byte                ; Variabele minuut
Dim UUR As Byte                   ; Variabele uur
 
Dim DUMMY As Byte                 ; Variabele dummy
 
Dim MODE As Byte                  ; Variabele mode
 
Cls                               ; Wis display
 
DelayMS 500                       ; Pauze 0.5 sec 
 
Clear                             ; Wis geheugen
 
 
         ;543210                  ; Hulpregel poort A
PORTA  = %000000                  ; Maak poort A laag
TRISA  = %111111                  ; Poort_A I/O
 
         ;543210                  ; Hulpregel poort B
PORTB  = %000000                  ; Maak poort B laag
TRISB  = %000000                  ; Poort_B I/O
 
         ;76543210                ; Hulpregel poort C
PORTC  = %00000000                ; Maak poort C laag
TRISC  = %00000000                ; Poort_C I/O
 
         ;76543210                ; Hulpregel poort D
PORTD  = %00000000                ; Maak poort D laag
TRISD  = %00000000                ; Poort_D I/O
 
         ;210                     ; Hulpregel poort E 
PORTE  = %000                     ; Maak poort E laag
TRISE  = %111                     ; Poort_E I/O
 
         ;76543210                ; Hulpregel analoog
ADCON0 = %00000001                ; ADCON0 register analoog
 
         ;543210                  ; Hulpregel analoog poort_B
ANSELH = %000000                  ; ANSEL register analoog poort_B
 
;------------------------------------
; LEZEN EN SCHRIJVEN NAAR DE DS1307.
;------------------------------------
 
BStart                            ; Bus start
BusIn %11010001,0,[SECONDE]       ; Lees seconde + bit7 (is osc. aan/uit)
DelayMS 10                        ; Wacht 10ms
Clear SECONDE.7                   ; Zet oscillator aan
BusOut %11010000,[SECONDE]        ; Schrijf naar rtc
DelayMS 10                        ; Wacht 10ms
BusIn %11010001,2,[UUR]           ; Lees uur
DelayMS 10                        ; Wacht 10ms
Clear UUR.6                       ; Select 24 uur klok
BusOut %11010000,2,[UUR]          ; Schrijf naar rtc
BStop                             ; Bus stop
 
;-------------------------------------------------
; PROGRAMMA UNIVERSELE REAL TIME KLOK MET DS1307.
;-------------------------------------------------
 
;-------------------------
; LEES RTC ALS MODE 0 IS.
;-------------------------
 
RUN:

    If MODE = 0 Then
      BStart                 
      BusIn %11010001,0,[SECONDE,MINUUT,UUR] 
      BStop 
      DUMMY = SECONDE & %01110000                 
      GoSub BEREKEN_WAARDE
      SECONDE = SECONDE & %00001111
      SECONDE = SECONDE + DUMMY
 
      DUMMY = MINUUT & %11110000
      GoSub BEREKEN_WAARDE
      MINUUT = MINUUT & %00001111
      MINUUT = MINUUT + DUMMY
 
      DUMMY = UUR & %00110000
      GoSub BEREKEN_WAARDE
      UUR = UUR & %00001111
      UUR = UUR + DUMMY
    End If
 
;-----------------------------
; PRINT UUR, MINUUT, SECONDE.
;-----------------------------
 
    Print At 1,1,Dec2 UUR,":",Dec2 MINUUT,":",Dec2 SECONDE
 
;------------------------------------------
; UREN, MINUTEN, EN SECONDEN GELIJKZETTEN.
;------------------------------------------
 
    If MODE_KNOP = 1 Then
     DelayMS 10
      Inc MODE
       If MODE > 3 Then  
        MODE = 0
        GoSub SCHRIJF_RTC          
       End If 
      Repeat                          
     Until MODE_KNOP = 0 
    End If
 
;--------------------
; UUR GELIJK ZETTEN.
;--------------------
 
    If MODE > 0 Then                      
     DelayMS 300
 
      Select Case MODE      
       Case 1
         Print At 1,1,"  "
        DelayMS 300
 
       If KNOP_OP = 1 Then
         DelayMS 10
          Inc UUR
           If UUR > 23 Then
            UUR = 0
           End If
       End If
 
       If KNOP_NEER = 1 Then
        DelayMS 10
         Dec UUR
          If UUR > 254 Then            
           UUR = 23
          End If
       End If
 
;-----------------------
; MINUUT GELIJK ZETTEN.
;-----------------------
 
       Case 2
        Print At 1,4,"  "
        DelayMS 300
 
        If KNOP_OP = 1 Then
         DelayMS 10
          Inc MINUUT
           If MINUUT > 59 Then
            MINUUT = 0
           End If
       End If
 
       If KNOP_NEER = 1 Then
        DelayMS 10
         Dec MINUUT
          If MINUUT > 254 Then             
           MINUUT = 59
          End If
       End If
 
;------------------------
; SECONDE OP NUL ZETTEN.
;------------------------
 
       Case 3
        Print At 1,7,"  "
         DelayMS 300
 
       If KNOP_OP = 1 Or KNOP_NEER = 1 Then
        DelayMS 10
        SECONDE = 0
       End If 
 
      End Select
    End If 
 
GoTo RUN
 
;----------------------------
; WAARDE BEREKENEN VOOR RTC.
;----------------------------
 
BEREKEN_WAARDE:

    DUMMY = (DUMMY/16)*10               
    Return
 
;--------------------------
; SCHRIJF WAARDE NAAR RTC.
;--------------------------
 
SCHRIJF_RTC:

    DUMMY = SECONDE / 10                 
    DUMMY = DUMMY * 16                
    SECONDE = SECONDE // 10                 
    SECONDE = SECONDE | DUMMY            
 
    DUMMY = MINUUT / 10
    DUMMY = DUMMY * 16
    MINUUT = MINUUT // 10
    MINUUT = MINUUT | DUMMY
 
    DUMMY = UUR / 10
    DUMMY = DUMMY * 16
    UUR = UUR // 10
    UUR = UUR | DUMMY
 
    BStart
    BusOut %11010000,0,[SECONDE,MINUUT,UUR]   
    BStop
    Return
 
End
 
Als je haar maar goed zit, GROETEN LAMBIEK.

Op 22 september 2019 11:33:33 schreef Bavelt:
Wat blijft is:

Dat is geen programma zoals ik al eerder heb gescheven maar een include file, zoals ik al dacht... een stap te ver.

LDmicro user.
Bavelt

Golden Member

Dank, Lambiek.
Dit programma is echter voor een PIC16F887. Die heeft een I2C hardware ondersteuning.

Ik probeerde een PIC16F628A te koppelen aan een RTC. Daar moet het softwarematig worden opgelost heb ik begrepen.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Het kan wel, maar er is geen enkele reden om voor een softwarematige oplossing te kiezen (altijd slechter)
Toen de 627/28/48 uitkwamen was een i2c op een MCU nog niet standaard, maar nu wel.

Het net gekeken: Conrad heeft de 16F1826 wel in DIL (qua geheugen identiek aan de 628a)

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

Golden Member

Op 22 september 2019 12:59:33 schreef MGP:
[...]
Dat is geen programma zoals ik al eerder heb gescheven maar een include file, zoals ik al dacht... een stap te ver.

Het effect is toch hetzelfde? Als ik het deel opsla als .pbp en INCLUDE gebruik, geeft de compiler dezelfde fouten.

pic basic code:

DEVICE 16F628A                      ; 16F628A PIC Microcontroller
CONFIG INTRC_OSC_NOCLKOUT, WDT_ON, PWRTE_ON, MCLRE_OFF, BODEN_ON, LVP_OFF, CP_OFF 
DECLARE XTAL 4


INCLUDE "C:\Pic\Testspul\DS3231.pbp"
Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Op 22 september 2019 13:13:26 schreef Arco:

Het net gekeken: Conrad heeft de 16F1826 wel in DIL (qua geheugen identiek aan de 628a)

Dat klopt. Tegen een heel nette prijs ook nog.
Ik kan natuurlijk de datasheet uitgebreid bekijken, maar weet jij zo of de verschillen tussen de 1826 en 1827 groot zijn of dat het soortgelijke uC's zijn?
Zodat ik mijn proef met de (I2C) RTC kan doen?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

De 1827 heeft twee maal zoveel geheugen, de 1847 heeft vier maal zoveel geheugen. (enige verschil)

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

Golden Member

Ik heb er inmiddels 2 besteld om te proberen! (1826)

Fouten zijn het bewijs dat je het probeert..

Andere pic's zullen je niet vooruit helpen, tenzij je natuurlijk de hardware I2C in de vingers hebt of voorbeelden hiervan.

Waarom er altijd vanuit gegaan wordt dat andere pic's de oplossing zijn begrijp ik niet goed.
Maargoed het is uw keuze en misschien krijg je dan meer hulp.

Met dat basicprogramma kan ik u niet helpen, ben teweinig op de hoogte van Proton en heb nog nooit met I2C gewerkt of geprogrammeerd.

Ik weet zelfs niet of Proton die hardwareregisters gebruikt van die nieuwere controllers en volgens mij niet!

LDmicro user.
Arco

Special Member

Vroeger was je verplicht om alles softwarematig (bit-bangen) te doen, maar tegenwoordig niet meer (dus waarom zou je moelijk gaan doen?)
Daarbij zijn gewone i/o pinnen eigenlijk niet geschikt als i2c driver omdat het bidirectionele pinnen moeten zijn met open drain driver.
(bij nieuwere pic kan iedere pin als OD pin geset worden, maar bij de 628 niet.)

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

De TS is volledig afhankelijk van Proton, wat heb je er dan aan?
Hij kan natuurlijk nog een andere taal leren.

LDmicro user.
Bavelt

Golden Member

Ik ben redelijk bedreven in Visual Basic .NET 2010.
Maar weet niet of dat bruikbaar is voor uC's.

Fouten zijn het bewijs dat je het probeert..

Visual Basic is voor Windows....

Je moet geen andere taal leren maar Proton goed in de vingers krijgen.
Hoe Proton die I2C bestuurd maakt voor u niet veel uit en ook niet welke controller je gebruikt.

Wilde ik maar zeggen dat je met die andere controllers geen stap verder bent met uw probleem, tenzij iemand u verder kan helpen.

LDmicro user.
Arco

Special Member

Picbasic is waarschijnlijk niks mis mee, maak ikzelf houd er niet van. (ik gebruik Mikrobasic, is wat gestructureerder van opbouw)
VB is voor PC programma's...

De TS is volledig afhankelijk van Proton, wat heb je er dan aan?

Die ondersteunt toch gewoon 'echte' (hardware) i2c?
Ik neem aan dat de 16f1826 gewoon ondersteud wordt (die bestaat tenslotte ook al weer bijna 9 jaar)

Met een passende controller ben je wel een stap verder: i2c maak je het best met een echte i2c interface.
(simpeler, minder belasting voor de processor. Soft- of hardwarematig maakt bij i2c wel degelijk uit))

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

Special Member

Op 22 september 2019 21:59:02 schreef MGP:
De TS is volledig afhankelijk van Proton, wat heb je er dan aan?

Die snap ik even niet, hij heeft toch Proton en kan goed overweg met Basic. De 16F1826 wordt gewoon ondersteund door Proton, tenminste bij mij wel.

Ik gebruik het zelf al zo'n +/- 20 jaar en ben eigenlijk nooit problemen tegen gekomen dat iets niet kon.

En natuurlijk kun je een andere taal leren, maar waarom zou je. Jij ben helemaal weg van LD-micro en daar is niets mis mee, ieder zijn ding toch. :)

En daar komt nog bij, iedere taal heeft zijn voor en tegen.

pic basic code:


'*  Name    : POORTINSTELLING 16F1826.                                      
'*  Author  : H van Zwieten.                                    
'*  Notice  : Copyright (c) 2019 H.v.Z.                         
'*          : All Rights Reserved                              
'*  Date    : 23-9-2019                                        
'*  Version : 1.0                                              
'*  Notes   :                                                   
                                                   
Device = 16F1826

Config1 FOSC_HS, WDTE_ON, PWRTE_OFF, MCLRE_OFF, CP_OFF, CPD_OFF, BOREN_SBODEN, CLKOUTEN_OFF, IESO_OFF, FCMEN_OFF
Config2 WRT_OFF, PLLEN_OFF, STVREN_OFF, LVP_OFF

Xtal 10                                ; Kristal 10 MHz

All_Digital true                       ; Alle poorten digitaal

Clear                                  ; Wis geheugen

        ;76543210                      ; Hulpregel Poort poort_A
PORTA = %00000000                      ; Zet poort_A laag
TRISA = %00000000                      ; Poort_A I/O
                                            
        ;76543210                      ; Hulpregel Poort poort_B
PORTB = %00000000                      ; Zet poort_B laag
TRISB = %00000000                      ; Poort_B I/O
Als je haar maar goed zit, GROETEN LAMBIEK.

Op 23 september 2019 11:45:53 schreef Lambiek:
[...]
Die snap ik even niet, ..

Nog een poging wagen want je hebt groot deel van de discussie gemist volgens lezen.

De TS heeft een 16F628a en daarmee wil hij communiceren in I2C.
In Proton kan dat volgens lezen perfect werken.
Maar de TS krijgt het maar niet voor elkaar om dat te laten werken.

Plots wordt hem aangeraden van andere controllers te kopen met I2C hardware ingebouwd, wat de TS ook doet, in de hoop van het dan wel werkend te krijgen.
Als hij het nu al niet met een 16F628a werkend krijgt, zal hij het dan wel werken met een 16F1826 MET hardware I2C?

Gezien de TS met Protonbasic werkt, wat ikzelf ook prima vind, zal een andere controller geen soelaas brengen voor zijn problemen, waarvan het gebrek aan programmeerervaring het hoofdprobleem blijkt te zijn.
Dat is geen verwijt want ik ken er nog minder van.

Volgens mij ondersteunt Proton geen hardware I2C (correct me if I'm wrong) en dus moet hij het met dezelfde instructies doen bij eender welke controller.
Ik heb wel een oudere versie van Proton en daarom ben ik niet 100% zeker.

Dus de aankoop was niet nodig voor zijn probleem maar ze kunnen wel gebruikt worden evenals zijn 16F877/887

Of wie gaat hem bijstaan als die andere controllers binnen zijn?

En herlees nu nog eens de discussie met dit in gedachte ;)

LDmicro user.
Arco

Special Member

Het grootste nadeel vond ik dat picbasic geen functies kent, eigenlijk wel een vereiste vind ik... (gosub is een overblijfsel van oer-basic)
Ook het feit dat de compiler zelf uit kan maken of een pin in of output is vind ik griezelig; ik maak dat zelf wel uit.

Ook de (standaard) libraryfuncties vind ik onoverzichtelijk, maar da's bij bijna elke compiler. Goede libraries schrijf je liefst zelf... ;)

@MGP:
Kom, kom, zo'n 'doomsday' beeld is nu ook weer niet nodig. Natuurlijk kun je met picbasic ook hardware i2c aansturen... ;)
Zo groot is het verschil tussen de midrange (16Fxxx) en enhanced midrange (16F1xxx) ook weer niet, er is zelfs een migration document over...

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

Op 23 september 2019 12:36:27 schreef Arco:
@MGP:
Kom, kom, zo'n 'doomsday' beeld is nu ook weer niet nodig. ..

Doomsday..helemaal niet.. hoogstens een ontgoocheling :p

Op 23 september 2019 12:36:27 schreef Arco:
..
Zo groot is het verschil tussen de midrange (16Fxxx) en enhanced midrange (16F1xxx) ook weer niet, er is zelfs een migration document over...

Een echte aanrader voor beginners :) :)

LDmicro user.
Lambiek

Special Member

Op 23 september 2019 12:30:19 schreef MGP:
De TS heeft een 16F628a en daarmee wil hij communiceren in I2C.
In Proton kan dat volgens lezen perfect werken.

Een 16F628 heeft geen hardware matige I2C pinnen en een 16F1826 wel.

En zelf gebruik ik al jaren I2C met proton, wordt gewoon ondersteund.

Plots wordt hem aangeraden van andere controllers te kopen met I2C hardware ingebouwd, wat de TS ook doet, in de hoop van het dan wel werkend te krijgen.

Als hij dat goed programmeert gaat dat ook werken. Heb hem een werkend voorbeeld gegeven.

Als hij het nu al niet met een 16F628a werkend krijgt, zal hij het dan wel werken met een 16F1826 MET hardware I2C?

Zeker wel.

Als je haar maar goed zit, GROETEN LAMBIEK.

@Lambiek, misschien kun je mij ook vertellen of Proton de hardware I2C ondersteund? want ik kan dat uit de manual niet opmaken.

LDmicro user.
Arco

Special Member

Ik vond dat ook altijd wat wazig. De i2cread/write, serin/out, hserin/out,... is allemaal wat onduidelijk uitgelegd in de manual. (wat doet wat?)
Zo ook dat er 2 verschillende interrrupts zijn: 'echte' en picbasics eigen soort... (was volgens mij iets met een underscore ervoor)

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