CodeVision AVR в вопросах и ответах
-
a.garkin
- Нашел транзистор. Понюхал.
- Сообщения: 175
- Зарегистрирован: Вт сен 29, 2009 09:28:51
- Откуда: Ульяновск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Кстати при использовании также родного заголовка LCD.H
И именно:
#ifndef _LCD_INCLUDED_
#define _LCD_INCLUDED_
#pragma used+
Валится точно также...
Проверьте плиз у кого есть возможность на версии 2.05.
И именно:
#ifndef _LCD_INCLUDED_
#define _LCD_INCLUDED_
#pragma used+
Валится точно также...
Проверьте плиз у кого есть возможность на версии 2.05.
-
a.garkin
- Нашел транзистор. Понюхал.
- Сообщения: 175
- Зарегистрирован: Вт сен 29, 2009 09:28:51
- Откуда: Ульяновск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
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>
Да спасибо помогло! Но тогда зачем облегчили подключение через:
// Alphanumeric LCD Module functions
// The LCD connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric menu
-
a.garkin
- Нашел транзистор. Понюхал.
- Сообщения: 175
- Зарегистрирован: Вт сен 29, 2009 09:28:51
- Откуда: Ульяновск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
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
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Значит кодировка не попадает. Проверить по асму.
Docendo discimus
-
a.garkin
- Нашел транзистор. Понюхал.
- Сообщения: 175
- Зарегистрирован: Вт сен 29, 2009 09:28:51
- Откуда: Ульяновск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
pyzhman писал(а):Значит кодировка не попадает. Проверить по асму.
Все разобрался сенкс, осталось только понять почему в:
Код: Выделить всё
sprintf(lcd_buffer,"Темп%u=%+.3f\xdfC",j++,ds18b20_temperature(&rom_code[i][0]));Вывод Темп1=25.357ЯС
Т.е знак градуса меняется на букву "Я"
- Сериг
- Это не хвост, это антенна
- Сообщения: 1451
- Зарегистрирован: Пт фев 19, 2010 19:39:28
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
Добрый вечер,не могли бы помочь с температурными датчиками ds18b20.
Atmega8 и два дааичика один на PB0,а второй на PB2,нужно считывать их и выводить на дисплей 16х2,подкоюченный на port D.
Просто это 1/3 моей программы,с одного датчика умею считывать,а со второго как хоть убей-не пойму...
Спасибо.
Atmega8 и два дааичика один на PB0,а второй на PB2,нужно считывать их и выводить на дисплей 16х2,подкоюченный на port D.
Просто это 1/3 моей программы,с одного датчика умею считывать,а со второго как хоть убей-не пойму...
Спасибо.
Re: CodeVision AVR в вопросах и ответах
всмысле? Во-первых: не пойму для чего такое щедрое и нерациональное использование выводов микроконтроллера? Можно к 1 линии подключить и не заморачиваться. Алгоритм считывания с одного датчика - такой же как и с другого. Не понимаю, в чем возникла трудность, ведь первый датчик у тебя работает...
Не умеешь - не берись, но не взявшись не научишься...
Re: CodeVision AVR в вопросах и ответах
a.garkin писал(а):Все разобрался сенкс, осталось только понять почему в:Код: Выделить всё
sprintf(lcd_buffer,"Темп%u=%+.3f\xdfC",j++,ds18b20_temperature(&rom_code[i][0]));
Вывод Темп1=25.357ЯС
Т.е знак градуса меняется на букву "Я"
Возможно всё дело в LCD. Надо поднять на него даташит, найти там таблицу поддерживаемых символов. Скорее всего символ градуса отсутствует, либо имеет другой код.
- Сериг
- Это не хвост, это антенна
- Сообщения: 1451
- Зарегистрирован: Пт фев 19, 2010 19:39:28
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
Arlleex писал(а):всмысле? Во-первых: не пойму для чего такое щедрое и нерациональное использование выводов микроконтроллера? Можно к 1 линии подключить и не заморачиваться. Алгоритм считывания с одного датчика - такой же как и с другого. Не понимаю, в чем возникла трудность, ведь первый датчик у тебя работает...
А как мне в живую узнать какой из них кто?вот в этом и нелогичность использования 2 пинов мк.
Меня не радует методом тыка каждый раз определять какой из них кто...
Могу кинуть исходник для работы 2 датчиков по одной линии,я так по началу сделал, потом понял что не правильно так делать.
Re: CodeVision AVR в вопросах и ответах
Не правильно. Поверь, инженеры-разработчики такую простейшую проблему обдумали сразу - и поэтому:
в каждом датчике есть ROM-память, содержащая уникальный 64-битный код, в котором имеется поле CRC (8bit), Family code (28h), и 48bit уникального идентификационного номера, по которому управляющая система понимает, кому она отсылает данные и от кого она их получает. Существует группа команд работы с ROM-памятью. Но обычно, если к линии подключен всего лишь 1 датчик, можно опустить эти команды, применив команду Skip ROM (пропуск ROM) - тут эта команда используется в каждой фазе обращения к датчику, т.к. он один. А по существу эта команда нужна в многоточечной системе, когда необходимо за одну команду передать всем датчикам какие-либо одинаковые данные.
в каждом датчике есть ROM-память, содержащая уникальный 64-битный код, в котором имеется поле CRC (8bit), Family code (28h), и 48bit уникального идентификационного номера, по которому управляющая система понимает, кому она отсылает данные и от кого она их получает. Существует группа команд работы с ROM-памятью. Но обычно, если к линии подключен всего лишь 1 датчик, можно опустить эти команды, применив команду Skip ROM (пропуск ROM) - тут эта команда используется в каждой фазе обращения к датчику, т.к. он один. А по существу эта команда нужна в многоточечной системе, когда необходимо за одну команду передать всем датчикам какие-либо одинаковые данные.
Не умеешь - не берись, но не взявшись не научишься...
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
rs39 писал(а):a.garkin писал(а):Все разобрался сенкс, осталось только понять почему в:
Вывод Темп1=25.357ЯС
Т.е знак градуса меняется на букву "Я"
Возможно всё дело в LCD. Надо поднять на него даташит, найти там таблицу поддерживаемых символов.
Можно еще и тупо вывести все символы на дисплей, при этом подписывая возле каждого какой он по счету, можно даже с использованием шестнадцатеричной системы исчисления.
Re: CodeVision AVR в вопросах и ответах
Arlleex наверное родом из Одесы, или недавно оттуда, Сериг задал конкретный вопрос, а вы ему вопрос №2 , и совет не делай так, мне вот тоже интересно подключить датчики нерационально на разные пины, только тоже не знаю как, мабуть и не узнаю, так как, инженеры против!
- Сериг
- Это не хвост, это антенна
- Сообщения: 1451
- Зарегистрирован: Пт фев 19, 2010 19:39:28
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
Arlleex писал(а):Не правильно. Поверь, инженеры-разработчики такую простейшую проблему обдумали сразу - и поэтому:
в каждом датчике есть ROM-память, содержащая уникальный 64-битный код, в котором имеется поле CRC (8bit), Family code (28h), и 48bit уникального идентификационного номера, по которому управляющая система понимает, кому она отсылает данные и от кого она их получает. Существует группа команд работы с ROM-памятью. Но обычно, если к линии подключен всего лишь 1 датчик, можно опустить эти команды, применив команду Skip ROM (пропуск ROM) - тут эта команда используется в каждой фазе обращения к датчику, т.к. он один. А по существу эта команда нужна в многоточечной системе, когда необходимо за одну команду передать всем датчикам какие-либо одинаковые данные.
Спасибо за ответ!
Но вот к примеру я делаю 200 устройств и начинаю их продавать,датчик один впаян в плату в второй выносится и что мне делать?методом тыка определять у кого какой rom code?это я все 200 устройств буду не одно кратно переделывать получается...
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Зачем же методом тыка? Методом инициализации.Сначала один датчик подключили, включили прибор, он сам запомнил его, любой не запомненный будет выполнять роль второго датчика.
Есть еще один способ- заранее разделить датчики на четные и нечетные. И от этого плясать.
Есть еще один способ- заранее разделить датчики на четные и нечетные. И от этого плясать.
- Volgol_555
- Потрогал лапой паяльник
- Сообщения: 301
- Зарегистрирован: Пт сен 23, 2011 13:13:51
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
На каждом датчике написан свой адрес - это и есть ROM code. Можно после инициализации n-го количества датчиков (их может быть до 8 на одной ноге) находить каждый путем сравнения с известным ROM кодом и брать данные именно с него. Т.е. по сути весь архив кодов сравнивать с известным ROM кодом одного датчика и при совпадении брать данные температуры.
Самое гениальное - всегда самое простое
Re: CodeVision AVR в вопросах и ответах
их может быть до 8 на одной ноге
неправда. Принципиального ограничения нет. Есть ограничение по параметрам линии, к которой это будет все подключено, а конкретно ее емкость и индуктивность, коэффициент разветвления по выходу микроконтроллера и т.д. и т.п.
Сначала при старте программы командой SEARCH ROM выявляем все серийные номера датчиков и тем самым определяем их количество.
Потом, чтобы обратиться к конкретному датчику, используя команду MATCH ROM, получаем к нему доступ.
А чтобы найти все номера датчиков - используйте вышеуказанный совет vitalik_1984.
Не умеешь - не берись, но не взявшись не научишься...
Re: CodeVision AVR в вопросах и ответах
Датчики на одной линии это уже протореный путь, естественно код разработал программист высокого уровня, примеров этого кода предостаточно и преимущества применения неоспоримы.
А вот, что бы, работали датчики на разных пинах, это по видимому надо уметь написать самому такой код, кто нибудь имеет пример такого кода? или будем доказывать уже давно всеми доказаное, что протокол 1-Wire это протокол №1 на века...
А вот, что бы, работали датчики на разных пинах, это по видимому надо уметь написать самому такой код, кто нибудь имеет пример такого кода? или будем доказывать уже давно всеми доказаное, что протокол 1-Wire это протокол №1 на века...
- Сериг
- Это не хвост, это антенна
- Сообщения: 1451
- Зарегистрирован: Пт фев 19, 2010 19:39:28
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
vitalik_1984 писал(а):Зачем же методом тыка? Методом инициализации.Сначала один датчик подключили, включили прибор, он сам запомнил его, любой не запомненный будет выполнять роль второго датчика.
Есть еще один способ- заранее разделить датчики на четные и нечетные. И от этого плясать.
ок,спасибо.
Тогда такой вопрос:
1131с4-это ром код датчика?
даже если да,тогда не могли бы помочь переделать код на считывание двух датчиков и вывод информации на дисплей?
вообще делаю термостат,но на датчиках как раз и возникла проблема.
на всех моих датчиках на корпусе написанно DALLAS 18b20 1131c4 +663ac
Код: Выделить всё
#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); // ждём
};
}
спасибо!
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Ром код записан внутри, снаружи пишется марка детали, дата производства, иногда Вид упаковки компонентов: лента, паллет, линейка.
- Сериг
- Это не хвост, это антенна
- Сообщения: 1451
- Зарегистрирован: Пт фев 19, 2010 19:39:28
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
Тогда как вы сне предлагаете на одну линию датчики вешать?
Я просто реально не понимаю,вот я сделал 1000 устройств и бегать у каждого смотреть какой датчик Кто...чистая смерть...
Я просто реально не понимаю,вот я сделал 1000 устройств и бегать у каждого смотреть какой датчик Кто...чистая смерть...