Hallo Leute,
hat irgend Jemand mal erfolgreich die Funktion "ReadProductionRow()" mit dem AVRco benutzt?
Ich habe jetzt verschiedene Wege ausprobiert.
1. In der Main App:
Ergebnis ist immer:
low: 00
High: 00
2. Versuch über das Boot:
Und in der MainApp:
Ich habe das Gefühl diese ReadProduktionRow Funktion hat einen Fehler.
Der ASM Code sieht wie folgt aus:
Ich bin kein ASM Profi, liegt hier nicht ein Fehler vor?
Die Funktion fordert im AVRco ein WORD (in C nutze ich hier aber ein uint8_t (entspricht ein Byte) ), in dieser Funktion wird das Word geladen und 8 Bits nach rechts geschoben, also kann die Adresse $20, $21 nie genutzt werden! Da diese Adresse verschoben wird! Das ist doch ein BUG oder?
Ich teste das ganze mal mit:
Thorsten
NACHTRAG:
Nach der Änderung erhalte ich nun auch Werte, ich weiss zwar noch nicht ob diese richtig sind:
low: 0B
High: FF
hat irgend Jemand mal erfolgreich die Funktion "ReadProductionRow()" mit dem AVRco benutzt?
Ich habe jetzt verschiedene Wege ausprobiert.
1. In der Main App:
Code
bCalLow:= ReadProductionRow(word(ADCACAL0));
bCalHigh:= ReadProductionRow(word(ADCACAL1));
DebugOut('low: '+ByteToHex(bCalLow));
DebugOut('High: '+ByteToHex(bCalHigh));
bCalHigh:= ReadProductionRow(word(ADCACAL1));
DebugOut('low: '+ByteToHex(bCalLow));
DebugOut('High: '+ByteToHex(bCalHigh));
Ergebnis ist immer:
low: 00
High: 00
2. Versuch über das Boot:
Code
{$EEPROM}
eebCalLow[EEpromEnd - 7] : byte; // 4089 ADC CalLow aus Boot
eebCalHigh[EEpromEnd - 6]: byte; // 4090 ADC CalHigh aus Boot
eebCalLow[EEpromEnd - 7] : byte; // 4089 ADC CalLow aus Boot
eebCalHigh[EEpromEnd - 6]: byte; // 4090 ADC CalHigh aus Boot
Code
// ADC Kalibrierung
eebCalLow:= ReadProductionRow($0020);
eebCalHigh:= ReadProductionRow($0021);
eebCalLow:= ReadProductionRow($0020);
eebCalHigh:= ReadProductionRow($0021);
Und in der MainApp:
Code
{$EEPROM}
eebCalLow[EEpromEnd - 7] : byte; // 4089 ADC CalLow aus Boot
eebCalHigh[EEpromEnd - 6]: byte; // 4090 ADC CalHigh aus Boot
eebCalLow[EEpromEnd - 7] : byte; // 4089 ADC CalLow aus Boot
eebCalHigh[EEpromEnd - 6]: byte; // 4090 ADC CalHigh aus Boot
Code
DebugOut('low: '+ByteToHex(eebCalLow));
DebugOut('High: '+ByteToHex(eebCalHigh));
DebugOut('High: '+ByteToHex(eebCalHigh));
Ich habe das Gefühl diese ReadProduktionRow Funktion hat einen Fehler.
Der ASM Code sieht wie folgt aus:
Code
.LINE 621
PUSH _FRAMEPTR
PUSH _FPTRHI
LDI _ACCA, 00020h SHRB 8
LDI _ACCB, 00020h AND 0FFh
ST -Y, _ACCA
ST -Y, _ACCB
.FRAME 2
.FRAME 0
CALL SYSTEM.READPRODUCTIONROW
POP _FPTRHI
POP _FRAMEPTR
STS PVS2018_GLOBAL.BCALLOW, _ACCA
PUSH _FRAMEPTR
PUSH _FPTRHI
LDI _ACCA, 00020h SHRB 8
LDI _ACCB, 00020h AND 0FFh
ST -Y, _ACCA
ST -Y, _ACCB
.FRAME 2
.FRAME 0
CALL SYSTEM.READPRODUCTIONROW
POP _FPTRHI
POP _FRAMEPTR
STS PVS2018_GLOBAL.BCALLOW, _ACCA
Code
.LINE 622
PUSH _FRAMEPTR
PUSH _FPTRHI
LDI _ACCA, 00021h SHRB 8
LDI _ACCB, 00021h AND 0FFh
ST -Y, _ACCA
ST -Y, _ACCB
.FRAME 2
.FRAME 0
CALL SYSTEM.READPRODUCTIONROW
POP _FPTRHI
POP _FRAMEPTR
STS PVS2018_GLOBAL.BCALHIGH, _ACCA
PUSH _FRAMEPTR
PUSH _FPTRHI
LDI _ACCA, 00021h SHRB 8
LDI _ACCB, 00021h AND 0FFh
ST -Y, _ACCA
ST -Y, _ACCB
.FRAME 2
.FRAME 0
CALL SYSTEM.READPRODUCTIONROW
POP _FPTRHI
POP _FRAMEPTR
STS PVS2018_GLOBAL.BCALHIGH, _ACCA
Ich bin kein ASM Profi, liegt hier nicht ein Fehler vor?
Code
LDI _ACCA, 00021h SHRB 8
LDI _ACCB, 00021h AND 0FFh
LDI _ACCB, 00021h AND 0FFh
Die Funktion fordert im AVRco ein WORD (in C nutze ich hier aber ein uint8_t (entspricht ein Byte) ), in dieser Funktion wird das Word geladen und 8 Bits nach rechts geschoben, also kann die Adresse $20, $21 nie genutzt werden! Da diese Adresse verschoben wird! Das ist doch ein BUG oder?
Ich teste das ganze mal mit:
Code
// ADC Kalibrierung
eebCalLow:= ReadProductionRow($2000);
eebCalHigh:= ReadProductionRow($2100);
eebCalLow:= ReadProductionRow($2000);
eebCalHigh:= ReadProductionRow($2100);
Thorsten
NACHTRAG:
Nach der Änderung erhalte ich nun auch Werte, ich weiss zwar noch nicht ob diese richtig sind:
low: 0B
High: FF