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

 
 
> ATMega
Буратино
сообщение May 11 2011, 06:14
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215



Работаю с процессором ATMega8. Необходимо на выводы OC1A, OC1B вывести сигнал 125кНz в противофазе.
В режиме CTC (сброс при совпадении) можно переключать в противоположное состояние вывод OC1A и/или OC1B, но получить сигналы на пинах в противофазе никак нельзя. Может быть необходимо ввести обработчик прерывания переполнения и уже в нем инвертировать второй вывод относительно первого? Возможно ли используя режим CTC получить сигнал на указанных выводах в противофазе не используя прерывания, либо же в данном случае правильнее использовать режим Fast PWM?


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
3 страниц V   1 2 3 >  
Start new topic
Ответов (1 - 36)
CYD
сообщение May 11 2011, 06:28
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 25-08-10
Пользователь №: 59 097



В книжке написано, что тоглать можно только ОС1А. Я вчера делал девайс и тоглал ОС1В, но тоглать их в противофазе без прерывания не получится.
возможно наиболее дешевым выходом будет дополнительный инвертер на выходе. хотя прерывание и пересчеты для тогланья в противофазе не отнимут больше 60-100 мкс.

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

Сообщение отредактировал CYD - May 11 2011, 06:30
Go to the top of the page
 
+Quote Post
Буратино
сообщение May 11 2011, 06:32
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215



Цитата(CYD @ May 11 2011, 09:28) *
В книжке написано, что тоглать можно только ОС1А.

одновременно можно "толгать" и ОС1А и ОС1В - проверено.

Цитата(CYD @ May 11 2011, 09:28) *
но тоглать их в противофазе без прерывания не получится.

думаю получится, но в другом режиме


Цитата(CYD @ May 11 2011, 09:28) *
возможно наиболее дешевым выходом будет дополнительный инвертер на выходе.

это перебор


Цитата(CYD @ May 11 2011, 09:28) *
хотя прерывание и пересчеты для тогланья в противофазе не отнимут больше 60-100 мкс.

копеечка к копеечке..

sm.gif Спасибо!


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
Sergey_Aleksandr...
сообщение May 11 2011, 08:23
Сообщение #4


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

Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764



Ещё как вариант - пересесть с устаревшей восьмёрки на Mega88. По ногам совместима. В ней появился дополнительный регистр управления таймером TCCR1C с битами FOC1A и FOC1B, усановка которого форсирует событие "Совпадение" для логики управляющей ногами OC1A и OC1B соответственно. Так, например, принудительно дёрнули ногу OC1A установкой бита FOC1A, запустили таймер в режиме CTC с указанием изменять состояние выводов OC1A и OC1B. В итоге при каждом Compare Event выводы будут "тоглеться", причём в противофазе.
Таким макаром я подавал сигнал удвоенной амплитуды на пьезоизлучатель (вместо 3.3 В на его выводы приходил сигнал с размахом 6.6 В).
UPD Хоть топикстартер и решил проблему, всё-равно поправлюсь: в Mega8 тоже есть биты FOC1A и FOC1B, но в регистре TCCR1A.

Сообщение отредактировал Sergey_Aleksandrovi4 - May 11 2011, 18:41
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 11 2011, 09:18
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Буратино @ May 11 2011, 09:14) *
В режиме CTC (сброс при совпадении) можно переключать в противоположное состояние вывод OC1A и/или OC1B, но получить сигналы на пинах в противофазе никак нельзя.
Почему нельзя? Что мешает остановить таймер (CS1x = 0), настроить таймер в режим 4 или 12 (CTC со сбросом по значению ICR1), для выходов поставить режим 01 (Toggle OC1A/OC1B on Compare Match), далее, установив FOC1A, инвертировать состояние одного из выходов и запустить таймер (CS1x = нужное значение предделителя). Все. Никаких сложностей не видно.

QUOTE (CYD @ May 11 2011, 09:28) *
В книжке написано, что тоглать можно только ОС1А.
Выкиньте эту книжку.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
haker_fox
сообщение May 11 2011, 09:34
Сообщение #6


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (CYD @ May 11 2011, 15:28) *
тоглать

