Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DS18B20 + ATTiny13A + 74HC595, Помогите разобраться 
:(
    Опции темы
Deals
Дата 19.7.2014, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 19.7.2014

Репутация: нет
Всего: нет



Доброго времени суток кто читает данную тему.
Сидел я и думал как бы выучить мне DS18B20 с 74HC595 и пришла мысль использовать ATTiny13A.
Это все чисто для обучения!
Написал программу, семисегментник работает нормально. Но вот общение с DS18B20 перешло в стадию нецензурной лексики  smile 
В общем привожу код С++:
Код

#define F_CPU 1200000UL

#include <util/delay.h>
#include <avr/io.h>

#define CLOCK            (1 << PINB2)
#define DATA            (1 << PINB0)
#define LATCH            (1 << PINB1)
#define DQ_DATA            (1 << PINB4)

#define SwitchIn(x)        (DDRB &= ~(x))
#define SwitchOut(x)    (DDRB |= x)

#define SetPORTLow(x)    (PORTB &= ~(x))
#define SetPORTHigh(x)    (PORTB |= x)

#define ReadPIN(x)        (PINB & x)

#define EMPTY 10
#define DASH 11
#define letter_n 12
#define letter_o 0
#define letter_k 13
#define letter_e 14
#define letter_r 15

unsigned char number[16] = { 126, 48, 109, 121, 51, 91, 95, 112, 255, 123, 0, 1, 21, 87, 79, 5 };

void DisplayNumber(signed char c, signed char b, signed char a);
void InitSeg( );
void FirstInitTH( );
void InitTH( );
void WriteByte( unsigned char data );
unsigned char ReadByte( );
unsigned char ConvertTemp(unsigned char first, unsigned char second);

int main(void)
{
    InitSeg( );
    FirstInitTH( );
    while(1)
    {
        InitTH( );
        WriteByte( 0xCC );
        WriteByte( 0x44 );
        SwitchIn(DQ_DATA);
        SetPORTHigh(DQ_DATA);
        
        unsigned char x = ReadPIN(DQ_DATA);
    
        while( x == 0 )
        {
            x = ReadPIN(DQ_DATA);
            DisplayNumber(number[EMPTY], number[letter_o], number[letter_n]);
            _delay_ms(1000);
        }

        InitTH( );
        WriteByte( 0xCC );
        WriteByte( 0xBE );
        unsigned char data[3] = { 0, 0, 0 };
        data[0] = ReadByte( );
        data[1] = ReadByte( );
        _delay_ms(200);
        data[2] = ConvertTemp(data[0], data[1]);
        //data[2] = 132;
        unsigned char a, b, c;
        a = data[2] / 100;
        b = (data[2] % 100) / 10;
        c = data[2] % 10;
        if ( a == 0 )
            a = EMPTY;
        if ( a == EMPTY && b == 0 )
            b = EMPTY;
        DisplayNumber(number[a],number[b],number[c]);
        _delay_ms(5000);
    }
}

void InitSeg( )
{
    SwitchOut(CLOCK | DATA | LATCH);
    SetPORTLow(CLOCK | DATA | LATCH);
    
    DisplayNumber(number[EMPTY], number[letter_o], number[letter_n]);
    
    _delay_ms(1500);
}

void DisplayNumber(signed char c, signed char b, signed char a)
{
    SetPORTLow(CLOCK | DATA | LATCH);
    
    unsigned char i, j, k;
    for (i = 0; i < 8; i++)
    {
        if ((a & (1 << i)) != 0)
            SetPORTHigh(DATA);
        else
            SetPORTLow(DATA);
        
        SetPORTHigh(CLOCK);
        SetPORTLow(CLOCK);
    }

    for (j = 0; j < 8; j++)
    {
        if ((b & (1 << j)) != 0)
            SetPORTHigh(DATA);
        else
            SetPORTLow(DATA);
        
        SetPORTHigh(CLOCK);
        SetPORTLow(CLOCK);
    }

    for (k = 0; k < 8; k++)
    {
        if ((c & (1 << k)) != 0)
            SetPORTHigh(DATA);
        else
            SetPORTLow(DATA);
        
        SetPORTHigh(CLOCK);
        SetPORTLow(CLOCK);
    }

    SetPORTHigh(LATCH);
    SetPORTLow(LATCH);
    
    SetPORTLow(CLOCK | DATA | LATCH);
}

void FirstInitTH( )
{
    SwitchOut(DQ_DATA);
    SetPORTLow(DQ_DATA);
    _delay_us(500);
    
    SwitchIn(DQ_DATA);
    SetPORTHigh(DQ_DATA);
    _delay_us(65);
    
    if ( ReadPIN(DQ_DATA) !=0 )
        DisplayNumber(number[letter_e], number[letter_r], number[letter_r]);
    else
        DisplayNumber(number[EMPTY], number[letter_o], number[letter_k]);
        
    _delay_ms(1500);
}

void InitTH( )
{    
    SwitchOut(DQ_DATA);
    SetPORTLow(DQ_DATA);
    _delay_us(500);
    
    SwitchIn(DQ_DATA);
    SetPORTHigh(DQ_DATA);
    _delay_us(500);
}

void WriteByte( unsigned char data )
{
    unsigned char i;
    SwitchOut(DQ_DATA);
    for ( i = 0; i < 8; i++)
    {
        SetPORTLow(DQ_DATA);
        _delay_us(2);
        if ( (data & (1 << i)) != 0 )
            SetPORTHigh(DQ_DATA);
        else
            SetPORTLow(DQ_DATA);
        _delay_us(60);
        SetPORTHigh(DQ_DATA);
        _delay_us(2);
    }
}

unsigned char ReadByte( )
{
    unsigned char data = 0, i;
    for ( i = 0; i < 8; i++)
    {
        SwitchOut(DQ_DATA);
        SetPORTLow(DQ_DATA);
        _delay_us(2);
        SwitchIn(DQ_DATA);
        SetPORTHigh(DQ_DATA);
        _delay_us(5);
        if ( (ReadPIN(DQ_DATA)) != 0 )
            data |= ( 1 << i );
        else
            data &= ~( 1 << i );

        _delay_us(60);
    }
    
    return data;    
}

unsigned char ConvertTemp(unsigned char first, unsigned char second)
{
    unsigned char result = 0, i, j;
    
    for ( i = 4; i < 8; i++)
    {
        if ( (first & (1 << i)) != 0)
            result |= ( 1<<(i-4) );
        else
            result &= ~( 1<<(i-4) );
    }
    
    for ( j = 0; j < 4; j++)
    {
        if ( (second & (1 << j)) != 0 )
            result |= ( 1<<(j+4) );
        else
            result &= ~( 1<<(j+4) );
    }
    
    return result;
}


Прошу строго не пинать, но подскажите где ошибка. DS18B20 реагирует на импульс сброса и подает ответ присутствия. А дальше ничего не работает :( Есть подозрение что ошибка в отправке битов.
Т.к. до данного участка уже не работает(хотя должен "занулить" линию во время конвертации):
Код

        while( x == 0 )
        {
            x = ReadPIN(DQ_DATA);
            DisplayNumber(number[EMPTY], number[letter_o], number[letter_n]);
            _delay_ms(1000);
        }
 Прошу помощи  smile 
PM MAIL   Вверх
Deals
Дата 20.7.2014, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 19.7.2014

Репутация: нет
Всего: нет



Проблема была найдена. Частота для процессора 1МГц не успевает формировать импульсы на датчик. Нужно минимум 4МГц... 0.4us
Выставил фюз CKDIV8 = 1 и все ок. Тему в клоуз.

Это сообщение отредактировал(а) Deals - 20.7.2014, 21:55
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0641 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.