Самый простой термометр не работает

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
Dimon49773
Встал на лапы
Сообщения: 108
Зарегистрирован: Ср янв 18, 2012 16:33:58

Самый простой термометр не работает

Сообщение Dimon49773 »

Всем привет...

Пытаюсь создать термометр на меге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 КБ) 160 скачиваний
Реклама
Аватара пользователя
masterpc
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Чт авг 13, 2009 08:22:53
Откуда: Vinnitsa

Re: Самый простой термометр не работает

Сообщение masterpc »

Насчет 0хАА проверяйте совпадают ли скорости обмена.
Данные с датчика если идут как попало за все не могу сказать, если 85 это может быть трабл с питанием, проверте уровни сигнала на и от датчика. У меня такое случалось когда куча датчиков на одной шине плюс паразитное питание проседало. Во втором случае была просадка питания. Могут быть неправильные задержки в драйвере датчиков стоять.
Реклама
Аватара пользователя
Dimon49773
Встал на лапы
Сообщения: 108
Зарегистрирован: Ср янв 18, 2012 16:33:58

Re: Самый простой термометр не работает

Сообщение Dimon49773 »

так это ж протеус
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»