Мелкие вопросы по МК и ПЛИС.
Задержку забыл
- Реклама
можно чуток красивее:
Код: Выделить всё
void main(void)
{
DDRD = 1;
PORTC = (1<<4); // внутренняя подтяжка (можно не использовать внешнюю)
while(1)
{
while(PINC & (1<<4)) ; // ждем нажатия (появления нуля)
PORTD ^= 1; // переключаем выход
_delay_ms(100); // от дребезга
while((PINC&(1<<4)) == 0) ; // ждем отпускания (появления единицы)
_delay_ms(100); // от дребезга
}
}Вопрос с инициализацией стэка ATmega32.
Компилятор пишет ошибку Operand(s) out of range in 'ldi r16,0x85f'
0x85f = 1000 0101 1111
Надо полтора байта, то есть два регистра. Только что-то не догоню, как это сделать
SPL и SPH. Но как это правильно записать?
Код: Выделить всё
.def R16=Temp1
-//-//-
ldi Temp1, RamEnd ;Инициализация стека
out SPL, Temp10x85f = 1000 0101 1111
Надо полтора байта, то есть два регистра. Только что-то не догоню, как это сделать
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
ldi tmp, high(RAMEND); Set Stack Pointer to top of RAM
out SPH, tmp;
ldi r16, low(RAMEND);
out SPL, tmp;
out SPH, tmp;
ldi r16, low(RAMEND);
out SPL, tmp;
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Сообщения: 804
- Зарегистрирован: Чт мар 12, 2009 16:31:05
Пиши вот так
Код: Выделить всё
.def temp = r16
ldi temp,LOW(RAMEND)
out SPL,temp
ldi temp,HIGH(RAMEND)
out SPH,temp- Реклама
Это я для самоконтроля распишу, а вы скажите, пожалуйста, так ли я понял или нет.Gudd-Head писал(а):ldi tmp, high(RAMEND); Set Stack Pointer to top of RAM
out SPH, tmp;
ldi r16, low(RAMEND);
out SPL, tmp;
RamEnd = 0x85f = 1000 0101 1111
1000 0101 1111 = [0000 1000] [0101 1111] - [High] [Low] соответственно.
ldi tmp, high(RAMEND) Загрузка в tmp 0000 1000
out SPH, tmp Загрузка 0000 1000 в Stack Pointer High
ldi tmp, low(RAMEND) Загрузка в tmp 0101 1111
out SPL, tmp Загрузка 0000 1000 в Stack Pointer High
Vov123, так и написал, только High и Low не менял местами. Это принципиально?
Последний раз редактировалось Мikа Ср апр 17, 2013 11:38:43, всего редактировалось 1 раз.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
Добрый!
Такая вот проблема: настраиваю ШИМ на меге16ой:
управляю ШИМом "OCR1AL=xxx".
Все работает, за исключением OCR1AL=0. В данном случае светодиод не гаснет полностью, а при подключении движка он гудит(через Н-мост). В чем может быть дело?
п.с. посмотрел на осцилографе при загрузке 0 все равно есть какая-то скважность, почему так?
после инициализации, то есть вроде все должно быть 0, все равно на выходе чтото есть =(
ответ http://www.radiokot.ru/forum/viewtopic.php?f=20&t=30098
Такая вот проблема: настраиваю ШИМ на меге16ой:
Код: Выделить всё
SETBIT(DDRD,4);//на выход
SETBIT(DDRD,5);//на выход
TCCR1A=0xA1;//
TCCR1B=0x0A;//MODE 5 - FAST PWM 8 BIT
Все работает, за исключением OCR1AL=0. В данном случае светодиод не гаснет полностью, а при подключении движка он гудит(через Н-мост). В чем может быть дело?
п.с. посмотрел на осцилографе при загрузке 0 все равно есть какая-то скважность, почему так?
после инициализации, то есть вроде все должно быть 0, все равно на выходе чтото есть =(
ответ http://www.radiokot.ru/forum/viewtopic.php?f=20&t=30098
Последний раз редактировалось Лютик Ср апр 17, 2013 14:01:41, всего редактировалось 2 раза.
парни, щас пытаюсь сделать прерывание на ATmega32, сначала хотел сделать по изменению сигнала на ножке INT0, потом по RESET.
Но нифига не получается.
А дальше, чтобы, допустим, использовать прерывание по RESET, что надо сделать?
Я попробовал сделать так, как в статьях про бегущий огонек, но ниче не выходит.
Какие ещё настройки надо сделатЬ, чтобы изменение потенциала на RESET вызывало прерывание?
Но нифига не получается.
Код: Выделить всё
ldi Temp1, 0b10000000 ;Глобальное разрешение прерываний
out SREG, Temp1Я попробовал сделать так, как в статьях про бегущий огонек, но ниче не выходит.
Какие ещё настройки надо сделатЬ, чтобы изменение потенциала на RESET вызывало прерывание?
Последний раз редактировалось Мikа Ср апр 17, 2013 13:55:59, всего редактировалось 1 раз.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
Жжоте, товарищМikа писал(а):чтобы изменение потенциала на RESET вызывало прерывание?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
А как надо было это правильно сказать? 
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
не знаю как в 32, но в остальных по ножке ресет Вы сможете вызвать перезагрузку контроллера, что ни есть прерывание. может я конечно, чего то не знаю, но ранее такого не встречал
Наверное не так понял эту статью. Тогда такой же вопрос, но относительно прерывания INT_0.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
это "прерывание" вызывается автоматически, его не надо настраивать))) PC (Program Counter) устанавливается на адрес = 0 в памяти программ и программа начинается сначала)) по-человечески это называется сброс микроконтроллера)Мikа писал(а):использовать прерывание по RESET, что надо сделать?
выберите другой источник прерывания)
Ставим плюсы: )
Выбрал, выбрал
INT_0. Как я понял, из 44 страницы даташита и статьи про прерывания, 2 $002 INT0 External Interrupt Request 0 означает прерывание, по изменению сигнала на ножке INT0. Правильно? Соответственно по этой же схемке
можно сделать на ногу INT0? Но что там надо прописать в программе кроме SREGa (а надо ли в нём что-то писать?) и sei. Ну и, естесственно, установки метки int_0: на обработчик прерывания.
можно сделать на ногу INT0? Но что там надо прописать в программе кроме SREGa (а надо ли в нём что-то писать?) и sei. Ну и, естесственно, установки метки int_0: на обработчик прерывания.Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
Там ещё выбирается по фронту/спаду/уровню будет прерывание. А вообще, почитайте ДШ и/или Евстифеева, погоняйте код в Студии прежде чем лезть на форум со своими вопросами.Мikа писал(а):Но что там надо прописать в программе кроме SREGa (а надо ли в нём что-то писать?) и sei.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Ну я, как бы гоняю код в студии и в контроллере. Читаю и мануал и статьи на эту тему. А зачем тогда форум, если не лезть на него со своими вопросами? Фронт\спад уровня, это изначальное 1 или 0 в регистре данной ножки? То есть в DDRx ставим 0 - делаем входом, а потом в PORTx ставим 1 или 0 в зависимости от того, на что хотим реагировать?
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
Мikа, при всей терпимости к новичкам, я Вам советую почитать перевод даташита на какой-нибудь контроллер. Не надо переводить самостоятельно. В сети все есть. На первой странице гугла найдете то, что Вам нужно. Почему на форуме должны переписывать то, что уже написано в открытом доступе.
Все же Ваш вопрос относится к основам и это следует изучать самостоятельно!
Вот когда появятся конкретные вопросы по реализации, милости просим.
Например: не получается то-то и то-то, пытался так.... так..... так..... и даже так.... поиграл в проктолога-стоматолога..... не получается! Вот код: .... . Вот схема: .... Вот условия возникновения глюка....
Все же Ваш вопрос относится к основам и это следует изучать самостоятельно!
Вот когда появятся конкретные вопросы по реализации, милости просим.
Например: не получается то-то и то-то, пытался так.... так..... так..... и даже так.... поиграл в проктолога-стоматолога..... не получается! Вот код: .... . Вот схема: .... Вот условия возникновения глюка....
Ставим плюсы: )
ДОброе утро, коты. Плз, с ходу не бейте, делаю как сказали, читаю, ищу, вникаю. Есть маленький вопросик относительно регистра SREG. По даташиту бит номер 7, с названием I отвечает за глобальное включение и выключение прерываний. - Всё ясно.
Но после прочтения описания регистра
interrupt enable control is then performed in separate control registers. If the Global
Interrupt Enable Register is cleared, none of the interrupts are enabled independent of
the individual interrupt enable settings. The I-bit is cleared by hardware after an interrupt
has occurred, and is set by the RETI instruction to enable subsequent interrupts. The Ibit
can also be set and cleared by the application with the SEI and CLI instructions, as
described in the instruction set reference.
есть два вопроса.
1). При вызывании прерывания, бит 7 "чистится" аппаратно. Т.е. во время обработки этого прерывания, другое прерывание уже сработать не сможет?
2). Команда RETI устанавливает бит 7, для возможности обработки последующих прерываний. - Это, вроде, понятно.
3). Бит 7 можно устанавливать и чистить командами SEI и CLI.
То есть
Будет эквивалентно SEI.
Следовательно, последовательно эти 2 команды использовать не надо, достаточно одной?
Аналогично при очистке бита.
И последний вопрос, относительно as described in the instruction set reference. в последнем предложении под спойлером. Я перевёл это на русский, но что это значит я не понял.
P.S. Очень надеюсь, что не вызову негатива, типа я лентяй, подайте мне всё на блюдичке.
Но после прочтения описания регистра
Спойлер
The Global Interrupt Enable bit must be set for the interrupts to be enabled. The individualinterrupt enable control is then performed in separate control registers. If the Global
Interrupt Enable Register is cleared, none of the interrupts are enabled independent of
the individual interrupt enable settings. The I-bit is cleared by hardware after an interrupt
has occurred, and is set by the RETI instruction to enable subsequent interrupts. The Ibit
can also be set and cleared by the application with the SEI and CLI instructions, as
described in the instruction set reference.
1). При вызывании прерывания, бит 7 "чистится" аппаратно. Т.е. во время обработки этого прерывания, другое прерывание уже сработать не сможет?
2). Команда RETI устанавливает бит 7, для возможности обработки последующих прерываний. - Это, вроде, понятно.
3). Бит 7 можно устанавливать и чистить командами SEI и CLI.
То есть
Код: Выделить всё
ldi Temp, 0b1000000
out SREG, TempСледовательно, последовательно эти 2 команды использовать не надо, достаточно одной?
Аналогично при очистке бита.
И последний вопрос, относительно as described in the instruction set reference. в последнем предложении под спойлером. Я перевёл это на русский, но что это значит я не понял.
P.S. Очень надеюсь, что не вызову негатива, типа я лентяй, подайте мне всё на блюдичке.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
Да, достачточно одной команды SEI или CLI.Мikа писал(а):Следовательно, последовательно эти 2 команды использовать не надо, достаточно одной?
Аналогично при очистке бита.
"как описано в руководстве по системе команд".Мikа писал(а):as described in the instruction set reference. Я перевёл это на русский, но что это значит я не понял.


