Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15583
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение BOB51 »

Зависит от режима работы.
При "ручном" останове текущее содержимое таймера не изменится (если момент останова не совпадет с соответствующей точкой работы таймера - например сброс по совпадению).
Насчет обнуления - это только или по сбросу или по выходу из сна оговорено - смотрим соответствующий раздел даташита.
8)
Реклама
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение akl »

[uquote="a1000",url="/forum/viewtopic.php?p=3909218#p3909218"]... Установив биты предделителя CS12 – CS10 в "000" мы останавливаем таймер. При этом TCNT1 обнуляется? Если опять запустить счёт он продолжится со значения в момент остановки или начнётся с нуля?[/uquote]Да, таймер останавливает счёт. Предделитель нет! При последующем запуске продолжение счёта в моменты переполнения предделителя.
Реклама
Аватара пользователя
a1000
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс окт 18, 2020 19:01:52
Откуда: Харьковская область

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение a1000 »

Сидел разбирался с кодом akl. Напишу, что я понял и свои вопросы.
Стартовая инициализация. Вы убрали очистку ОЗУ. Вы считаете это лишним, или спрятали что-бы не загромождать код? С настройками таймера понятно - счётчик стоит, прерывания по захвату разрешены, предделитель сброшен. В R22 заготовка для TCCR1B.
Основной цикл. Пока Т=0 - крутимся вначале.
Прерывание. По первому заходу всё ясно - запускаем счётчик, сбрасываем флаг из R30 и в основной цикл. А вот второй заход (с переходом на метку ZAHVAT) мне не совсем понятен. Я бы сократил его до

Код: Выделить всё

ZAHVAT:
   in Temp1,ICR1L    ;копируем значение регистра захвата
   in Temp2,ICR1H
   SET  ;устанавливаем бит Т
EXT:
RETI
Ведь после этого мы попадаем в LOOP с Т=1. Нас пропустит на вывод на индикатор и задержку. А в конце вы поставили

Код: Выделить всё

rjmp   RESET
А там все необходимые настройки таймера и флагов уже прописаны. Так-что все манипуляции с регистрами в прерываниями я считаю излишними.
И последний вопрос. Если вы убрали очистку ОЗУ из блока стартовой инициализации, что очистит TCNT1?
Это Спарта! В смысле, ассемблер. Все ручками.
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение akl »

[uquote="a1000",url="/forum/viewtopic.php?p=3909483#p3909483"]...убрали очистку ОЗУ из блока стартовой инициализации, что очистит TCNT1?[/uquote]Область адресов RAM и область регистров I/O разные. А так, да просто не включил при инициализации

Код: Выделить всё

   ;настройка таймера1
   ldi Temp1, 0b00000000
   out TCCR1A, Temp1

;   CLR Temp1         ;обнуляем счётчмк
   out TCNT1H,Temp1
   out TCNT1L,Temp1
;================
;   LDI   R16,1<<PSR10
;   OUT   SFIOR,R16   ; обнулить предделитель таймера
;================
Убрал очистку предделителя при инициализации. Лучше её делать в начале измерения, чтобы счет вкупе с предделителем начинался с одного и того же места.

Код: Выделить всё

TIM1_CAPT:            ;обработчик прерывания по захвату таймера 1
   SBRS R30,0   
   rjmp ZAHVAT

   LDI   R16,1<<PSR10 ;!!!!!!!!!!!!!!!!!!
   OUT   SFIOR,R16      ;!!!!!!!!!!!!!!!

   OUT   TCCR1B,R22
   CBR   R30,1<<0
   rjmp EXT
ZAHVAT:
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
a1000
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс окт 18, 2020 19:01:52
Откуда: Харьковская область

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение a1000 »

Да, область регистров I/O при такой очистке не затрагиваются. Попробую вечером объединить свой код с вашим.
Это Спарта! В смысле, ассемблер. Все ручками.
Реклама
Аватара пользователя
vistador
Это не хвост, это антенна
Сообщения: 1393
Зарегистрирован: Ср янв 30, 2008 17:52:55

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение vistador »