Нет такого слова в русском языке. Есть "переключать", "устанавливать", "сбрасывать" и др.
Поверьте, такая речь не только не украшает язык, но и сбивает с толку.
Пришел ко мне на днях человек и говорит модное слово "Актюатор" (исполнительный механизм). В итоге выяснилось, что он не имеет представления о чем говорит вообще.
Прошу прощения за bb-offtopic.gif


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Буратино
сообщение May 11 2011, 09:53
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215



Сделал вот так:
Код
void Init_Timer1 (void) {
    TCCR1A = (1 << COM1A1)|(1 << COM1A0)|(1 << COM1B1);
    TCCR1B = (1 << WGM12)|(1 << CS10);
    OCR1AH = 0x00;
    OCR1AL = 0x1F;
}

volatile INT08U j=0;
#pragma vector=TIMER1_COMPA_vect
__interrupt void timer1_compa_isr(void) {

    if (j) {
            TCCR1A = (1 << COM1A1)|(1 << COM1A0)|(1 << COM1B1);
            j = 0;
        }
        else {
            TCCR1A = (1 << COM1A1)|(1 << COM1B0)|(1 << COM1B1);
            j = 1;
    }
}


Но у меня используется и таймер 0, и он переполняется с большой частотой 8кНz. Наблюдаю искажения формы сигнала:
(частота не ровно 125кHz в связи с тем что использую кварц немного другой)

Не совсем понимаю почему так происходит, ведь приоритет у таймера 1 выше чем у таймера 0..

Цитата(Сергей Борщ @ May 11 2011, 12:18) *
Почему нельзя?


Супер, Спасибо! sm.gif
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 11 2011, 10:09
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Буратино @ May 11 2011, 13:53) *
Не совсем понимаю почему так происходит, ведь приоритет у таймера 1 выше чем у таймера 0.
Приоритет определяет: какое прерывание обрабатывать первым при одновременности возникновения запросов от нескольких прерываний. Ежели МК приступил к процедуре обработки прерывания с низким приоритетом, которая выполняется Х мкс, а в это время был выставлен запрос на прерывание более высокого приоритета, то этот запрос будет отложен до окончания процедуры обработки прерывания низкого приоритета. Т.о. второе прерывание (с высоким приоритетом) будет задержано на Х мкс.
Go to the top of the page
 
+Quote Post
Буратино
сообщение May 11 2011, 10:27
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215



Цитата(Палыч @ May 11 2011, 13:09) *
Приоритет определяет: какое прерывание обрабатывать первым при одновременности возникновения запросов от нескольких прерываний. Ежели МК приступил к процедуре обработки прерывания с низким приоритетом, которая выполняется Х мкс, а в это время был выставлен запрос на прерывание более высокого приоритета, то этот запрос будет отложен до окончания процедуры обработки прерывания низкого приоритета. Т.о. второе прерывание (с высоким приоритетом) будет задержано на Х мкс.


Да, спасибо!

Всем сенкс, работает! sm.gif




Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
Буратино
сообщение May 12 2011, 06:34
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215



ATMega8/8МHz кварц. Подскажите, как получить в микроконтроллере микросекундные задержки?
Дело в том, что если я программирую таймер на такие периоды переполнения, то вся система вырубается! Думаю, что прерывание не успевает выполниться, и приходит следующее.
Но мне нужно сделать в некоторых местах программы задержку в микросекундах!


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 12 2011, 07:36
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Буратино @ May 12 2011, 09:34) *
Но мне нужно сделать в некоторых местах программы задержку в микросекундах!
Можно просто крутиться в цикле N раз (см. __delay_cycles()). Такая задержка будет растягиваться за счет прерываний. Можно использовать свободнобегущий таймер: Считываете и запоминаете его значение в начале интервала, затем в цикле считываете его текущее значение, вычитаете из него начальное, сравниваете полученный результат с длительностью интервала. Если результат меньше - еще одна итерация цикла.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
dimka76
сообщение May 12 2011, 08:36
Сообщение #12


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



А зачем все эти заморочки с прерываниями. В режиме ШИМ все будет происходить аппаратно и в противофазе.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
Буратино
сообщение May 13 2011, 07:49
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215



Цитата(dimka76 @ May 12 2011, 11:36) *
А зачем все эти заморочки с прерываниями. В режиме ШИМ все будет происходить аппаратно и в противофазе.


На сколько я понял, в режиме Fast PWM, счетчик считает от нуля и до разрядности ШИМ. Для моего кварца максим. чатсота гораздо ниже 125кHz получается. Может быть в других режимах ШИМ можно это сделать, либо Fast PWM настроить на счет не от нуля, но я сделал так как советовал Сергей: в режиме CTC перевернул одну лапу спец. битом и настроил пины соответственно. Все получилось здорово.


У меня такой вопрос: сделал систему на процессоре ATMega8. Все работает так как и планировалось, за исключением одного "но". Дело в том, что рядом с процессором (~13mm) на плате расположено реле, которое коммутирует две настольные лампы, одна из которых VTLAMP3W (содержит две лампы дневного света BLUB 9W G23), другая обычная лампа накаливания на 40W. Время от времени процессор виснетsad.gif

Добавил доп. емкость на вход питания ,отпаял все лишние провода от лап.
зы
Конечно, в реале, реле будет коммутировать совсем не такие токи, но тем не менее нужно попытаться разобраться!


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 13 2011, 08:02
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Буратино @ May 13 2011, 10:49) *
Добавил доп. емкость на вход питания ,отпаял все лишние провода от лап.
зы
Конечно, в реале, реле будет коммутировать совсем не такие токи, но тем не менее нужно попытаться разобраться!
Показывайте схему. Показывайте разводку. Вероятнее всего проблема в неправильной разводке земли, либо в висящем в воздухе без подтяжки входе Reset, либо не на все ноги завели земли/питания.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
dimka76
сообщение May 13 2011, 08:20
Сообщение #15


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(Буратино @ May 13 2011, 11:49) *
На сколько я понял, в режиме Fast PWM, счетчик считает от нуля и до разрядности ШИМ. Для моего кварца максим. чатсота гораздо ниже 125кHz получается. Может быть в других режимах ШИМ можно это сделать,


Можно чтобы считал до ICR1.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
Буратино
сообщение May 13 2011, 08:32
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215



Цитата(Сергей Борщ @ May 13 2011, 11:02) *
Показывайте схему. Показывайте разводку. Вероятнее всего проблема в неправильной разводке земли, либо в висящем в воздухе без подтяжки входе Reset, либо не на все ноги завели земли/питания.


Схема: http://electronix.ru/forum/index.php?act=a...st&id=54636
(В схеме С8 с R12 нужно поменять местами)
Плата:

Все неиспол. выводы сделал выходами и записал туда нули:
Код
void Init_Ports (void) {
    DDRB  = (1<<DDB5)|(1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0);
    PORTB = (1<<PB4)|(1<<PB2);

    DDRC  =  (1<<DDC5)|(1<<DDC4)|(1<<DDC3)|(1<<DDC2)|(1<<DDC0);
    PORTC =  (1<<PC1);

    DDRD  = (1<<DDD7)|(1<<DDD6)|(1<<DDD5)|(1<<DDD4)|(1<<DDD3)|(1<<DDD1)|(1<<DDD0);
    PORTD = (1<<PD2)|(1<<PD1);
}


---
На четвертой картинке "подсветил" именно землю на плате:

---
При этом я обратил внимание, что траблы именно с лампой где стоят дневного типа лампочки.. Сейчас попробую посмотреть на питающее напряжение в моменты вкл/откл такой нагрузки.
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение

 


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 13 2011, 10:29
Сообщение #17


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Буратино @ May 13 2011, 11:32) *
Схема:
У вас AVcc в воздухе. По разводке - c1 далековато от ног процессра. Подключите AVcc, не забудьте на него тоже емкость повесить.

И очень мне не понравилась земля на конденсаторы кварца петлей через всю плату. Ее бы тут же вокруг кварца (вниз по картинке) обвести и максимально близко к земляным ногам процессора на земляную дорожку.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Буратино
сообщение May 13 2011, 11:13
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215



