432
Downloads
432
Downloads of v 1.0.0
2019-05-09
Last published
PIC12 I2C Master & Slave PWM Demo
1.0.0
This demo uses two PIC12LF1822 devices, one as an I2C Master and the other as an I2C Slave. The two devices are connected directly with each other via their respective SDA and SCL pins (no external pull-up resistors are required). The I2C Master writes values into the Slave's I2C buffer which will change the Slave device's PWM output characteristics dynamically. This code can also be easily ported to similar devices such as the PIC12(L)F1840 & PIC16(L)F1823.
PIC12LF1822 I2C Master & Slave Demo
This demo uses two PIC12LF1822 devices, one as an I2C Master and the other as an I2C Slave.
Connect the two devices with direct jumper connections between their respective SDA and SCL pins (no external pull-up resistors are required).
The I2C Master writes values into the I2C Slave I2C buffer which will change the PWM output characteristics dynamically.
The I2C Slave can be put into a sleep mode by the I2C Master writing a non-zero value into the I2C Slave buffer location 0, and can wake up
by the I2C Master writing a 0 into the slave's buffer location 0. This is how the I2C Master can turn off the I2C Slave's PWM output and
keep the Slave in sleep mode to conserve power.
The I2C Master can also change the PWM carrier frequency by updating the Slave's I2C buffer location 1, and change the PWM duty cycle by updating
the Slave's I2C buffer location 2.
Currently the I2C Slave buffer only has 3 locations that are used, but of course the additional locations can be used and the total buffer size
can be increased as well.
Both I2C Master and Slave devices have PWM output on RA5 and A/D input on RA4. No external pull-ups are required on the SDA & SCL pins, since
the PIC12 internal pull-ups are enabled for these pins.
I2C Slave
(1) Default 7-bit I2C slave address is 0101010 (or 0x54 if including the R/W bit as an 8-bit value)
(2) Default PWM carrier frequency is ~6kHz, based on the following parameters:
* Timer2 Period Register (PR2) = 0x52
* Timer2 Prescaler (T2CKPS) = 4
* Tosc = 8 MHz
To calculate what the PR2 value should be for a specific period, use the following formula:
Period = {[PR2 + 1] * 4 * Tosc * T2CKPS}
(3) The I2C buffer (SSPBuffer[I2C_BUFFERSIZE]) is an array that contains system configuration information:
* Buffer index 0 : 0 = Active, 1 or higher = Sleep
* Buffer index 1 : PR2 period register value (determines the PWM carrier frequency)
* Buffer index 2 : CCPR1L register value (determines the duty cycle)
For example, to achieve a PWM of 40% duty cycle, the CCPR1L value needs to be 40% of the PR2 register value
(4) Can only support SCL frequency of 100 kHz (might be able to handle 400 kHz if sleep mode feature is disabled in firmware)
I2C Master
(1) To write to the Slave's I2C buffer, use the following API
PIC12_write(byte address, byte data);
For example, to write the value 0xBA to the Slave's I2C buffer location #2, use PIC12_write(2, 0xBA)
NOTE: A dummy byte write is required at the end if the Slave is currently in a sleep mode
(2) To read the contents of the Slave's I2C buffer, issue a Read command with an additional byte count, and ignore the first byte that is read back
For example, if the Slave's I2C buffer is 3 bytes in length, then issue a Read command that is 4 bytes long and ignore the first byte:
AA 00 52 29 (ignore the 0xAA)
Buffer location 0 = 0x00
Buffer location 1 = 0x52
Buffer location 2 = 0x29
To install PIC12 I2C Master & Slave PWM Demo, download this package and open it in IDE.
Supported Products: MPLAB X
Release Notes
Original Release
Owners
Authors
Tags
Dependencies
-
- No dependencies.
Version History
Version | Downloads | Last updated | Approved |
---|---|---|---|
PIC12 I2C Master... 1.0.0 (this version) | 432 | Thursday, May 9, 2019 | yes |