Всем привет...
Пытаюсь создать термометр на меге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];
}
}
//----------