#define F_CPU 16000000 #define F_SCL 100000 // 100kHz #include #include #include "lcd.h" #include static int lcd_putchar(char c, FILE *stream){ LCDCharacterOut(c); return 0; } static FILE mystdout = FDEV_SETUP_STREAM(lcd_putchar, NULL,_FDEV_SETUP_WRITE); // ADS1114 Slave Adresse unsigned char SLA_W_ADS1114 = 0x90; unsigned char SLA_R_ADS1114 = 0x91; int Messwert_sum = 0; int Messwert_H = 0; int Messwert_L = 0; //I2C start kondition static void I2C_start(void) { TWCR0 = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO); // Stop bit, falls andere teilnehmer aktiv sind //_delay_ms(40); TWCR0 = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); // 1. Start Kondition für I2C while (!(TWCR0 & (1 << TWINT))); // 2. Warten bis TWINT-Bit gesetzt ist. (Die Startbedingung wurde gesendet) } //I2C stop kondition static void I2C_ende(void) { TWCR0 = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO); // Stop bit } unsigned char ADS1114_lesen(void) { TWCR0 = (1 << TWEA) | (1 << TWINT) | (1 << TWEN); // TWINT in TWCR0 löschen um die übertragung der Adresse zu starten while (!(TWCR0 & (1 << TWINT))); // 4.SLA wurde übertragen und A empfangen return TWDR0; } unsigned char ADS1114_rw(unsigned char rw) { if (rw == 1) { TWDR0 = SLA_R_ADS1114; // 3. SLA_R in TWDR0 schreiben, read modus TWCR0 = (1 << TWINT) | (1 << TWEN); // TWINT in TWCR0 löschen um die übertragung der Adresse zu starten while (!(TWCR0 & (1 << TWINT))); // 4.SLA wurde übertragen und A empfangen return TWDR0; } else { TWDR0 = SLA_W_ADS1114; // 3. SLA_W in TWDR0 schreiben, write modus TWCR0 = (1 << TWINT) | (1 << TWEN); // TWINT in TWCR0 löschen um die übertragung der Adresse zu starten while (!(TWCR0 & (1 << TWINT))); // 4.SLA wurde übertragen und A empfangen return TWDR0; } } int main (void) { stdout = &mystdout; //I2C TWSR0 = 0; TWBR0 = ((F_CPU / F_SCL) - 16) / 2; sei(); // Alle INT freigeben LCDinit(); LCDCursorOff(); while(1) { I2C_start(); ADS1114_rw(0); // 0 = Schreiben, 1= Lesen TWDR0 = 0b00000001; // Pointer Register, 0x01 =Config Register TWCR0 = (1 << TWINT) | (1 << TWEN); while (!(TWCR0 & (1 << TWINT))); TWDR0 = 0b11000001; // Byte 1(MSB), Single Conversion, AIN 0 = Input & AINx = GND, FSR +/- 6.144V, Single shot TWCR0 = (1 << TWINT) | (1 << TWEN); while (!(TWCR0 & (1 << TWINT))); TWDR0 = 0b10000011; // Byte 2(LSB), 128 SPS, Comp disable and Alert Disable TWCR0 = (1 << TWINT) | (1 << TWEN); while (!(TWCR0 & (1 << TWINT))); I2C_ende(); I2C_start(); ADS1114_rw(0); // 0 = Schreiben, 1= Lesen TWDR0 = 0b00000000; // Pointer Register, 0x00 = Conversion Register TWCR0 = (1 << TWINT) | (1 << TWEN); while (!(TWCR0 & (1 << TWINT))); I2C_ende(); I2C_start(); ADS1114_rw(1); // 0 = Schreiben, 1= Lesen Messwert_H = ADS1114_lesen(); _delay_ms(10); Messwert_L = ADS1114_lesen(); Messwert_sum = Messwert_H<<8 | Messwert_L>>0; // MSB und LSB an die richtige stelle schieben I2C_ende(); LCDCursorHome(); printf("Spannung: %.2f V",Messwert_sum *0.0001875); // temp sum in fließkommazahl umrechnen und auf Display ausgeben } }