Jump to content

Recommended Posts

памагите начать выполнение задания , начинается так : " Запишите в регистры R1 и R2 адрес ячейки памяти 001D " С помощью какой "mnemonic" можно это записать??

заранее спасибо!

Share this post


Link to post
Share on other sites

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

Судя по наименованию регистров, это контроллер ATMEL, команда загрузки константы в регистр - LDI Rx,K , но если ты внимательно почитаешь документацию на контроллер, ты удивишься что эта команда для многих контроллеров работает только с регистрами R16-R31... поэтому загрузить константу в R1 и R2 можно только через промежуточный регистр, затем используя команду MOV, чтобы загрузить ноль в регистр - не обязательно загружать константу, можно его просто обнулить: CLR Rx.

Share this post


Link to post
Share on other sites

спасибо большое! да, да контроллер ATMEL ! а можно сразу вопрос по этому поводу: а какие еще есть контроллеры? просто навскидку назовите еще парочку...

команда LDI загружает именно костанту в регистр, а в задании "адрес ячейки памяти", или это и есть константа??

и почему тогда написано " 001D " а не " 00 и 1D " ?

про то как обнулить младший регистр спасибо отдельное, возьму на заметку!

Share this post


Link to post
Share on other sites

Вебинар STM32G0 – новый лидер бюджетных 32-битных микроконтроллеров от STMicroelectronics

Компания Компэл приглашает вас 25 сентября принять участие в вебинаре, который посвящен новому семейству микроконтроллеров STM32G0. Вебинар рассчитан на технических специалистов и тех, кто хорошо знаком с семейством STM32. На вебинаре будут освоены современные методы тестирования производительности микроконтроллеров на примере самых бюджетных 32-битных семейств общего назначения STM32G0 и STM32F0 и проведено их подробное сравнение.

Подробнее

Там же говорится Адрес ячейки, а не содержимое.

Адрес - 16 битное число, а регистры 8 бит значит одна половинка адреса идет в один регистр, другая в другой. Надо только уточнить в какой ложить младшую часть адреса, а в какой старшую.

Поскольку регистр этот не индексный, то разницы нет никакой... лишь бы потом не забыть что куда.

Но есть еще индексные регистры, X, Y, Z. Эти регистры 16-битные, и образуются из пар R27-R28, R29-R30, R31-R32. Лучше конечно использовать другие регистры аналогично. Посмотри, как в этих регистрах распределяется старший-младший разряд.

Контроллеры производят Microchip, Atmel, motorola и т.д. и у каждой фирмы есть ряды контроллеров различного назначения.

Share this post


Link to post
Share on other sites

тяжеловато, но из сказанного решил написать код:

clr r1

ldi r16 , 1D

mov r2 , r16

во второй строчке ошибка.. " 1D " это в16ричной форме написано что ли? мне надо перевести в 10чную и получившееся значение записать во второй строчке...?

Share this post


Link to post
Share on other sites
                     

Литиевые батарейки Fanso в беспроводных датчиках пожарно-охранной сигнализации

Выбор подходящего элемента питания, способного обеспечивать требуемый уровень напряжения и выдавать необходимый ток на протяжении всего периода эксплуатации беспроводной пожарно-охранной системы является одной из первостепенных задач. Наиболее подходящим для этих целей элементом являются литий-тионилхлоридные элементы питания, а одним из наиболее конкурентоспособных производителей – компания Fanso, предлагающая своим клиентам продукты как универсальные, так и разработанные специально для решения конкретных задач.

Подробнее...

Почитай хелп к компилятору как указываются 16-ричные числа, во многих записываются как 0x1D

Share this post


Link to post
Share on other sites

просветления какие то есть в голове, Спасибо!

А вот дальше задание:

" Запишите в регистры R1 и R2 адрес ячейки памяти 001D . ЗАПИШИТЕ В ЭТУ ЯЧЕЙКУ ЧИСЛО 44. "

У меня в голове два варианта: 1) это как то сделать через R1 и R2 , но я не знаю как?

2) в програме написать:

ldi 0x001D , 44 но кажется это какойто бред,и прога выдает ошибку

Share this post


Link to post
Share on other sites

Скачай даташит на контроллер, и читай по нему способ адресации.

Для прямой загрузки в ячейку памяти используется команда STS k, Rn где k - адрес ячейки памяти, Rn - регистр значение которого туда загружается. Есть еще ST X,Rn где X - индексный регистр, в котором должен находится адрес ячейки из общего адресного пространства.

Почитай все-таки даташит ... на сайте атмела, есть переведенная документация по всему семейству контроллеров разделенная на части.

Share this post


Link to post
Share on other sites

читал читал даташит на русском, ничего не понял.. начал разбираться в ваших словах, пошаговый вывод :

" Для прямой загрузки в ячейку памяти используется команда STS k, Rn где k - адрес ячейки памяти, Rn - регистр значение которого туда загружается. "

ldi r18 , 44 ; т.е. регистру r18 присвоил число 44

sts 0x001D , r18 ; теперь в ячейку памяти загрузил r18 со значением 44

далее складываю число 55 с содержимым ячейки памяти 001D :

ldi r19 , 55

subi r19 , -0x001D ; получается я сложил 55 с числом 0x001D , а мне надо с содержимым ячейки..? вопрос : как обратиться к содержимому ячейки памяти ??

Share this post


Link to post
Share on other sites

Проще всего это делать при помощи регистров X, Y, Z. Нет команд для операций непосредственно над содержимым ячеек памяти, чтобы что-то с ними сделать, надо выгрузить значение в регистр. Хотя, есть исключение - инкремент и декремент можно производить непосредственно с ячейками памяти.

Еще раз посмотри модель памяти контроллера, память адресуемая при помощи регистров X,Y,Z - это общее адресное пространство регистров, портов и RAM... т.е. чтобы регистр X показал на ячейку памяти с адресом, нужно к этому адресу прибавить смещение с которого начинается память.

Кстати, а почему нельзя использовать команду сложения, ADD ?

Share this post


Link to post
Share on other sites

ADD нельзя использовать потому что операндами являются два регистра, а в нашем случае регистр и "ячейка памяти" - это я так думал! :)

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

теперь все получилось! УРААААААА!!!

Alexeyslav, С П А С И Б О ОГРОМНОЕ!!!

еще надо будет попробовать с регистрами Х, Y, Z....

Share this post


Link to post
Share on other sites

Добрый вечер. Такой вот вопрос от начинающего.

При подключенном питании к дисплею WH1602B на выводах 4 (RS), 5 (R/W), 11-14 (D4, D5, D6, D7) напряжение 5 В. При этом вся нижняя сторока засвечена. Вопрос: это нормально?

post-48557-076609300 1286725480_thumb.jpg

Share this post


Link to post
Share on other sites

из прочитанной мною литературы я понял что r26 это одно и то же что XL ? т.е. я понял что в проге можно писать и то и другое , но почему например на строчку " mov r2 , r26 " компилятор ошибку не выдает, а на " mov r2 , XL " показывает ошибку.?

Share this post


Link to post
Share on other sites

потому что в литературе используют свои обозначения. в своей программе можешь использовать свои определения для регистров (директива DEFINE) или назначит ему такое имя как в книжке, тогда ошибки не будет.

Share this post


Link to post
Share on other sites

Подскажите, что означаетнадпись обведеная красным (скрин из даташита на mega16)? Нужно припаивать нижнюю часть к общему проводу? Это обязательно?

post-6787-023982500 1287040188_thumb.jpg

Share this post


Link to post
Share on other sites

 Нужно припаивать нижнюю часть к общему проводу? Это обязательно?

post-6787-023982500 1287040188_thumb.jpg

Буквальный перевод надписи.

"Примечание:

Нижний контакт должен бытьприпаян к земле."

Share this post


Link to post
Share on other sites

Как вы себе это представляете? Микросхема не выдержит такого издевательства. Скорее всего достаточно пружинящего контакта.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Как вы себе это представляете? Микросхема не выдержит такого издевательства. Скорее всего достаточно пружинящего контакта.

Ничего необычного в пайке термопада нет. Практически все QFN, DFN корпуса паяют в печке или феном. И при этом паяется земляной полигон внизу корпуса. Как пример можно привести трансивер CC1100 Техаса или драйвер МОСФЕТов uCC27324 той же фирмы. Последнюю микросхему вообще нельзя эксплуатировать без припаянного термопада. Она попросту сгорит. Корпус размером 3х3 мм способен рассеять 3 ватта..., ессно, что без термоконтакта он сгорит в первые несколько секунд работы...

Впрочем и трансивер тоже не заработает без паяного основания... Но уже по сигнальным соображениям.

Share this post


Link to post
Share on other sites
Практически все QFN, DFN корпуса паяют в печке или феном
Не у всех есть такое оборудование.
(скрин из даташита на mega16)
Вроде АТмеги так сильно не греются, если их, конечно, не заводить на слишком высоких частотах и не снимать слишком большой ток с выводов.

Share this post


Link to post
Share on other sites

Нет фена, кто мешает микропаяльник купить? Свободно паяются 30 микронные золотые выводы  низкотемпературным припоем.  

