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

Обсуждаем контроллеры компании Atmel.
Ответить
Sabril
Родился
Сообщения: 3
Зарегистрирован: Чт июл 16, 2015 15:16:26

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

Сообщение 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 сек на одну секунду.

Датчик тут же проверил на Ардуинке, температуру показивает нормально.
Зарание Спасибо всем кто сможет подсказать в чем проблема.
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

А что там у Вас с тактовой частотой не протеусной, а в реальной тиньке?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Sabril
Родился
Сообщения: 3
Зарегистрирован: Чт июл 16, 2015 15:16:26

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

Сообщение Sabril »

Спасибо, я понял в каком направлении копать. Переставил в протеусе частоту на 1,2 МГц (читал что у тиньки13 именно такая) и вуаля))) То же что и на макетке) Я павда не понимаю почему не работает этот код, но буду разбираться, если кто нить может помочь советом буду благодарен))) :beer:
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Sabril писал(а):читал что у тиньки13 именно такая
Где это прочитали? У тиньки13 четыре источника тактирования. Внешний и внутренние 128 кГц, 4,8МГц, 9,6МГц. Это устанавливается фьюзами. Кроме того еще есть регистр-делитель частоты. Читайте даташит.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
Sabril
Родился
Сообщения: 3
Зарегистрирован: Чт июл 16, 2015 15:16:26

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

Сообщение Sabril »

Я прошу прощения, я имел в виду частоту по умолчанию.
Впрочем ошибка как я понял очевидна :

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

 _delay_us(480);//--480  // ждём
DDRB&=~(1<<3);          //активируем   PB3 как вход
_delay_us(60);//--60
  i=(PINB & (1<<3));    //читаем
_delay_us(420);//--420
  
Реклама
Antony91
Родился
Сообщения: 19
Зарегистрирован: Пт янв 18, 2013 00:51:00

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

Сообщение 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 и виснет конкретно в этом месте.
Реклама
Андрей СШ
Опытный кот
Сообщения: 806
Зарегистрирован: Ср май 06, 2015 06:41:27
Откуда: Благовещенск

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

Сообщение Андрей СШ »

У Вас АЦП настроен на автозапуск после каждого преобразования. Похоже он сам постоянно устанавливает ADSC в 1.
The ADSC bit will be read as one during a conversion, independently of how the conversion was started.
Попробуйте отключить ADATE.
Antony91
Родился
Сообщения: 19
Зарегистрирован: Пт янв 18, 2013 00:51:00

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

Сообщение Antony91 »

Попробовал!
Помогло! :))
А я второй день пытаюсь понять что не так....
Большое кошачье спасибо!!!
Antony91
Родился
Сообщения: 19
Зарегистрирован: Пт янв 18, 2013 00:51:00

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

Сообщение Antony91 »

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

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

Сообщение Antony91 »

Кажется разобрался. Из-за погрешности в вычислениях и неидеальных резисторах значение плавало вокруг 0... увеличил уменьшаемое на несколько значений и все кажется заработало!
Коты, спасибо, что вы есть и есть где помяукать :))
Ответить

Вернуться в «AVR»