/*
* Program to read the temperature sensor on the ATMega328P
* Original code by Joel Jojo
*
* This is free software. You can redistribute it and/or modify it under
* the terms of MIT Licence.
* To view a copy of this license, visit http://opensource.org/licenses/mit-license.php
*/
// Importing required libraries
//#include <avr/io.h>
//#include <stdbool.h>
//#include "TempReader.h"
// Create an object of TempReader
//TempReader t;
void setup() {
// Initialise Serial Communication
Serial.begin(115200);
// Read the temperature value in degree celsius
int temp = ReadTempinC();
// Display the value in the serial monitor
Serial.print("Chip temperature is ");
Serial.print(temp);
Serial.println(" degrees Celsius");
}
void loop() {
/*// Read the temperature value in degree celsius
int temp = ReadTempinC();
// Display the value in the serial monitor
Serial.print("Chip temperature is ");
Serial.print(temp);
Serial.println(" degrees Celsius");
delay(500);
*/
}
// Function to read the temperature sensor
int ReadTempinC()
{
// Store register values
uint8_t oldADMUX = ADMUX;
Serial.print("oldADMUX ");
Serial.println(oldADMUX, BIN);
uint8_t oldADCSRA = ADCSRA;
Serial.print("oldADCSRA ");
Serial.println(oldADCSRA, BIN);
uint8_t oldADCSRB = ADCSRB;
Serial.print("oldADCSRB ");
Serial.println(oldADCSRB, BIN);
uint8_t oldACSR = ACSR;
Serial.print("oldACSR ");
Serial.println(oldACSR, BIN);
// Configure ADC for reading temperature sensor
//Регистр ADMUX: выбираем опорное 1.1 В (REFS0, REFS1), внутренний датчик температуры (MUX3...MUX0 = 1000)
//представление данных с младшими битами в ADCL (ADLAR=0)
//ADMUX |= (1 << REFS0) | (1 << REFS1) | (1 << MUX3);
//ADMUX &= ~((1 << MUX2) | (1 << MUX1) | (1 << MUX0) | (1 << ADLAR));
ADMUX = 0b11001000;
// Регистр ADCSRA: Разрешаем ADC, прескалер на максимум (128),
// (ADEN, ADPS2, ADPS1, ADPS0, ADIF =1 )
ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
// (обнуляем ADATE,ADIE, ADIF)
ADCSRA &= ~((1 << ADATE) | (1 << ADIE) | (1 << ADIF));
// отрицательный вход компаратора ставим на AIN1, режим АЦП - free running
// (обнуляем ACME,ADTS2,ADTS1,ADTS0)
ADCSRB &= ~((1 << ACME) | (1 << ADTS2) | (1 << ADTS1) | (1 << ADTS0));
// выключаем компаратор - зачем ??? (ставим бит ACD в единицу)
ACSR |= (1 << ACD);
Serial.print("ACSR ");
Serial.println(ACSR, BIN);
// Start conversion
ADCSRA |= (1 << ADSC);
// Wait for conversion to complete Ждать пока ADSC не станет нулевым
while (ADCSRA & (1 << ADSC));
// Read the temperature
int tempRaw = ADCW;
int tempinC = int((tempRaw - 324.31 ) / 1.22);
// Restore old register values
Serial.println(ADCSRA, BIN);
ADCSRA = oldADCSRA;
ADCSRB = oldADCSRB;
ACSR = oldACSR;
// Return the temperature value
return tempinC;
}