Мелкие вопросы по МК и ПЛИС.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Значит их там просто нет, в самом контроллере. Что вобщем-то неудивительно.
Тогда надо сотреть на что влияет конфигурация на первом и устанавливать соответствующие по смыслу во втором.
Контактная информация:
Реклама
Chettuser

Сообщение Chettuser »

Дело в том что в p18f1320.h есть такое
Спойлер

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

/*-------------------------------------------------------------------------
 *   CONFIG3H (0x300005)
 *-------------------------------------------------------------------------*/
#define _CONFIG3H_DEFAULT    0x80
#define _MCLRE_OFF_3H        0x7F
#define _MCLRE_ON_3H         0xFF

/*-------------------------------------------------------------------------
 *   CONFIG4L (0x300006)
 *-------------------------------------------------------------------------*/
#define _CONFIG4L_DEFAULT    0x85
#define _STVR_OFF_4L         0xFE
#define _STVR_ON_4L          0xFF

#define _LVP_OFF_4L          0xFB
#define _LVP_ON_4L           0xFF

#define _DEBUG_ON_4L         0x7F
#define _DEBUG_OFF_4L        0xFF
А вот в p18f14k50.h увы... нету. :dont_know: Где это смотреть? Ведь, например, WDT то по-любому есть в таком МК!

PS: Более того! 14К50 нет даже в PIC18-Config-Settings-Addendum_51537f.pdf
Реклама
Встал на лапы
Сообщения: 129
Зарегистрирован: Вт мар 22, 2011 18:41:48

Сообщение Serj324 »

Помогите мне запустить программу Khazama AVR Programmer ну ни как не получается.
А дело вот в чем собрал я вот такой программатор с этого http://fischl.de/usbasp/ сайта.
USBasp - USB programmer for Atmel AVR controllers.
Прошил, компьютер определил его устанавил драйвера, и хочу пользоватся вот этой программой Khazama AVR Programmer но уже 5-ть штук скачал с разных мест и вылитает одна и таже ошибка, фаил с расширением ddl не найден.
Фото ошибки прикрепляю, подскажите в чем может быть делло, антивирусник отключен система XP.
Вложения
1.jpg
(14.45 КБ) 332 скачивания
Опытный кот
Аватара пользователя
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону

Сообщение Goldsmith »

Serj324 писал(а):вылитает одна и таже ошибка, фаил с расширением ddl не найден.
Не DDL, а DLL (dynamic-link library). msvbvm60.dll - это виртуальная машина, необходимая для выполнения программ, написанных на языке Visual Basic 6. Найдете ее в Сети без проблем.

Этой версии языка уже 15 лет (вышла в 1998 году), поэтому к таким программам лучше относиться осторожнее: либо сама программа написана очень давно и лучше поискать более свежую версию, либо ее автор остановился на уровне прошлого века и лучше поискать аналогичный софт от другого автора. Да и тот факт, что автор не включил в дистрибутив необходимые библиотеки, тоже говорит о многом.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Эти инклудники - ни больше ни меньше как простые объявления констант, смотри значения констант в даташите и занеси их в свой инклудник. По всей видимости, константы эти объединяются лог.функцией И в одну константу, таким образом константа с "0" битом включит соответствующий Fuse-bit в конфигурации.
Контактная информация:
Реклама
Встал на лапы
Сообщения: 129
Зарегистрирован: Вт мар 22, 2011 18:41:48

Сообщение Serj324 »

Подскажите.
Нечаянно выставил опасный фьюз SPIEN и теперь не могу запрограммировать Atmega 8.
Подскажите как можно реанимировать ?
Есть два программатора
1-й Программатор Громова на Com порт (простая схема 5-ть деталей).
2-й USBasp программатор
Можно ли с помощью них как-то востановить МК ?
Подскажите простую схему.
Реклама
aam
Собутыльник Кота
Аватара пользователя
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Сообщение aam »

Здравствуйте!
Допустим у меня проц Тини13 принимает на ногу сигнал по прерыванию PCINT (асинхронно).
И допустим во время выполнения подпрограммы прерывания проскочила короткая помеха какраз в тот момент, когда я читаю состояние вывода.
Поскольку прерывания генерируются по ИЗМЕНЕНИЮ сигнала, эта помеха должна вызвать 2 прерывания. Выполнятся ли они сразу после завершения обработки первоначального "правльного" прерывания или будут "проглочены"?
Иначе говоря, надо ли мне каждый раз проверять, какой сигнал был принят предыдущий раз или я могу быть уверен в том, что если в процедуре прерывания в данный момент читаю, скажем, лог. 1, то при предыдущем прерывании был лог. 0 ?

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

Сообщение vitalik_1984 »

Serj324 писал(а):Подскажите.
Нечаянно выставил опасный фьюз SPIEN и теперь не могу запрограммировать Atmega 8.
Подскажите как можно реанимировать ?
Есть два программатора
1-й Программатор Громова на Com порт (простая схема 5-ть деталей).
2-й USBasp программатор
Ни тот ни другой вам не поможет. Вот тут про это же говорилось.
Контактная информация:
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Выполнятся ли они сразу после завершения обработки первоначального "правльного" прерывания или будут "проглочены"?
Контроллер прост как валенок. Пока прерывание не обработано - реакции на последующие прерывания не будет, они будут проглочены. Согласно даташиту у контроллера есть два вида прерываний - которые автоматически сбрасывают признак прерывания, и такие признак которых надо сбрасывать вручную.
Надо только уточнить в даташите к какому типу прерываний относится прерывание по изменению уровня. Судя по тому что для прерывания есть только маска, оно относится к первому типу. И тогда проблема может возникнуть в случае когда возникает два прерывания по изменению уровня в момент обработки любого прерывания.
И потом, в таком случае когда ты в обработчике прерывания считываешь значение порта - спектр возможных проблем увеличивается. Ведь за время начиная от возникновения условия прерывания и до момента считывания значение на порту вполне может изменится и даже не один раз. А это минимум 4 такта, +4 такта на сохранение регистра статуса и несколько тактов на считывание значения с порта. Считай сам... какое это время, вероятность возникновения "проблемы" и т.д.

Например произошло прерывание по условию перехода 1->0 ожидаешь что на порту будет 0, а оно взяло и изменилось так что считывается "1". В первом случае установится признак прерывания, и после обработки будет выполнена та же самая процедура, и считает так же "1" если считать что переход был из-за помехи. Если будешь считать прерывания - помеху увидишь и обработаешь правильно(если задействовано только одно прерывание во всей прошивке иначе возможен пропуск и помеха сгенерирует только одно прерывание), а если хранить предыдущее значение и сравнивать - возможно очень много вариантов.
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 65
Зарегистрирован: Пн авг 18, 2008 22:29:59
Откуда: Архангельск

Сообщение Димаn »

Добрый вечер! Подскажите, плиз по старой доброй Меге8. Если порт D задействовал как USART, остальные ноги не работают? Во всяком случае пытаюсь счас "поморгать" светодиодом на ноге PD2 - при включенном USART'е не получается.... :?
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Не работают только ноги RX и TX когда приемник и/или передатчик USART соответственно включен. Если включен только приемник - соответственно лапкой TX можно дергать как обычным портом.
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 65
Зарегистрирован: Пн авг 18, 2008 22:29:59
Откуда: Архангельск

Сообщение Димаn »

Тогда кусочек кода. В Меге8 выходы: RXD- это D0; TXD - это D1. Пытаюсь поморгать D2
#include <avr/io.h>
#include <avr/interrupt.h>
#include "usart.h"
#include <util/delay.h>


int main( void )
{
DDRD|=(1<<PD2);
USART_Init();

while(1){
PORTD^=(1<<PD2);
_delay_ms(1000);
}
}
void USART_Init(void)
{
UBRRH=0;
UBRRL=51; //ñêîðîñòü îáìåíà 9600 áîä
UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //ðàçð. ïðåðûâ ïðè ïðèåìå, ðàçð ïðèåìà, ðàçð ïåðåäà÷è.
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //ðàçìåð ñëîâà 8 ðàçðÿäîâ
}
aam
Собутыльник Кота
Аватара пользователя
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Сообщение aam »

Alexeyslav писал(а):Пока прерывание не обработано - реакции на последующие прерывания не будет, они будут проглочены.
Я читал, что там очередь вроде есть. Надо будет еще почитать...

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

А вот если прерывание по переполнению таймера может "проглотить" "настоящее" прерывание от ИК-проемника, то тут уже стопудово ошибка приема будет, причем с большой вероятностью (в отличие от просто разовых помех).

Прерывание в проге не одно. Есть еще прерывание по переполнению таймера, который одновременно работает ШИМ-генератором Fast PWM. Этим таймером я считаю дительность импульсов от ПДУ протокола RC-5 (т. е. там в прерывании тупо счетчик). Прерывание по уровню на ноге - только одно.
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

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

Для пульта ДУ это не страшно, вероятность возникновения довольно мала а прерывание от таймера зависимо от прерывания по уровню. Я так понял в прерывании по уровню сбрасываешь таймер и он начинает считать с нуля, по следующему прерыванию считываешь и обнуляешь... а срабатывание прерывания от таймера будет означать таймаут и окончание команды. т.е. оно технически во время нормальной посылки срабатывать не должно и мешать не будет.
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 65
Зарегистрирован: Пн авг 18, 2008 22:29:59
Откуда: Архангельск

Сообщение Димаn »

возможно в моей ситуации нельзя использовать конструкцию вида (1 <<PD2) ? Нету сейчас возиожности проверить...
aam
Собутыльник Кота
Аватара пользователя
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Сообщение aam »

Не совсем так. Таймер у меня генерирует ШИМ с частотой 37,5 кГц (внутренний RC Тини13 9,6 МГц) и сбрасывать его нельзя. Одновременно таймер генерирует прерывания по ПЕРЕПОЛНЕНИЮ, т. е. каждые 26,67 мкс. Эти прерывания успользуются у меня как-то вроде клока - в процедуре обработки просто инкрементируется регистр-счетчик и если доходит до FF, то перестает инкрементироваться.
Сигнал от фотоприемника заведен на ногу PCINT3 и включены асинхронные прерывания PCINT и по маске выбрана эта нога, чтоб только с нее происходило прерывание. В этом прерывании регистр-счетчик проверяется и обнуляется - таким образом я измеряю длительность импульса от фотоприемника.

Поэтому прерывания от ноги и от таймера никак не связаны и запросто могут инициироваться одновременно. Другой вопрос, что значение регистра-счетчика +/- 1 не существенно - я проверяю отклонение импульса +/- 25% от номинальной длительности протокола RC5.
Alexeyslav писал(а):Но если два раза или более одно и то же прерывание возникнет во время обработки прерывания - оно будет обработано по окончанию только один раз
Во время обработки этого же прерывания? Т. е. при помехе во время штатного выполнения процедуры обработки прерывания по изменению уровня эта процедура повторится гарантированно 1 раз?
Если так, то при этом повторе прога вылетит на ошибку при анализе регистра-счетчика (он останется нулевым) и все будет нормально.
Если не так, то я должен хранить значение уровня при предыдущем прерывании и проверять - если читается то же, то что-то не так, а если противоположное - то все норм.
Собственно в этом вопрос - нужно ли добавлять эту проверку (т. е. усложнять код) или она излишняя?

ЗЫ: по идее, надо делать как вы описали, т. е. использовать захват, но таймер 1, а мне нужен ШИМ для ЦАПа. И к тому же, если не ошибаюсь, у Тини 13 нет захвата таймера. Можно взять Тини25, но я люблю максимальную простоту и дешевизну при максимальной функциональности. Не хватит памяти Тини13 - придется брать 25.


Димаn, конструкция вида "1 <<PD2" - тупо для препроцессора. Я обычно пишу что-то типа: 0b00000010 - нагляднее как-то. В вашем случае это единица, сдвинутая на константу PD2 (забыл, какое значение несет эта аббревиатура...). Причем это выражение вычисляется препроцессором при компиляции и в конечной проге бедет стоять как я написал двоичное число, а не набор команд.


***

Вот что вычитал в ДШ:
1) При возникновении прерываний флаг I регистра SREG аппаратно сбрасывается, запрещая тем самым обработку следующих прерываний. При возврате из подпрограммы обработки прерываний (команда RETI) флаг I устанавливается аппаратно.
2) Все имеющиеся прерывания можно разделить на два типа. Прерывания первого типа генерируются при наступлении некоторого события, в результате которого устанавливается флаг прерывания. При этом флаг прерывания аппаратно (или программно) сбрасывается.
Прерывания второго типа не имеют флагов прерываний и генерируются в течение всего времени, пока присутствуют условия, необходимые для этого. Соответственно, если условия, вызывающие прерывание, исчезнут до разрешения прерывания, генерации прерывания не произойдет.
3) Микроконтроллеры семейства Mega поддерживают очередь прерываний, которая работает следующим образом: если условия генерации одного или более прерываний возникают в то время, когда флаг общего разрешения прерываний сброшен, соответствующие флаги устанавливаются в «1» и остаются в этом состоянии до установки флага общего разрешения прерываний. После разрешения прерываний, выполняется их обработка в порядке приоритета.
4) После выхода из прерывания процессор всегда выполняет одну команду основной программы, прежде чем обслужить любое отложенное прерывание.
5) для индикации внешних прерываний используется регистр флагов прерываний GIFR (тини13/25).
Если в результате события на любом из выводов PCINT... формируется запрос на прерывание, этот бит устанавливается в 1. Флаг сбрасывается аппаратно при запуске подпрограммы обработки прерывания или программно, записью в него 1.

Получается, если у меня произошло прерывание PCINT по изменению на ноге, то у меня запускается процедура его обработки, сбрасывается флаг PCINT в GIFR и I в SREG. Если в процессе выполнения этой процедуры уровень на ноге опять меняется, то у меня устанавливается флаг PCINT, но поскольку флаг I сброшен, повторно обработчик не может быть вызван (п. 3). Когда процедура завершается, команда reti устанавливает флаг I. Проц выполняет одну команду из кода (п. 4) и повторно вызывает этот мой обработчик, т. к. флаг PCINT установлен и прерывание в очереди. Запустившись повторно, обработчик "думает", что это следующий фронт импульса, но проанализировав значение регистра-счетчика, которое к этому моменту будет равно 0, максимум 1, "понимает", что "импульс" слишком короткий и по этому условию вылетает на обработку ошибки (что мне и нужно).

Вроде ничего не напутал?

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

Если рассмотреть взаимодействие внешнего прерывания и прерывания от таймера, то одно из них попадет в очередь и выполнится после завершения 1-го. Если во время обработки внешнего прерывания в очередной раз переполнится таймер, его прерывание произойдет только после завершения подпрограммы обработки внешнего прерывания и на ее работу не повлияет.
Если фотоприемник "дернет" ногу во время прерывания от таймера, то обработка этого события начнется после выхода из обработчика таймера, который всего-навсего получит значение регистра-счетчика на 1 больше, что не смертельно в данном случае (разброс на длительность импульса +/-25%, типовая ожидаемая ширина импульса - 33 единицы регистра-счетчика - 880 мкс) .

А вот что я не учитывал до настоящего времени - это то, что в прерывании надо сохранять в стек SREG :) Возможно, в этом причина некоторых "странных и непонятных" глюков предыдущих моих устройств. Например, прерывание возникает в момент выполнения операции сравнения и не запомнив SREG, после выхода из прерывания я прос*у результат сравнения и уйду не на ту метку не по тому условию.
Встал на лапы
Сообщения: 129
Зарегистрирован: Вт мар 22, 2011 18:41:48

Сообщение Serj324 »

Подскажите имеется выпаянная но рабочая я проверял Atmega 8535-16pi
Какие существуют интересные схемы для сборки на данном МК. Подскажите.
Второй день ищу и нечго не могу найти.
Друг Кота
Аватара пользователя
Сообщения: 20132
Зарегистрирован: Чт сен 01, 2011 12:53:27
Откуда: ТьмуТаракания. Почетный житель подмостовья

Сообщение oleg63m »

параллельный программатор http://radiokot.ru/forum/viewtopic.php?f=20&t=864
Шекспир сказал: Судить меня -дано лишь Богу, другим я укажу дорогу... https://natribu.org/
Я его полностью поддерживаю.
Программирую на Fuse AtmelAVR.
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

Сообщение slavokhire5 »

привет всем котам. возник вопрос по спящим режимам Tiny13a. в каких из них возможно удерживать выходы? (0 и/или 1, в зависимости от хода выполнения программы)
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Chettuser

Сообщение Chettuser »

Может быть вопрос покажется глупым, но...
Реализация какиз из функций, преобразующих int в string, а именно itoa или sprintf меньше занимает места в памяти?
Спасибо.
Ответить

Вернуться в «Разные вопросы по МК»