И именно:
#ifndef _LCD_INCLUDED_
#define _LCD_INCLUDED_
#pragma used+
Валится точно также...
Проверьте плиз у кого есть возможность на версии 2.05.
Да спасибо помогло! Но тогда зачем облегчили подключение через:pyzhman писал(а):Prior to #include -ing the lcd.h file, you must declare which microcontroller port is used for communication with the LCD module.
The following LCD formats are supported in lcd.h: 1x8, 2x12, 3x12, 1x16, 2x16, 2x20, 4x20, 2x24 and 2x40 characters.
Example:
/* the LCD module is connected to PORTC */
#asm
.equ __lcd_port=0x15
#endasm
/* now you can include the LCD Functions */
#include <lcd.h>
Теперь интересней:pyzhman писал(а):Prior to #include -ing the lcd.h file, you must declare which microcontroller port is used for communication with the LCD module.
The following LCD formats are supported in lcd.h: 1x8, 2x12, 3x12, 1x16, 2x16, 2x20, 4x20, 2x24 and 2x40 characters.
Example:
/* the LCD module is connected to PORTC */
#asm
.equ __lcd_port=0x15
#endasm
/* now you can include the LCD Functions */
#include <lcd.h>
Все разобрался сенкс, осталось только понять почему в:pyzhman писал(а):Значит кодировка не попадает. Проверить по асму.
Код: Выделить всё
sprintf(lcd_buffer,"Темп%u=%+.3f\xdfC",j++,ds18b20_temperature(&rom_code[i][0]));Возможно всё дело в LCD. Надо поднять на него даташит, найти там таблицу поддерживаемых символов. Скорее всего символ градуса отсутствует, либо имеет другой код.a.garkin писал(а): Все разобрался сенкс, осталось только понять почему в:Вывод Темп1=25.357ЯСКод: Выделить всё
sprintf(lcd_buffer,"Темп%u=%+.3f\xdfC",j++,ds18b20_temperature(&rom_code[i][0]));
Т.е знак градуса меняется на букву "Я"
А как мне в живую узнать какой из них кто?вот в этом и нелогичность использования 2 пинов мк.Arlleex писал(а):всмысле? Во-первых: не пойму для чего такое щедрое и нерациональное использование выводов микроконтроллера? Можно к 1 линии подключить и не заморачиваться. Алгоритм считывания с одного датчика - такой же как и с другого. Не понимаю, в чем возникла трудность, ведь первый датчик у тебя работает...
Можно еще и тупо вывести все символы на дисплей, при этом подписывая возле каждого какой он по счету, можно даже с использованием шестнадцатеричной системы исчисления.rs39 писал(а):Возможно всё дело в LCD. Надо поднять на него даташит, найти там таблицу поддерживаемых символов.a.garkin писал(а): Все разобрался сенкс, осталось только понять почему в:
Вывод Темп1=25.357ЯС
Т.е знак градуса меняется на букву "Я"
Спасибо за ответ!Arlleex писал(а):Не правильно. Поверь, инженеры-разработчики такую простейшую проблему обдумали сразу - и поэтому:
в каждом датчике есть ROM-память, содержащая уникальный 64-битный код, в котором имеется поле CRC (8bit), Family code (28h), и 48bit уникального идентификационного номера, по которому управляющая система понимает, кому она отсылает данные и от кого она их получает. Существует группа команд работы с ROM-памятью. Но обычно, если к линии подключен всего лишь 1 датчик, можно опустить эти команды, применив команду Skip ROM (пропуск ROM) - тут эта команда используется в каждой фазе обращения к датчику, т.к. он один. А по существу эта команда нужна в многоточечной системе, когда необходимо за одну команду передать всем датчикам какие-либо одинаковые данные.
неправда. Принципиального ограничения нет. Есть ограничение по параметрам линии, к которой это будет все подключено, а конкретно ее емкость и индуктивность, коэффициент разветвления по выходу микроконтроллера и т.д. и т.п.их может быть до 8 на одной ноге
ок,спасибо.vitalik_1984 писал(а):Зачем же методом тыка? Методом инициализации.Сначала один датчик подключили, включили прибор, он сам запомнил его, любой не запомненный будет выполнять роль второго датчика.
Есть еще один способ- заранее разделить датчики на четные и нечетные. И от этого плясать.
Код: Выделить всё
#include <mega8.h> // библиотека ввода\вывода микроконтроллера
#asm
.equ __w1_port=0x18 ;PORTB //сообщаем куда подключен датчик
.equ __w1_bit=0
#endasm
#include <ds18b20.h> //библиотека для работы с датчиком ds18b20
unsigned char rom_code[4][9]; //масив с адресами найденых датчиков
#define MAX_DS18B20 8
#asm
.equ __lcd_port=0x12 ;PORTD //сообщаем куда подключён экран
#endasm
#include <lcd.h> //библиотека для LCD
#include <stdio.h> //библиотека для LCD
#include <delay.h> //библиотека задержки
unsigned char i,devices; //переменная в которой количество
int temp1,temp2; //обьявляем перменные
unsigned char lcd_buffer_1[16]; //масив с данными для экрана
unsigned char lcd_buffer_2[16]; //масив с данными для экрана
void main(void) // Declare your global variables here
{
char *_str="http://c2.at.ua"; //Создаем информ. строку
char *_str1="2 Tepјoјeїpa 1\x60C";
PORTB=0b00000000; // «WzAVR «Port B initialization
DDRB=0b00000000; // 0b в таком виде легче представить состояние портов
PORTC=0b10000000; // «WzAVR «Port C initialization
DDRC=0b00000000;
PORTD=0b00000000; // «WzAVR «Port D initialization
DDRD=0b00000000;
devices=w1_search(DS18B20_SEARCH_ROM_CMD,rom_code); //определим сколько устройств подключено к шине 1-Wire
ACSR=0x80; // «Analog Comparator: Off
ds18b20_init(0,-35,35,DS18B20_12BIT_RES); // переключения термометра в 12 битный режим
w1_init(); // Wire Bus initialization
lcd_init(16); // Инициализация ЖКИ на 16 символов
lcd_gotoxy(0, 0); // Переводим курсор на первый символ первой строки
lcd_puts(_str); // Выводим строку _str на дисплей ЖКИ
lcd_gotoxy(0, 1); // Переводим курсор на первый символ первой строки
lcd_puts(_str1); // Выводим строку _str на дисплей ЖКИ
delay_ms(900); // ждём 900мс
lcd_clear(); // чистим дисплей перед выводом
lcd_init(16); // Инициализация ЖКИ на 16 символов
while(devices>0) // бесконечный цикл, если датчик подключон
{ // Place your code here
temp1 = ds18b20_temperature(&rom_code[0][0]); // читаем температуру с выбранного датчика
//if( temp1 > 1000 ) { temp1 = 4096 - temp1; temp1 = -temp1; }
if ((temp1 < 130) & (temp1 > -60)) // установим границу диапазон
temp1= temp1;
else
{
temp1 =0; // если выходит за границу тогда 0
}
sprintf(lcd_buffer_1," t%u=%i.%u\xdfC ",i+1,temp1,temp1%1);
lcd_gotoxy(0,0); // указали место на дисплее
lcd_puts(lcd_buffer_1); // выводим масив на LCD
temp2 = ds18b20_temperature( &rom_code[1][0] ); //читаем температуру с выбранного датчика
//if( temp2 > 1000 ) { temp2 = 4096-temp2; temp2 = -temp2; }
if ((temp2 < 130) & (temp2 > -60)) // установим границу диапазон
temp2= temp2;
else
{
temp2 =0; // если выходит за границу тогда 0
}
sprintf(lcd_buffer_2," t%u=%i.%u\xdfC ",i+2,temp2,temp2%1);
lcd_gotoxy(0,1);
lcd_puts(lcd_buffer_2); // выводим масив на LCD
delay_ms(30); // ждём
};
}