Even vertalen:
'****************************************************************
'* Name : P1 dongle *
; +--v--+
; V+ >[ ] - GND
; Crystal to A4 A5 <[ ]< A0
; Crystal To A5 A4 <[ ]< A1
; MCLR A3 >[ ]< A2 Temp out
; CCp1 in C5 <[ ] C0 LCD display
; C4 <[ ]> C1 LCD display
; LCD display C3 <[ ]< C2 LCD display
; LCD display C6 <[ ]> B4
; LCD display C7 <[ ]> B5 RS232 in
; B7 <[ ]> B6
; +-----+
Device 16F690 ;Gebruik een PIC16F690 type
Config HS_OSC, WDT_OFF, PWRTE_ON, MCLRE_OFF, CP_OFF, CPD_OFF, BOD_OFF, IESO_OFF, FCMEN_OFF
XTAL = 20
Declare LCD_DTPIN = PORTC.0 ;De Data aansluiting moet nu aan PORTb.4-7
Declare LCD_ENPIN = PORTC.6 ;De EN aansluiting moet nu aan PORTC.6
Declare LCD_RSPIN = PORTC.7 ;De RS aansluiting moet nu aan PORTC.7
'; 76543210
PORTA = %11100000 ; Alle PORTA uitgangen uit (laag maken)
TRISA = %10100011 ; A5 moet een ingang zijn anders gaat het fout met het crystal ??
PORTB = %00000000 ; Alle PORTB uitgangen uit (laag maken)
TRISB = %01100000 ; Yes en NO knop
PORTC = %00110010 ; Alle PORTC uitgangen uit (laag maken)
TRISC = %00100010 ; Tris C.5 aan voor CCP1 input
ANSEL = %00000000 ; Anders doet het display niets
ANSELH = %00000000 ; Anders doet het display niets
CCP1CON = %00000101 ; 1 e rising edge
PIE1 = %00000101 ; Zet CCP1IE interrupt enable
PIR1 = %00000000 ;
T1CON = %00000001 ; Timer1 = on
OPTION_REG = %10000000 ; Zwakke pull-up voor schakelaars YES NO , RA4 as input
INTCON = %00000011 ; Met opzet op 1 gezet om Flag interrupts te vermijden.
Print At 1,1, " TEST "
DelayMS 1000
';Poort aliases, bij wijzigen ook TRIS checken
; Declare HSERIAL_BAUD = 115200 ' Set baud rate for USART 1
Declare HSERIAL_RCSTA = %10010000 ' Enable serial port and continuous receive
;BAUDIN CON 16468 ' 115200,8,N,1 Seriële In
Dim RSDATA [9] As Byte ' Data-invoerarray
Dim i As Byte ;
Symbol wacht = 1000
Clear
Symbol SYNC = 0
Symbol BRGH = 1
Symbol BRG16 = 1
SPBRG = 42 ; voor 115200 baud
Cls
While 1 = 1
loop:
For i = 0 To 10
Next
HSerIn wacht, Fault, [Wait("1-0:2.7.0"), Str RSDATA \ 8 ]
Print At 1, 1, RSDATA[1] , RSDATA [2],RSDATA[3] , RSDATA [4], RSDATA[5] , RSDATA [6], RSDATA[7] , RSDATA [8]
GoTo loop
Fault:
Print At 2,1, "error P1"
DelayMS 1000
GoTo loop
Wend
[Bericht gewijzigd door Henry S. op (0%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Is die library snel genoeg om op 115k2 meerdere karakters tegelijk te verwerken?
Als die te traag is loopt de boel ook vast. In dat geval gewoon de rx data direct uitlezen zonder library.
[Bericht gewijzigd door Arco op (40%)]
Op donderdag 16 april 2026 22:47:54 schreef Waters:
Beste Kodec. ik schreef al :
Ik heb een nieuwe meter met P1 poort.
Deze wil ik uitlezen om het actuele verbruik te monitoren
teneinde 1 of 2 sets zonnepanelen uit te schakelen.Dus ik wil een programma maken om 1 of 2 sets zonnepanelen uit te schakelen.
Dat kan niet met een dongle.Hobby groet
Dat kan niet met een dongle maar wel met een 2-Wire REMI bv. Die heeft 2 relaiscontacten NO die kan switchen naargelang een aantal parameters. Of je laat die relais via HomeAssistant en zelf geschreven logica switchen. Dat zou mijn denkpiste zijn.
Maar ik heb wel interesse in de manier dat jij het aan het doen bent. Waarschijnlijk een stuk goedkoper
[Bericht gewijzigd door Kodec op (21%)]
Waters
Guus@Sint-Michielsgestel
Ik heb nog even gekeken naar de data van de P1 meter,
Het is een pakket van 80ms iedere seconde.
Dus ongeveer iedere 7 usec komt er een bitje binnen.
De processor loopt op een 20 MHz klok / 4 is 5 instructies per usec.
Voor het binnenhalen van een bit zijn er dus 20 tot 40 instructies.
Arco, je stelde voor om de informatie eerst binnen te halen en dan pas te zoeken naar de
code voor het actuele vermogen.
Maar eerst zou er toch ontvangst moeten zijn.
Klopt de code ?
En daar zit mijn onzekerheid.
Bij voorbaat dank voor antwoorden
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Als je eerst test met een terminal programma (bijv. HTerm ), kun je makkelijker zien wat er waar misgaat.
(je kunt ook verschillende baudrates testen dan om te kijken of het daaraan ligt.)
joopv
Golden Member
Op vrijdag 17 april 2026 11:25:10 schreef Waters:
Ik heb nog even gekeken naar de data van de P1 meter,
Het is een pakket van 80ms iedere seconde.
Dus ongeveer iedere 7 usec komt er een bitje binnen.
De processor loopt op een 20 MHz klok / 4 is 5 instructies per usec.
Voor het binnenhalen van een bit zijn er dus 20 tot 40 instructies.
Moet je echt bitbangen? Ik lees dat er een eusart interface in dit pic zit...? Gebruik je die wel?
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
marcob
People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years
Het gaat wel werken met een PIC, het hoeft geen probleem te zijn. Persoonlijk zou ik in deze tijd gaan voor een ESP8266 of ESP32. Voordeel dat je een locale webpagina hebt om waarden te bekijken via computer of telefoon.
Een ESP printje kun je kant en klaar kopen tegenwoordig:
https://www.tinytronics.nl/nl/domotica/sensoren/energie/universele-p1-…
Daarnaast genoeg voorbeelden wat de software betreft, bijvoorbeeld:
https://github.com/thieu-b55/Slimme-Digitale-Energie-Meter
picsels
Volgend project: 7-seg gaming displays; dan dec-1982 labvoeding afmaken, dan funcgen met ad9833 afmaken, dan...
Misschien iets 'outside the box': als het je puur gaat om het uitlezen, en niet zozeer om te klussen met ESP/PIC, én je hebt ergens een PC/SBC in je netwerk, is een kant-en-klare dongle met een API veel gemakkelijker. De nieuwe meters hebben toch veelal een 'powered' aansluiting.
Inpluggen, op je Wifi aansluiten, simpel scriptje op een PC/SBC en Bob's your uncle.
Een API uitlezen kan overigens ook met een ESP32!
Dan heb je best of both worlds: gemak van een kant-en-klare dongle, en een µController waarmee je kunt aansturen wat je wilt.
Just a thought...
Klein nadeeltje is de prijs: die dongle's zijn weinig meer dan een €3 chippie met plastic omhulsel, voor €25.
joopv
Golden Member
Op vrijdag 17 april 2026 14:09:10 schreef Arco:
Ik zie HSERIN(), dus de hardware usart is gebruikt...
Dan heb je toch veel meer tijd beschikbaar..? Geen 9us per bit maar 90 of 100us per byte. Of nog meer als er buffering is.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Ik neem aan dat die HSERIN aan polling doet? (gezien de 'blocking' functie)
Da's sowieso niet erg fris voor dit soort toepassingen, uart rx interrupt gebruiken is 'the way to go'...
(dan mis je niks, en de controller heeft zeeen van tijd over om andere dingen te doen...)
Je gebruikt een externe echte crystal? Heb eens gespeeld met de uart van de Attiny en de interne klok bleek niet precies genoeg voor hogere baudrates voor de seriële verbinding.
Je kunt de PIC configureren dat ie de clock (van de crystal) op een pin out zet, dan kan je met een counter meten of je frequentie klopt.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Met een 20MHz kristal is de afwijking op 115k2 -1.36%, ruim binnen de 3% grens...
Voor exact (0.00% afwijking) kun je een 18.432MHz kristal gebruiken.
Waters
Guus@Sint-Michielsgestel
Er zit een 20MHz crystal tussen pin A4 en A5, Ik kan de frequentie testen door een
1 MHz ( 40/60 dutycycle ) te maken . Op porta,2 staat dan deze frequentie.
Print At 2,1, "1 MHz 40% duty"
ASM
loop_1MHz:
bsf PORTA,2 ; output high
nop ;
bcf PORTA,2 ; output low
btfsc PORTB,4 ; test switch for P1 mode
GoTo done_1MHz ; switch HI, so exit this mode and go back to P1
bsf PORTA,2 ; output high
nop ;
bcf PORTA,2 ; output low
GoTo loop_1MHz ;
done_1MHz:
ENDASM
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Kristalfrequentie is echt wel nauwkeurig genoeg voor serieel...
Het is sowieso 'good practice' om een led telaten knipperen ter controle of de boel goed 'loopt' (ik neem meestal 500mS on/off)
Ik zou eerst met een terminalprogramma testen, dan weet je veel eerder waar de fout zit. (anders wordt 't een soort 'ezeltje prik') 
Op RA4 staat trouwens gewoon het 20MHz signaal als je wilt meten...
Waters
Guus@Sint-Michielsgestel
Als je het crystal meet op RA4, dan beinvloed je de frequentie vanwege de 7pF van de probe
waardoor je de frequentie niet exact kunt afregelen. Vandaar mijn oplossing .
( Alleen voor fine tuning )
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Waters
Guus@Sint-Michielsgestel
Heb inmiddels het P1 poort telegram onder de knie.
De bedoeling is om een boiler te sturen, maar het programma staat
te pendelen . Ik gebruik een radiator kachel van 2kW als load.
Een probleem is dat de regeling van de power niet gelijk loopt
met de uitlezing van de poort.
'****************************************************************
'* Name : P1 dongle *
'* Date : 17-06-2026 *
'* Version : 1.0 op 29-06-2026 *
'* Notes : Uitlezing P1dongle, actie TRIAC Boiler 2kW *
'* : Triac gaat aan en stuurt energie naar Boiler *
'****************************************************************
; PIC16F690 +--v--+
; V+ >[ ] - GND
; 20MHz Crystal to A4 A5 <[ ]< A0
; 20MHz Crystal To A5 A4 <[ ]< A1
; MCLR A3 >[ ]< A2 TRIAC out
; HPWM OUT C5 <[ ] C0 LCD display
; C4 <[ ]> C1 LCD display
; LCD display C3 <[ ]< C2 LCD display
; LCD display C6 <[ ]> B4
; LCD display C7 <[ ]> B5 RS232 in
; B7 <[ ]> B6
; +-----+
Device 16F690
Config HS_OSC, WDT_OFF, PWRTE_ON, MCLRE_OFF, CP_OFF, CPD_OFF, BOD_OFF, IESO_OFF, FCMEN_OFF
XTAL = 20
Declare LCD_DTPIN = PORTC.0
Declare LCD_ENPIN = PORTC.6
Declare LCD_RSPIN = PORTC.7
; 76543210
PORTA = %11100000
TRISA = %10100011 ' RA5 is input voor Kristal (Correct!)
PORTB = %00000000
TRISB = %01100000 ' RB5 = RX, moet een INgang zijn. (Staat correct op 1)
PORTC = %00000010
TRISC = %00000010
ANSEL = %00000000 ' Alle analoge poorten UIT (Cruciaal voor LCD en RX!)
ANSELH = %00000000 ' AN11 (RB5/RX) staat hierdoor ook UIT (Correct!)
T1CON = %00000001 ' Timer1 aan
; Interrupt registers UITzetten om crashes te voorkomen
PIE1 = %00000001 'interrupts Timer1 inschakelen
OPTION_REG = %10000000 ' Geen pull-ups
CM1CON0 = %00000000 'Comparator 1-module is UIT
CM2CON0 = %00000000 'Comparator 2-module is UIT
INTCON = %00000000 'Interruptscontrole (TMR0 AAN)
ALL_DIGITAL TRUE
; Calculated Baudrate = 115200 @ Xtal 20MHz, Error = 0,16%
HSERIAL_RCSTA = 144 ' %10010000 -> SPEN active, CREN (Continuous Receive) active
HSERIAL_TXSTA = 36 ' %00100100 -> TXEN active, BRGH = 1
HSERIAL_SPBRG = 10 ' 115200 Baud
HSERIAL_CLEAR = On
Dim PT_Info[10] As Byte ; Tijd en Datum
Dim P1_Info[9] As Byte
Dim P0_Info[9] As Byte
Dim MY As Word ; Power van het NET
Dim Pnet As Word ; Power van het NET
Dim Pzon As Word ; Power van de ZON
Dim Ptime As byte ; Datum YYMMDDhhmmss
;MY = ValPzon
Dim Duty As Byte
Dim Duty4 As Byte
Dim Duty2 As Byte
Dim Duty3 As Byte
Dim DutyF As Byte
Dim Teller As Byte ; Aftellen van de tijd dat de boiler actief is
Dim TIMER1 As TMR1L.Word ; Timer1 woord
symbol RCIDLE = BAUDCTL.6 ; High voor Idle, low voor startbit received
symbol TMR1F = PIR1.0
Symbol TRIAC = PORTA.2
Clear
Print At 2, 1, "P1_poort"
DelayMS 500
Cls
;----------- Main Application -----------
Main:
' Preventieve controle op Overrun Fout (OERR).
' Als de buffer overloopt bij 115200 baud, resetten we hem hier direct.
If RCSTA.1 = 1 Then
RCSTA.4 = 0 ' CREN uit
RCSTA.4 = 1 ' CREN aan (wist OERR vlag)
EndIf
' We wachten maximaal 1000ms op de header en vullen direct de 9 bytes array.
HRSin { 1000 , TimeOutLabel },Wait("0-0:1.0.0("),Str PT_Info\12 ; Time from grid
HRSin { 1000 , TimeOutLabel },Wait("1-0:1.7.0("),Str P1_Info\9 ; Power from grid
HRSin { 1000 , TimeOutLabel },Wait("1-0:2.7.0("),Str P0_Info\9 ; power from sun
Cls
Pnet = ( P1_Info[1] - 48) *1000 + ( P1_Info[3] -48 ) * 100 +( P1_Info[4] -48 ) *10 + P1_Info[5] -48
Pzon =( P0_Info[1] - 48) *1000 + ( P0_Info[3] -48 ) * 100 +( P0_Info[4] -48 ) *10 + P0_Info[5] -48
Print at 2,1, "NET ", DEC Pnet ," W"
print at 1,1, "ZON ", DEC Pzon ,"W"
If Pzon > Pnet then Print At 1 ,10," +", DEC (Pzon - Pnet ),"W"
Print At 2, 12, DEC (PT_Info[6] -48) , dec (PT_Info[7]- 48 ),":" ,DEC( PT_Info[8] - 48) ,DEC ( PT_Info[9] -48 )
;----------------------------------------------------------------------------------------
;START VOORWAARDEN TRIAC CONTROL BOILER
;-------------------------------------------------------------------------------------------
If ( Pzon - Pnet) > 2000 then ; Altijd aan want de ZON wil leveren
TRIAC = 1
Goto Main
endif
;----------------------------------------------------------------------------------------
; REGELING TRIAC CONTROL BOILER
;-------------------------------------------------------------------------------------------
If (Pnet - Pzon) >= 5 then
Duty3 = ((Pnet - Pzon) /20 )
Print At 2 ,12, dec Duty3
goto DutyCAL
endif
If (Pzon - Pnet) < 2000 then Duty2 = (Pzon - Pnet) /20 ; Maximum voor 2kWatt
DutyCAL:
Duty = Duty2 + Duty4 - Duty3 ; Als de boiler aanstaat dan zakt de power in.
Duty4 = Duty ; De meting geeft dan aan dat de boiler
; PWM informatie moet krijgen. Dat kan dus fout zijn
If Duty <= 50 then
TRIAC = 1
DutyF = Duty
endif
If Duty > 50 then
DutyF = 100 - Duty
TRIAC = 0
endif
If Duty >= 100 then Duty = 99
Teller = 0
;----------------------------------------------------------------------------------------
; TIEN MILLISECONDEN TIMER
;-------------------------------------------------------------------------------------------
Cycle:
IF PIR1.0 =1 then ; Timer1 Flag at 65536 - 15536 = 50000 ;
PIR1.0 = 0 ; Clock van 20 MHz is .2 usec tic
INC Teller ; tijd is dan 50.000 x .2 usec = 10 msec
TIMER1 = TIMER1 + 15536 ; Iedere 10 millisec loopt de teller op
endif ; max teller in 1 sec is dus 100
If Teller > DutyF then
TRIAC =~ TRIAC
GoTo Main
endif
goto Cycle
GoTo Main
TimeOutLabel:
' Er is binnen 1 seconde geen ("1-0:1.7.0(") of onvolledige data binnengekomen
; Print At 1, 1, "Wachten op data"
Print At 2, 1, "Timeout!"
; delayms 1000
; cls
GoTo Main
End
[Bericht gewijzigd door Waters op (92%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Code is zo (zonder indentatie) moeilijk te lezen en te volgen.
Zo zonder interrupts is sowieso iets waar ik de rillingen van krijg... 
Maar als alles sequentieel uitgevoerd wordt zou het ook moeten (kunnen) werken...
hardbass
PE2BAS
Pnet en Pzon zijn nu een word. Die kan niet negatief worden. (van 0 tot 65535) Als de zon nu meer levert dan je gebruikt wordt het resultaat heel groot. (pnet - pzon) Dat is waarom hij pendelt.
Ik zou het overschot een keer uitrekenen, en daarop regelen.
Vraagje, want blijkbaar er ontgaat mij iets.
Je hebt een nieuwe kWh-meter met P1-poort; dus een nieuwe 'slimme' meter? Welk merk en type?
De communicatie op 9600 baud gaat goed. Dus de seriele protocol-instellingen zijn correct.
Voor zover mij bekend heeft een P1-poort een Tx-lijn en een Data-Request-lijn; geen RX-lijn!
Hoe zet je de kwh-meter op 15200 baud?
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
joopv
Golden Member
DSMR is async serieel met 115200 bd. Dat staat in de specs.
https://www.netbeheernederland.nl/publicatie/dsmr-502-p1-companion-sta…
6.1 Transfer speed and character formatting
The interface must use a fixed transfer speed of 115200 baud.
The Metering System must send its data to the OSM device every single second and the
transmission of the entire P1 telegram must be completed within 1s.
The format of transmitted data must be defined as “8N1”. Namely:
- 1 start bit,
- 8 data bits,
- no parity bit and
- 1 stop bit