L-P 0 30 октября, 2005 Опубликовано 30 октября, 2005 · Жалоба Здравствуйте. Не удается заставить работать такую программу: (При нажатии 2-й кнопки на STK500 содержимое ADCH/L должно выводиться на диоды, с интервалом ~1cек.) .include "m8535def.inc" .org 0 rjmp RESET .org ADCCaddr rjmp interrupt .MACRO output com @1 out @0, @1 com @1 .ENDMACRO RESET: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 rcall init_ports rcall init_adc sei MAIN: rjmp MAIN pdelay: pdelay1: ldi r17, 100 pdelay2: ldi r18, 100 pdelay3: dec r18 brne pdelay3 dec r17 brne pdelay2 dec r19 brne pdelay1 ret init_adc: push r16 ldi r16, (1 << ADEN)|(1 << ADIE)|(1 << ADFR)|(1 << ADPS0)|(1 << ADPS2) out ADCSRA, r16 ldi r16, 2 out ADMUX, r16 sbi ADCSRA, ADSC pop r16 ret init_ports: ldi r16, 0xFF out DDRB, r16 clr r16 out DDRA, r16 out PORTA, r16 ret interrupt: in r20, ADCL in r21, ADCH output PORTB, r20 rcall pdelay output PORTB, r21 rcall pdelay ret При запуске сначала загораются все 8 диодов, а затем через ~1 сек младшие два, которые так и застывают и при нажатии кнопок ничего не меняется. Помогите разобраться в чем здесь проблема. Заранее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
m16 0 30 октября, 2005 Опубликовано 30 октября, 2005 · Жалоба на телесистемах читай по ссылкам Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Reboot_s 0 30 октября, 2005 Опубликовано 30 октября, 2005 · Жалоба Я пока с АЦП не работал, но заметил такую мелочь как отсутствие команды "reti". Которая обязательна для выхода из прерывания! "reti" а не "ret"! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
L-P 0 30 октября, 2005 Опубликовано 30 октября, 2005 · Жалоба Да, действительно, спасибо. Но проблема все же осталась. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
solidreg 0 30 октября, 2005 Опубликовано 30 октября, 2005 · Жалоба А какая у вас частота CPU? Как я вижу, у вас F(АЦП)=F(CPU)/32. АЦП работает на частотах до 100kHz. То, при делении на 32, CPU должен работать не скорее чем 100kHz*32=3.2MHz. Иначе увелечите деление на 64 или 128. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Laksus 0 1 ноября, 2005 Опубликовано 1 ноября, 2005 · Жалоба _______ L-P Не удается заставить работать такую программу: (При нажатии 2-й кнопки на STK500 содержимое ADCH/L должно выводиться на диоды, с интервалом ~1cек.) При запуске сначала загораются все 8 диодов, а затем через ~1 сек младшие два, которые так и застывают и при нажатии кнопок ничего не меняется. Помогите разобраться в чем здесь проблема. Заранее спасибо. _______ Код вполне рабочий (если ret в конце заменить на reti). Попробовал толко что, правда не мега, а AT90S8535. (Я тоже начинающий и играюсь сейчас с АЦП). Мигает и правильно показывает, (толко конечно не от нажатия кнопочки, а сам по себе, так как кнопка в коде не упомянута). Скорее всего проблема не в коде. Например внешнее опорное напряжение равно нулю. Или на измерительном входе напряжение не меняется. Или, что нибудь напутано в фузах. ________ solidreg А какая у вас частота CPU? Как я вижу, у вас F(АЦП)=F(CPU)/32. АЦП работает на частотах до 100kHz. ________ У меня сейчас под рукой нет данных по атмеге8535, но для AT90S8535: "The successive approximation circuitry requires an input clock frequency between 50kHz and 200 kHz to achieve maximum resolution. If a resolution of lower than 10 bits is required, the input clock frequency to the ADC can be higher than 200 kHz to achieve a higher sampling rate." Для мега8 пишут "от 50 до 200, а если не требуется высокая точность, то до 1000 кГц" (см. табл.103, правда даташит довольно старый). Неужели для мега8535 в самом деле установлено до 100кГц? Александр 2005 11 01 laksus mail.ru Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
L-P 0 4 ноября, 2005 Опубликовано 4 ноября, 2005 · Жалоба Огромное спасибо за ответы, у меня закончился траффик, поэтому не смог сразу ответить. Вот программа, слегка переделанная, но в сущности осталась как и была. .include "m8535def.inc" .org 0 rjmp RESET .org ADCCaddr rjmp interrupt .MACRO output com @1 out @0, @1 com @1 .ENDMACRO RESET: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 ldi r16, 7 ;ADC7 - вход АЦП. out ADMUX, r16 ;запуск преобразования в цикл. режиме, разрешение прерывания. ldi r16, (1 << ADEN)|(1 << ADIE)|(1 << ADSC)|(1 << ADFR);|(1 << ADPS0)|(1 << ADPS2) out ADCSRA, r16 ldi r16, 0xFF out DDRB, r16;порт B на вывод clr r16 out DDRA, r16 out PORTA, r16 sei MAIN: rjmp MAIN interrupt: ;обработчик прерывания in r20, ADCL in r21, ADCH andi r21, 0x03 output PORTB, r20 rcall delay output PORTB, r21 rcall delay reti delay: ;подпрограмма задержки delay1: ldi r17, 100 delay2: ldi r18, 100 delay3: dec r18 brne delay3 dec r17 brne delay2 dec r19 brne delay1 ret При запуске начинают мигать сначала все 8 диодов, а затем младшие два, с интервалом пару секунд. Что свидетельствует, о том, что из ADCL/ADCH извлекаются только единицы, а ведь должны быть нули, как я понимаю? Ведь на вход не поступает напряжение. Затем при нажатии на 7-ю кнопку, начинают мигать младшие три диода - т.е. в регистре ADCH - нули, а в ADCL - 0x07. Пожалуйста объясните мне почему так происходит? Код вполне рабочий (если ret в конце заменить на reti). Попробовал толко что, правда не мега, а AT90S8535. (Я тоже начинающий и играюсь сейчас с АЦП). Мигает и правильно показывает, (толко конечно не от нажатия кнопочки, а сам по себе, так как кнопка в коде не упомянута). Скорее всего проблема не в коде. Например внешнее опорное напряжение равно нулю. Или на измерительном входе напряжение не меняется. Или, что нибудь напутано в фузах. Спасибо, за внимание к моей проблеме. Проблема в том, что я слаб в схемотехнике. Насчет опорного напряжения: наверное, оно действительно равно нулю, потому что я никаких ИОНов не подключал. Я пробовал использовать внутр. ИОН загрузив в ADMUX 0xC7 вместо 0x07, но ничего не изменилось. Буду признателен если объясните мне как правильно нужно измерять напряжение, - как подключить внешний ИОН (и где его брать :) ) или можно обойтись внутр. ИОНом? И как правильно подавать напряжение на вход АЦП, что для этого нужно, подойдут ли для этого кнопки? В понедельник мне нужно уже продемонстрировать работающую программу преподу. :( Заранее, спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Laksus 0 4 ноября, 2005 Опубликовано 4 ноября, 2005 · Жалоба 2005 11 04 _______________________________________ Насчет опорного напряжения: наверное, оно действительно равно нулю, потому что я никаких ИОНов не подключал. ___________________________ А можно просто померить тестером между выводом AREF (выв 32 для корпуса DIP-40) и общим GND(выв 31). При прошивке в ADMUX 0xC7 действительно должен подключиться внутренний и на этом выводе будет 2,5В. Если нет, то имеет смысл померять не закорочен ли он (при выключеном питании, тестером). Также надо мерять напряжение на выводе АЦП (например вывод 33 для АЦП7). _______________________________________ _______________________________________ ldi r16, 7 ;ADC7 - вход АЦП. out ADMUX, r16 ___________________________ Если так то надо соеденить выводы AREF & AVCC. (30 и 32 для корпуса ДИП-40). Для подключения внутреннего r16, 0xC7(2.56V) or r16,0x47(Vcc). _______________________________________ _______________________________________ ;запуск преобразования в цикл. режиме, разрешение прерывания. ldi r16, (1 << ADEN)|(1 << ADIE)|(1 << ADSC)|(1 << ADFR);|(1 << ADPS0)|(1 << ADPS2) out ADCSRA, r16 ___________________________ Закомментированы ;|(1 << ADPS0)|(1 << ADPS2) поэтому предделитель равен 2. То есть если у кварца частота 4 МГц, то частота АЦП 2 МГц. А Атмель обещает работу АЦП только до 1 МГц, а лучше 50...200кГц. Надо убрать точку с запятой. _______________________________________ _______________________________________ andi r21, 0x03 ___________________________ По моему лишняя. Хотя вреда нет. ______________________________________ ______________________________________ как подключить внешний ИОН (и где его брать ) или можно обойтись внутр. ИОНом? ___________________________ Если не требуется очень высокой точности, то проще всего взять напряжение питания в качестве внешнего. ______________________________________ ______________________________________ И еще. Рекомендую http://electronix.ru/redirect.php?http://[banned]/mkkurs05.htm, там вообще то на Си, но сайт http://electronix.ru/redirect.php?http://[banned] (2005 11 04) очень хорош для знакомства с микроконтроллерами, если адрес сайта меняется искать по "snGJTDSAIR3245". И наконец. ______________ 1 - Схемы STK500 не имею, поэтому куда идет седьмая кнопка незнаю. Про кнопку я вообще что-то не понял. Или же результат при ее нажатии должен запоминаться (как в токоизмерительных клещах). Или же надо мерить напряжение снятое с кнопки, или еще что. Если запоминаться, то прерыванию от АЦП результат надо читать, но не выводить, а затем по прерыванию от кнопки выводить. Но, по моему, наглядней непрерывное отображение. ______________ 2 - Как сделать пример использования АЦП в АТмега8535. ______________ 2.0 - Берем даташит на мега8535 (например на www.atmel.com ищем по 8535(броузер должен быть с поддержкой джавы)) , находим http://www.atmel.com/dyn/resources/prod_do...nts/doc2502.pdf (2.5МБ, естественно на английском). ______________ 2.1 - Берем переменный резистор 1...1000кОм. Цепляем один край на питание Vcc (вывод 10 для мега8535 в ДИП корпусе , например +5В), второй край на общий GND (11), средний вывод (ползунок) цепляем (через резистор 100...500кОм, чтобы не спалить чип) на один из входов АЦП, между входом АЦП и аналоговой землей GND (выв31) желательно включить конденсатор 0.1мкФ. Вывод АЦП выбирается так: ldi r16, 0 ;ADC0 - вход АЦП. out ADMUX, r16 ; будет выбран нулевой вход АЦП .... ldi r16, 7 ;ADC7 - вход АЦП. out ADMUX, r16 ; будет выбран седьмой вход АЦП ______________ 2.2 - Что будет опорным напряжением зависит от того, что прошито в 2 старших бита ADMUX (REF1 (бит7) и REF0(бит6)): 00xx xxxx - Внешнее, если не нужно высокой точности можно взять +5В с питания, то есть соеденить перемычкой выводы AREF (32) и AVCC(30). 01xx xxxx - Напряжение питания AVCC, но подключается само внутри, перемычки паять не надо. На вывод AREF желательно поставить конденсатор 0.1мкФ. 10xx xxxx - не используется 11xx xxxx - Внутренний источник опорного напряжения 2.56В. Опять же желателен конденсатор. Кстати, а у Вас действительно АТмега8535. Не 90S8535, у той не было внутреннего ИОН. В регистре AREF есть еще бит ADLAR. Если он равен 0, то результат выравнивается по правому краю, то есть все биты кроме двух старших в регистре ADCL. А если он =1, то все биты, кроме двух младших в регистре ADCH, при этом если нам достаточно точности 8 бит, то регистр ADCL можем просто отбросить. ______________ Итак например примем вход5, опорное напряжение возмем с источника питания внутренним подключением, результат выровняем влево (andi r21, 0x03 при этом, выравнивании влево, надо убрать). ldi r16, (1<<REFS0)|(1<<ADLAR)|(1<<MUX2)|(1<<MUX0) out ADMUX, r16 ______________ 2.3 - так как в коде указано .org ADCCaddr rjmp interrupt то результаты измерения будут выводится непрерывно, без кнопочек, по мере вращения переменного резистора. З.Ы. Рекомендую для наглядности измерения сделать разные паузы для вывода старших и младших разрядов. Наример старший 1 сек, а младший 0.25сек. З.З.Ы. Конкретно эти строчки ldi r16, (1<<REFS0)|(1<<ADLAR)|(1<<MUX2)|(1<<MUX0) out ADMUX, r16 не проверял, могут быть опечатки. Кроме того я сам довольно слаб в микроконтроллерах, могу и ошибаться. Александр 2005 11 04 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
L-P 0 4 ноября, 2005 Опубликовано 4 ноября, 2005 · Жалоба Во первых, большое спасибо за такой подробный ответ!! 1 - Схемы STK500 не имею, поэтому куда идет седьмая кнопка незнаю. Про кнопку я вообще что-то не понял. Или же результат при ее нажатии должен запоминаться (как в токоизмерительных клещах). Или же надо мерить напряжение снятое с кнопки, или еще что. В STK500 есть панелька из 8-ми кнопок. Их можно подключить с помощью шины к порту A. Таким образом, настроив 7-й выход порта А, как вход АЦП (ADC7), я пытаюсь добиться, того чтобы при нажатии кнопки импульс от ее нажатия измерялся. На самом же деле при нажатии этой кнопки все диоды гаснут, а когда она отпущена, горят все 10 разрядов (сначала 8, а потом 2). Когда я закомментировал ту строчку ldi r16, (1 << ADEN)|(1 << ADIE)|(1 << ADSC)|(1 << ADFR);|(1 << ADPS0)|(1 << ADPS2) получилось, что при нажатии кнопки горят 3 младших разряда, а при отпущенной кнопке старшие 7. А если отсоединить кнопки от порта А, то диоды начинают мигать совершенно случайным образом - не понимаю в чем дело... Кто знаком с STK500 объясните, пожалуйста, почему так происходит???!!! Еще раз спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 5 ноября, 2005 Опубликовано 5 ноября, 2005 · Жалоба L-P, я не очень люблю кросспостинги, поэтому ответ читайте в форуме Телесистем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Frox_SzC 0 10 августа, 2009 Опубликовано 10 августа, 2009 · Жалоба А на верилоге слабо???? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться