Вс мар 10, 2019 17:27:53
Вс мар 17, 2019 13:49:23
Сб мар 23, 2019 22:19:20
(ULP 4.1) Detected uninitialized Port 1 in this project. Recommend initializing all unused ports to eliminate wasted current consumption on unused pins.
Пт мар 29, 2019 21:18:24
I2C_DEV->I2CSA = address >> 1;
I2C_DEV->CTLW0 &= ~UCSLA10;
I2C_DEV->CTLW0 |= UCTR;
I2C_DEV->CTLW0 |= UCTXSTT; // Передаём СТАРТ
LaunchPad_LED(0);
while ((I2C_DEV->IFG & UCTXIFG0) == 0) continue; // Ждём появления флага прерывания готовности буфера передачи
I2C_DEV->TXBUF = reg_addr; // Загружаем в буфер первый байт
LaunchPad_LED(1);
while ((I2C_DEV->IFG & UCTXIFG0) == 0) { // Снова ждём флаг и попутно проверяем не пришел ли NAK на адрес ведомого.
if (I2C_DEV->IFG & UCNACKIFG) {
I2C_DEV->CTLW0 |= UCTXSTP;
return I2C_NAK_ADDR;
}
};
for (i=0; i<length; i++) { // Теперь передаём весь буфер.
I2C_DEV->TXBUF = *data_ptr++;
while ((I2C_DEV->IFG & UCTXIFG0) == 0) {
if (I2C_DEV->IFG & UCNACKIFG) {
I2C_DEV->CTLW0 |= UCTXSTP;
return I2C_ERROR;
}
};
}
sendnext = 0;
I2C_DEV->I2CSA = address >> 1;
I2C_DEV->CTLW0 &= ~UCSLA10;
I2C_DEV->CTLW0 |= UCTR;
I2C_DEV->CTLW0 |= UCTXSTT;
I2C_DEV->IE |= EUSCI_B_IE_TXIE0;
LaunchPad_LED(0);
while (sendnext == 0) continue;
I2C_DEV->TXBUF = reg_addr;
LaunchPad_LED(1);
sendnext = 0;
while (sendnext == 0) {
if (I2C_DEV->IFG & UCNACKIFG) {
I2C_DEV->CTLW0 |= UCTXSTP;
return I2C_NAK_ADDR;
}
};
for (i=0; i<length; i++) {
sendnext = 0;
I2C_DEV->TXBUF = *data_ptr++;
while (sendnext == 0) {
if (I2C_DEV->IFG & UCNACKIFG) {
I2C_DEV->CTLW0 |= UCTXSTP;
return I2C_ERROR;
}
};
}
#1528-D (ULP 3.1) Detected flag polling using UCTXIFG0. Recommend using an interrupt combined with enter LPMx and ISR
Сб апр 06, 2019 16:16:48
typedef enum {
send_reg_hi,
send_reg_lo,
send_data,
rcv_reg_hi,
rcv_reg_lo,
rcv_restart,
rcv_data,
rcv_stop,
i2c_stop,
i2c_idle,
} i2c_state_t;
#define I2C_DEV EUSCI_B3
#define SDA_SCL_PORT P6
#define SDA_PIN (1u << 6)
#define SCL_PIN (1u << 7)
i2c_state_t i2c_state;
int data_count, i2c_register;
char *data_ptr;
t_i2c_status i2c_error_code;
void i2c_master_init(void) {
// включаем внутренние подтяжки на всякий случай.
// И тогда в некоторых случаях можно обойтись и без внешних резисторов.
SDA_SCL_PORT->REN |= (SDA_PIN | SCL_PIN);
SDA_SCL_PORT->OUT |= SCL_PIN;
Clock_Delay1us(10);
SDA_SCL_PORT->OUT |= SDA_PIN;
// выполняем clock toggle для вывода ds3231 в состояние незанимающее шину.
while ((SDA_SCL_PORT->IN & SDA_PIN) == 0) {
SDA_SCL_PORT->OUT &= ~SCL_PIN;
SDA_SCL_PORT->DIR |= SCL_PIN;
Clock_Delay1us(10);
SDA_SCL_PORT->DIR &= ~SCL_PIN;
SDA_SCL_PORT->OUT |= SCL_PIN;
Clock_Delay1us(10);
}
// подключаем выводы к EUSCI -
// ИЗМЕНИТЬ В СЛУЧАЕ ВЫБОРА ДРУГОГО ПОРТА!!!!!!!!!!!!!!!!!!!!!!!!!!!!
SDA_SCL_PORT->SEL0 &= ~(SDA_PIN | SCL_PIN);
SDA_SCL_PORT->SEL1 |= (SDA_PIN | SCL_PIN);
// Конфигурируем EUSCI
I2C_DEV->CTLW0 |= UCSWRST;
I2C_DEV->CTLW0 = UCMST | EUSCI_B_CTLW0_MODE_3 | EUSCI_B_CTLW0_SSEL__SMCLK | UCSYNC | UCSWRST;
I2C_DEV->BRW = 30; // 12000 MHz / 30 = 400 bps
I2C_DEV->CTLW0 &= ~UCSWRST;
NVIC_EnableIRQ(EUSCIB3_IRQn);
}
void EUSCIB3_IRQHandler(void) {
switch (I2C_DEV->IV) {
case 0x02: // Arbitration lost; Interrupt Flag: UCALIFG; Interrupt
break;
case 0x04: // Not acknowledgment; Interrupt Flag: UCNACKIFG
i2c_error_code = I2C_ERROR;
I2C_DEV->CTLW0 |= UCTXSTP;
i2c_state = i2c_stop;
break;
case 0x06: // Start condition received; Interrupt Flag: UCSTTIFG
break;
case 0x08: // Stop condition received; Interrupt Flag: UCSTPIFG
i2c_state = i2c_idle;
break;
case 0x0A: // Slave 3 Data received; Interrupt Flag: UCRXIFG3
case 0x0C: // Slave 3 Transmit buffer empty; Interrupt Flag: UCTXIFG3
case 0x0E: // Slave 2 Data received; Interrupt Flag: UCRXIFG2
case 0x10: // Slave 2 Transmit buffer empty; Interrupt Flag: UCTXIFG2
case 0x12: // Slave 1 Data received; Interrupt Flag: UCRXIFG1
case 0x14: // Slave 1 Transmit buffer empty; Interrupt Flag: UCTXIFG1
break;
case 0x16: // Data received; Interrupt Flag: UCRXIFG0
*data_ptr++ = I2C_DEV->RXBUF;
if (--data_count == 1) {
i2c_state = rcv_stop;
}
break;
case 0x18: // Transmit buffer empty; Interrupt Flag: UCTXIFG0
switch (i2c_state) {
case rcv_reg_hi:
I2C_DEV->TXBUF = (i2c_register >> 8) & 0xFFu;
i2c_state = rcv_reg_lo;
break;
case rcv_reg_lo:
I2C_DEV->TXBUF = i2c_register & 0xFFu;
i2c_state = rcv_restart;
break;
case rcv_restart:
I2C_DEV->CTLW0 &= ~UCTR;
I2C_DEV->CTLW0 |= UCTXSTT;
i2c_state = rcv_data;
if (data_count == 1) {
i2c_state = rcv_stop;
}
break;
case send_reg_hi:
I2C_DEV->TXBUF = (i2c_register >> 8) & 0xFFu;
i2c_state = send_reg_lo;
break;
case send_reg_lo:
I2C_DEV->TXBUF = i2c_register & 0xFFu;
i2c_state = send_data;;
break;
case send_data:
if (data_count--) {
I2C_DEV->TXBUF = *data_ptr++;
} else {
I2C_DEV->CTLW0 |= UCTXSTP;
i2c_state = i2c_stop;
}
break;
}
break;
case 0x1A: // Byte counter zero; Interrupt Flag: UCBCNTIFG
case 0x1C: // Clock low timeout; Interrupt Flag: UCCLTOIFG
case 0x1E: // 9th bit position; Interrupt Flag: UCBIT9IFG
break;
}
}
t_i2c_status i2c_wr_reg(uint8_t address, uint8_t reg_addr, char * data, unsigned int length) {
data_ptr = data;
data_count = length;
i2c_register = reg_addr;
i2c_state = send_reg_lo;
i2c_error_code = I2C_SUCCESS;
I2C_DEV->I2CSA = address >> 1;
I2C_DEV->CTLW0 &= ~UCSLA10;
I2C_DEV->CTLW0 |= UCTR | UCTXSTT;
I2C_DEV->IE |= UCTXIE0 | UCNACKIE | UCSTPIE;
while (i2c_state != i2c_idle) continue;
I2C_DEV->IE &= ~(UCTXIE0 | UCNACKIE | UCSTPIE);
return i2c_error_code;
}
t_i2c_status i2c_rd_reg(uint8_t address, uint8_t reg_addr, char * data, unsigned int length) {
data_ptr = data;
data_count = length;
i2c_register = reg_addr;
i2c_state = rcv_reg_lo;
i2c_error_code = I2C_SUCCESS;
I2C_DEV->I2CSA = address >> 1;
I2C_DEV->CTLW0 &= ~UCSLA10;
I2C_DEV->CTLW0 |= UCTXSTT | UCTR ;
I2C_DEV->IE |= UCTXIE0 | UCRXIE | UCNACKIE | UCSTPIE;
while (i2c_state != i2c_idle) {
if (i2c_state == rcv_stop) {
while (I2C_DEV->CTLW0 & UCTXSTT) continue;
I2C_DEV->CTLW0 |= UCTXSTP;
i2c_state = i2c_stop;
}
}
I2C_DEV->IE &= ~(UCTXIE0 | UCRXIE | UCNACKIE | UCSTPIE);
if (data_count) i2c_error_code = I2C_ERROR;
return i2c_error_code;
}
while(1) {
if (i2c_rd_reg(0xD0, 0x00, time, 8) != I2C_SUCCESS) LaunchPad_Output(1<<0);
else LaunchPad_Output(1<<2);
print_dump(time);
i2c_update_display();
}
Пт апр 19, 2019 10:59:22
// delay function
// which delays about 6*ulCount cycles
// ulCount=8000 => 1ms = (8000 loops)*(6 cycles/loop)*(20.83 ns/cycle)
//Code Composer Studio Code
void delay(unsigned long ulCount){
__asm ( "pdloop: subs r0, #1\n"
" bne pdloop\n");
}
void delay(unsigned long ulCount){
__asm ( "pdloop: subs ulCount, #1\n"
" bne pdloop\n");
}
//*********** EnableInterrupts ***************
// emable interrupts
// inputs: none
// outputs: none
void EnableInterrupts(void){
__asm (" CPSIE I\n"
" BX LR\n");
}
Вс апр 21, 2019 20:05:54
Вс апр 21, 2019 22:02:59
Собственно, только из-за лекций. Поначалу, показалось, что посмотрю, подсмотрю и мне откроется нечто сокровенное. Вообще, сначала я этот кит не брал, а за дюжину евро купил просто платку ланчпада - так что у меня их сейчас две - одна на роботе, а на второй я тренируюсь. В соревнованиях требований на конструкцию никаких нет. Есть ограничение на массу, габариты, автономность. Ну, тем, кто выступает в категории Лего - там да, есть требование, что можно использовать только компоненты от Лего (и без клея!). А в свободной конструкции - полный простор. Поначалу смотрел, что почти все конструкции содержали ардуиновские платки - мини, нано. Но вот смотрю, например в той команде от которой я выступаю, протолкнули Cypress PSoC и уже мини-сумо роботов делают на нём. Я, конечно, скривился, сказал, что у 4-го PSoC маловато как-то периферии. На что мне ответили, что они делают на пятом. Я сказал, что они же в корпусах не для "наколенного" монтажа. А они показывают плату с припаянным QFN48. Ну что ж, может и я буду вынужден перейти на такие, когда перестанут удовлетворять имеющиеся.Ser60 писал(а):Почему Вы решили преобрести имено этот Кит с MSP432?
// ----------
// Stop the motors, power down the drivers, and
// set the PWM speed control to 0% duty cycle.
// Input: none
// Output: none
void Motor_Stop(void){
// write this as part of Lab 13
TIMER_A0->CCR[3] = 0;
TIMER_A0->CCR[4] = 0;
// SLEEP_PORT->OUT &= ~((1u << LEFT)|(1u << RIGHT));
}
Пн апр 22, 2019 07:54:35
Пн апр 22, 2019 08:35:57
Вт апр 23, 2019 01:10:40
Ср апр 24, 2019 05:48:07
Ср апр 24, 2019 18:44:24
Чт июн 27, 2019 05:58:42
Чт июн 27, 2019 16:43:33
Чт июн 27, 2019 18:33:37
Чт июн 27, 2019 19:14:46
Чт июн 27, 2019 20:23:24
Чт июн 27, 2019 20:45:16
Пт июн 28, 2019 03:30:03