Share this post


Link to post
Share on other sites
Практически все QFN, DFN корпуса паяют в печке или феном
Не у всех есть такое оборудование.
(скрин из даташита на mega16)
Вроде АТмеги так сильно не греются, если их, конечно, не заводить на слишком высоких частотах и не снимать слишком большой ток с выводов.

Причем тут нагрев?

Речь идет о высокочастотной топологии. Хотите уверенной работы МК в условиях помех - делайте как написано в даташите.

Есть допустимая температура и время пайки термопада. Указана в даташите. Фен (технический) никакая не экзотика и его стоит иметь если применяете такие корпуса. А уж демонтаж микросхем с ним вообще плевое дело...

Share this post


Link to post
Share on other sites

помогите пожалуйста разобраться:

Вот начало задачи: " наша программа будет просто включать СИД и удерживать его в этом состоянии. Прежде всего, необходимо определить входы и выходы. В этом проекте нам потребуется только один выход, в качестве которого будем использовать вывод RB0. "

почитав теорию я написал такой код:

ldi r16 , 0b11111110

out DDRB , r16 ; т.е.используется только один вывод туда и пишем 0, в остальные 1чки

в учебнике же написан ответ:

ser r16

out DDRB , r16

как я понимаю это ж не одно и то же! в этом случе устанавливаутся все 1чки и получается что ни один вывод не задействован...

Правильна моя логика?

Share this post


Link to post
Share on other sites

