Страница 1 из 1

Attiny13 Первый проект

Добавлено: Чт июл 16, 2015 18:28:52
Sabril
Добрый день Уважаемые Форучане, прошу вашего совета:

С микроконтролерами только начинаю своё знакомство.
Решил сделать термометр на одном светодиоде, за основу была взята 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 сек на одну секунду.

Датчик тут же проверил на Ардуинке, температуру показивает нормально.
Зарание Спасибо всем кто сможет подсказать в чем проблема.

Re: Attiny13 Первый проект

Добавлено: Чт июл 16, 2015 18:53:15
Z_h_e
А что там у Вас с тактовой частотой не протеусной, а в реальной тиньке?

Re: Attiny13 Первый проект

Добавлено: Пт июл 17, 2015 18:04:52
Sabril
Спасибо, я понял в каком направлении копать. Переставил в протеусе частоту на 1,2 МГц (читал что у тиньки13 именно такая) и вуаля))) То же что и на макетке) Я павда не понимаю почему не работает этот код, но буду разбираться, если кто нить может помочь советом буду благодарен))) :beer:

Re: Attiny13 Первый проект

Добавлено: Пт июл 17, 2015 18:19:24
Z_h_e
Sabril писал(а):читал что у тиньки13 именно такая
Где это прочитали? У тиньки13 четыре источника тактирования. Внешний и внутренние 128 кГц, 4,8МГц, 9,6МГц. Это устанавливается фьюзами. Кроме того еще есть регистр-делитель частоты. Читайте даташит.

Re: Attiny13 Первый проект

Добавлено: Пт июл 17, 2015 19:11:38
Sabril
Я прошу прощения, я имел в виду частоту по умолчанию.
Впрочем ошибка как я понял очевидна :

Код: Выделить всё

 _delay_us(480);//--480  // ждём
DDRB&=~(1<<3);          //активируем   PB3 как вход
_delay_us(60);//--60
  i=(PINB & (1<<3));    //читаем
_delay_us(420);//--420
  

Re: Attiny13 Первый проект

Добавлено: Вс авг 02, 2015 14:09:46
Antony91
Здравствуйте коты!
Не первый проект на АВРках, но ситуация сродни "стою на асфальте я в лыжи обутый..."

Скажу сразу, в протеусе все работает, проблема уже в реальной модели.
Программа виснет при ожидании окончания преобразования. По логике работы я выставляю бит ADSC и кручусь в до того момента пока он станет 0. Но выходит, что он 0 не становится...
Для пробы засунул кусок в главный цикл, и все равно та же песня.

в Reset: ldi Temp, 0b00100111
out ADCSRA, Temp

ldi Temp, 0b00000000
out ADCSRB, Temp

ldi Temp, 0b00100000
out ADMUX, Temp

Основной код

Main:
sbi ADCSRA, 7
ldi Temp, 0b00100010
out ADMUX, Temp
ldi Temp,0b00010000
out DIDR0,Temp
rcall Delay_20mks
sbi ADCSRA, 6
Convertion:
in Temp, ADCSRA
sbrc Temp,6
rjmp Convertion
in Temp, ADCL
in Temp, ADCH
cbi ADCSRA, ADSC
cbi ADCSRA, ADEN
rjmp Main

Чего не так?

проверяю работу по включению лапок Sbi PortB,X и виснет конкретно в этом месте.

Re: Attiny13 Первый проект

Добавлено: Вс авг 02, 2015 15:38:53
Андрей СШ
У Вас АЦП настроен на автозапуск после каждого преобразования. Похоже он сам постоянно устанавливает ADSC в 1.
The ADSC bit will be read as one during a conversion, independently of how the conversion was started.
Попробуйте отключить ADATE.

Re: Attiny13 Первый проект

Добавлено: Вс авг 02, 2015 15:50:30
Antony91
Попробовал!
Помогло! :))
А я второй день пытаюсь понять что не так....
Большое кошачье спасибо!!!

Re: Attiny13 Первый проект

Добавлено: Пн авг 03, 2015 11:00:40
Antony91
И снова всем мяу!
С одной проблемой разобрался, но появилась другая.
АЦП выдает какой-то бред. Схема работы такая: после полевого p-канального транзистора стоит резистор 0,22 Ом, каналы АЦП стоят на его выводах и путем вычитания значения в 2 каналах можно узнать ток. Беда такая, что даже при работе вхолостую, там все равно какие-то большие значения.
По питанию стоит 100 нФ, по каждому каналу АЦП стоит по 100 нФ, режим ADC noise reduction не использую.
В протеусе, опять таки, все работает превосходно. Что за беда? куда копать?

Re: Attiny13 Первый проект

Добавлено: Пн авг 03, 2015 12:13:24
Antony91
Кажется разобрался. Из-за погрешности в вычислениях и неидеальных резисторах значение плавало вокруг 0... увеличил уменьшаемое на несколько значений и все кажется заработало!
Коты, спасибо, что вы есть и есть где помяукать :))