Start working on system initialization
This commit is contained in:
@@ -13,6 +13,9 @@
|
|||||||
#define TW_MR_SLA_NACK 0x48
|
#define TW_MR_SLA_NACK 0x48
|
||||||
#define TW_MR_DATA_ACK 0x50
|
#define TW_MR_DATA_ACK 0x50
|
||||||
|
|
||||||
|
// XXX: Handle interrupts in TWI_vect ISR? This may not
|
||||||
|
// actually be much better than the blocking approach
|
||||||
|
|
||||||
int TWI_Init(void)
|
int TWI_Init(void)
|
||||||
{
|
{
|
||||||
// Set SCL bit rate to 400kHz
|
// Set SCL bit rate to 400kHz
|
||||||
@@ -23,7 +26,7 @@ int TWI_Init(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int TWI_Start(char addr, char mode)
|
int TWI_Start(unsigned char addr, unsigned char mode)
|
||||||
{
|
{
|
||||||
unsigned int status;
|
unsigned int status;
|
||||||
|
|
||||||
@@ -60,7 +63,7 @@ int TWI_Start(char addr, char mode)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int TWI_Write(char data)
|
int TWI_Write(unsigned char data)
|
||||||
{
|
{
|
||||||
TWDR = data;
|
TWDR = data;
|
||||||
TWCR = (1 << TWEN) // Enable TWI
|
TWCR = (1 << TWEN) // Enable TWI
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
#define MAD_CORE_BUS_TWI_H
|
#define MAD_CORE_BUS_TWI_H
|
||||||
|
|
||||||
int TWI_Init(void);
|
int TWI_Init(void);
|
||||||
int TWI_Start(char addr, char mode);
|
int TWI_Start(unsigned char addr, unsigned char mode);
|
||||||
int TWI_Write(char data);
|
int TWI_Write(unsigned char data);
|
||||||
int TWI_Wait_ACK(void);
|
int TWI_Wait_ACK(void);
|
||||||
int TWI_Stop(void);
|
int TWI_Stop(void);
|
||||||
|
|
||||||
|
|||||||
76
src/main.c
76
src/main.c
@@ -3,27 +3,76 @@
|
|||||||
#include "bus/twi.h"
|
#include "bus/twi.h"
|
||||||
|
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
|
#include <assert.h>
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
char crb;
|
|
||||||
|
|
||||||
// ADS1115 (ADC)
|
// ADS1115 (ADC)
|
||||||
// PCA9546 (Multiplexer TWI)
|
// PCA9546 (Multiplexer TWI)
|
||||||
// ATH20 (3x)
|
// ATH20 (3x)
|
||||||
// BMP280 (3x)
|
// BMP280 (3x)
|
||||||
|
|
||||||
|
// PB0 Mosfet 1 Peltier
|
||||||
|
// PB1 Mosfet 2 Heating
|
||||||
|
// PB2 Mosfet 3 Lights
|
||||||
|
|
||||||
|
// PD4 PWM Peltier Hot Side
|
||||||
|
// PD5 PWM Peltier Cold Side
|
||||||
|
// PD7 PWM Heating
|
||||||
|
|
||||||
|
// PC0 TWI Multiplexer SCL
|
||||||
|
// PC1 TWI Multiplexer SDA
|
||||||
|
|
||||||
|
// PD0 Serial USART RX
|
||||||
|
// PD1 Serial USART TX
|
||||||
|
|
||||||
|
static void SetPinDefaults(void);
|
||||||
|
static void SetTWIChannel(int channel);
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
SetPinDefaults();
|
||||||
|
|
||||||
USART_Init();
|
USART_Init();
|
||||||
TWI_Init();
|
TWI_Init();
|
||||||
|
|
||||||
sei();
|
sei();
|
||||||
|
|
||||||
Info("Initializing...");
|
Info("Initializing...");
|
||||||
|
SetTWIChannel(0);
|
||||||
|
|
||||||
|
Sleep(500);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void SetPinDefaults(void)
|
||||||
|
{
|
||||||
|
// Initialize Pin Outputs
|
||||||
|
// ======================
|
||||||
|
|
||||||
|
// PB0: MOSFET #1 (Peltier)
|
||||||
|
DDRB |= (1 << PB0); // Out
|
||||||
|
PORTB &= ~(1 << PB0); // Low
|
||||||
|
|
||||||
|
// PB1: MOSFET #2 (Heating)
|
||||||
|
DDRB |= (1 << PB1); // Out
|
||||||
|
PORTB &= ~(1 << PB1); // Low
|
||||||
|
|
||||||
|
// PB2: MOSFET #3 (Lights)
|
||||||
|
DDRB |= (1 << PB2); // Out
|
||||||
|
PORTB &= ~(1 << PB2); // Low
|
||||||
|
}
|
||||||
|
|
||||||
|
static void SetTWIChannel(int channel)
|
||||||
|
{
|
||||||
|
unsigned char crb;
|
||||||
|
|
||||||
|
assert(channel >= 0);
|
||||||
|
assert(channel <= 3);
|
||||||
|
|
||||||
// PCA9546 I2C Multiplexer
|
// PCA9546 I2C Multiplexer
|
||||||
// =======================
|
// =======================
|
||||||
|
|
||||||
TWI_Stop();
|
Info("Switching TWI channel to %d...", channel);
|
||||||
|
|
||||||
// Excerpts taken from the PCA9546A datasheet:
|
// Excerpts taken from the PCA9546A datasheet:
|
||||||
// https://www.ti.com/lit/ds/symlink/pca9546a.pdf
|
// https://www.ti.com/lit/ds/symlink/pca9546a.pdf
|
||||||
@@ -45,12 +94,14 @@ int main(void)
|
|||||||
|
|
||||||
// 7 6 5 4 | 3 2 1 0
|
// 7 6 5 4 | 3 2 1 0
|
||||||
// X X X X | B3 B2 B1 B0
|
// X X X X | B3 B2 B1 B0
|
||||||
// | CHANNEL_______
|
// UNUSED____ | CHANNEL_______
|
||||||
|
|
||||||
crb = 0x01; // Channel 0 | 00000001
|
crb = (1 << channel);
|
||||||
// = 0x02 // Channel 1 | 00000010
|
|
||||||
// = 0x04 // Channel 2 | 00000100
|
// crb = 0x01; // Channel 0 | 00000001
|
||||||
// = 0x08 // Channel 3 | 00001000
|
// crb = 0x02 // Channel 1 | 00000010
|
||||||
|
// crb = 0x04 // Channel 2 | 00000100
|
||||||
|
// crb = 0x08 // Channel 3 | 00001000
|
||||||
|
|
||||||
TWI_Write(crb);
|
TWI_Write(crb);
|
||||||
|
|
||||||
@@ -62,8 +113,5 @@ int main(void)
|
|||||||
TWI_Wait_ACK();
|
TWI_Wait_ACK();
|
||||||
TWI_Stop();
|
TWI_Stop();
|
||||||
|
|
||||||
Info("Switched to TWI channel 0.");
|
Info("TWI channel was switched to %d.", channel);
|
||||||
Sleep(500);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user