Как же меня достали i2c и любые приборы, которые не толерантны к пяти вольтам. Ну пипец просто.
Скажите, есть люди, у которых не было затяжных проблем с i2C?
roboforum.ruТехнический форум по робототехнике. |
|
|
dccharacter писал(а):Вот удалось частично поймать мастер на передаче. Странное поведение линии SDA между пересылкой байтов, она, почему-то, отпускается. А судя по даташиту - не должна.
__CONFIG(FOSC_INTOSC & CLKOUTEN_OFF & WDTE_OFF & PWRTE_ON & PLLEN_OFF);
и:
__delay_ms(ххх);
if (ADIE && ADIF)
...
if (TMR0IF && TMR0IE)
if (ADIE && ADIF) {
ADIF = 0;
v_bat_sample = (ADRESH << 8) + ADRESL;
GO_nDONE = 1;
}
Dmitry__ писал(а):Нуууу, штука сложная, буду глазеть по мере появления своб. времени...
Чем компилишь проект? Линуховый mplab x ide ругается на:
- Код: Выделить всё • Развернуть
__CONFIG(FOSC_INTOSC & CLKOUTEN_OFF & WDTE_OFF & PWRTE_ON & PLLEN_OFF);
и:
__delay_ms(ххх);
Dmitry__ писал(а):Замеченные косяки:
Зачем в прерывании проверять флаги "ie"? Оверхеды жОсткие.
- Код: Выделить всё • Развернуть
if (ADIE && ADIF)
...
if (TMR0IF && TMR0IE)
Если периф. узел выключен, то не будет генериться флаг "IF" и соотв. isr, а если узел вкл. то незачем проверять "IE".
Dmitry__ писал(а):Далее, ты настроил ADC на чтение в isr. Сразу после чтения запускаешь новое преобразование:
- Код: Выделить всё • Развернуть
if (ADIE && ADIF) {
ADIF = 0;
v_bat_sample = (ADRESH << 8) + ADRESL;
GO_nDONE = 1;
}
АЦП - штука быстрая, за n тактов - происходит новое прерывание от ацп. А нужно тебе это для жутко медленного v_bat_sample. Если ты запустишь дебаггер (можно чисто софтовый), то увидишь что твоя прога все время крутится в isr adc. При выходе из прерывания, выполняется всего несколько команд основной программы и происходит очередное прерывание от adc.
dccharacter писал(а):xc8
dccharacter писал(а):Ты это! Чего говоришь-то! Флаги один хрен взводятся. Надо пруфов?
The ADIF bit is set at the completion of
every conversion, regardless of whether
or not the ADC interrupt is enabled.
SSP1ADD = _XTAL_FREQ / (4 * 100000l) - 1; //400kHz
v_bat_sample = (ADRESH << 8) + ADRESL;
v_bat_sample = ADRES;
uint16_t v_bat_sample;
union
{
uint16_t v_bat_sample;
unsigned char byte_v_bat_sample[sizeof(v_bat_sample)];
}mU;
а вместо:
v_bat_sample = (ADRESH << 8) + ADRESL;
так:
mU.byte_v_bat_sample[0] = ADRESL;
mU.byte_v_bat_sample[1] = ADRESH;
7814 ;main.c: 160: mU.byte_v_bat_sample[0] = ADRESL;
7815 00DC 0021 movlb 1 ; select bank1
7816 00DD 081B movf 27,w ;volatile
7817 00DE 0020 movlb 0 ; select bank0
7818 00DF 00AE movwf ??_isr
7819 00E0 082E movf ??_isr,w
7820 00E1 00D3 movwf _mU
7821
7822 ;main.c: 161: mU.byte_v_bat_sample[1] = ADRESH;
7823 00E2 0021 movlb 1 ; select bank1
7824 00E3 081C movf 28,w ;volatile
7825 00E4 0020 movlb 0 ; select bank0
7826 00E5 00AE movwf ??_isr
7827 00E6 082E movf ??_isr,w
7828 00E7 00D4 movwf _mU+1
7814 ;main.c: 160: mU.byte_v_bat_sample[0] = ADRESL;
7815 00DC 0021 movlb 1 ; select bank1
7816 00DD 081B movf 27,w ;volatile
7817 00DE 0020 movlb 0 ; select bank0
7820 00E1 00D3 movwf _mU
7821
7822 ;main.c: 161: mU.byte_v_bat_sample[1] = ADRESH;
7823 00E2 0021 movlb 1 ; select bank1
7824 00E3 081C movf 28,w ;volatile
7825 00E4 0020 movlb 0 ; select bank0
7828 00E7 00D4 movwf _mU+1
7809 ;main.c: 160: v_bat_sample = (ADRESH << 8) + ADRESL;
7810 00DC 0021 movlb 1 ; select bank1
7811 00DD 081C movf 28,w ;volatile
7812 00DE 0020 movlb 0 ; select bank0
7813 00DF 01D1 clrf _v_bat_sample+1
7814 00E0 07D1 addwf _v_bat_sample+1,f
7815 00E1 0021 movlb 1 ; select bank1
7816 00E2 081B movf 27,w ;volatile
7817 00E3 0020 movlb 0 ; select bank0
7818 00E4 01D0 clrf _v_bat_sample
7819 00E5 07D0 addwf _v_bat_sample,f
while ((SSP1CON2 & 0x1F) || (SSP1STATbits.R_nW));
void interrupt isr(void) {
if (IOCIE && IOCIF) {}
if (IOCBF3) {}
if (IOCBF7) {}
if (ADIE && ADIF) {}
if (TMR0IF && TMR0IE) {}
}
void interrupt isr(void) {
if (ADIF) {} return; //самый шустрый вверх, ADIE - удалить.
if (IOCIF) {} return;
if (IOCBF3) {} return;
if (IOCBF7) {} return;
if (TMR0IF && TMR0IE) {}
}
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1