Например TDA7294

Форум РадиоКот • Просмотр темы - Самый простой термометр не работает
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вс июл 27, 2025 22:04:21

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 3 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Самый простой термометр не работает
СообщениеДобавлено: Чт апр 19, 2012 19:49:47 
Встал на лапы
Аватар пользователя

Зарегистрирован: Ср янв 18, 2012 16:33:58
Сообщений: 108
Рейтинг сообщения: 0
Всем привет...

Пытаюсь создать термометр на меге48 который бы отправлял температуру через UART и отображал её на семисегментном дисплее с четырьмя знаками.

Проблема такая:
1.Не работает UART, вместо температуры приходит только "AAAAAA...", чтобы не слал, всёравно такое
2.дисплей отображает правильно но глючит, если темп. = 15, он отображает 15, потом 85, потом 00, потом 32, и опять 15.

может чего бросится в глаза...помогите...

заранее благодарю

Код:
#include <avr/io.h>
#include <util/delay.h>
#include "onewire.h"
#include "ds18x20.h"
#include <avr/interrupt.h>

unsigned char   data[2]; // переменная для хранения старшего и младшего байта данных
unsigned char   themperature[3]; // в этот массив будет записана температура
unsigned char   nDevices;   // количество сенсоров
unsigned char   owDevicesIDs[MAXDEVICES][8];   // Их ID

#define   SegPort   PORTB
#define   PosPort   PORTC

unsigned char buffer[4];
unsigned char digit[] = {127-64,127-64-32-16-8-1,127-32-4,
127-32-16,127-16-8-1,127-16-2,127-2,127-64-32-16-8,127,127-16};
//----------
void USART_init(unsigned int ubrr)
{
   UBRR0H = (unsigned char)(ubrr>>8);
   UBRR0L = (unsigned char)ubrr;
   UCSR0B = (1<<TXEN0);
   UCSR0C = (1<<UCSZ01)|(1<<UCSZ00)|(1<<USBS0);
}
//----------
void USART0_write(unsigned char data)
{
   while(!(UCSR0A & (1<<UDRE0)));
   UDR0=data;
}
//----------
ISR (TIMER1_COMPA_vect)
{
  // Начало вывода с позиции 0
  // Позиция выводимого разряда 0xFE=0b11111110
  static unsigned char pos=0,mask=0xFE;
  // Выключение сегментов
  SegPort=0;
  // Переходим на следующий разряд
  PosPort=mask;
  // Выводим символ из буфера
  SegPort=buffer[pos];
  pos++;
  // Сдвиг позиции вывода
  mask=mask<<1;mask=mask | 1;
  // Если дошли до конца, то повторяем сначала
  if(mask==0xEF)
  {
    mask=0xFE;
    pos=0;
  }
}
//----------
unsigned char search_ow_devices(void) // поиск всех устройств на шине
{
   unsigned char   i;
      unsigned char   id[OW_ROMCODE_SIZE];
      unsigned char   diff, sensors_count;

   sensors_count = 0;

   for( diff = OW_SEARCH_FIRST; diff != OW_LAST_DEVICE && sensors_count < MAXDEVICES ; )
    {
      OW_FindROM( &diff, &id[0] );

         if( diff == OW_PRESENCE_ERR ) break;

         if( diff == OW_DATA_ERR )   break;

         for (i=0;i<OW_ROMCODE_SIZE;i++)
            owDevicesIDs[sensors_count][i] = id[i];
      
      sensors_count++;
    }
   return sensors_count;

}
//----------
void main( void )
{

   unsigned char t1,temp;
    DDRB = 0xFF;
    DDRB=0xFF;
    PORTC = 0x0F;
    DDRC = 0x0F;
     DDRD = 0b00001010; PORTD = 0b00000000;
   
   OCR1AH=0x0A;OCR1AL=0x04;
    TCCR1B=1<<WGM12 | 1<<CS10;
    TIMSK1=1<<TOIE2 | 1<<OCIE1A;
   
    USART_init(51);
    sei();
   
  while(1){
      nDevices = search_ow_devices(); // ищем все устройства

      DS18x20_StartMeasureAddressed(owDevicesIDs[0]); // запускаем измерение

      _delay_ms(800);
      
      DS18x20_ReadData(owDevicesIDs[0], data); // считываем данные

      DS18x20_ConvertToThemperature(data, themperature); // преобразовываем температуру в человекопонятный вид

      USART0_write(themperature[1]);   
      USART0_write(".");
      USART0_write(themperature[2]);   
      
      temp = themperature[1];
      t1=temp/10;
      buffer[1]=digit[t1];
      temp=temp-t1*10;
      buffer[2]=digit[temp];
      
   }
}
//----------



Вложения:
7seg.rar [70.4 KiB]
Скачиваний: 151
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Самый простой термометр не работает
СообщениеДобавлено: Чт апр 19, 2012 23:30:49 
Нашел транзистор. Понюхал.
Аватар пользователя

Карма: 3
Рейтинг сообщений: 4
Зарегистрирован: Чт авг 13, 2009 08:22:53
Сообщений: 160
Откуда: Vinnitsa
Рейтинг сообщения: 0
Насчет 0хАА проверяйте совпадают ли скорости обмена.
Данные с датчика если идут как попало за все не могу сказать, если 85 это может быть трабл с питанием, проверте уровни сигнала на и от датчика. У меня такое случалось когда куча датчиков на одной шине плюс паразитное питание проседало. Во втором случае была просадка питания. Могут быть неправильные задержки в драйвере датчиков стоять.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Самый простой термометр не работает
СообщениеДобавлено: Пт апр 20, 2012 21:17:52 
Встал на лапы
Аватар пользователя

Зарегистрирован: Ср янв 18, 2012 16:33:58
Сообщений: 108
Рейтинг сообщения: 0
так это ж протеус


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y