Запись в регистр направления DDR лог. 1 превращает его в выход, а лог. 0 превращает в вход

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Sofia Vin
      Предлагаем проектную работу в Москве:
      Микроконтроллер STM32F103.
        
      Есть встроенный код с использованием функций библиотеки FreeRTOS, код имеет описанный протокол для связи с внешним миром.
        
      Необходимо проводить доработку кода под задачи программиста верхнего уровня и его тестирование в составе оборудования. 
      Работа в лаборатории (м.Университет) и удаленно. 
      Оплата по договоренности.
      Если Вы обладаете опытом схемотехнического проектирования и программирования микроконтроллеров, и Вас заинтересовала данная возможность, ждем Ваши отклики по контактным данным:
      8 (925) 023-60-02   Алексей
      E-mail: nassa@marathon.ru
       
    • By Антон Плюшкин
      В общем есть небольшая тривиальная задача - сделать свитюльку. Контроллер управляет светодиодиками, цвета меняются, людишки довольны.
      Схема проста: Attiny44a -> 2n3904 x3 -> RGB-светодиод.
      Собрал, протестил, всё норм, но!
      Как только в коде я использую функцию задержки - _delay_ms (util/delay.h) - контроллер повисает!
      #define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { // Input/Output Ports initialization // Port A initialization // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRA=(1<<DDA7) | (1<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); // State: Bit7=0 Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B initialization // Function: Bit3=In Bit2=Out Bit1=In Bit0=In DDRB=(0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit3=T Bit2=0 Bit1=T Bit0=T PORTB=(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Phase correct PWM top=0xFF // OC0A output: Non-Inverted PWM // OC0B output: Non-Inverted PWM // Timer Period: 0,031875 ms // Output Pulse(s): // OC0A Period: 0,031875 ms Width: 0 us // OC0B Period: 0,031875 ms Width: 0 us TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Ph. correct PWM top=0x00FF // OC1A output: Non-Inverted PWM // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer Period: 0,031875 ms // Output Pulse(s): // OC1A Period: 0,031875 ms Width: 0 us // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // Timer/Counter 1 Interrupt(s) initialization TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1); // External Interrupt(s) initialization // INT0: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-11: Off MCUCR=(0<<ISC01) | (0<<ISC00); GIMSK=(0<<INT0) | (0<<PCIE1) | (0<<PCIE0); // USI initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC); // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0); ADCSRB=(0<<ACME); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR0=(0<<ADC1D) | (0<<ADC2D); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); unsigned char VL_OCR0A = 0, VL_OCR0B = 0, VL_OCR1A = 0; OCR0A = 0; OCR0B = 0; OCR1A = 0; while(1) { _delay_ms( 100 ); VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } } Т.е. если указать задержку в начале цикла, то светодиод не светится вообще.
      Если задержку убрать - светодиод немного подсвечивает всеми цветами.
      while(1) { _delay_ms( 100 ); // <--- ЗАДЕРЖКА --- VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } Где я накосячил?
      З.Ы.: Замечаний по поводу оптимизации кода, излишних переменных и п.р. прошу не писать - изощряюсь как могу ибо не пойму почему не работает
    • Guest Денис
      By Guest Денис
      В общем, есть такое чудо китайской техники (фото)
      Что оно может:
      1. Заряжаться через microUSB порт
      2. Кнопка вкл/выкл, она же переключает режимы
      3. 3 режима свечения светодиода (он светит разными цветами)
      Что я хочу сделать:
      1. Пункты 1 и 2 выше
      2. Разнообразить количество режимов, переливание статичный цвет и тд...
      Вопрос: как это сделать? что купить?

      P.S. К сожалению, в гугле не нашел подробной инструкции, а я в электронике я дуб дубом


    • By Reptile
      Доброго времени суток. Пытаюсь восстановить работоспособность колонок Top Device TDE 261/2.1. Колонки не раз ремонтировалась по части УНЧ, при очередном ремонте по ошибке (одинаковые разъемы) с трансформатора было подано переменное питающее напряжение на входы (разъем AUX/MP3) аудиопроцессора PT2313L  (3,10,14 ноги - AGND, R_IN2 L_IN2). В результате чего выгорел сам аудиопроцессор PT2313L. PT2313L был заменен. Но колонка по прежнему не запускается. Как я понял, не запускается сам PT2313L, на его аудиовыходах (ноги 24, 25) сигнала нет. Передняя панель работает: индикация, кнопки, енкодер. Имеется подозрение, что вместе с процессором выгорели линии DATA и/или CLK на MCU, так как MCU и PT2313L соединены по этим линиям напрямую друг с другом. В МК и всей этой цифровой штуке не очень шарю, не знаю, как грамотно проверить работоспособность этой цифровой части, поэтому прошу помощи - Возможно ли какими-либо способами восстановить колонку или уже всё... 
      Из приборов, к сожалению, только мультиметр, осциллограф отсутствует.
      Ниже немного измерений.
      Напряжения на линиях: STD-BY-ждущий режим (в скобках рабочий режим):
      DATA - 2.31В (1.9В).
      CLK - 0.125В (0.135В).
      Сопротивление между выводами:
      CLK_MCU-DATA_MCU - 47 Ом. 
      CLK_MCU/DATA_MCU-GND - около 0.22 Ом и там и там. Звонится в обе стороны.
      Питание MCU 5В, (4.6В STD-BY-ждущий режим, 4.0В рабочий режим и со временем также почему-то может падать до 3.6В)
      MCU - не известен, нет маркировки. 18 Выводов, DIP.
      Ноги MCU, которые удалось опознать:
      1 - DATA
      18 - CLK
      3 - GND (?)
      5 - GND (?)
      ? - они соединены вместе
      14 - VCC
      17 - not used (n/a)
      15, 16 - OSC
      ET6202 - управление индикатором, Control LED drive circuit
      Фото плат (под сполером) и даташиты прилагаются.
      Схемы данных колонок не имеется. Все что удалось найти это схема чуть более старшей модели TDE280/2.1, с данными колонками она мало что общего имеет, лишь общий принцип, узлы довольно сильно отличаются, но прикреплю на всякий, для общей информации.
      PT2313L
      ET6202
      TDE280
       
    • By bustamax
      Привет хочу сделать лазерный проектор по типу элт монитора. Из vga разъёма выходят 2 Синала срочной и кадровой развёртки. Со строчной разобрался. Вопрос по кадровой. Она будет реализована с помощью гальванометра который после каждой строки отклоняет зеркало на какой то угол ( пускай строк 480 тогда если взять напряжение управления гальво от 0 до 10 вольт и шаг задать 0,01 в - будет 1000 строк) даже если строк будет 720 в 1000 они уместятся.
      Так вот принцип придумал такой - с выхода Hsync поступает сигнал строки - микросхема прибавляет пускай напряжение +0,01 вольт, затем поступает 2й сигнал от Hsync микросхема прибавляет ещё 0,01 вольт ( напряжение 0,02) наш гальво отклонился уже до 3й строки и так далее пока не поступит сигнал VSYNC о смене кадра - Гальво возвращается в 0.
      Хотя правильней вот так:
      Либо сделать что бы гальво двигался при отсутствии сигнала Hsync - скажем поступает сигнал строчной развёртки отрабатывает строчная развертка затем сигнал становится логическим 0 и тут срабатывает гальво и т.д пока не придёт сигнал от vsync (логическая 1).
       
      по факту схема даж считать не должна - есть сигнал прибавляем есть другой сигнал сбрасываем
       Я в электронике логический 0 но спаять по приведённой схеме смогу)
      если кто поможет спасибо
       
       
×
×
  • Create New...