/*
Plik "main.c"
KURS AVR-GCC cz.5
(xyz.isgreat.org)
Transmisja szeregowa do komputera PC, przykład nr. 4
(schemat i opis działania w artykule)
atmega16 (1MHz)
*/
/* Prędkość transmisji 2400 */
#define BAUD 2400
#define MYUBRR F_CPU/BAUD/16-1
#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>
#include "ds18b20.h"
/* Inicjuje port szeregowy AVRa */
void USART_init(unsigned int myubrr)
{
/* Ustala prędkość transmisji */
UBRRH = (unsigned char)(myubrr>>8);
UBRRL = (unsigned char)myubrr;
/* Włącza nadajnika */
UCSRB = (1<<TXEN);
/* Format ramki: 8 bitów danych, 1 bit stopu, brak bitu parzystości */
UCSRC = (1<<URSEL)|(3<<UCSZ0);
}
/* Wysyła znak do portu szeregowego */
static int USART_Transmit(char c, FILE *stream)
{
while(!(UCSRA & (1<<UDRE)));
UDR = c;
return 0;
}
/* Tworzy strumienia danych o nazwie 'mystdout' połączony
z funkcją 'USART_Transmit' */
static FILE mystdout = FDEV_SETUP_STREAM(USART_Transmit, NULL, _FDEV_SETUP_WRITE);
/* GŁÓWNA FUNKCJA */
int main(void)
{
/* Zmienna 'temp' przechowuje wartość temperatury */
double temp;
/* Do tej tablicy zapisywane będą dane odczytane z układu ds18b20 */
unsigned char ds18b20_pad[9];
/* Inicjalizuje port szeregowy AVRa */
USART_init(MYUBRR);
/* Przekierowuje standardowe wyjście do 'mystdout' */
stdout = &mystdout;
/* Główna pętla */
while(1)
{
/* Funkcja 'ds18b20_ConvertT' wysyła do układu ds18b20
polecenie pomiaru */
if(ds18b20_ConvertT())
{
/* 750ms - czas konwersji */
_delay_ms(750);
/* Odczyt z układu ds18b20, dane zapisywane są w tablicy ds18b20_pad.
Dwie pierwsze pozycje w tablicy to kolejno mniej znaczący bajt, bardziej
znaczący bajt wartość zmierzonej temperatury */
ds18b20_Read(ds18b20_pad);
/* Składa dwa bajty wyniku pomiaru w całość. Cztery pierwsze bity mniej
znaczącego bajtu to część ułamkowa wartości temperatury, więc całość
dzielona jest przez 16 */
temp = ((ds18b20_pad[1] << 8) + ds18b20_pad[0]) / 16.0 ;
/* Wysyła komunikat do portu szeregowego */
printf("Temperatura powietrza:%5.2f°C\n", temp);
}
}
}