Поиск сообщества
Показаны результаты для тегов 'ASM'.
Найдено: 6 результатов
-
Здравствуйте. Вопрос к гуру, на сколько будет меньше разрыв данных при посылке через SPI 16бит, если ожидание готовности написать на ассемблере? И сразу второй вопрос, как правильно её вставить? void sendWord(uint16_t data) { SPDR = data; while(!(SPSR & (1<<SPIF))); // это заменить на ассемблерную вставку //вот тут видно задержку SPDR = data>>8; while(!(SPSR & (1<<SPIF))); // и это заменить на ассемблерную вставку } Этот код не работает (ассемблерная вырезка из даташита). Я не соображаю... asm volatile( "Wait_Transmit: in r16, SPSR sbrs r16, SPIF rjmp Wait_Transmit ret" ); Пока писал сообщение, понял свой косяк, регистр r16 в строке выше у меня не соответствует data.Тогда еще вопрос, как полностью этот кусок "sendWord" написать на ассемблере? Заранее Спасибо!
-
Привет, знатоки. Написал свою первую программу для контроллера STM8L152C6T6 (STM8L-Discovery). Это, собственно, моя первая программа для контроллеров вообще. Я многого не знаю и не понимаю. Возможно ваш ответ на мой вопрос будет банален. Используемая периферия: DAC, DMA, TIM4, CLK, GPIO Задача у программы такая: В EEPROM зашит один период синусоиды с дискретизацией 44100Гц. Период занимает ровно 101 байт, что по сути должно быть равно 2,29мс (1/44100*101). В коде программы только конфигурация периферии, одно прерывание на кнопке и пустой бесконечный цикл, который ничего не делает. Всю работу выполняет таймер, который настроен выдавать запрос к DMA на каждые 1/44100 (ядро тактируется 2мГц, таймер считает до 45). В свою очередь DMA забирает из EEPROM по одному байту на каждый запрос от таймера и передаёт его в DAC. Далее DAC выводит бесконечную синусоиду на ногу PF0. Прерывание на кнопке запускает весь этот механизм и зажигает светодиод. Проблема: Измеряя ногу PF0 осциллографом было замечено, что период синусоиды занимает около ≈4мс. Фото под катом. Меня это расстроило. Экспериментально выяснилось, что стоит только вписать в бесконечный цикл какую-нибудь проверку, например, [если значение текущего байта синусоиды = 0xFF, то зажечь светодиод, если 0x00, то потушить], то осциллограф показывает правильный тайминг в 2(с копейками)мс. В принципе в теле цикла может быть что угодно, кроме пустоты, и тайминг налаживается. Я не могу отдебажить дизассемблер, т.к. его не знаю. Это у меня в планах. Но я очень хочу понять, что происходит и почему пустой цикл рушит тайминг. Спасибо.
- 13 ответов
-
-1
-
Написать программу Асм атмега 1284. Фрагмент: после команды считать рабочий регистр (в котором может появиться число от 1 до 50) каждому числу соответствует 4 значения (это таблица) их нужно загрузить в четыре рабочих регистра для дальнейшей обработки) Где лучше хранить таблицу? Пример: считали 48 числа 5; 8; 21; 25 Считали 31 числа 4; 9; 11; 35
- 15 ответов
-
- asm
- программирование
-
(и ещё 1 )
C тегом:
-
Здравствуйте, весь день голову ломаю...Нужно подружить PIC16F72 с Flash-памятью AT45DB161D. В порядке эксперимента для начала хочу прочитать регистр статуса и идентификатор памяти, но она ничего совсем не отвечает . вот код: ;========== Настройка МК ============================================== SetMCU CALL Pause1s CLRF STATUS CLRF PORTA CLRF PORTB CLRF PORTC BSF STATUS, RP0 ;Банк 1 MOVLW b'00000000' ;Значение для направления PORTA MOVWF TRISA ;Настройка PORTA MOVLW b'00000000' ;Значение для направления PORTB MOVWF TRISB ;Настройка PORTB MOVLW b'00010000' ;Значение для направления PORTC MOVWF TRISC ;Настройка PORTC ;========== Инициализация SPI =========================================== BCF STATUS, RP0 ;Банк 0 CLRF SSPSTAT MOVLW b'00100000' ;Значение для настройки SPI MOVWF SSPCON ;Настройка SPI BSF PORTC, 6 ;Установка CS0 ;========== Чтение идентификатора AT45DB161D BCF PORTC, 6 ;Опускаем CS MOVLW 0x9F ;Опкод для чтения идентификатора CALL SPI_Trans ;Обмен SPI MOVLW 0x00 ;Ждем ответ CALL SPI_Trans MOVF SPI_RX,0 ;Принятый байт в аккумулятор MOVWF PORTB ;Вывод значения BSF PORTC, 6 ;Завершение передачи stop GOTO stop ;Бесконечный цикл ;========== Передача по SPI ====================================================================================================== SPI_Trans MOVWF SSPBUF ;Передача байта CALL Pause1ms ;Ожидание завершения передачи MOVF SSPBUF, 0 ;Копирование принятого байта MOVWF SPI_RX RETURN В протеусе с SPI_Debugger-ом все работает, если подставить на место ответа какое-нибудь значение, оно выводится в портБ. Но в железе с подключенной памятью ничего не происходит. Выводы памяти RESET, WP соединены с питанием. Питание 3,3В. Помогите, пожалуйста)
-
Добрый день, прошу помочь в реализации протокола общения между Atmega32 и компером ... язык только АСМ, т.к. Си плохо разумею))) Ниже привожу протокол: ********************* система команд: <ID>, <comand>, <data> <ID> это число или слово в ASCII <data> это слово размером 1 байт <comand>: -SA -- установить значение по напряжению, следующий байт значение от 0 до 255 -SV -- установить значение по току, следующий байт значение от 0 до 255 -M1 -- установить режим работы - ток -M2 -- установить режим работы - напряжение -M3 -- установить режим работы - импульсный -D -- установить все параметры по умолчанию -N -- включить ус-во -F -- выключить ус-во -RA -- передать мастеру действующее значение тока, следующий байт значение от 0 до 255 -RV -- передать мастеру действующее значение напряжения, следующий байт значение от 0 до 255 -RT -- передать мастеру значение температуры, следующий байт значение от 0 до 255 -RM -- передать мастеру характер нагрузки ток/напряжение, в ответ следует значение 'A' или 'V' в ASCII -RQ -- передать мастеру состояние аварии, если ус-во в штатном рехжиме то возвращается значение "0", если произошла остановка работы по причине аварии, то возвращается "1" - перегрузка по току во вторичной цепи, "2" - КЗ в нагрузке, "3" - температура 95С и выше, в ASCII ********************* может кто может оказать поддержку? Рассматриваю также денежную компенсацию за активную помощь в реализации кода ...