CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вт сен 29, 2009 09:28:51
Откуда: Ульяновск

Сообщение a.garkin »

Кстати при использовании также родного заголовка LCD.H

И именно:
#ifndef _LCD_INCLUDED_
#define _LCD_INCLUDED_

#pragma used+

Валится точно также...
Проверьте плиз у кого есть возможность на версии 2.05.
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вт сен 29, 2009 09:28:51
Откуда: Ульяновск

Сообщение a.garkin »

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
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вт сен 29, 2009 09:28:51
Откуда: Ульяновск

Сообщение a.garkin »

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>

Теперь интересней:

После прошивки, зависает программа в том месте где идут русские буквы в программе.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Значит кодировка не попадает. Проверить по асму.
Docendo discimus
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вт сен 29, 2009 09:28:51
Откуда: Ульяновск

Сообщение a.garkin »

pyzhman писал(а):Значит кодировка не попадает. Проверить по асму.
Все разобрался сенкс, осталось только понять почему в:

Код: Выделить всё

sprintf(lcd_buffer,"Темп%u=%+.3f\xdfC",j++,ds18b20_temperature(&rom_code[i][0]));
Вывод Темп1=25.357ЯС

Т.е знак градуса меняется на букву "Я" :shock:
Контактная информация:
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Сообщение Сериг »

Добрый вечер,не могли бы помочь с температурными датчиками ds18b20.
Atmega8 и два дааичика один на PB0,а второй на PB2,нужно считывать их и выводить на дисплей 16х2,подкоюченный на port D.
Просто это 1/3 моей программы,с одного датчика умею считывать,а со второго как хоть убей-не пойму...
Спасибо.
Реклама
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Сообщение Arlleex »

всмысле? Во-первых: не пойму для чего такое щедрое и нерациональное использование выводов микроконтроллера? Можно к 1 линии подключить и не заморачиваться. Алгоритм считывания с одного датчика - такой же как и с другого. Не понимаю, в чем возникла трудность, ведь первый датчик у тебя работает...
Не умеешь - не берись, но не взявшись не научишься...
Открыл глаза
Аватара пользователя
Сообщения: 53
Зарегистрирован: Сб май 07, 2011 14:35:24
Откуда: Россия

Сообщение rs39 »

a.garkin писал(а): Все разобрался сенкс, осталось только понять почему в:

Код: Выделить всё

sprintf(lcd_buffer,"Темп%u=%+.3f\xdfC",j++,ds18b20_temperature(&rom_code[i][0]));
Вывод Темп1=25.357ЯС
Т.е знак градуса меняется на букву "Я" :shock:
Возможно всё дело в LCD. Надо поднять на него даташит, найти там таблицу поддерживаемых символов. Скорее всего символ градуса отсутствует, либо имеет другой код.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Сообщение Сериг »

Arlleex писал(а):всмысле? Во-первых: не пойму для чего такое щедрое и нерациональное использование выводов микроконтроллера? Можно к 1 линии подключить и не заморачиваться. Алгоритм считывания с одного датчика - такой же как и с другого. Не понимаю, в чем возникла трудность, ведь первый датчик у тебя работает...
А как мне в живую узнать какой из них кто?вот в этом и нелогичность использования 2 пинов мк.
Меня не радует методом тыка каждый раз определять какой из них кто...
Могу кинуть исходник для работы 2 датчиков по одной линии,я так по началу сделал, потом понял что не правильно так делать.
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Сообщение Arlleex »

Не правильно. Поверь, инженеры-разработчики такую простейшую проблему обдумали сразу - и поэтому:
в каждом датчике есть ROM-память, содержащая уникальный 64-битный код, в котором имеется поле CRC (8bit), Family code (28h), и 48bit уникального идентификационного номера, по которому управляющая система понимает, кому она отсылает данные и от кого она их получает. Существует группа команд работы с ROM-памятью. Но обычно, если к линии подключен всего лишь 1 датчик, можно опустить эти команды, применив команду Skip ROM (пропуск ROM) - тут эта команда используется в каждой фазе обращения к датчику, т.к. он один. А по существу эта команда нужна в многоточечной системе, когда необходимо за одну команду передать всем датчикам какие-либо одинаковые данные.
Не умеешь - не берись, но не взявшись не научишься...
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

rs39 писал(а):
a.garkin писал(а): Все разобрался сенкс, осталось только понять почему в:
Вывод Темп1=25.357ЯС
Т.е знак градуса меняется на букву "Я" :shock:
Возможно всё дело в LCD. Надо поднять на него даташит, найти там таблицу поддерживаемых символов.
Можно еще и тупо вывести все символы на дисплей, при этом подписывая возле каждого какой он по счету, можно даже с использованием шестнадцатеричной системы исчисления.
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пт апр 27, 2012 15:48:35

Сообщение TovsCat »

Arlleex наверное родом из Одесы, или недавно оттуда, Сериг задал конкретный вопрос, а вы ему вопрос №2 , и совет не делай так, мне вот тоже интересно подключить датчики нерационально на разные пины, только тоже не знаю как, мабуть и не узнаю, так как, инженеры против!
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Сообщение Сериг »

Arlleex писал(а):Не правильно. Поверь, инженеры-разработчики такую простейшую проблему обдумали сразу - и поэтому:
в каждом датчике есть ROM-память, содержащая уникальный 64-битный код, в котором имеется поле CRC (8bit), Family code (28h), и 48bit уникального идентификационного номера, по которому управляющая система понимает, кому она отсылает данные и от кого она их получает. Существует группа команд работы с ROM-памятью. Но обычно, если к линии подключен всего лишь 1 датчик, можно опустить эти команды, применив команду Skip ROM (пропуск ROM) - тут эта команда используется в каждой фазе обращения к датчику, т.к. он один. А по существу эта команда нужна в многоточечной системе, когда необходимо за одну команду передать всем датчикам какие-либо одинаковые данные.
Спасибо за ответ!
Но вот к примеру я делаю 200 устройств и начинаю их продавать,датчик один впаян в плату в второй выносится и что мне делать?методом тыка определять у кого какой rom code?это я все 200 устройств буду не одно кратно переделывать получается...
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Зачем же методом тыка? Методом инициализации.Сначала один датчик подключили, включили прибор, он сам запомнил его, любой не запомненный будет выполнять роль второго датчика.

Есть еще один способ- заранее разделить датчики на четные и нечетные. И от этого плясать.
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 301
Зарегистрирован: Пт сен 23, 2011 13:13:51
Откуда: Минск

Сообщение Volgol_555 »

На каждом датчике написан свой адрес - это и есть ROM code. Можно после инициализации n-го количества датчиков (их может быть до 8 на одной ноге) находить каждый путем сравнения с известным ROM кодом и брать данные именно с него. Т.е. по сути весь архив кодов сравнивать с известным ROM кодом одного датчика и при совпадении брать данные температуры.
Самое гениальное - всегда самое простое
Контактная информация:
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Сообщение Arlleex »

их может быть до 8 на одной ноге
неправда. Принципиального ограничения нет. Есть ограничение по параметрам линии, к которой это будет все подключено, а конкретно ее емкость и индуктивность, коэффициент разветвления по выходу микроконтроллера и т.д. и т.п.

Сначала при старте программы командой SEARCH ROM выявляем все серийные номера датчиков и тем самым определяем их количество.
Потом, чтобы обратиться к конкретному датчику, используя команду MATCH ROM, получаем к нему доступ.

А чтобы найти все номера датчиков - используйте вышеуказанный совет vitalik_1984.
Не умеешь - не берись, но не взявшись не научишься...
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пт апр 27, 2012 15:48:35

Сообщение TovsCat »

Датчики на одной линии это уже протореный путь, естественно код разработал программист высокого уровня, примеров этого кода предостаточно и преимущества применения неоспоримы.
А вот, что бы, работали датчики на разных пинах, это по видимому надо уметь написать самому такой код, кто нибудь имеет пример такого кода? или будем доказывать уже давно всеми доказаное, что протокол 1-Wire это протокол №1 на века...
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Сообщение Сериг »

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);                                                      // ждём 
};

}
спасибо!
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Ром код записан внутри, снаружи пишется марка детали, дата производства, иногда Вид упаковки компонентов: лента, паллет, линейка.
Контактная информация:
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Сообщение Сериг »

Тогда как вы сне предлагаете на одну линию датчики вешать?
Я просто реально не понимаю,вот я сделал 1000 устройств и бегать у каждого смотреть какой датчик Кто...чистая смерть...
Ответить

Вернуться в «AVR»