Подскажите пожалуйста..
Вот читаю ДШ на Тини13...

Про внешние прерывания..
Там написано что прерывания осуществляются от пинов: INT0 и PCINT0....PCINT5. с последними все понятно... но вот INT0 на каком выводе ???
Или я чтото не понял...?
Вложения
IMG_20201028_010908.jpg
(79.3 КБ) 214 скачиваний
Реклама
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение akl »

Для soic
PB1 (MISO/AIN1/OC0B/INT0/PCINT1)
Аватара пользователя
vistador
Это не хвост, это антенна
Сообщения: 1393
Зарегистрирован: Ср янв 30, 2008 17:52:55

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение vistador »

[uquote="akl",url="/forum/viewtopic.php?p=3913981#p3913981"]Для soic
PB1 (MISO/AIN1/OC0B/INT0/PCINT1)
[/uquote]
Большое спасибо...

Пс
Вот я лох...
Не заметил...
Вложения
IMG_20201028_015235.jpg
(43.43 КБ) 193 скачивания
Игорь_396
Встал на лапы
Сообщения: 102
Зарегистрирован: Ср дек 25, 2019 21:17:31
Откуда: Саратов

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Игорь_396 »

Всем доброго дня. Завалялось у меня несколько штук attiny261, ради интереса решил попробовать запустить PWM6 Mode. Даташит изучал как мог, с помощью гуглопереводчика. Попробовал в протеусе - на выходах сигнала нет. В железе еще не собирал.. Подскажите, где ошибка? CKSEL fuses 0001, SUT1..0 = 10.
Код инициализации таймера1 под спойлером.

Код: Выделить всё

  ldi temp, 0b00111111  ; выводы ШИМ на выход (6 PWM)
		  out ddrb, temp        ;        
            
;        t1
                  ldi temp, 1<<PLLE ; включаем PLL
		  out PLLCSR, temp  ;

		  in temp, PLLCSR   ; ждем установки
		  sbrs temp, PLOCK  ; бита PLOCK 
		  rjmp PC-2         ;
                  ldi temp, 1<<PCKE|1<<PLLE ; включаем прескалер
		  out PLLCSR, temp  ;

                  ldi temp, 1<<DTPS10; Dead Time
		  out TCCR1B, temp     ;
		  ldi temp, 0b00110011 ;
		  out DT1, temp        ;

		  ldi temp, 1<<COM1D0|1<<PWM1D;
		  out TCCR1C, temp    ;
                  ldi temp, 1<<WGM11 ;
		  out TCCR1D, temp   ;
		  ldi temp, 1<<COM1A0|1<<COM1B0|1<<PWM1A|1<<PWM1B; PWM6, ïîäêë âûõîäû.
		  out TCCR1A, temp   ;

		  ldi temp, 1        ; 341
		  out TC1H, temp     ;
		  ldi temp,85        ;
		  out  OCR1A, temp   ;
И еще вопрос возник - что за регистр на фото? Не нашел про него описания в ДШ. По названию вроде бы понятно, что он должен делать, но в него ничего не пишется и адрес его странный. [img][img]https://img.radiokot.ru/files/138172/thumbnail/2e26kx6sqy.png[/img][/img]
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение akl »

Стартовать тоже нужно
Спойлер

Код: Выделить всё

	ldi temp, 0b00111111  ; выводы ШИМ на выход (6 PWM)
	out ddrb, temp        ;       
           
	ldi temp, 1<<PLLE ; включаем PLL
	out PLLCSR, temp  ;

         in temp, PLLCSR   ; ждем установки
         sbrs temp, PLOCK  ; бита PLOCK
         rjmp PC-2         ;
           ldi temp, 1<<PCKE|1<<PLLE ; включаем прескалер
         out PLLCSR, temp  ;

	LDI R21,1<<DTPS10; Dead Time
	out TCCR1B,R21     ;
