С микроконтролерами только начинаю своё знакомство.
Решил сделать термометр на одном светодиоде, за основу была взята Attiny13 но сразу же выяснилось что памяти катастрофически мало (до этого всё делалось на Ардуинке).
Код получения температуры с DS18B20 нашёл в интернете дальше дописал сам. Собственно код:
Код: Выделить всё
/*
* prog_example_ds18b20_attiny13a
*
* Created: 26.06.2014
* Author: alexander
*/
//определяем частоту
#define F_CPU 8000000L
//подключаем заголовочные файлы
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define LEDON PORTB |= _BV(PB0)
#define LEDOFF PORTB &= ~_BV(PB0)
//задаёмся прототипом функции, чтения данных датчика ds18b20
void temperature(void);
int8_t volatile termo; //переменная для данных температуры
int main(void)
{
while(1)
{
temperature() ; // функцию read ds18b20
}
return 0;
}
//-----------------------------------------------------------------------
uint8_t therm_reset() //функция подготовки ds18b20
{
uint8_t i; // переменная
PORTB&=~(1<<3); //устанавливаем порт PB3 как низкий уровень
DDRB|=(1<<3); //активируем PB3 как выход
_delay_us(480);//--480 // ждём
DDRB&=~(1<<3); //активируем PB3 как вход
_delay_us(60);//--60
i=(PINB & (1<<3)); //читаем
_delay_us(420);//--420
return i; // возвращаем "1" ok
}
//-------------------------------------------------------------------------
//запись бита
void therm_write_bit(uint8_t bit)
{
PORTB&=~(1<<3);
DDRB|=(1<<3);
_delay_us(2);//---2
if(bit) DDRB&=~(1<<3);
_delay_us(60);//--60
DDRB&=~(1<<3);
}
//----------------------------------------------------------------------
//запись байта
void therm_write_byte(uint8_t byte)
{
uint8_t i=8;
while(i--)
{
therm_write_bit(byte&1);
byte>>=1;
}
}
//-----------------------------------------------------------------------
//чтение бита
uint8_t therm_read_bit(void)
{
uint8_t bit=0;
PORTB&=~(1<<3);
DDRB|=(1<<3);
_delay_us(2);//2
DDRB&=~(1<<3);
_delay_us(14);//--14
if(PINB&(1<<3)) bit=1;
_delay_us(45);//--45
return bit;
}
//---------------------------------------------------------------------
//чтение байта
uint8_t therm_read_byte(void)
{
uint8_t i=8, n=0;
while(i--)
{
n>>=1;
n|=(therm_read_bit()<<7);
}
return n;
}
//----------------------------------------------------------------------
void temperature(void)
{
asm("cli");
uint8_t temperature[2];
therm_reset();
therm_write_byte(0xcc);
therm_write_byte(0x44);
while(!therm_read_bit());
therm_reset();
therm_write_byte(0xcc);
therm_write_byte(0xbe);
temperature[0]=therm_read_byte();
temperature[1]=therm_read_byte();
therm_reset();
// обрабатываем полученные данные в читаемый вид
termo=temperature[0]>>4;
termo|=(temperature[1]&0xf)<<4;
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
// Индикация температуры
//Температура
int one = (termo/10);
int two = (termo-(one*10));
DDRB |=1<<PB0; // Конфигурация порта
//if (termo<1)
//{
//LEDON;
//}
//Проверка минусовой температуры
if (termo<0)
{
one*=-1;
two*=-1;
}
//Индикация температуры
for (int i=1; i <= one; i++)
{
LEDON;
_delay_ms(600);
LEDOFF;
_delay_ms(200);
}
_delay_ms(300);
for (int i=1; i <= two; i++)
{
LEDON;
_delay_ms(200);
LEDOFF;
_delay_ms(250);
}
_delay_ms(3000);
}
//---------------конец обработки ds18b20----------------
Проверил в протеусе, всё работает.
Но при прошивке тиньки получилось соовсем другое, светодиод мигает один раз в приблизительно 30 сек на одну секунду.
Датчик тут же проверил на Ардуинке, температуру показивает нормально.
Зарание Спасибо всем кто сможет подсказать в чем проблема.



