I have been working on a powerful new feature for AVRco that I call skeleton records.
Skeleton records are a significant move towards object orientation.
We classically associate object orientation with classes but they are not the only way to achieve it. At the end of the day object orientation is gathering everything associated with an object in one place, be that data, functions, procedures or whatever. In our case we achieve it with records.
Skeleton records are distinguished from classical records by adding chevrons <> after the word ‘record’. Those chevrons may contain additional information in the form of parameters, but more of that later.
As a tutorial we will illustrate how to use skeleton records by building a driver for ADC for the Mega4808 and 4809 chips specifically, but the design should work for other chips in the same family.
A short extract illustrates some of the features of skeleton records.
Udo has been helping me to develop these features.
Anyone else interested in playing with skeleton records and maybe contributing to their development please let me know and I will send them the latest beta.
Regards
Merlin
============================================================
Ich habe an einer mächtigen neuen Funktion für AVRco gearbeitet, die ich Skeleton Records nenne.
Skeleton Records sind ein bedeutender Schritt in Richtung Objektorientierung.
Wir assoziieren Objektorientierung klassischerweise mit Klassen, aber sie sind nicht die einzige Möglichkeit, dies zu erreichen. Letzten Endes bedeutet Objektorientierung, dass alles, was mit einem Objekt verbunden ist, an einem Ort gesammelt wird, seien es Daten, Funktionen, Prozeduren oder was auch immer. In unserem Fall erreichen wir dies mit Datensätzen.
Skeleton-Datensätze unterscheiden sich von klassischen Datensätzen durch das Hinzufügen von Chevrons <> nach dem Wort "Record". Diese Chevrons können zusätzliche Informationen in Form von Parametern enthalten, aber dazu später mehr.
Als Tutorial werden wir die Verwendung von Skeleton-Records anhand eines ADC-Treibers für die Mega4808- und 4809-Chips veranschaulichen, aber das Design sollte auch für andere Chips der gleichen Familie funktionieren.
Wer sonst noch Interesse hat, mit Skeleton Records zu spielen und vielleicht zu ihrer Entwicklung beizutragen, möge sich bitte bei mir melden, und ich werde ihm die neueste Beta-Version schicken.
Mit freundlichen Grüßen
Merlin
Skeleton records are a significant move towards object orientation.
We classically associate object orientation with classes but they are not the only way to achieve it. At the end of the day object orientation is gathering everything associated with an object in one place, be that data, functions, procedures or whatever. In our case we achieve it with records.
Skeleton records are distinguished from classical records by adding chevrons <> after the word ‘record’. Those chevrons may contain additional information in the form of parameters, but more of that later.
As a tutorial we will illustrate how to use skeleton records by building a driver for ADC for the Mega4808 and 4809 chips specifically, but the design should work for other chips in the same family.
A short extract illustrates some of the features of skeleton records.
Code
type
tADCPrecision = (adc10Bit, adc8Bit);
tADCSAMPNUM = (adcNone, adcACC2, adcACC4, adcACC8, adcACC16, adcACC32, adcACC64);
tADCRefSel = (adcInternal, adcVDD, adcVREFA );
tADCPrescalar = (adcDIV2, adcDIV4, adcDIV8, adcDIV16, adcDIV32, adcDIV64, adcDIV128, adcDIV256);
tADCINITDelay = (adcDLY0, adcDLY16, adcDLY32, adcDLY64, adcDLY128, adcDLY256);
tADCASV = ( adcASVOFF, adcASVOn );
tADCWINCM = (adcWCNONE, adcWCBELOW, adcWCABOVE, adcWCINSIDE, adcWCOUTSIDE);
tADCMUXPOS = (adcAIN0, adcAIN1, adcAIN2, adcAIN3, adcAIN4, adcAIN5, adcAIN6, adcAIN7, adcAIN8,
adcAIN9, adcAIN10, adcAIN11, adcAIN12, adcAIN13, adcAIN14, adcAIN15, adcDACREF0=$1C,
adsTEMPSENSE=$1E, adcGND=$1F);
tDUTCYCLE = (adcDC50, adcDC25);
TUPDI_ADCn_LL = Record<>
private
fCTRLA : byte;
fCTRLB : byte;
fCTRLC : byte;
fCTRLD : byte;
fCTRLE : byte;
fSAMPCTRL : byte;
fMUXPOS : byte;
fReserved1 : byte;
fCOMMAND : byte;
fEVCTRL : byte;
fINTCTRL : byte;
fINTFLAGS : byte;
fDBGCTRL : byte;
fTEMP : byte;
fReserved2 : word;
fRES : word;
fWINLT : word;
fWINHT : word;
fCALIB : byte;
private
function GetRUNSTBY : boolean;
procedure SetRUNSTBY( NewVal : boolean );
function GetRESSEL : tADCPrecision;
procedure SetRESSEL( NewVal : tADCPrecision );
function GetFREERUN : boolean;
procedure SetFREERUN( NewVal : boolean );
function GetENABLE : boolean;
procedure SetENABLE( NewVal : boolean );
function GetSAMPNUM : tADCSAMPNUM;
procedure SetSAMPNUM( NewVal : tADCSAMPNUM );
function GetSAMPCAP : boolean;
procedure SetSAMPCAP( NewVal : boolean );
function GetREFSEL : tADCRefSel;
procedure SetREFSEL( NewVal : tADCRefSel );
function GetPRESC : tADCPrescalar;
procedure SetPRESC( NewVal : tADCPrescalar );
function GetINITDLY : tADCINITDelay;
procedure SetINITDLY( NewVal : tADCINITDelay );
function GetASDV : tADCASV;
procedure SetASDV( NewVal : tADCASV );
function GetSAMPLDLY : byte;
procedure SetSAMPLDLY( NewVal : byte );
function GetWINCM : tADCWINCM;
procedure SetWINCM( NewVal : tADCWINCM );
function GetSAMPLEN : byte;
procedure SetSAMPLEN( NewVal : byte );
function GetMUXPOS : tADCMUXPOS;
procedure SetMUXPOS( NewVal : tADCMUXPOS );
function GetSTCONV : boolean;
procedure SetSTCONV( NewVal : boolean );
function GetSTARTEI : boolean;
procedure SetSTARTEI( NewVal : boolean );
function GetWCMPEnable : boolean;
procedure SetWCMPEnable( NewVal : boolean );
function GetRESRDYEnable : boolean;
procedure SetRESRDYEnable( NewVal : boolean );
function GetWCMP : boolean;
procedure SetWCMP( NewVal : boolean );
function GetRESRDY : boolean;
procedure SetRESRDY( NewVal : boolean );
function GetDBGRUN : boolean;
procedure SetDBGRUN( NewVal : boolean );
procedure SetTEMP( NewVal : word );
procedure SetRES( NewVal : word );
procedure SetWINLT( NewVal : word );
procedure SetWINHT( NewVal : word );
function GetDUTYCYC : tDUTCYCLE;
procedure SetDUTYCYC( NewVal : tDUTCYCLE );
public
property RUNSTBY : boolean
read GetRUNSTBY
write SetRUNSTBY;
property RESSEL : tADCPrecision
read GetRESSEL
write SetRESSEL;
property FREERUN : boolean
read GetFREERUN
write SetFREERUN;
property ENABLE : boolean
read GetENABLE
write SetENABLE;
property SAMPNUM : tADCSAMPNUM
read GetSAMPNUM
write SetSAMPNUM;
property SAMPCAP : boolean
read GetSAMPCAP
write SetSAMPCAP;
property REFSEL : tADCRefSel
read GetREFSEL
write SetREFSEL;
property PRESC : tADCPrescalar
read GetPRESC
write SetPRESC;
property INITDLY : tADCINITDelay
read GetINITDLY
write SetINITDLY;
property ASDV : tADCASV
read GetASDV
write SetASDV;
property SAMPLDLY : byte
read GetSAMPLDLY
write SetSAMPLDLY;
property WINCM : tADCWINCM
read GetWINCM
write SetWINCM;
property SAMPLEN : byte
read GetSAMPLEN
write SetSAMPLEN;
property MUXPOS : tADCMUXPOS
read GetMUXPOS
write SetMUXPOS;
property STCONV : boolean
read GetSTCONV
write SetSTCONV;
property STARTEI : boolean
read GetSTARTEI
write SetSTARTEI;
property WCMPEnable : boolean
read GetWCMPEnable
write SetWCMPEnable;
property RESRDYEnable : boolean
read GetRESRDYEnable
write SetRESRDYEnable;
property WCMP : boolean
read GetWCMP
write SetWCMP;
property RESRDY : boolean
read GetRESRDY
write SetRESRDY;
property DBGRUN : boolean
read GetDBGRUN
write SetDBGRUN;
property TEMP : byte
read fTEMP
write fTEMP;
property RES : word
read fRES
write fRES;
property WINLT : word
read fWINLT
write fWINLT;
property WINHT : word
read fWINHT
write fWINHT;
property DUTYCYC : tDUTCYCLE
read GetDUTYCYC
write SetDUTYCYC;
end;
tADCPrecision = (adc10Bit, adc8Bit);
tADCSAMPNUM = (adcNone, adcACC2, adcACC4, adcACC8, adcACC16, adcACC32, adcACC64);
tADCRefSel = (adcInternal, adcVDD, adcVREFA );
tADCPrescalar = (adcDIV2, adcDIV4, adcDIV8, adcDIV16, adcDIV32, adcDIV64, adcDIV128, adcDIV256);
tADCINITDelay = (adcDLY0, adcDLY16, adcDLY32, adcDLY64, adcDLY128, adcDLY256);
tADCASV = ( adcASVOFF, adcASVOn );
tADCWINCM = (adcWCNONE, adcWCBELOW, adcWCABOVE, adcWCINSIDE, adcWCOUTSIDE);
tADCMUXPOS = (adcAIN0, adcAIN1, adcAIN2, adcAIN3, adcAIN4, adcAIN5, adcAIN6, adcAIN7, adcAIN8,
adcAIN9, adcAIN10, adcAIN11, adcAIN12, adcAIN13, adcAIN14, adcAIN15, adcDACREF0=$1C,
adsTEMPSENSE=$1E, adcGND=$1F);
tDUTCYCLE = (adcDC50, adcDC25);
TUPDI_ADCn_LL = Record<>
private
fCTRLA : byte;
fCTRLB : byte;
fCTRLC : byte;
fCTRLD : byte;
fCTRLE : byte;
fSAMPCTRL : byte;
fMUXPOS : byte;
fReserved1 : byte;
fCOMMAND : byte;
fEVCTRL : byte;
fINTCTRL : byte;
fINTFLAGS : byte;
fDBGCTRL : byte;
fTEMP : byte;
fReserved2 : word;
fRES : word;
fWINLT : word;
fWINHT : word;
fCALIB : byte;
private
function GetRUNSTBY : boolean;
procedure SetRUNSTBY( NewVal : boolean );
function GetRESSEL : tADCPrecision;
procedure SetRESSEL( NewVal : tADCPrecision );
function GetFREERUN : boolean;
procedure SetFREERUN( NewVal : boolean );
function GetENABLE : boolean;
procedure SetENABLE( NewVal : boolean );
function GetSAMPNUM : tADCSAMPNUM;
procedure SetSAMPNUM( NewVal : tADCSAMPNUM );
function GetSAMPCAP : boolean;
procedure SetSAMPCAP( NewVal : boolean );
function GetREFSEL : tADCRefSel;
procedure SetREFSEL( NewVal : tADCRefSel );
function GetPRESC : tADCPrescalar;
procedure SetPRESC( NewVal : tADCPrescalar );
function GetINITDLY : tADCINITDelay;
procedure SetINITDLY( NewVal : tADCINITDelay );
function GetASDV : tADCASV;
procedure SetASDV( NewVal : tADCASV );
function GetSAMPLDLY : byte;
procedure SetSAMPLDLY( NewVal : byte );
function GetWINCM : tADCWINCM;
procedure SetWINCM( NewVal : tADCWINCM );
function GetSAMPLEN : byte;
procedure SetSAMPLEN( NewVal : byte );
function GetMUXPOS : tADCMUXPOS;
procedure SetMUXPOS( NewVal : tADCMUXPOS );
function GetSTCONV : boolean;
procedure SetSTCONV( NewVal : boolean );
function GetSTARTEI : boolean;
procedure SetSTARTEI( NewVal : boolean );
function GetWCMPEnable : boolean;
procedure SetWCMPEnable( NewVal : boolean );
function GetRESRDYEnable : boolean;
procedure SetRESRDYEnable( NewVal : boolean );
function GetWCMP : boolean;
procedure SetWCMP( NewVal : boolean );
function GetRESRDY : boolean;
procedure SetRESRDY( NewVal : boolean );
function GetDBGRUN : boolean;
procedure SetDBGRUN( NewVal : boolean );
procedure SetTEMP( NewVal : word );
procedure SetRES( NewVal : word );
procedure SetWINLT( NewVal : word );
procedure SetWINHT( NewVal : word );
function GetDUTYCYC : tDUTCYCLE;
procedure SetDUTYCYC( NewVal : tDUTCYCLE );
public
property RUNSTBY : boolean
read GetRUNSTBY
write SetRUNSTBY;
property RESSEL : tADCPrecision
read GetRESSEL
write SetRESSEL;
property FREERUN : boolean
read GetFREERUN
write SetFREERUN;
property ENABLE : boolean
read GetENABLE
write SetENABLE;
property SAMPNUM : tADCSAMPNUM
read GetSAMPNUM
write SetSAMPNUM;
property SAMPCAP : boolean
read GetSAMPCAP
write SetSAMPCAP;
property REFSEL : tADCRefSel
read GetREFSEL
write SetREFSEL;
property PRESC : tADCPrescalar
read GetPRESC
write SetPRESC;
property INITDLY : tADCINITDelay
read GetINITDLY
write SetINITDLY;
property ASDV : tADCASV
read GetASDV
write SetASDV;
property SAMPLDLY : byte
read GetSAMPLDLY
write SetSAMPLDLY;
property WINCM : tADCWINCM
read GetWINCM
write SetWINCM;
property SAMPLEN : byte
read GetSAMPLEN
write SetSAMPLEN;
property MUXPOS : tADCMUXPOS
read GetMUXPOS
write SetMUXPOS;
property STCONV : boolean
read GetSTCONV
write SetSTCONV;
property STARTEI : boolean
read GetSTARTEI
write SetSTARTEI;
property WCMPEnable : boolean
read GetWCMPEnable
write SetWCMPEnable;
property RESRDYEnable : boolean
read GetRESRDYEnable
write SetRESRDYEnable;
property WCMP : boolean
read GetWCMP
write SetWCMP;
property RESRDY : boolean
read GetRESRDY
write SetRESRDY;
property DBGRUN : boolean
read GetDBGRUN
write SetDBGRUN;
property TEMP : byte
read fTEMP
write fTEMP;
property RES : word
read fRES
write fRES;
property WINLT : word
read fWINLT
write fWINLT;
property WINHT : word
read fWINHT
write fWINHT;
property DUTYCYC : tDUTCYCLE
read GetDUTYCYC
write SetDUTYCYC;
end;
Udo has been helping me to develop these features.
Anyone else interested in playing with skeleton records and maybe contributing to their development please let me know and I will send them the latest beta.
Regards
Merlin
============================================================
Ich habe an einer mächtigen neuen Funktion für AVRco gearbeitet, die ich Skeleton Records nenne.
Skeleton Records sind ein bedeutender Schritt in Richtung Objektorientierung.
Wir assoziieren Objektorientierung klassischerweise mit Klassen, aber sie sind nicht die einzige Möglichkeit, dies zu erreichen. Letzten Endes bedeutet Objektorientierung, dass alles, was mit einem Objekt verbunden ist, an einem Ort gesammelt wird, seien es Daten, Funktionen, Prozeduren oder was auch immer. In unserem Fall erreichen wir dies mit Datensätzen.
Skeleton-Datensätze unterscheiden sich von klassischen Datensätzen durch das Hinzufügen von Chevrons <> nach dem Wort "Record". Diese Chevrons können zusätzliche Informationen in Form von Parametern enthalten, aber dazu später mehr.
Als Tutorial werden wir die Verwendung von Skeleton-Records anhand eines ADC-Treibers für die Mega4808- und 4809-Chips veranschaulichen, aber das Design sollte auch für andere Chips der gleichen Familie funktionieren.
Wer sonst noch Interesse hat, mit Skeleton Records zu spielen und vielleicht zu ihrer Entwicklung beizutragen, möge sich bitte bei mir melden, und ich werde ihm die neueste Beta-Version schicken.
Mit freundlichen Grüßen
Merlin