Цитата(Сергей Борщ @ May 13 2011, 13:29) *
У вас AVcc в воздухе. По разводке - c1 далековато от ног процессра. Подключите AVcc, не забудьте на него тоже емкость повесить.

И очень мне не понравилась земля на конденсаторы кварца петлей через всю плату. Ее бы тут же вокруг кварца (вниз по картинке) обвести и максимально близко к земляным ногам процессора на земляную дорожку.


Спасибо, сейчас все поправлю!

AVCC куда подключать? К +питания процессора? У меня в схеме не используется АЦП, AVCC обязательно подключать?



--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 13 2011, 11:18
Сообщение #19


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Буратино @ May 13 2011, 14:13) *
У меня в схеме не используется АЦП, AVCC обязательно подключать?
Читаем даташит:
QUOTE
AVCC is the supply voltage pin for the A/D Converter, Port C (3..0), and ADC (7..6). It should be externally connected to VCC, even if the ADC is not used. If the ADC is used, it should be connected to VCC through a low-pass filter. Note that Port C (5..4) use digital supply voltage, VCC.



--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Буратино
сообщение May 13 2011, 11:41
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215



АААААsm.gif теперь все работает даже с тремя лампами! sm.gif
Спасибо!


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
Клим
сообщение May 16 2011, 06:24
Сообщение #21


Местный
***

Группа: Свой
Сообщений: 230
Регистрация: 7-04-08
Из: Украина, Запорожье
Пользователь №: 36 541



Цитата(dimka76 @ May 13 2011, 11:20) *
Можно чтобы считал до ICR1.

Самое простое решение для данной задачи:
FastPWM со счетом до ICR1. При 8мгц - легко получить 125кгц. И без всяких прерываний.
Код
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Fast PWM top=ICR1
// OC1A output: Inverted
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xE2;
TCCR1B=0x19;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x3F;
OCR1AH=0x00;
OCR1AL=0x1F;
OCR1BH=0x00;
OCR1BL=0x1F;
Go to the top of the page
 
+Quote Post
Буратино
сообщение May 21 2011, 12:02
Сообщение #22


Профессионал
*****

Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215



Цитата(Клим @ May 16 2011, 09:24) *
Самое простое решение для данной задачи:
FastPWM со счетом до ICR1. При 8мгц - легко получить 125кгц. И без всяких прерываний.


Самое простое решение (без прерываний) подсказал Сергей Борщ. используется режим "сброс по совпадению" вот с такой фишечкой:
Код
TCCR1A |= (1 << FOC1A);



Сегодня пробую EEPROM на ATMega8. Вот код функций чтения и записи в энергонезависимую память:
Код
void EEPROMWrite(INT16U uiAddress, INT08U ucData) {

    while(EECR & (1<<EEWE))                                     // Wait for completion of previous write /
;
    EEAR = uiAddress;                                           // Set up address and data registers /
    EEDR = ucData;
    EECR |= (1<<EEMWE);                                         // Write logical one to EEMWE /
    EECR |= (1<<EEWE);                                          // Start eeprom write by setting EEWE /
}


INT08U EEPROMRead(INT16U uiAddress) {

    while(EECR & (1<<EEWE))                                     // Wait for completion of previous write /
;
    EEAR = uiAddress;                                           // Set up address register /
    EECR |= (1<<EERE);                                          // Start eeprom read by writing EERE /
    return EEDR;                                                // Return data from data register /
}


Не получается вычитывать записанные данные. В программе делаю вот так:
Код
...
            for(i=0; i<8; i++) {
                EEPROMWrite(i, (INT08U)tmp2);
                tmp2 >>= 8;
            }


            for (i=0; i < 8; i++)
                UARTTransmitByte ( EEPROMRead(i) );
            
...

Все четко работает. Но если заремить строку EEPROMWrite(i, (INT08U)tmp2);, то получаю вместо записанной и сохраненной информации 0xFFы...
Где я ошибся? Спасибо!


