Перейти к содержанию
    

Изменение текста программы при смене компилятора и чипа

Не могли бы вы проверить этот кусок исходного кода

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")?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё проверять лень(чем-то же и вы должны заниматься ведь так? )

Но могу подсказать, что функция 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 у меня нет и я им не пользовался ни разу :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

т.е. будет так в итоге 1101001000000000 | 0000000000011011

А выполнив эту операцию мы получим 1101001000011011

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

 

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

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

 

И ещё вопрос - правильно ли я понял что,если не было установки портов, то они находяться в третьем состоянии(Z) т.е. в данном случае

 ClrBit(DDRB,AIN0);  // Перевести в Z-состояние порты В

DDRB = 0b00?Если это так ,то не вижу смысла в этой строке кода так как порт и так в нужном состоянии.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В tiny2313 таймер0 8-битный, ТН скорее всего должна инкрементироваться где-то в обработчике прерывания по переполнению таймера0.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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' была обьявленна,но на неё нет ссылок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

За ссылку спасибо,разобрался всё работает.

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

Таким образом получается программная 16ти битность )

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

 

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

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

 

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

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

 

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

Т.е.можно не обращать внимания на это предупреждение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то чем дальше, тем меньше мне нравится Ваш этот 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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Да,мне то же.Но зато по нему есть хорошая книга на русском,а остальные компиляторы этим похвастаться не могут.

Студия4 у меня есть,но без SP3 и toolchain,а вот как и что там делать почитать негде.

А с прогой от аффтара явно что то не то.Я прошил МК прошивкой которую он прислал вместе с исходником(соответственно выставив фьюзы чтобы tiny2313 иммитировала 90S2313),результат плачевный - вообще ничего не работает.Я грешил на неполную совместимость МК.В CVAVR преределал исходник под тиньку(осталось только предупреждение по __eeprom word dummy[8]= {0,0,0,0,0,0,0,0};) компилится без проблем, прошил этой прошивкой результат такой же.Аффтар пишет что устройство с этой прошивкой работало нормально,но прокомментировать фрагменты кода отказался,сылаясь на занятость.Вообщем что бы убедится в работоспособности данного кода нуна гдето родной МК раздобыть.

Жаль что завтра на работу ехать,но литературку беру с собой,буду налегать на теорию :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да отвяжитесь вы от этой прошивки и её автора!

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обидно,да.Я так понимаю,если человек выкладывает в инет на всеобщее обозрение свою конструкцию,то должен быть готов в любой момент дать исчерпывающие обьяснения по работе устройства и его програмному обеспечению.А он не смог даже сказать как включаются кнопки.Из схемы можно предположить что происходит замыкание контактов S0,S1,S2 с RET,но это ж предположение.

Студию скачал,установил,но ещё не юзал.Приеду буду осваивать,а пока не порекомендуете литературку по ней на русском?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот рекомендуют перед установкой студии ставить WinAVR для программирования в студии на С,это так или это действительно для старых версий?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...