Code:
/*
* Test_AD.c
*
* Created: 20.10.2013 21:36:29
* Author: Marius
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 8000000
#include <util/delay.h>
#include <string.h>
#include <stdio.h>
#define BAUD 9600
#define MYUBRR F_CPU/16/BAUD-1
#define UART_MAXSTRLEN 10
volatile uint8_t uart_str_complete = 0; // 1 .. String komplett empfangen
volatile uint8_t uart_str_count = 0;
unsigned char uart_string[UART_MAXSTRLEN + 1] = ""; //volatile!!!
int adctbl [33] = { 1016, 1008, 994, 969, 928, 867, 783, 681, 568, 456, 355, 271, 204, 152, 114, 86, 65, 49, 38, 29, 23, 18, 14,
12, 9, 8, 6, 5, 4, 4, 3, 2, 1};
uint16_t temptbl [33] = { -60, -50,-40, -30, -20, -10, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180,
190, 200, 210, 220, 230, 240, 270, 300 };
void USART_Transmit(unsigned char data ){
/*
Wait for empty transmit buffer
*/
while
( !( UCSRA & (1<<UDRE)));
/*
Put data into buffer, sends the data
*/
UDR = data;
}
void USART_Init_Interrupt(unsigned int UBRR){
sei();
UBRRH = UBRR >> 8;
UBRRL = UBRR & 0xFF;
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1
UCSRB |= (1<<RXEN)|(1<<TXEN)|(1<<RXCIE); // UART RX, TX und RX Interrupt einschalten
}
uint16_t convertADCtoTemp(uint16_t adc){
int i=0;
while(!(adc <= adctbl[i] && adc >= adctbl[i+1])){
i++;
}
USART_Transmit(i);
return temptbl[i];
}
int main(void){
USART_Init_Interrupt(MYUBRR);
ADMUX=0b01000101; //int ref, Ergebnis in ADCH, Pin PC5
ADCSRA=0b10000101;
while(1){
//int sample=0;
ADCSRA = ADCSRA | (1<<ADSC); // single conversion mode ein
while(ADSC == 1); // warten bis konvertierung abgeschlosen
uint8_t theLowADC = ADCL;
uint16_t adc = ADCH<<8 | theLowADC;
USART_Transmit((ADCH));
USART_Transmit(theLowADC);
USART_Transmit(13);
_delay_ms(1000);
}
}
Die Schaltung ist wie folgt: Aus dem NTC und einem 100kOhm Widerstand ist ein Spannungsteiler aufgebaut dessen Ausgang an PC5 des ATmgea geht. Der NTC geht gegen +5V und der feste Widerstand gegen GND.
Lesezeichen