Форум РадиоКот https://radiokot.ru/forum/ |
|
Самый простой термометр не работает https://radiokot.ru/forum/viewtopic.php?f=20&t=69870 |
Страница 1 из 1 |
Автор: | Dimon49773 [ Чт апр 19, 2012 19:49:47 ] | ||
Заголовок сообщения: | Самый простой термометр не работает | ||
Всем привет... Пытаюсь создать термометр на меге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]; } } //----------
|
Автор: | masterpc [ Чт апр 19, 2012 23:30:49 ] |
Заголовок сообщения: | Re: Самый простой термометр не работает |
Насчет 0хАА проверяйте совпадают ли скорости обмена. Данные с датчика если идут как попало за все не могу сказать, если 85 это может быть трабл с питанием, проверте уровни сигнала на и от датчика. У меня такое случалось когда куча датчиков на одной шине плюс паразитное питание проседало. Во втором случае была просадка питания. Могут быть неправильные задержки в драйвере датчиков стоять. |
Автор: | Dimon49773 [ Пт апр 20, 2012 21:17:52 ] |
Заголовок сообщения: | Re: Самый простой термометр не работает |
так это ж протеус |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |