Мелкие вопросы по МК и ПЛИС.
- Сообщения: 1800
- Зарегистрирован: Вт окт 05, 2010 01:08:57
Chip115Опыта у меня у самого мизер, но ваш вопрос тянет на пару курсов института.
KIT
- Реклама
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
Chip115, где зависает то?
Обычно заводят сторожевую собаку и натравливают перед опасным участком.
Еще не делают вызовы функций в обработках прерываний, а ставят флаги, по которым переходят на участки кода в основном цикле.
Обычно заводят сторожевую собаку и натравливают перед опасным участком.
Еще не делают вызовы функций в обработках прерываний, а ставят флаги, по которым переходят на участки кода в основном цикле.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
вопрос по кварцу к атмеге16. Я так понял что надо как-то прописывать источник синхронизации... Ибо прикол в том что контроллеру пофигу какой я ставлю кварц(или вообще не ставлю). Частота мигания светодиодов(прицепил для проверки проги) остаётся одинаковой... Юарт работает через раз... Подключал нормально. Кварц 7.3728 через 10пФ. Где прописать чтобы МК синхронизировался от кварца? Может там по умолчанию от Р-С генератора...
Успех - императив!
А в даташите что написано? Слышали что-нибудь про "фьюзы"?Roman Venom писал(а):Может там по умолчанию от Р-С генератора...
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Сообщения: 326
- Зарегистрирован: Сб сен 06, 2008 12:56:13
Совершенно верно. Обычно МК с завода идет настроенный на внутренний генератор. Выставьте (см. датшит) фьюзы CKSEL3...1, согласно частоте кварца.Roman Venom писал(а):Я так понял что надо как-то прописывать источник синхронизации...
- Реклама
ValBag&Gudd-Head
Выставил для кварца 7.3728...прошил. Теперь программатор контроллер вообще не определяет
Выставил для кварца 7.3728...прошил. Теперь программатор контроллер вообще не определяет
- Вложения
-
- 1.JPG
- (27.81 КБ) 337 скачиваний
Успех - императив!
Дык, а куда SPIEN делся? И нафига галок на CKSEL понаставили?Roman Venom писал(а):Выставил для кварца 7.3728...прошил. Теперь программатор контроллер вообще не определяет
Вот, тренируйтесь как надо: http://www.engbedded.com/fusecalc/
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Gudd-Head
П.С. так что случилось(почему такая бяка)? Контроллер можно выкидывать или что-то можно сделать?
В понипроге он всегда залочен.Дык, а куда SPIEN делся?
То есть? Для кварца 3-8МГц написано установить CKSEL 3:1. CKSEL0 тоже установил. для задержки при включении 4.1мс... Всё по даташиту.И нафига галок на CKSEL понаставили?
Спасибо. Обязательно.Вот, тренируйтесь как надо: http://www.engbedded.com/fusecalc/
П.С. так что случилось(почему такая бяка)? Контроллер можно выкидывать или что-то можно сделать?
Успех - императив!
- Сообщения: 326
- Зарегистрирован: Сб сен 06, 2008 12:56:13
Так вы наоброт все поставили. На рисунке внизу пояснение: галочка - ноль, без - 1. У вас получился сигнал внешней синхронизации. Подавайте внешний сигнал и перепрошивайте.Roman Venom писал(а):ValBag&Gudd-Head
Выставил для кварца 7.3728...прошил. Теперь программатор контроллер вообще не определяет
Вы не установили, а сбросили в "0". Читайте внимательней (а также смотрите сцылку что я дал).Roman Venom писал(а): То есть? Для кварца 3-8МГц написано установить CKSEL 3:1. CKSEL0 тоже установил.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Gudd-Head
Ссылку использовал по назначению
. Оценил. Ещё раз благодарю.
ValBag
Да блин. Вот это засада... Всё как в поговорке: "поспешишь..."Вы не установили, а сбросили в "0". Читайте внимательней (а также смотрите сцылку что я дал).
Ссылку использовал по назначению
ValBag
Так и сделал(хорошо что генератор есть). Методом втыка накрутил частоту и оно стёрлось. Спасибо, ваш совет спас жизнь меге16. А то я уже хотел доставать другуюПодавайте внешний сигнал и перепрошивайте.
Успех - императив!
уже второй день бьюсь в поисках адекватной литературе по pic16f84, уже даже весь ассемблер выучил.
подскажите что за банк1 и банк2? зачем это вообще и как работает?
подскажите что за банк1 и банк2? зачем это вообще и как работает?
В ПИКах не шарю, но рискну предположать, что это — две страницы (банка) регистров с одинаковыми номерами. И в регистре состояний есть битик, который указывает, какой банк регистров используется в настоящий момент... Так?V2oD2o писал(а):подскажите что за банк1 и банк2? зачем это вообще и как работает?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Да пока не где. Просто задачу надо реализовать на мк. И зависание может привести к выходу из строя чего либо. вот и интересуюсь о том как избежать этих ситуаций. можете про флаги подробнее рассказать? И У меня в основном цикле идет только опрос клавиатуры.Meteor писал(а):Chip115, где зависает то?
Обычно заводят сторожевую собаку и натравливают перед опасным участком.
Еще не делают вызовы функций в обработках прерываний, а ставят флаги, по которым переходят на участки кода в основном цикле.
Вот кусок кода:
Код: Выделить всё
void main (void)
{
unsigned int delay_count; // Used to implement a delay
bit duty_direction = 0; // 0 = Decrease; 1 = Increase
PORT_Init (); // Initialize crossbar and GPIO
OSCILLATOR_Init (); // Initialize oscillator
PCA0_Init (); // Initialize PCA0
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer
// enable)
while ((OSCICN & 0x40 ) == 0); // Wait until stable
Timer0_Init (freq[nfreq]); // Initialize the Timer0
EA = 1; // Enable global interrupts
CLR_LED
while (1)
{
Scan();
};
}
Код: Выделить всё
void Timer0_ISR (void) interrupt 1
{
Start_M1();
}
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
© Альберт Эйнштейн
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
Про флаги.
Как известно, наступление событий (например принят байт по UART) приодит к установки флагов прерываний. Эта процедура стандартная и расписывать ее смысла нет. Так же нет смысла пережевывать почему обработка прерываний должна быть короткой. Но предположим, что существуют события которые требуют достаточно длинной обработки. Рассмотрим такой пример. Нужно формировать обработку сигналов в зависимости от пройденного системного времени. Пусть одно из событий будет требовать обработки в момент t= 1 мс, второе событие момент t=4 мс... N-ое событие в момент времени t= M*dt мс. Решение влоб - настройка таймера на минимальный интервал времени, накопление этого времени и сравнение с наперед заданными значениями в обработке прерываний таймера. Это потребует длительного цикла обработки и идет вразрез с общей концепцией "чем короче, тем лучше!". Тогда можно сделать обходной маневр, назначив один из регистров (на асме) или выделив переменнную (на С) обозвав его\ее Флагом. Таймер опять же настраиваем на минимальный интервал dt. Перед стартом очищаем регистр\переменную Флаг. В обработке прерываний таймера устанавлиаем бит 0 Флага в состояние 1 и выходим. В вечном цикле проводим анализ на факт установки бита 0 Флага. Если он установлен - переходим на участок обработки (вызываем функцию) где:
1) Инкрементируем системное время.
2) Сравниваем системное время с заданными интервалами.
3) Производим формирование команд при совпадении системного времени с заданным отрезком.
4) Перед выходом из функции сбрасываем бит 0 Флага.
Далее по индукции, можно на один региср повесить обработку до 8-ми событий. Причем часть битов Флага может устанавливаться в обработке предыдущих функциях обработки все того же Флага. При необходимости данный метод легко расширяется. Единственно необходимо следить за тем что бы максимальная цепочка функций не превысила интервал системного времени.
Вот как то так и продолжать!
Как известно, наступление событий (например принят байт по UART) приодит к установки флагов прерываний. Эта процедура стандартная и расписывать ее смысла нет. Так же нет смысла пережевывать почему обработка прерываний должна быть короткой. Но предположим, что существуют события которые требуют достаточно длинной обработки. Рассмотрим такой пример. Нужно формировать обработку сигналов в зависимости от пройденного системного времени. Пусть одно из событий будет требовать обработки в момент t= 1 мс, второе событие момент t=4 мс... N-ое событие в момент времени t= M*dt мс. Решение влоб - настройка таймера на минимальный интервал времени, накопление этого времени и сравнение с наперед заданными значениями в обработке прерываний таймера. Это потребует длительного цикла обработки и идет вразрез с общей концепцией "чем короче, тем лучше!". Тогда можно сделать обходной маневр, назначив один из регистров (на асме) или выделив переменнную (на С) обозвав его\ее Флагом. Таймер опять же настраиваем на минимальный интервал dt. Перед стартом очищаем регистр\переменную Флаг. В обработке прерываний таймера устанавлиаем бит 0 Флага в состояние 1 и выходим. В вечном цикле проводим анализ на факт установки бита 0 Флага. Если он установлен - переходим на участок обработки (вызываем функцию) где:
1) Инкрементируем системное время.
2) Сравниваем системное время с заданными интервалами.
3) Производим формирование команд при совпадении системного времени с заданным отрезком.
4) Перед выходом из функции сбрасываем бит 0 Флага.
Далее по индукции, можно на один региср повесить обработку до 8-ми событий. Причем часть битов Флага может устанавливаться в обработке предыдущих функциях обработки все того же Флага. При необходимости данный метод легко расширяется. Единственно необходимо следить за тем что бы максимальная цепочка функций не превысила интервал системного времени.
Вот как то так и продолжать!
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
- Сообщения: 2
- Зарегистрирован: Сб дек 11, 2010 12:54:44
- Сообщения: 2
- Зарегистрирован: Сб дек 11, 2010 12:54:44
почитал вопросы/ответы на форуме. Похоже многие успешно собрали термометр по ссылке www.pic16.nm.ru Но у меня проблемма. На индикаторе меняются цыфры 58,3 и 08,3. помогите решить проблемму.
Вам уже ответили, но чуток добавлю.V2oD2o писал(а):уже второй день бьюсь в поисках адекватной литературе по pic16f84, уже даже весь ассемблер выучил.
подскажите что за банк1 и банк2? зачем это вообще и как работает?
Разделение на банки ОЗУ потребовалось по простой причине - недостаточная разрядность команды. При 14-разрядах командного слова в программной памяти полный 9-разрядный адрес регистра в ОЗУ просто не помещается в одну команду.
Команда состоит из двух полей - кода операции и адресного поля операнда. На адресное поле операнда оставлено только 7 разрядов. Таким образом пришлось восьмой и девятый разряд разместить в слове состояния процессора. Это биты RP0 и RP1. Причем последний бит используется только в контроллерах, где 4 банка памяти.
Несколько неудобно, но нестрашно. Если задача требует гладкого поля памяти ОЗУ, то стоит применять 18-ые ПИКи. Там слово команды 16-разрядное и система адресации ОЗУ несколько другая (хотя и совместимая снизу вверх - код 12...16 ПИКов в 18 будет исполнен, ессно в АСМ записи).
Ну уж если я правильно сказал (отталкиваясь от архитектуры 8051), то я тоже добавлю. В обработке прерывания может быть удобно просто переключить банк регистров чтобы не сохранять в стэке их состояние, а сохранить только слово состояния процессораКРАМ писал(а):Вам уже ответили, но чуток добавлю.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
В данном случае в обработчике требуется сохранять как минимум ДВЕ переменных. Это аккумулятор и регистр состояния. Аккумулятор принадлежит всем банкам сразу.
В 24-х ПИКах другая архитектура. Там 16 рабочих регистров, поэтому вопрос о защите их содержимого в обработчиках решается через стек.
В 12...18 ПИКах стек не доступен пользователю, поэтому либо его нужно отдельно организовать через косвенную адресацию, либо сохранять контекст в конкретные выделенные регистры.
В 24-х ПИКах другая архитектура. Там 16 рабочих регистров, поэтому вопрос о защите их содержимого в обработчиках решается через стек.
В 12...18 ПИКах стек не доступен пользователю, поэтому либо его нужно отдельно организовать через косвенную адресацию, либо сохранять контекст в конкретные выделенные регистры.