---
Я все понял! sm.gif)))))))0 Кто догадается в чем дело было?


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 21 2011, 21:35
Сообщение #23


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Буратино @ May 21 2011, 15:02) *
Самое простое решение (без прерываний) подсказал Сергей Борщ.
На самом деле dimka76 прав - в режиме Fast PWM можно ограничить период значением ICR1. А выходы настроить дергаться в противофазе. Тогда не нужен будет FOC1A, вся настройка сведется к трем строчкам.
QUOTE (Буратино @ May 21 2011, 15:02) *
Я все понял! sm.gif)))))))0 Кто догадается в чем дело было?
EEPROM стиралась вместе ко старым кодом перед записью новой прошивки?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Diusha
сообщение May 23 2011, 04:16
Сообщение #24


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



Цитата(Буратино @ May 21 2011, 15:02) *
Все четко работает. Но если заремить строку EEPROMWrite(i, (INT08U)tmp2);, то получаю вместо записанной и сохраненной информации 0xFFы...

Я все понял! sm.gif)))))))0 Кто догадается в чем дело было?

Ну наверно в этом:
tmp2 >>= 8;
А если заремить, то читались, видимо, ранее правильно записанные данные.
Правда, я сей (или сёв?) не знаю и могу только предположить, что при сдвиге на 8 в регистре оказываются единицы.
Это по поводу загадки.
А по делу на всякий пожарный напомню, что между запись EEWE д. б. после EEMWE в теч. не более 4-х тактов. Если у Вас в программе разрешены прерывания, условие может нарушиться
Go to the top of the page
 
+Quote Post
Буратино
сообщение May 24 2011, 07:56
Сообщение #25


Профессионал
*****

Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215



Цитата(Сергей Борщ @ May 22 2011, 00:35) *
EEPROM стиралась вместе ко старым кодом перед записью новой прошивки?

Да, именно такsm.gif

Цитата(Diusha @ May 23 2011, 07:16) *
А по делу на всякий пожарный напомню, что между запись EEWE д. б. после EEMWE в теч. не более 4-х тактов. Если у Вас в программе разрешены прерывания, условие может нарушиться

То есть лучше кусочек который пишет значения в ЕЕПРОМ, заключить в:
Код
    
__disable_interrupt();
...
__enable_interrupt();

?


Подскажите, как программно выполнить ресет? Вот у меня в программе есть место где по сути дела алгоритм должен просто начать выполняться с самого начала, как выполнить ресет программно? Спасибо!
АТMega8, IAR


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
Sergey_Aleksandr...
сообщение May 24 2011, 08:47
Сообщение #26


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

Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764



Цитата(Буратино @ May 24 2011, 11:56) *
То есть лучше кусочек который пишет значения в ЕЕПРОМ, заключить в:
Код
    
__disable_interrupt();
...
__enable_interrupt();

?

Это небезопасно, т.к. этим кодом можно несанкционированно разрешить прерывания там, где они запрещены. Лучше так:
Код
char temp = SREG;
__disable_interrupt();
...
SREG = temp;


Про ресет тут целая тема на нескольких страницах была. В кратце: если аппаратно надо сбросить, то только с помощью WatchDog это можно сделать, если просто програмно перепрыгнуть куда-либо, то как-то так:
Код
unsigned short Addr = (unsigned short)main;
((void(*)(void))Addr)();
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 24 2011, 08:49
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Буратино @ May 24 2011, 11:56) *
Подскажите, как программно выполнить ресет?
Вот тут это было
Go to the top of the page
 
+Quote Post
Буратино
сообщение May 24 2011, 09:12
Сообщение #28


Профессионал
*****

Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215



Спасибо! sm.gif


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 24 2011, 10:22
Сообщение #29


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Буратино @ May 24 2011, 10:56) *
То есть лучше кусочек который пишет значения в ЕЕПРОМ, заключить в:
Лучше всего воспользоваться средствами компилятора:
CODE
#include <stdint.h>  // И не нужно придумывать свои типы вроде UINT8U
__eeprom uint8_t My_data[8];

void test()
{

    for(uint_fast8_t i = 0; i < sizeof(My_data) / sizeof(My_data[0]); ++i)
          My_data[i] = i;

    for(uint_fast8_t i = 0; i < sizeof(My_data) / sizeof(My_data[0]); ++i)
          UARTTransmitByte(My_data[i]);
}



--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Bass
сообщение May 26 2011, 03:42
Сообщение #30


Участник
*

Группа: Свой
Сообщений: 66
Регистрация: 5-08-10
Из: Томск
Пользователь №: 58 761



Цитата(Sergey_Aleksandrovi4 @ May 24 2011, 15:47) *
Это небезопасно, т.к. этим кодом можно несанкционированно разрешить прерывания там, где они запрещены. Лучше так:
Код
char temp = SREG;
__disable_interrupt();
...
SREG = temp;


Если используете gcc (он же WinAVR), то в util/atomic.h есть средства для работы с атомарными блоками. Можно использовать такую конструкцию
Код
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
// тут код блока с атомарным доступом
}
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 26 2011, 04:26
Сообщение #31


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Bass @ May 26 2011, 07:42) *
Если используете gcc (он же WinAVR), то в util/atomic.h есть средства для работы с атомарными блоками. Можно использовать такую конструкцию
Код
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
// тут код блока с атомарным доступом
}
Можно, но с переносимостью будут проблемы. ATOMIC_BLOCK реализован на специфических особенностях gcc и подобную конструкцию повторить средствами другого компилятора может не получиться. Так что не стоит...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Буратино
сообщение Jun 1 2011, 17:23
Сообщение #32


Профессионал
*****

Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215



Скажите, а вот если я не использую АЦП микроконтроллера ,могу ли я пустить через неиспользуемые выводы преобразователя (не совмещенные с пинами общего назначения) сигналы с других лап?
Ну вот например со второго пина через 22й в АТMega8?
Спасибо!
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 2 2011, 04:11
Сообщение #33


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Думаю что да.
Входы АЦП-высокоимпедансные и не должны никак влиять на логический сигнал.
Главное чтобы этот сигнал никак не повлиял на соседние остальные входы АЦП, если они используются (хоть там и мультиплексор ВЧ сигнал ИМХО может дать фон).


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Буратино
сообщение Jun 2 2011, 06:48
Сообщение #34


Профессионал
*****

Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215



Спасибо!
И еще один вопросик: вот если для программирования ATMega8 используется AVReal и как бы линии программирования выведены на разъем программирования, но есть желание задействовать аппаратные "мощностя" таймера 2 для управления пищалкой (вывод PB3 MOSI/OC2).
Вот никакого криминала в том чтоб использовать совместно пин PB3 и для программирования чипа и для управления пищалкой?

Я так понимаю, что в режиме программирования вывод PB3 MOSI/OC2, настроен как вход и принимает данные от программатора, после того как я (программатор) пускает ресет, этот вывод можно использовать как угодно? Получается что будет попискивать в режиме программирования пищалка и больше ниче такого страшного? Спасибо!
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 2 2011, 07:08
Сообщение #35


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Если у пищалки высокоимпедансный вход то всё будет ок (стоит почитать даташит на неё).
Если нет то нужно будет поставить резистор последовательно пищалке, а на разъём программирования вывести сигнал напрямую с ноги MCU.
Номинал этого резистора стоит подобрать исходя из минимального рабочего тока пищалки.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Буратино
сообщение Jun 2 2011, 07:16
Сообщение #36


Профессионал
*****

Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215



Цитата(demiurg_spb @ Jun 2 2011, 10:08) *
Если у пищалки высокоимпедансный вход то всё будет ок (стоит почитать даташит на неё).
Если нет то нужно будет поставить резистор последовательно пищалке, а на разъём программирования вывести сигнал напрямую с ноги MCU.
Номинал этого резистора стоит подобрать исходя из минимального рабочего тока пищалки.


так на схеме же есть кусочек со схемой управления пищалкой!


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 2 2011, 07:21
Сообщение #37


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



R20 увеличить можно до 4,7К
И проверить будет-ли открываться полевик (думаю что будет) там делитель получится 1:10.
Можно ничего и не менять. Тоже будет работать.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 14:14
Рейтинг@Mail.ru


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