AlexDX740 0 11 ноября, 2010 Опубликовано 11 ноября, 2010 · Жалоба Не могли бы вы проверить этот кусок исходного кода word measure(void){ ClrBit(DDRB,AIN0); // Перевести в Z-состояние порты В TCNT0 = TH = 0; // Очистить счетчик-накопитель TCCR0 = PRESC; // Включить Таймер 0 SetBit(DDRB,T); // Включить транзистор while(BitOff(ACSR,ACO)); // Ждать изменения состояния компаратора TCCR0 = 0; // Выключить Таймер 0 ClrBit(DDRB,T); // Выключить транзистор SetBit(DDRB,AIN0); // Разрядить конденсатор delayms(2); // Время для разряда return(TH<<8 | TCNT0); // Возвращаем результат замера времени } Я пробовал посчитать с подстановкой битов у меня получается что возвращаться будет 0??? И ещё вопрос ,почему Code Vision AVR упорно не принимает команду запуска глобальных прерываний __enable_interrupt(); но команду на ассемблере хавает #asm("sei")? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 11 ноября, 2010 Опубликовано 11 ноября, 2010 · Жалоба Всё проверять лень(чем-то же и вы должны заниматься ведь так? ) Но могу подсказать, что функция measure возвращает значение типа word - т.е. ДВА байта. Счётчик у таймера тоже 16ти битный. Т.е. состоит он из двух половинок. TH - хранит старший байт TCNT0 - младший. Последняя строка делает следующее: представим себе некую переменную с типом word. Назовем её по имени фунции - measure последняя строчка по сути делает присвоение measure = (TH<<8 | TCNT0); Т.е. берем TH и подвигаем его на один байт в сторону старших разрядов. Если TH был 11010010 то после операции <<8 получится 1101001000000000 - результат то у нас 16ти битный. Как-бы таким образом старший байт счётчика таймера встал на своё место (стал старшим байтом ) ). Дальше сюда надо как-то присовокупить младший байт(TCNT0). Примем TCNT0 = 00011011 У нас уже есть результат от TH<<8 и он равен 1101001000000000 выполним операцию логического ИЛИ со значением TCNT0 - 00011011 1101001000000000 | 00011011 Для выполнения этой операции TCNT0 будет приведен к типу word путём добавления восьми нулей в старшем байте т.е. будет так в итоге 1101001000000000 | 0000000000011011 А выполнив эту операцию мы получим 1101001000011011 Что и требовалось. И ещё вопрос ,почему Code Vision AVR упорно не принимает команду запуска глобальных прерываний __enable_interrupt(); но команду на ассемблере хавает #asm("sei")?Понятия не имею. Видимо нужно сделать #include или же __enable_interrupt(); - это вообще не из Code Vision AVR... я по WINAVR могу что-то подсказать. CVAVR у меня нет и я им не пользовался ни разу :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexDX740 0 11 ноября, 2010 Опубликовано 11 ноября, 2010 · Жалоба т.е. будет так в итоге 1101001000000000 | 0000000000011011 А выполнив эту операцию мы получим 1101001000011011 Т.е. в данном фрагменте программы,поскольку программа работает не в реальном МК и счётчик таймера ничего не считает,TH и TCNT0 имеют значение 0000000000000000 и в итоге функция = 0,поэтому компилятор выдаёт предупреждение и в принципе на это можно не обращать внимания? Видимо нужно сделать #include или же __enable_interrupt(); - это вообще не из Code Vision AVR... Но команда __enable_interrupt();это команда включения глобальных прерываний указаная в даташите к tiny2313 или она может меняться в зависимости от компилятора? И ещё вопрос - правильно ли я понял что,если не было установки портов, то они находяться в третьем состоянии(Z) т.е. в данном случае ClrBit(DDRB,AIN0); // Перевести в Z-состояние порты В DDRB = 0b00?Если это так ,то не вижу смысла в этой строке кода так как порт и так в нужном состоянии. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 12 ноября, 2010 Опубликовано 12 ноября, 2010 · Жалоба Т.е. в данном фрагменте программы,поскольку программа работает не в реальном МК и счётчик таймера ничего не считает,TH и TCNT0 имеют значение 0000000000000000 и в итоге функция = 0,поэтому компилятор выдаёт предупреждение и в принципе на это можно не обращать внимания?Что за предупреждение? Я думаю не должен он ни о чем предупреждать ибо TCNT0 и TH должны быть объявлены со словом volatile, что информирует компилятор(обратите внимание: Си компилятор!) о том, что значение переменной может меняться или считываться где-либо за пределами кода, который мы скормили компилятору. Заметьте, что это может быть аппаратное изменение значения(как в случае с таймером) так и программное изменение скажем из обработчика прерывания реализованного на асме ) Без volatile Си компилятор не может понять, что эта переменная нужна в конкретном месте программы и может "закешировать" её значение в одном из регистров и фактического чтения/записи в память не производить. В нашей функции конечно-же компилятор считает, что наши переменные равны нулю ибо видно их обнуление и не видно откуда у них может появиться что-то отличное от нуля и без volatile компилятор вообще выброст всё, что касается этих переменных, а в конце функции сделает return 0; Тем не менее Ваш компилятор может компилировать правильно, но всё равно предупреждать и это тоже сгодится за норму... я не могу точно сказать. Для верности надо бы посмотреть объявление этих самых TH и TCNT0. Но команда __enable_interrupt();это команда включения глобальных прерываний указаная в даташите к tiny2313 или она может меняться в зависимости от компилятора?Что Вы там в даташите вычитали - я не знаю но суть объясню: в языке Си(в стандарте) вообще не описано ничего относящегося к прерываниям. Равно как и много других особенностей имеющихся на конкретной архитектуре и реализуемой только на асме. Так вот для доступа к таким фишкам придуманы так называемые интринсики. Интринсики эти в каждом компиляторе для каждой платформы свои. Сам по себе интринсик выглядит как функция, но это не функция. На место интринсика во время компиляции вставляется заранее определенная ассемблерная вставка(это всё вшито в компилятор). Так вот я пологал, что __enable_interrupt(); - это и есть интринсик Вашего компилятора, взамен которого в код фактически вставляется то самое sei Что там можно было вычитать в даташите про Си код - я не представляю! Даташит относится к девайсу, а не к компилятору. Однако вы читаете русский даташит, а это означает, что наши умники приложили к нему руку и там может быть что-то типа "все примеры приведены с расчётом на использование компилятора такого-то..." а вы это проморгали и поэтому __enable_interrupt(); у Вас не фурычит )) ClrBit(DDRB,AIN0); // Перевести в Z-состояние порты В DDRB = 0b00?Если это так ,то не вижу смысла в этой строке кода так как порт и так в нужном состоянии. Вам не кажется, что мы по кругу ходим? Ведь разбирали же не так давно макрос ClrBit(); Вы уже должны понимать, что этот код чистит бит AIN0 регистра DDRB. Это не тоже самое, что всему регистру присвоить 0! 0 присваивается одному единственному биту! Кстати тут по сути вывод AIN0 конфигурируется как входной. Никакого Z-состояния нет. В случае если встроенный pull-up резистор отключен - порт не будет создавать особого тока, но всё-же это не высокоимпедансное состояние(вывод порта физически соединен со схемой внутри контроллера). Так что это опять похоже заморочки вашего АФФТАРА :)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
256 0 12 ноября, 2010 Опубликовано 12 ноября, 2010 · Жалоба В tiny2313 таймер0 8-битный, ТН скорее всего должна инкрементироваться где-то в обработчике прерывания по переполнению таймера0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexDX740 0 12 ноября, 2010 Опубликовано 12 ноября, 2010 · Жалоба sigmaN Что за предупреждение? Я думаю не должен он ни о чем предупреждать ибо TCNT0 и TH должны быть объявлены со словом volatile, Да, TH обьявлен как volatile byte.Компилятор по этой строке выдаёт два предупреждения: Warning: dira.c(173): shift result will be 0(перемещаемый результат = 0) Warning: dira.c(173): overflow is possible in 8 bit shift left, casting shifted operand to 'int' may be required(переполнение возможно в 8 битах перемещённых влево,для подсчёта преремещений может потребоваться операнд int. Тут у меня попутно созрел ещё вопрос Счётчик у таймера тоже 16ти битный. Т.е. состоит он из двух половинок. TH - хранит старший байт TCNT0 - младший. но таймер0 вроде 8-битный,откуда старший байт? "все примеры приведены с расчётом на использование компилятора такого-то..." а вы это проморгали и поэтому __enable_interrupt(); у Вас не фурычит )) В точку! Вам не кажется, что мы по кругу ходим? Ведь разбирали же не так давно макрос ClrBit(); Вы уже должны понимать, что этот код чистит бит AIN0 регистра DDRB. Это не тоже самое, что всему регистру присвоить 0! 0 присваивается одному единственному биту! Кстати тут по сути вывод AIN0 конфигурируется как входной. Никакого Z-состояния нет. Не совсем понимаю зачем чистить бит AIN0 если он установлен 0 #define AIN0 0 и биты этой ноги DDB0=0;PORTB0=0 а это третье состояние(так по крайней мере в даташите указано) 314 ТН скорее всего должна инкрементироваться где-то в обработчике прерывания по переполнению таймера0. Это как?Чуть подробнее можно,для чайника. Да,компилятор ругается ещё на одну строку __eeprom word dummy[8]= {0,0,0,0,0,0,0,0}; и предупреждает:Warning: dira.c(64): global variable 'dummy' was declared, but not referenced(глобальная переменная 'dummy' была обьявленна,но на неё нет ссылок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 12 ноября, 2010 Опубликовано 12 ноября, 2010 · Жалоба Warning: dira.c(173): shift result will be 0(перемещаемый результат = 0) Warning: dira.c(173): overflow is possible in 8 bit shift left, casting shifted operand to 'int' may be required Это весьма странно, т.к. есть такая штука как integer promotion. Ааа, вот нашел http://electronix.ru/forum/index.php?showtopic=46523 Это фишка вашего компилятора. но таймер0 вроде 8-битный, откуда старший байт?в обработчике прерывания таймера должен быть инкремент TH каждый раз, когда TCNT0 "перескакивает через 255" в 0. Таким образом получается программная 16ти битность ) Не совсем понимаю зачем чистить бит AIN0 если он установлен 0 Код #define AIN0 0 и биты этой ноги DDB0=0;PORTB0=0 а это третье состояние(так по крайней мере в даташите указано) Уважаемые знатоки, а разве применительно к пину, сконфигурированному как input с отключенной подтяжкой можно применить термин Tri-state (Hi-Z) ?? Википедия говорит: Высокоимпедансное состояние или Z-состояние — такое состояние контакта логической схемы, при котором сопротивление между этим контактом и остальной схемой очень велико А зачем там аффтар чистит этот бит? Но ведь перед выходом из функции он его ставит SetBit(DDRB,AIN0); // Разрядить конденсатор значит до следующего вызова функции этот бит таки стоит и аффтар чистит его перед измерением.. Warning: dira.c(64): global variable 'dummy' was declared, but not referencedНу у вас пока нет кода, который бы обращался к dummy. Объявление есть, но переменная не используется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexDX740 0 12 ноября, 2010 Опубликовано 12 ноября, 2010 · Жалоба За ссылку спасибо,разобрался всё работает. в обработчике прерывания таймера должен быть инкремент TH каждый раз, когда TCNT0 "перескакивает через 255" в 0. Таким образом получается программная 16ти битность ) Блин,а в даташите практически об этом ни слова. Уважаемые знатоки, а разве применительно к пину, сконфигурированному как input с отключенной подтяжкой можно применить термин Tri-state (Hi-Z) ?? ???Но ведь именно так написано в даташите:-"Третье или состояние Z,когда ({DDB0,PORTB0}=0b00),выводы являются входами и имеют высокое входное сопротивление". Я чёт совсем запутался.Как правильно то будет? значит до следующего вызова функции этот бит таки стоит и аффтар чистит его перед измерением.. Да,тут я проморгал. Дествительно автор устанавливал этот бит. Ну у вас пока нет кода, который бы обращался к dummy. Объявление есть, но переменная не используется. Т.е.можно не обращать внимания на это предупреждение? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 12 ноября, 2010 Опубликовано 12 ноября, 2010 · Жалоба Блин,а в даташите практически об этом ни слова.Да там и об использовании компаратора для измерения напряжения - тоже ни слова :cranky: Это Ваша программа. Вы там можете хоть 128ми битный счётчик сделать.... об этом не должны писать в даташите. Даташит - это описание чипа. Там вообще подобную информацию искать бессмысленно. Даже удивительно, что вы такое написали.... Но ведь именно так написано в даташите:-"Третье или состояние Z,когда ({DDB0,PORTB0}=0b00),выводы являются входами и имеют высокое входное сопротивление". Я чёт совсем запутался.Как правильно то будет? Ну видел я там это, да. И понятно, что входное сопротивление такого пина получается весьма большим, но всё-же я высказал сомнение насчёт корректности термина в этом случае. Ведь Высокоимпедансное состояние или Z-состояние — такое состояние контакта логической схемы, при котором сопротивление между этим контактом и остальной схемой очень великоно между самой ногой контроллера и его схемой сопротивление то не большое! Большое сопротивление получается в таком случае относительно общего провода(GND) контроллера. Вот о чем я. Т.е.можно не обращать внимания на это предупреждение?конечно, забейте на это и всё. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 13 ноября, 2010 Опубликовано 13 ноября, 2010 · Жалоба Что-то чем дальше, тем меньше мне нравится Ваш этот CVAVR...слезайте с него, это не Си.Выбрось каку!!! И интегер промоушнз там не единственный прикол :( Заучите все эти примочки, а потом будете локти кусать... Переползайте ка вы на GNU. С сайта Atmel стяните студию и toolchain и начинайте с нормальным компилятором работать...мой Вам добрый совет ) http://www.atmel.com/dyn/products/tools_ca...sp?tool_id=2725 - страничка студии качать(ставить в порядке перечисления): AVR Studio 4.18 (build 684) (116 MB, updated 11/09) AVR Studio 4.18 SP3 (b716) (31 MB, updated 9/10) AVR Toolchain Installer (87 MB, updated 9/10) For use with AVR Studio 4.18 SP3 Вот. И давайте на теорию налягайте. Чувствуется, что даже в битовых операциях плаваете.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexDX740 0 13 ноября, 2010 Опубликовано 13 ноября, 2010 · Жалоба Что-то чем дальше, тем меньше мне нравится Ваш этот CVAVR... Да,мне то же.Но зато по нему есть хорошая книга на русском,а остальные компиляторы этим похвастаться не могут. Студия4 у меня есть,но без SP3 и toolchain,а вот как и что там делать почитать негде. А с прогой от аффтара явно что то не то.Я прошил МК прошивкой которую он прислал вместе с исходником(соответственно выставив фьюзы чтобы tiny2313 иммитировала 90S2313),результат плачевный - вообще ничего не работает.Я грешил на неполную совместимость МК.В CVAVR преределал исходник под тиньку(осталось только предупреждение по __eeprom word dummy[8]= {0,0,0,0,0,0,0,0};) компилится без проблем, прошил этой прошивкой результат такой же.Аффтар пишет что устройство с этой прошивкой работало нормально,но прокомментировать фрагменты кода отказался,сылаясь на занятость.Вообщем что бы убедится в работоспособности данного кода нуна гдето родной МК раздобыть. Жаль что завтра на работу ехать,но литературку беру с собой,буду налегать на теорию Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 13 ноября, 2010 Опубликовано 13 ноября, 2010 · Жалоба Да отвяжитесь вы от этой прошивки и её автора! НЕчему там учиться и компилить тупо тоже там нЕчего. Своё надо делать и по правильному! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexDX740 0 13 ноября, 2010 Опубликовано 13 ноября, 2010 · Жалоба Обидно,да.Я так понимаю,если человек выкладывает в инет на всеобщее обозрение свою конструкцию,то должен быть готов в любой момент дать исчерпывающие обьяснения по работе устройства и его програмному обеспечению.А он не смог даже сказать как включаются кнопки.Из схемы можно предположить что происходит замыкание контактов S0,S1,S2 с RET,но это ж предположение. Студию скачал,установил,но ещё не юзал.Приеду буду осваивать,а пока не порекомендуете литературку по ней на русском? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 13 ноября, 2010 Опубликовано 13 ноября, 2010 · Жалоба Не порекомендую. не о чем там читать. Создаёте проект. в свойствах ставите нужный камень - далее как обычно в проект добавляете файлы и жмете кнопочку Build. Если немного включить интуицию и чутьё - вы получите информацию прямо из первоисточника(от интерфейса среды). Не стесняйтесь включать моск и разбираться, что называется, на ходу. Без этого вы так и останетесь на уровне поиска готовых решений и русских мануалов. Автор уже в годах, на сколько я понимаю... кто знает, может и забыл уже что там и как у него было.... :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexDX740 0 13 ноября, 2010 Опубликовано 13 ноября, 2010 · Жалоба Вот рекомендуют перед установкой студии ставить WinAVR для программирования в студии на С,это так или это действительно для старых версий? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться