- уже использовал в поворотниках для авто (для линейки WS281х) - вот те работают
Я конечно дико извиняюсь, а в чём сакральный смысл применения 32-х разрядного процессора в реле поворотов ?
Спрашиваю так, с интереса.
Код: Выделить всё
void CalcTemperature(void) {
uint16_t resADC;
uint8_t i;
uint8_t tempCurr;
int16_t tempFIR=0;
static uint8_t index=0;
if(!flag.tempSensReady) return;
flag.tempSensReady=0;
resADC=(uint16_t)ADRESL+((uint16_t)ADRESH<<8);
tempCurr=(int8_t)((((((__int24)resADC*gainTempSens)/256)+offsetTempSens)/10)-8);
arrayTemp[index]=tempCurr;
index=(index+1)&0x7F;
for(i=0;i<128;i++) tempFIR+=(int16_t)arrayTemp[i];
temperature=(int8_t)(tempFIR>>7);
ADCON0bits.GO=1;
}
Код: Выделить всё
199: void CalcTemperature(void) {
200:
201: uint16_t resADC;
202: uint8_t i;
203: uint8_t tempCurr;
204: int16_t tempFIR=0;
5844 0E00 MOVLW 0x0
5846 0105 MOVLB 0x5
5848 6FD5 MOVWF CLCSELECT, BANKED
584A 0E00 MOVLW 0x0
584C 6FD4 MOVWF CLCDATA, BANKED
205: static uint8_t index=0;
206:
207: if(!flag.tempSensReady) return;
584E BA19 BTFSC 0x19, 5, ACCESS
5850 EF2C GOTO 0x5858
5852 F02C NOP
5854 EF2E GOTO 0x585C
5856 F02C NOP
5858 EF30 GOTO 0x5860
585A F02C NOP
585C EFC4 GOTO 0x5988
585E F02C NOP
208: flag.tempSensReady=0;
5860 9A19 BCF 0x19, 5, ACCESS
209: resADC=(uint16_t)ADRESL+((uint16_t)ADRESH<<8);
5862 0103 MOVLB 0x3
5864 51EB MOVF DMAnDCNTH, W, BANKED
5866 6E4B MOVWF HLVDCON1, ACCESS
5868 51EA MOVF DMAnDCNT, W, BANKED
586A 0105 MOVLB 0x5
586C 6FD1 MOVWF 0xD1, BANKED
586E C54B MOVFF 0x54B, 0x5D2
5870 F5D2 NOP
210: tempCurr=(int8_t)((((((__int24)resADC*gainTempSens)/256)+offsetTempSens)/10)-8);
5872 0E2E MOVLW 0x2E
5874 6EF6 MOVWF 0xFF6, ACCESS
5876 0E00 MOVLW 0x0
5878 6EF7 MOVWF 0xFF7, ACCESS
587A 0E2C MOVLW 0x2C
587C 6EF8 MOVWF 0xFF8, ACCESS
587E 0009 TBLRD*+
5882 F3D4 NOP
5884 F54B NOP
5886 0009 TBLRD*+
588A F3D4 NOP
588C F54C NOP
588E 0E00 MOVLW 0x0
5890 6E43 MOVWF NVMADR, ACCESS
5892 0E01 MOVLW 0x1
5894 6E44 MOVWF NVMADRH, ACCESS
5896 0E00 MOVLW 0x0
5898 6E45 MOVWF NVMADRU, ACCESS
589A 0E2A MOVLW 0x2A
589C 6EF6 MOVWF 0xFF6, ACCESS
589E 0E00 MOVLW 0x0
58A0 6EF7 MOVWF 0xFF7, ACCESS
58A2 0E2C MOVLW 0x2C
58A4 6EF8 MOVWF 0xFF8, ACCESS
58A6 0009 TBLRD*+
58AA F3D4 NOP
58AC F54D NOP
58AE 0009 TBLRD*+
58B2 F3D4 NOP
58B4 F54E NOP
58B6 C54D MOVFF 0x54D, multiplicand
58B8 F53A NOP
58BA C54E MOVFF 0x54E, counter
58BC F53B NOP
58BE 6A3C CLRF 0x3C, ACCESS
58C0 BE3B BTFSC 0x3B, 7, ACCESS
58C2 063C DECF 0x3C, F, ACCESS
58C4 C5D1 MOVFF resADC, dividend
58C6 F537 NOP
58C8 C5D2 MOVFF 0x5D2, key
58CA F538 NOP
58CC 6A39 CLRF CLKRCON, ACCESS
58CE EC08 CALL 0x6810, 0
58D0 F034 NOP
58D2 C537 MOVFF dividend, dividend
58D4 F540 NOP
58D6 C538 MOVFF key, 0x541
58D8 F541 NOP
58DA C539 MOVFF divisor, 0x542
58DC F542 NOP
58DE EC3A CALL 0x5C74, 0
58E0 F02E NOP
58E2 504B MOVF HLVDCON1, W, ACCESS
58E4 2440 ADDWF NVMCON0, W, ACCESS
58E6 0105 MOVLB 0x5
58E8 6FCE MOVWF 0xCE, BANKED
58EA 504C MOVF ZCDCON, W, ACCESS
58EC 2041 ADDWFC NVMCON1, W, ACCESS
58EE 6FCF MOVWF 0xCF, BANKED
58F0 0E00 MOVLW 0x0
58F2 BE4C BTFSC ZCDCON, 7, ACCESS
58F4 0EFF MOVLW 0xFF
58F6 2042 ADDWFC NVMLOCK, W, ACCESS
58F8 6FD0 MOVWF 0xD0, BANKED
58FA C5CE MOVFF __pcstackBANK5, dividend
58FC F540 NOP
58FE C5CF MOVFF 0x5CF, 0x541
5900 F541 NOP
5902 C5D0 MOVFF tempFreqMode, 0x542
5904 F542 NOP
5906 0E0A MOVLW 0xA
5908 6E43 MOVWF NVMADR, ACCESS
590A 0E00 MOVLW 0x0
590C 6E44 MOVWF NVMADRH, ACCESS
590E 0E00 MOVLW 0x0
5910 6E45 MOVWF NVMADRU, ACCESS
5912 EC3A CALL 0x5C74, 0
5914 F02E NOP
5916 5040 MOVF NVMCON0, W, ACCESS
5918 0FF8 ADDLW 0xF8
591A 0105 MOVLB 0x5
591C 6FD3 MOVWF 0xD3, BANKED
213: arrayTemp[index]=tempCurr;
591E 0E00 MOVLW 0x0
5920 2412 ADDWF 0x12, W, ACCESS
5922 6ED9 MOVWF 0xFD9, ACCESS
5924 6ADA CLRF 0xFDA, ACCESS
5926 0E08 MOVLW 0x8
5928 22DA ADDWFC 0xFDA, F, ACCESS
592C F74C NOP
592E F4DF NOP
214: index=(index+1)&0x7F;
5930 2812 INCF 0x12, W, ACCESS
5932 0B7F ANDLW 0x7F
5934 6E12 MOVWF 0x12, ACCESS
215: for(i=0;i<128;i++) tempFIR+=(int16_t)arrayTemp[i];
5936 0E00 MOVLW 0x0
5938 6FD6 MOVWF CLCnCON, BANKED
593A 0E00 MOVLW 0x0
593C 25D6 ADDWF CLCnCON, W, BANKED
593E 6ED9 MOVWF 0xFD9, ACCESS
5940 6ADA CLRF 0xFDA, ACCESS
5942 0E08 MOVLW 0x8
5944 22DA ADDWFC 0xFDA, F, ACCESS
5946 50DF MOVF 0xFDF, W, ACCESS
5948 6E4B MOVWF HLVDCON1, ACCESS
594A 504B MOVF HLVDCON1, W, ACCESS
594C 27D4 ADDWF CLCDATA, F, BANKED
594E 0E00 MOVLW 0x0
5950 BE4B BTFSC HLVDCON1, 7, ACCESS
5952 0EFF MOVLW 0xFF
5954 23D5 ADDWFC CLCSELECT, F, BANKED
5956 2BD6 INCF CLCnCON, F, BANKED
5958 0E7F MOVLW 0x7F
595A 65D6 CPFSGT CLCnCON, BANKED
595C EFB2 GOTO 0x5964
595E F02C NOP
5960 EFB4 GOTO 0x5968
5962 F02C NOP
5964 EF9D GOTO 0x593A
5966 F02C NOP
216: temperature=(int8_t)(tempFIR>>7);
5968 C5D4 MOVFF tempFIR, 0x54B
596A F54B NOP
596C C5D5 MOVFF 0x5D5, 0x54C
596E F54C NOP
5970 0E07 MOVLW 0x7
5972 6E4D MOVWF 0x4D, ACCESS
5974 344C RLCF ZCDCON, W, ACCESS
5976 324C RRCF ZCDCON, F, ACCESS
5978 324B RRCF HLVDCON1, F, ACCESS
597A 2E4D DECFSZ 0x4D, F, ACCESS
597C EFBA GOTO 0x5974
597E F02C NOP
5980 504B MOVF HLVDCON1, W, ACCESS
5982 6E2A MOVWF 0x2A, ACCESS
217:
218: ADCON0bits.GO=1;
5984 0103 MOVLB 0x3
5986 81F3 BSF DMAnSCNTH, 0, BANKED
219: }
5988 0012 RETURN 0
дословно будет выполнять следующее. Содержимое восьмибитного регистра ADRESH будет сдвинуто влево на восемь бит и результат этого сдвига будет очевидно равен НУЛЮ. То есть ты присвоил 16-битной локальной resADC значение только восьми младших бит 12-разрядного АЦП. 4 старших разряда пошли лесом.resADC=(uint16_t)(ADRESL + ADRESH<<8);
Код: Выделить всё
volatile uint16_t resADC = 555;
movlw 0x2B
movwf resADC
movlw 0x2
movwf 0x48Код: Выделить всё
resADC=(uint16_t)(ADRESL+ADRESH<<8);
bsf STATUS, RP0
movf ADRESH, W ; читаем в W старший байт АЦП
bcf STATUS, RP0
addwf ADRESL, W ; суммируем с W младший байт АЦП
movwf 0x45 ; выгружаем сумму в адрес 0x45
clrf 0x46 ; очищаем содержимое по адресу 0x46
rlf 0x46, F ; сдвигаем по кольцу влево на один бит это содержимое
movwf 0x48 ; выгружаем результат в старший байт resADC
clrf resADC ; очищаем младший байт resADC
Код: Выделить всё
volatile uint16_t resADC = 555;
movlw 0x2B
movwf resADC
movlw 0x2
movwf 0x48Код: Выделить всё
resADC=(uint16_t)(ADRESL+ADRESH<<8);
bsf STATUS, RP0
movf ADRESH, W ; читаем в W старший байт АЦП
bcf STATUS, RP0
addwf ADRESL, W ; суммируем с W младший байт АЦП
movwf 0x45 ; выгружаем сумму в адрес 0x45
clrf 0x46 ; очищаем содержимое по адресу 0x46
rlf 0x46, F ; сдвигаем по кольцу влево на один бит это содержимое
movwf 0x48 ; выгружаем результат в старший байт resADC
clrf resADC ; очищаем младший байт resADC
Код: Выделить всё
209: resADC=(uint16_t)ADRESL+((uint16_t)ADRESH<<8);
5862 0103 MOVLB 0x3
5864 51EB MOVF DMAnDCNTH, W, BANKED
5866 6E4B MOVWF HLVDCON1, ACCESS
5868 51EA MOVF DMAnDCNT, W, BANKED
586A 0105 MOVLB 0x5
586C 6FD1 MOVWF 0xD1, BANKED
586E C54B MOVFF 0x54B, 0x5D2
5870 F5D2 NOP
Код: Выделить всё
209: resADC=(uint16_t)ADRESL+((uint16_t)ADRESH<<8);
5862 0103 MOVLB 0x3
5864 51EB MOVF DMAnDCNTH, W, BANKED
5866 6E4B MOVWF HLVDCON1, ACCESS
5868 51EA MOVF DMAnDCNT, W, BANKED
586A 0105 MOVLB 0x5
586C 6FD1 MOVWF 0xD1, BANKED
586E C54B MOVFF 0x54B, 0x5D2
5870 F5D2 NOP
Код: Выделить всё
bsf E_LCD
bcf E_LCD
Код: Выделить всё
bsf E_LCD
nop
bcf E_LCD
Код: Выделить всё
bsf E_LCD
bcf E_LCD
Код: Выделить всё
bsf E_LCD
nop
bcf E_LCD