;	ldi temp, 1<<DTPS10; Dead Time
;	out TCCR1B, temp     ;

         ldi temp, 0b00110011 ;
         out DT1, temp        ;

	ldi temp, 1<<PWM1A|1<<COM1A1|1<<COM1B1; PWM6, iiaee auoiau.
;????	lldi temp, 1<<PWM1A|1<<COM1A1|1<<COM1B1; PWM6, iiaee auoiau.
         out TCCR1A, temp   ;
         ldi temp, 1<<COM1D1 ;
         out TCCR1C, temp    ;
           ldi temp, 1<<WGM11 ;
         out TCCR1D, temp   ;

         ldi temp, 1        ; 341
         out TC1H, temp     ;
         ldi temp,85        ;
         out  OCR1A, temp   ;
         ldi temp,75        ;
         out  OCR1B, temp   ;
         ldi temp,65        ;
         out  OCR1C, temp   ;

	LDI R21,1<<DTPS10|1<<CS10; Старт Dead Time+F_CPU/1
	out TCCR1B,R21     ;

	RJMP	PC
По регистру :dont_know:
Аватара пользователя
a1000
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс окт 18, 2020 19:01:52
Откуда: Харьковская область

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение a1000 »

Всем счастливого нового года!
Прикупил на али такую приблуду
Изображение
Называется LED-матрица 8x8 с драйвером max7219. Поигрался с ней в среде Arduino и решил запустить её на ASM. МК atmega8. Включение отдельных пикселей реализовал без проблем. Решил сделать бегущий огонёк в первой строке. Вот код
Спойлер

Код: Выделить всё

.CSEG
;=============
; Таблица прерываний
    .ORG 0x00
        RJMP	RESET			

;=============
; ***** ПОДПРОГРАММы РАБОТЫ С MAX7219
SPI_transfer:     ;отправка данных (Temp5 - команда, Temp6 - данные)
    cbi PORTB, 2 // Вывод SS на 0
	OUT SPDR, Temp5 ;отправляем команду
vozvr_1:	
	sbis SPSR, SPIF ;ждём отправки    
    rjmp vozvr_1
	sbi PORTB, 2 // Вывод SS на +5
	cbi PORTB, 2 // Вывод SS на 0
	OUT SPDR, Temp6 ;отправляем данные
vozvr_2:	
	sbis SPSR, SPIF ;ждём отправки    
    rjmp vozvr_2
	sbi PORTB, 2 // Вывод SS на +5
	RET          


delay_01:         ;задержка 0,1 сек 
; delaying 799995 cycles:
          ldi  R17, $5F
WGLOOP0:  ldi  R18, $17
WGLOOP1:  ldi  R19, $79
WGLOOP2:  dec  R19
          brne WGLOOP2
          dec  R18
          brne WGLOOP1
          dec  R17
          brne WGLOOP0
; ----------------------------- 
; delaying 3 cycles:
          ldi  R17, $01
WGLOOP3:  dec  R17
          brne WGLOOP3
; ----------------------------- 
; delaying 2 cycles:
          nop
          nop
		  RET
; =========== 


; ***** КОНЕЦ ОБЛАСТИ ПОДПРОГРАММ******
;=============
; Прерывание по сбросу, стартовая инициализация 
RESET:	
    ; Инициализация стека
    LDI 	Temp1, LOW(RAMEND)
    OUT 	SPL, Temp1
    LDI 	Temp1, HIGH(RAMEND)	
    OUT 	SPH, Temp1
    
    CLI  ; Глобальный запрет прерываний
    
	
    ; настройка SPI
    ldi temp1,0b00101100 // SS, SCK, MOSI на выход
    out DDRB, temp1 // Отправляем в конфигуратор порта
    sbi PORTB, 2 // Вывод SS на +5 
    ldi temp1, 0b01010000 // Настраиваем SPI, SPE = 1 это разрешит протокол;
    out SPCR, temp1 // MSTR = 1 говорит что мы руководим посылкой
	

	; ***** ИНИЦИАЛИЗАЦИЯ МИКРОСХЕМЫ ******
	;режим "НЕ ТЕСТ"
	LDI 	Temp5, 0x0F
	LDI 	Temp6, 0x00
	RCALL SPI_transfer

	;режим "НЕ СОН"
	LDI 	Temp5, 0x0C
	LDI 	Temp6, 0x01
	RCALL SPI_transfer

	;яркость
	LDI 	Temp5, 0x0A
	LDI 	Temp6, 0x08
	RCALL SPI_transfer

	;режим "ВСЕ ИНДИКАТОРЫ"
	LDI 	Temp5, 0x0B
	LDI 	Temp6, 0x07
	RCALL SPI_transfer

	;режим "БЕЗ ДЕКОДЕРА"
	LDI 	Temp5, 0x09
	LDI 	Temp6, 0x00
	RCALL SPI_transfer

	;очистка
	CLR     Temp6
	LDI 	Temp4, 0x08
	m01:
	MOV     Temp5, Temp4
	RCALL SPI_transfer
	DEC     Temp4
	tst Temp4
    BRNE m01 


	; ***** КОНЕЦ ИНИЦИАЛИЗАЦИИ ******

	LDI 	Temp6, 0b00000001

	Proga: // Основная программа
	
	LDI 	Temp5, 0x01
	RCALL SPI_transfer
	rol     Temp6
	RCALL delay_01
	
	rjmp Proga
Огонёк бежит, но почему-то постоянно светятся первые пиксели во второй, четвёртой и восьмой строках. Выглядит это так

Не могу понять где косяк, подскажите.
Это Спарта! В смысле, ассемблер. Все ручками.
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение akl »

Не понятно дергание лапы PORTB,2/SS. Для защелки MAX7219 лапа PB2/SS не подходит

Код: Выделить всё

;=============
.equ	LOAD=PB1
; ***** ПОДПРОГРАММы РАБОТЫ С MAX7219
SPI_transfer:     ;отправка данных (Temp5 - команда, Temp6 - данные)
	CBI PORTB,LOAD //
;    cbi PORTB, 2 // Вывод SS на 0
   OUT SPDR, Temp5 ;отправляем команду
vozvr_1:   
   sbis SPSR, SPIF ;ждём отправки   
    rjmp vozvr_1
;   sbi PORTB, 2 // Вывод SS на +5
;   cbi PORTB, 2 // Вывод SS на 0
   OUT SPDR, Temp6 ;отправляем данные
vozvr_2:   
   sbis SPSR, SPIF ;ждём отправки   
    rjmp vozvr_2
	SBI	PORTB,LOAD
;   sbi PORTB, 2 // Вывод SS на +5
   RET
Аватара пользователя
a1000
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс окт 18, 2020 19:01:52
Откуда: Харьковская область

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение a1000 »

Попробовал поменять РВ2 на РВ1 и РВ0 - вообще не запустилось. Включает тестовый режим и всё. Это когда светят все пиксели. Убрал дёрганье ножкой между посылкой первого и второго байта - стало работать как надо на РВ2.
Это Спарта! В смысле, ассемблер. Все ручками.
Аватара пользователя
a1000
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс окт 18, 2020 19:01:52
Откуда: Харьковская область

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение a1000 »

В процессе дальнейшего копания возникла ещё одна проблемка. Попробовал сделать кольцевой сдвиг символа влево. Задумка такова - в оперативке по метке Kod зарезервировано 8 байт. Там лежит построчно закодированный символ. Temp5 - счётчик и указатель на номер строки при передаче. Они совпадают. Извлекаем в Temp6 первый байт, отправляем в max7219, выполняем кольцевой сдвиг и возвращаем в оперативку с пост-инкрементом и снова по кругу. Получился такой код
Спойлер

Код: Выделить всё

LDI 	Temp5, 0x01   
Proga: 
	
	LDI	XL,low(Kod)     //запись адреса метки ОЗУ
	LDI 	XH,High(Kod)
	m05:
	LD  	Temp6, X	//получение данных
	RCALL SPI_transfer      //подпрограмма отправки данных (Temp5 и Temp6)
	CLC
	rol     Temp6           //сдвиг байта влево
	BRCC m03
	ORI     Temp6,0b00000001 
	m03:
	ST      X+,Temp6         //сохранение нового сзачения с пост-инкрементом
	INC     Temp5            //инкрементируем счётчик
	CPI     Temp5,0x09       //проверяем прошло-ли 8 циклов
	BRNE    m05              //если нет на метку m05
	                         //если да:
	RCALL delay_01           //задержка
	LDI 	Temp5, 0x01      //обновляем счётчик
	
	rjmp Proga 

Символ выводится но не сдвигается. Где я напартачил?
Это Спарта! В смысле, ассемблер. Все ручками.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15583
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение BOB51 »

Для матричного экрана более рационально менять содержимое буфера видеопамяти, а затем делать пакетный вывод в СБИС индикатора.
8)
Аватара пользователя
a1000
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс окт 18, 2020 19:01:52
Откуда: Харьковская область

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение a1000 »

А можно немного по подробнее.
Это Спарта! В смысле, ассемблер. Все ручками.
dgrett
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение dgrett »

BOB хотел сказать, что ваши 8 байт являются видеопамятью. Каждые Х мС времени подпрограмма вывода выводит всё содержимое этой видеопамяти в ваш модуль 8Х8. А вы, когда ВАМ надо эту видеопамять модифицируете.
Я всё-всё узнAю и стану профессором.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15583
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение BOB51 »

Легче заново набросок сделать, чем в чужом, фрагментами представленном коде, разбираться.
Тем более, что в данном случае надо еще и к даташиту на MAX7219 плотненько возвернуться. Да со структурой привязки пикселей уточнить (теоретически там 8 колонок по 8 вертикальных точек в колонке - блок данных "на боку" - в наличии такой матрицы на данный момент нету за ненадобностью - могу лишь "теоретизировать").
Да и МК для меня не "базовый" - хотя в примитиве с программным SPI что на тиньку2313, что на мегу8 лаподрыг особо отличаться не должен...
Разве что без привязки к МК то уже библиотечка получается...
8)
Аватара пользователя
a1000
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс окт 18, 2020 19:01:52
Откуда: Харьковская область

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение a1000 »

Не уверен, что
BOB51 писал(а): более рационально менять содержимое буфера видеопамяти, а затем делать пакетный вывод
8)
Тогда надо будет вытащить байт из оперативки, модифицировать, вернуть обратно, а потом ещё раз вытаскивать для отправки. Как по мне - вытащил, отправил, модифицировал, вернул более оптимально. По поводу
BOB51 писал(а):в данном случае надо еще и к даташиту на MAX7219 плотненько возвернуться. Да со структурой привязки пикселей уточнить
это всё не нужно. По работе с MAX7219 вопросов нет. Вывод реализован без вопросов. Вопрос в модификации. Почему после первого прохода я получаю из оперативки немодифицированные данные?
Это Спарта! В смысле, ассемблер. Все ручками.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15583
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение BOB51 »

Вообще-то данные из ячейки видеобуфера вытаскиваются однократно на каждое обращение к СБИС контроллера.
Тем более, что у АВРок косвенное чтение памяти имеется.
А вот отсылка блока из двух байт при каждом обращении к СБИС (адрес и данные) выполняется.
Полный цикл - пересылка блока 8*2=16 байт по SPI заметно длиннее всех имеющихся обращений к ОЗУ.
8)
Касательно обработки содержимого видеобуфера - это уже на усмотрение автора.
В зависимости от задачи можно обработку и в регистровом файле делать.
:wink:
Допустим блок видеобуфера в ОЗУ имеет вот такое размещение:
Изображение
а вот относительно дисплея... шаблон развернется "боком":
Изображение
Это как первая подсказка к алгоритму обработки.
И еще одно замечание -
Если для циклических процессов (бегущие точки или полоски, разнообразные сдвиги) еще можно применить программные решения, то для версий мультипликации гораздо выгоднее применять ряд из "кадров", размещенных или в ПЗУ или во внешней ЕЕПРОМ.
8)
Ответить

Вернуться в «AVR»