animal 0 29 мая, 2014 Опубликовано 29 мая, 2014 · Жалоба Добрый день, господа! Прошу Вашей помощи. #include <../../../../../../../../include/xc.h> #include <../../../../../../include/pic16f1518.h> // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. // CONFIG1 #pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled) #pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input) #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset disabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) #pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled) #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled) // CONFIG2 #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config VCAPEN = OFF // Voltage Regulator Capacitor Enable bit (VCAP pin function disabled) #pragma config STVREN = OFF // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config LPBOR = OFF // Low-Power Brown Out Reset (Low-Power BOR is disabled) #define _XTAL_FREQ 16000000 #define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0))) unsigned char Tmp; main(void) { OSCCON = 0b01111010; // Internal OSC @ 16MHz SSPCON1=0b00101000; //I2C master SSPCON3bits.SDAHT = 1; // Minimum of 300 ns hold time on SDA // after the falling edge of SCL SSPSTAT=0b10000000; //slew rate control disabled SSPADD=0x27; //100 kHz SSPIF = 0; // Clear the serial port interrupt flag BCLIF = 0; // Clear the bus coll interrupt flag BCLIE = 1; // Enable bus collision interrupts SSPIE = 1; // Enable serial port interrupts PEIE = 1; // Enable peripheral interrupts GIE = 1; // Enable global interrupts PORTC = 0x00; // Clear PORTC LATC = 0x00; // Clear PORTC latches TRISC = 0b00011000; // Set RC3, RC4 as inputs for I2C PORTB=0x00; LATB=0x00; TRISB=0x00; __delay_ms(100); do{ SSPCON2bits.SEN = 1; // set start bit SSPBUF=0x30; do{}while(!SSPIF); SSPIF=0; // SSPBUF=0x55; // do{}while(!SSPIF); // SSPIF=0; SSPCON2bits.PEN = 1; // set stop bit PORTBbits.RB5=1; __delay_ms(100); PORTBbits.RB5=0; __delay_ms(100); }while(1); } На RB5 - светодиод. Без строчек с SSP все мигает. При загрузке приведенного кода мигания нет. При запуске в отладке с PicKit3 происхдят "перескоки" на начало программы (даже если в теле программы про SSP только одна строчка старт-бита). Контроллер PIC16F1518, XC8 1.31, MPLAB-X 1.9, код слизан с AN734. Пните пожалуйста в нужном направлении. :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Voldemari4 0 29 мая, 2014 Опубликовано 29 мая, 2014 · Жалоба У вас разрешены прерывания, а где обработчик прерываний? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 29 мая, 2014 Опубликовано 29 мая, 2014 · Жалоба Именно. Обработчика нет. 2. А что, так можно: GIE = 1; //? и компайлер понимает? Я думал что только INTCONbits.GIE=1; и так далее.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Voldemari4 0 29 мая, 2014 Опубликовано 29 мая, 2014 · Жалоба А что, так можно: GIE = 1; //? и компайлер понимает? Я думал что только INTCONbits.GIE=1; Все биты прописаны через #define в заголовочном файле для контроллера. Вот пример для PIC24 /* INTCON2 */ #define _INT0EP INTCON2bits.INT0EP #define _INT1EP INTCON2bits.INT1EP #define _INT2EP INTCON2bits.INT2EP #define _DISI INTCON2bits.DISI #define _ALTIVT INTCON2bits.ALTIVT Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 29 мая, 2014 Опубликовано 29 мая, 2014 · Жалоба А.. интересненько.. Не, пожалуй, с битами лучше. Нагляднее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
animal 0 29 мая, 2014 Опубликовано 29 мая, 2014 · Жалоба У вас разрешены прерывания, а где обработчик прерываний? добавил: void interrupt isr(void) { if (SSPIF) { Tmp=1; SSPIF=0; } if (BCLIF) { Tmp=1; BCLIF=0; } } и изменил: SPCON2bits.SEN = 1; // set start bit do{}while(SSPCON2bits.SEN); SSPBUF=0x30; do{}while(!Tmp); Tmp=0; SSPCON2bits.PEN = 1; // set stop bit Мыргает. На строке do{}while(SSPCON2bits.SEN) возникает BusCollision (вижу в режиме отладки PicKitом). :( и на ногах SCL SDA ничего не происходит. Старта нет, посылки нет. Пинайте дальше. :) Возможно что-то с конфигурацией не так, но она полностью слизана из апноута и на CCS старт и посылка адреса присутствовала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 29 мая, 2014 Опубликовано 29 мая, 2014 · Жалоба Мыргает. На строке do{}while(SSPCON2bits.SEN) возникает BusCollision (вижу в режиме отладки PicKitом). :( и на ногах SCL SDA ничего не происходит. Старта нет, посылки нет. Пинайте дальше. :) Возможно что-то с конфигурацией не так, но она полностью слизана из апноута и на CCS старт и посылка адреса присутствовала. Ну если бас коллижн, значит там уже "0" на той ноге. Я так понимаю. Резисторы подтяжки на + стоят? Че вольтметр показывает ДО старта? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
animal 0 30 мая, 2014 Опубликовано 30 мая, 2014 · Жалоба Ну если бас коллижн, значит там уже "0" на той ноге. Я так понимаю. Резисторы подтяжки на + стоят? Че вольтметр показывает ДО старта? Резисторы подтяжки стоят на килооом на плюс. На выводах всегда +5. Не проскакивает ни импульса (следит осцил в режиме выборки). Далее код на CCS: #BYTE SSPCON1=0x0215 #BYTE SSPSTAT=0x0214 #BYTE SSPADD=0x0212 #BYTE SSPCON2=0x0216 #BYTE SSPCON3=0x0217 #BYTE SSPBUF=0x0211 #BYTE PIR1=0x0011 #BYTE PIE1=0x0091 #BYTE PIR2=0x0012 #BYTE PIE2=0x0092 #INT_SSP void ssp_interrupts() { Tmp_SSP=TRUE; clear_interrupt(INT_SSP); } #INT_BUSCOL void ssp_collision() { Tmp_BUSCOL=TRUE; clear_interrupt(INT_BUSCOL); output_high(PIN_B5); } void main() {setup_oscillator(OSC_16MHZ|OSC_INTRC); SSPCON1=0b00101000; //I2C master SSPCON3=0b00001000; SSPSTAT=0b10000000;//slew rate control disabled SSPADD=0x27; //100 kHz bit_set(PIE1,3);//SSPIE=1 interrupt enable bit_set(PIE2,3);//BCLIE=1 interrupt bus collision enable enable_interrupts(GLOBAL); delay_ms (500); do{ bit_set(SSPCON2,0); //start SEN=1 do{}while(bit_test(SSPCON2,0)); SSPBUF=0x08; do{}while(!Tmp_SSP); //SSPIF=? (interrupt=?) Tmp_SSP=0; SSPBUF=0x55; do{}while(Tmp_SSP); //SSPIF=? (interrupt=?) Tmp_SSP=0; bit_set(SSPCON2,2); //stop bit delay_us(100); }while(TRUE); }//main Код на CCS дает старт бит и посылку байта адреса, затем повтор. Нету у меня прав редактирования сообщений оказывается. :( Запуск отладки на PickKit3 не показателен. Отладка на коде CCS тоже приводит к "перескоку" выполнения со строки do{}while(!Tmp_SSP); //после посылки адреса. Реально-же, байты адреса следуют друг за другом (без паузы в полсекунды). И, да, в программе на XC8, прерывания по BUSCOL на самом деле не происходит. Но на выводах все равно +5 и тишина... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Voldemari4 0 30 мая, 2014 Опубликовано 30 мая, 2014 · Жалоба Ваша программа может зависать на циклах while. Все таки внутри цикла стоит сделать счетчик и выход через некоторое время в случае зависания. Попробуйте еще вместо ожидания флага прерывания после передачи поставить ожидание сброса бита SSPSTATbits.BF. И еще зачем вам прерывание void ssp_interrupts()? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
animal 0 30 мая, 2014 Опубликовано 30 мая, 2014 · Жалоба Ваша программа может зависать на циклах while. Все таки внутри цикла стоит сделать счетчик и выход через некоторое время в случае зависания. Попробуйте еще вместо ожидания флага прерывания после передачи поставить ожидание сброса бита SSPSTATbits.BF. И еще зачем вам прерывание void ssp_interrupts()? CCS-ный код приведен для примера, что MSSP контроллера признаки жизни подает и с пайкой ничего не напутано. Сконцентрировать внимание хотелось бы именно на XC8, так как планирую на него перейти. Проблема в том, что на XC8 MSSP признаки жизни вообще не подает. П.С.: Экспресс-опрос присутствующих. А на чем программируете Вы? И на чем, по вашему мнению, программирует большинство микрочиповцев? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 30 мая, 2014 Опубликовано 30 мая, 2014 · Жалоба Я на XC8. Вот выжимка из рабочего кода PIC18F14K50: void Init() { SSPADD = 29; //48 MHz PLL, 12 MHz crystal SSPCON1bits.SSPM = 0x08; SSPCON1bits.SSPEN = 1; // Enable priority interrupt RCONbits.IPEN = 1; INTCONbits.GIEL = 1; INTCONbits.GIEH = 1; IPR1bits.SSPIP = 0; PIE1bits.SSPIE = 1; } inline void I2C_wait() { while (PIR1bits.SSPIF == 0); } uint8_t I2C_read(uint8_t addr) { uint8_t ret = 0xDD; //START SSPCON2bits.SEN = 1; I2C_wait(); //Device address SSPBUF = I2C_ADDR; I2C_wait(); //Device memory address SSPBUF = addr; I2C_wait(); //Repeated start SSPCON2bits.RSEN = 1; I2C_wait(); //Device address with READ bit on SSPBUF = I2C_ADDR | 0x01; I2C_wait(); //enable read SSPCON2bits.RCEN = 1; I2C_wait(); SSPCON2bits.ACKDT = 0; SSPCON2bits.ACKEN = 1; ret = SSPBUF; I2C_wait(); SSPCON2bits.RCEN = 1; I2C_wait(); SSPCON2bits.ACKDT = 0; SSPCON2bits.ACKEN = 1; ret = SSPBUF; I2C_wait(); SSPCON2bits.RCEN = 1; I2C_wait(); SSPCON2bits.ACKDT = 1; SSPCON2bits.ACKEN = 1; ret = SSPBUF; SSPCON2bits.PEN = 1; I2C_wait(); ret = SSPBUF; return ret; } void interrupt low_priority LowPriorityInterrupt() { if (PIR1bits.SSPIF) { PIR1bits.SSPIF = 0; //i2c_interrupt(); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
animal 0 30 мая, 2014 Опубликовано 30 мая, 2014 (изменено) · Жалоба За выжимку спасибо. Я, хоть тресни, не вижу ошибки в коде. Модуль MSSP не подает вообще ни импульса. Конфигурацию проверил десять раз уже. Не могу понять где ошибка... Изменено 30 мая, 2014 пользователем animal Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 30 мая, 2014 Опубликовано 30 мая, 2014 · Жалоба За выжимку спасибо. Я, хоть тресни, не вижу ошибки в коде. Модуль MSSP не подает вообще ни импульса. Конфигурацию проверил десять раз уже. Не могу понять где ошибка... Аналоговый блок есть там, отключен? А просто можками подергать/почитать - работает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
animal 0 30 мая, 2014 Опубликовано 30 мая, 2014 · Жалоба Аналоговый блок есть там, отключен? А просто можками подергать/почитать - работает? Добавил : ADCON0bits.ADON=0; //ADC disable Нет изменений. На CCS+MPLABX даже пытается I2С работать. Ноги точно рабочие. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 30 мая, 2014 Опубликовано 30 мая, 2014 · Жалоба Остается сравнить состояния регистров до I2C START в CCS и XC8 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться