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

Обсуждаем контроллеры компании Atmel.
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

я говорю - когдато :)
надо было повыводить биты этой сволочи когда оно ошибалось :)
+ эт уже готовая формула была для паралельного АЦП просто подставляй вес каждого и делай условия по старшим битам слова
просто люди тут нагородили кучу всего изза разделения побитно байта или полторых байт....дык это как бы логичнейший вариант
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

Вот бы чтото с этой дурацкой памятью решить
ну или на крайний случай с чтением из 1wire шины средствами встроенной библиотеки номеров устройств?
Кстати у когото есть нормально расписанные технологии составления таблицы адресов устройств
хотя логичнее наверное именно заставить работать мои 512 байт памяти в компиляторе как основной - помоему никакие ккомпиляторы пока что этого не позволяют %(
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

Кстати вот ещё несколько фокусов с битами сделанными макросом

#define SetBit(x,y) (x|=(1<<y))
#define ClrBit(x,y) (x&=~(1<<y))
#define ToggleBit(x,y) (x^=(1<<y))
#define FlipBit(x,y) (x^=(1<<y)) // Same as ToggleBit.
#define TestBit(x,y) (x&(1<<y))
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

clawham писал(а):...дык это как бы логичнейший вариант
Разделять число на отдельные биты, затем сдвигать эти биты в младшую позицию (деля таким образом на возрастающую степень двойки), после чего умножать результат на вес младшего бита, предварительно умноженный на ту же степень двойки, на которую только что делили само число - это логичнейший вариант?!! :shock:
Да это не только не логичнейший, это вовсе нелогичный процесс, так как все эти двадцать четыре действия тождественно равны простому умножению исходного, неразобранного на биты, числа на цену деления (а не на восемь кратных ей значений)!
Я уже не говорю о том, что для того, кто этого не писал (а через некоторое время - и для автора этой кутерьмы тоже) смысл происходящего станет неочевиден; а также о том, что, хотя дополнительной пользы эти лишние операторы не принесут никакой, источником дополнительных ошибок они будут в той же степени, что и нормальные операторы, написанные для дела.
Пройти через это в процессе понимания "откуда ноги растут" можно - эти пути вообще неисповедимы, но предлагать такое другим, да еще, как логичнейшее решение, ох, не надо!Изображение
clawham писал(а):Кстати у когото есть нормально расписанные технологии составления таблицы адресов устройств
Ты о поиске утсройств на шине? Разумеется есть - у Максима. Найди у него апноту AN187 - "1-Wire Search Algorithm", там все по шагам и расписано. И, кстати, ситуация, названная тобой - "функция всегда возвращяет 255", во время поиска устройств на 1-wire шине (если ты верно ее описал) - там описана вместе с причинами. Более того, она - часть алгоритма. :)
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

пока что я пришел к тому что проще будет вести некую базу адресов, дописывать записи в которую буду с компьютера или ещё проще - допишу в менюшке чтоб котроллер постоянно проверял адрес устройства 1wire и пробегая по микрухе памяти если не нашел - добавлял его. микруха память не теряет при выключении вот и получится БД :)
немнога через попу конечно ну да ладно.
По поводу поразрядного деления умножения - а вот предложите чтото лучшее если ваша "АЦП" каждому своему разряду выставляет в левом протоколе процент погрешности !!
Эт была входная платка от станка с ЧПУ и надо было его нечнога модернизировать. в идиотских советских ацп на дискретных элементахвес каждого бита менялся и далеко не линейно!!! вот и понадобилась такая строочка а уже потом дело дошло до самописной функции получения температуры с датчиков и мне просто было так наглядней глюк искать.
По поводу функции чтения эт вообще не из той категории вопрос!
Вопрос тут в алгоритме самого чтения организованного в библиотеке
255 это значит никто не ответил на адрес посланный перед этим НО....
адрес слался правильно...просто чтение работает как-то не так.
Изобретать велосипед описывая снова интерфейс 1wire смысла не вижу ибо он-то в оболочке уже как-то реализован....теперь осталось выяснить как?
запись работает как часы. термометры всегда одновременно преобразование начинают а вот вручную получить данные скретчпада используя библиотеку 1wire.h у меня не получилось.
я не спорю - оно работает, я не спорю люди умные эти либы писали но нигде я не встретил примера в котором использовались эти функции и успешно
ну разве что вторая либа (ds1820.h) именно через либу 1wire.h
в принципе вариант "неправильно описал" не рассматривается так как не я её писал и она работает!!! но я не знаю как ею пользоваться
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

clawham писал(а):вес каждого бита менялся и далеко не линейно!!!
Разумеется нелинейно - это же степенной ряд, поскольку число двоичное, соседние разряды отличаются весом в 2 раза - сравни с коэффициентами в твоем примере:
0.0625
0.125
0.25
0.5
1
2
4
8
clawham писал(а):По поводу функции чтения эт вообще не из той категории вопрос!
Тогда стоит пояснить, что означают слова "составление таблицы адресов устройств" в твоем вопросе.
Аватара пользователя
Cat
Электрический кот
Сообщения: 1087
Зарегистрирован: Вт май 05, 2009 10:43:42
Откуда: Россия
Контактная информация:

Сообщение Cat »

Пардон что вмешиваюсь с такими простымы вопросами. Какая сейчас последняя версия CodeVision? Есть ли смысл обновиться с версии 1.25.5?
Если есть, то каковы будут ограничения по совместимости кодов/самописных библиотек?
И что это даст в сухом остатке?
Боевой ватник.
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

ребята вы не поняли вообще не в ту степь полезли ну то что было уже нету я просто его достал когда игрался с Дской сичас у меня написано просто деление и всё эт был тупо пример как биты из чисел доставать ну сколько можно-то? абсолютно согласен что таким способом вычислять температуру в ДС-ке совершенно тупо ну и что?во время отладки мне надо было видеть каждый бил ибо не умею я читать с 1wire самостоятельно

по поводу что я имею ввиду под поиском - а то и имею ввиду!
у меня есть устройство коробочка возле станка и 38 зон температурных к примеру + примерно 120 термоэлементов и система охлаждения(когда станок выходит на расчетную мощность некоторые зоны начинают перегреваться без принудительного нагрева - просто от трения

мне надо всю эту арраву опрашивать БЫСТРО....так быстро как только можно....пока что это получается(я просто посылаю скип ром и начало конверсии потом жду 500 мс и по одному читаю скретчпады - чтение супербыстрое на самом деле скорости в таком варианте хватает) но адреса я забиваю в программную константу принудительно и потом просто прохожусь по этому массиву но если я захочу добавить новый термодаччик мне прийдётся узнвать его адрес, дописывать в массив, перекомпилировать прошивку перепрошивать МК и только тогда он будет участвовать тоже....а это неприемлемо хочется гибкости но чувствую я средствами одной только функции встроенной w1_search() я не смогу это реализовать ибо встроенной памяти мало и даж если взять 128-ю мегу и сделать под неё плату с внешними 64 килобайтами ну...это дурдом просто ради такой мелочи так усложнять конструкцию....у меня ж есть тупая SRAM которой на 20 ног дай адрес и она на друугих 8-ми выдаст содержимое или запишет то что было на тех 8-ми в адрес выставленный 20-ю первыми ногами....при помощи 2-х регистров запросто подключу этого зверя 512 килобайтного к меге 16, напишу процедурку и разработаю структуру памяти но это всё для моего использования....компилятор же не создаст в той внешней памяти массив адресов чтоб его заполняла функция 1w_search()
Аватара пользователя
sheva_s
Грызет канифоль
Сообщения: 256
Зарегистрирован: Пт апр 27, 2007 14:32:48
Откуда: Украина Кривой Рог
Контактная информация:

Сообщение sheva_s »

Подскажите как реализовать посегментную динамическую индикацию для цифр. Если можно хоть какойто пример для цифры.
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Пример (неоптимальный, зато наглядный) для семисегментных индикаторов с ОК, табло шириной 4 символа, в строке символов для отображения (static char Tablo[TABLO_LEN]) ожидаются только десятичные цифры, сегменты от A до G запитаны через порт AnodePort, битами от 0 до 6, катоды заведены на порт CathodePort:

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

#define         TABLO_LEN   4
static  char    Tablo[TABLO_LEN];
// сегменты (при матрице с ОК, зажигаются единичками)
#define     segA    0b00000001
#define     segB    0b00000010
#define     segC    0b00000100
#define     segD    0b00001000
#define     segE    0b00010000
#define     segF    0b00100000
#define     segG    0b01000000

static  char    CMasks[10]=
        {
            segA|segB|segC|segD|segE|segF,     // 0
            segB|segC,                         // 1
            segA|segB|segD|segE|segG,          // 2
            segA|segB|segC|segD|segG,          // 3
            segB|segC|segF|segG                // 4
            segA|segC|segD|segF|segG,          // 5
            segA|segC|segD|segE|segF|segG,     // 6
            segA|segB|segC,                    // 7
            segA|segB|segC|segD|segE|segF|segG,// 8
            segA|segB|segC|segD|segF|segG      // 9
        },
        RunningGround[TABLO_LEN] = {0b1110,0b1101,0b1011,0b0111};

// прерывание от таймера
void    TimerOvflow()
{
static unsigned char TabloIdx = 0;

        if (++TabloIdx >= TABLO_LEN) TabloIdx = 0;
        // гасим все знаки в табло, подавая 1 на все катоды
        CathodePort = 0b1111;
        // меняем цифру, выводимую в регистр сегментов (выводим маску сегментов на аноды)
        AnodePort = CMasks[(Tablo[TabloIdx] - '0')];
        // зажигаем очередное знакоместо в табло, подавая 0 на очередной катод
        CathodePort = RunningGround[TabloIdx];
}
Аватара пользователя
Cat
Электрический кот
Сообщения: 1087
Зарегистрирован: Вт май 05, 2009 10:43:42
Откуда: Россия
Контактная информация:

Сообщение Cat »

На сайте уважаемого ARV очень толковый и понятный пример. Посмотрите.
Боевой ватник.
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

Меня просто интересует вопрос как читать из шины данные например есть
DS2413 - 2 битный порт ввода вывода, если вывод ещё получается то чтение этой самой функцией

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

unsigned char w1_read(void);
не возвращяет ничего отличного от 255....может надо по какому-то прерыванию читать или чтото ещё в этом роде?
Я про встроенную библиотеку работы с 1wire

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

/*
  CodeVisionAVR C Compiler
  (C) 1998-2000 Pavel Haiduc, HP InfoTech S.R.L.

  Prototypes for Dallas Semiconductor
  1 Wire protocol functions

  BEFORE #include -ING THIS FILE YOU
  MUST DECLARE THE I/O ADDRESS OF THE
  DATA REGISTER OF THE PORT AT WHICH
  THE 1 WIRE BUS IS CONNECTED AND
  THE DATA BIT USED

  EXAMPLE FOR PORTB:

    #asm
        .equ __w1_port=0x18
        .equ __w1_bit=3
    #endasm
    #include <1wire>
*/

#ifndef _W1_INCLUDED_
#define _W1_INCLUDED_

#pragma used+
unsigned char w1_init(void);
unsigned char w1_read(void);
unsigned char w1_write(unsigned char data);
unsigned char w1_search(unsigned char cmd,void *p);
unsigned char w1_dow_crc8(void *p,unsigned char n);
#pragma used-

#endif


init - сброс шины
write - работает чётко
search - работает но ей нужна ссылка на массив, который она заполнит
dow_crc8 - расчет CRC и оно тоже работает
а вот read чтото ну ни в какую не могу организовать.....чего-то я не понимаю но чего я не понимаю я не понимаю!!! :) памажите кто работал с 1wire больше чем термометр но на этих либах в кодвижине!!!
Аватара пользователя
sheva_s
Грызет канифоль
Сообщения: 256
Зарегистрирован: Пт апр 27, 2007 14:32:48
Откуда: Украина Кривой Рог
Контактная информация:

Сообщение sheva_s »

Cat писал(а):На сайте уважаемого ARV очень толковый и понятный пример. Посмотрите.

Перерыл полностью сайт так и ненашел , в файлах к устройствам есть код для такой индикации но тяжело в нем разобраться там написано для другого компилятора.
Прийдеться ждать уважаемого ARV может втолкует что да как .
Аватара пользователя
sheva_s
Грызет канифоль
Сообщения: 256
Зарегистрирован: Пт апр 27, 2007 14:32:48
Откуда: Украина Кривой Рог
Контактная информация:

Сообщение sheva_s »

Yellow Tiger писал(а):Пример (неоптимальный, зато наглядный) для семисегментных индикаторов с ОК

Спасибо попробую разобраться.
Аватара пользователя
Cat
Электрический кот
Сообщения: 1087
Зарегистрирован: Вт май 05, 2009 10:43:42
Откуда: Россия
Контактная информация:

Сообщение Cat »

http://arv.radioliga.com/index.php?opti ... &Itemid=49 Я это имел ввиду. У меня есть код работающий в железе для коде вижна. Убираются незначащие нули, если надо пририсовывается минус опять же с учетом длины числа. Если нужно-стучите в личку, поделюсь и объясню что к чему.

ПС: у YT интересное решение. Посмотрите все варианты, думаю поймете что и как.
Боевой ватник.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

я выкладывал у себя на сайте так же исходники для проекта "термостат - меньше, чем не бывает" - там есть нормально прокомментированный модуль 7-сегментного дисплея, где учтено многое: и нули, и знаки, и мигание, и общие аноды-катоды и т.п. - короче, смотрите, авось и польза будет...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Cat
Электрический кот
Сообщения: 1087
Зарегистрирован: Вт май 05, 2009 10:43:42
Откуда: Россия
Контактная информация:

Сообщение Cat »

Ваш код намного универсальнее, моё же произведение (у вас подсматривал саму идею) заточено под конкретную железку, убрано все "лишнее", потому и проще.

ARV, у вас есть "джентельменский набор" разных универсальных кусков кода на все случаи жизни? Наподобие как библиотеки Паскаля Стэнга? Если есть, не могли бы вы выложить их? Даже без пояснений ( чтобы не замучали шквалом вопросов), по принципу: дано - как есть. рабочее. пользуйтесь.
Боевой ватник.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

джентельменский набор - это сильно сказано, такого у меня нет. конечно, постепенно накапливаются кое-какие решения, заготовки и т.п. в частности, сейчас есть модуль 1-wire с функциями получения температуры в ЦЕЛЫХ числах (в десятых и сотых долях градуса), в том числе с автоматическим определением типа датчика DS18S20 или DS18B20. есть модуль 7-сегментного дисплея (наиболее востребованный мною), в том числе с поддержкой функций а-ля printf (для форматированного вывода). есть кое-какие наработки по работе с кнопками (автоповтор при длительном нажатии и т.п.). есть пробный шар приема IR-кодов ДУ (оказалось, кроме RC5 элементарно принимаются коды практически любых стандартов). есть задел по работе с энкодером. из всего этого я особого секрета не делаю, по мере того, как код я причесываю до качественного состояния, я его публикую на своем сайте.

в частности, в вышеупомянутом исходнике для проекта микро-термостата есть почти все модули из перечисленных. недоделанные модули я принципиально не показываю никому - это без исключений.

честно говоря, мне не очень приятно просто раздавать готовые исходники - славы тут никакой, и, главное, пользы для того, кто ими пользуется, тоже почти никакой. я с бОльшим удовольствием рассказываю об алгоритмах, по которым надо писать те или иные куски кода. считаю, что понимание алгоритмов дает значительно больше пользы. как вы могли заметить, в моих статьях больше рассказов о том, как сделать, чем готовых кусков кода.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
sheva_s
Грызет канифоль
Сообщения: 256
Зарегистрирован: Пт апр 27, 2007 14:32:48
Откуда: Украина Кривой Рог
Контактная информация:

Сообщение sheva_s »

ARV немогли бы Вы написать как осуществляеться алгоритм вывода для посегментной индикации, а то что то никак немогу разобраться.
Немогу понять как вывести число на индикатор к примеру число 3 на индикаторе с общим анодом 0d01001111, как разложить его на 0 и 1 для вывода.

Cat спасибо за код но это немного нето что мне нужно у Вас написана поразрядная индикация где выводиться сразу число а мне нужно выводить число отдельными сегментами, что то типа зажег один сегмент подождали затем этот потушили зажгли следующий сегмент подождали и тд .
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

sheva_s, с обычной динамической индикацией вы разобрались, как я понял? так вот, посегментная от обычной отличается незначительно:
1. частота прерываний должна быть в 8 раз выше
2. в обработчике прерывания надо завести static-переменную, назовем ее МАСКОЙ. изначально эта маска равна 1. Эта маска будет обозначать бит, который надо вывести (т.е. сегмент).
3. при каждом прерывании вы должны сделать следующее: взять символ, который собрались выводить из массива, и при помощи нужных битовых операций (для индикаторов с общим анодом и катодом операции разные) и МАСКИ оставить в символе только ОДИН БИТ, сбросив остальные в "невидимое" состояние, т.е. несветящееся. после этого символ (точнее, остатки от него) вывести, как обычно, а МАСКУ сдвинуть влево. если после сдвига МАСКА обнулится - это означает. что все 8 битов поочереди вы вывели, и ПОРА БРАТЬ СЛЕДУЮЩИЙ СИМВОЛ ИЗ МАССИВА (в следующий раз по прерыванию). МАСКУ при этом снова надо сделать равной 1.

надеюсь, я понятно изложил.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ответить

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