dobré je to k tomu. komunikuji s ds18b20 v přerušení (časování sběrnice od TMR) Mám union a v něm struktury. Kvůli rychlému vypočtení CRC to zmáknu v ASM. no a proto přístup z asm do struct. tohle je řešení
Tak nic kloudného jsem nevyggoglil, nakonec jsem to dal takhle a chodí to, i když to košer tedy není. Ale chodí to.
typedef union {
struct {
int StrukturaPoveluAll;
_VycetPoveluDS18B20 Povel;
char Teplota_LSB;
char Teplota_MSB;
char;
};
struct StrukturaRead {
char PoradiBitu; // kolikáty bit se přijímá
char CRC;
_VycetPoveluDS18B20; //Povel
char; //TeplotaLSB;
char; //Teplota_MSB
char Work; // Work
} Read;
} xDS18B20_status;
//--------------------------------------------------------------------------------
xDS18B20_status DS18B20_status;
//--------------------------------------------------------------------------------
void DS18B20_CRCcheck ()
{
DS18B20_status.Read.PoradiBitu = 8; //pocet pripoctenych bitu 8
#asm
PoradiBitu set _DS18B20_status;
CRC set _DS18B20_status + 1;
Work set _DS18B20_status + 5;
vypcr0:
RRCF Work, f; //LSB do C
BC vypcr3;
BTFSC CRC, 7;
goto vypcr4; //CRC (7) = 1, C = 0
vypcr1:
BCF (STATUS), 0; //CRC (7).XOR.C = 0
RLCF CRC, f;
vypcr2:
DECFSZ PoradiBitu, f;
GOTO vypcr0;
RETURN;
vypcr3:
BTFSC CRC, 7;
GOTO vypcr1; //CRC (7).XOR.C = 0
vypcr4:
MOVLW 18h; //CRC (7).XOR.C = 1
XORWF CRC, f; //CRC.XOR.18h
BSF (STATUS), 0;
RLCF CRC, f;
GOTO vypcr2;
#endasm
}