реклама на сайте
подробности

 
 
21 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> Изменение текста программы при смене компилятора и чипа
RW6MKA
сообщение Nov 11 2010, 10:28
Сообщение #31


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401



Не могли бы вы проверить этот кусок исходного кода
Код
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")?
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 11 2010, 18:40
Сообщение #32


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Всё проверять лень(чем-то же и вы должны заниматься ведь так? )
Но могу подсказать, что функция 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 у меня нет и я им не пользовался ни разу sad.gif


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Nov 11 2010, 21:19
Сообщение #33


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401



Цитата
т.е. будет так в итоге 1101001000000000 | 0000000000011011
А выполнив эту операцию мы получим 1101001000011011

Т.е. в данном фрагменте программы,поскольку программа работает не в реальном МК и счётчик таймера ничего не считает,TH и TCNT0 имеют значение 0000000000000000 и в итоге функция = 0,поэтому компилятор выдаёт предупреждение и в принципе на это можно не обращать внимания?

Цитата
Видимо нужно сделать #include или же __enable_interrupt(); - это вообще не из Code Vision AVR...

Но команда __enable_interrupt();это команда включения глобальных прерываний указаная в даташите к tiny2313 или она может меняться в зависимости от компилятора?

И ещё вопрос - правильно ли я понял что,если не было установки портов, то они находяться в третьем состоянии(Z) т.е. в данном случае
Код
ClrBit(DDRB,AIN0);  // Перевести в Z-состояние порты В
DDRB = 0b00?Если это так ,то не вижу смысла в этой строке кода так как порт и так в нужном состоянии.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 12 2010, 01:05
Сообщение #34


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
Т.е. в данном фрагменте программы,поскольку программа работает не в реальном МК и счётчик таймера ничего не считает,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 резистор отключен - порт не будет создавать особого тока, но всё-же это не высокоимпедансное состояние(вывод порта физически соединен со схемой внутри контроллера). Так что это опять похоже заморочки вашего АФФТАРА smile.gif)


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
314
сообщение Nov 12 2010, 06:13
Сообщение #35


Частый гость
**

Группа: Участник
Сообщений: 139
Регистрация: 17-08-07
Пользователь №: 29 855



В tiny2313 таймер0 8-битный, ТН скорее всего должна инкрементироваться где-то в обработчике прерывания по переполнению таймера0.
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Nov 12 2010, 09:07
Сообщение #36


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401



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' была обьявленна,но на неё нет ссылок.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 12 2010, 09:45
Сообщение #37


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
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. Объявление есть, но переменная не используется.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Nov 12 2010, 16:00
Сообщение #38


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401



За ссылку спасибо,разобрался всё работает.
Цитата
в обработчике прерывания таймера должен быть инкремент TH каждый раз, когда TCNT0 "перескакивает через 255" в 0.
Таким образом получается программная 16ти битность )

Блин,а в даташите практически об этом ни слова.

Цитата
Уважаемые знатоки, а разве применительно к пину, сконфигурированному как input с отключенной подтяжкой можно применить термин Tri-state (Hi-Z) ??

???Но ведь именно так написано в даташите:-"Третье или состояние Z,когда ({DDB0,PORTB0}=0b00),выводы являются входами и имеют высокое входное сопротивление". Я чёт совсем запутался.Как правильно то будет?

Цитата
значит до следующего вызова функции этот бит таки стоит и аффтар чистит его перед измерением..

Да,тут я проморгал. blush.gif Дествительно автор устанавливал этот бит.

Цитата
Ну у вас пока нет кода, который бы обращался к dummy. Объявление есть, но переменная не используется.

Т.е.можно не обращать внимания на это предупреждение?
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 12 2010, 18:25
Сообщение #39


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
Блин,а в даташите практически об этом ни слова.
Да там и об использовании компаратора для измерения напряжения - тоже ни слова cranky.gif Это Ваша программа. Вы там можете хоть 128ми битный счётчик сделать.... об этом не должны писать в даташите. Даташит - это описание чипа. Там вообще подобную информацию искать бессмысленно. Даже удивительно, что вы такое написали....

Цитата
Но ведь именно так написано в даташите:-"Третье или состояние Z,когда ({DDB0,PORTB0}=0b00),выводы являются входами и имеют высокое входное сопротивление". Я чёт совсем запутался.Как правильно то будет?
Ну видел я там это, да. И понятно, что входное сопротивление такого пина получается весьма большим, но всё-же я высказал сомнение насчёт корректности термина в этом случае. Ведь
Цитата
Высокоимпедансное состояние или Z-состояние — такое состояние контакта логической схемы, при котором сопротивление между этим контактом и остальной схемой очень велико
но между самой ногой контроллера и его схемой сопротивление то не большое! Большое сопротивление получается в таком случае относительно общего провода(GND) контроллера. Вот о чем я.

Цитата
Т.е.можно не обращать внимания на это предупреждение?
конечно, забейте на это и всё.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 13 2010, 01:33
Сообщение #40


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Что-то чем дальше, тем меньше мне нравится Ваш этот CVAVR...слезайте с него, это не Си.Выбрось каку!!!

И интегер промоушнз там не единственный прикол sad.gif
Заучите все эти примочки, а потом будете локти кусать...
Переползайте ка вы на 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

Вот. И давайте на теорию налягайте. Чувствуется, что даже в битовых операциях плаваете....


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Nov 13 2010, 10:59
Сообщение #41


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401



Цитата
Что-то чем дальше, тем меньше мне нравится Ваш этот CVAVR...

Да,мне то же.Но зато по нему есть хорошая книга на русском,а остальные компиляторы этим похвастаться не могут.
Студия4 у меня есть,но без SP3 и toolchain,а вот как и что там делать почитать негде.
А с прогой от аффтара явно что то не то.Я прошил МК прошивкой которую он прислал вместе с исходником(соответственно выставив фьюзы чтобы tiny2313 иммитировала 90S2313),результат плачевный - вообще ничего не работает.Я грешил на неполную совместимость МК.В CVAVR преределал исходник под тиньку(осталось только предупреждение по __eeprom word dummy[8]= {0,0,0,0,0,0,0,0}wink.gif компилится без проблем, прошил этой прошивкой результат такой же.Аффтар пишет что устройство с этой прошивкой работало нормально,но прокомментировать фрагменты кода отказался,сылаясь на занятость.Вообщем что бы убедится в работоспособности данного кода нуна гдето родной МК раздобыть.
Жаль что завтра на работу ехать,но литературку беру с собой,буду налегать на теорию biggrin.gif
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 13 2010, 13:00
Сообщение #42


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Да отвяжитесь вы от этой прошивки и её автора!
НЕчему там учиться и компилить тупо тоже там нЕчего. Своё надо делать и по правильному!


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Nov 13 2010, 20:06
Сообщение #43


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401



Обидно,да.Я так понимаю,если человек выкладывает в инет на всеобщее обозрение свою конструкцию,то должен быть готов в любой момент дать исчерпывающие обьяснения по работе устройства и его програмному обеспечению.А он не смог даже сказать как включаются кнопки.Из схемы можно предположить что происходит замыкание контактов S0,S1,S2 с RET,но это ж предположение.
Студию скачал,установил,но ещё не юзал.Приеду буду осваивать,а пока не порекомендуете литературку по ней на русском?
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 13 2010, 20:29
Сообщение #44


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Не порекомендую. не о чем там читать. Создаёте проект. в свойствах ставите нужный камень - далее как обычно в проект добавляете файлы и жмете кнопочку Build. Если немного включить интуицию и чутьё - вы получите информацию прямо из первоисточника(от интерфейса среды). Не стесняйтесь включать моск и разбираться, что называется, на ходу. Без этого вы так и останетесь на уровне поиска готовых решений и русских мануалов.

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


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Nov 13 2010, 21:13
Сообщение #45


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401



Вот рекомендуют перед установкой студии ставить WinAVR для программирования в студии на С,это так или это действительно для старых версий?
Go to the top of the page
 
+Quote Post

21 страниц V  < 1 2 3 4 5 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th August 2025 - 21:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01628 секунд с 7
ELECTRONIX ©2004-2016