
Ассемблер (ASM) для AVR в вопросах и ответах
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Только не забудь - что каждый массив должен иметь 16 чисел, просто последним в массиве делаешь 0. 

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Смотрю здесь знающие КОТЫ собрались, пользуясь случаем спрошу: как заставить работать PORTB.6 и PORTB.7 в меге 8.
Если встреваю в тему, сильно не пинайте, потом удалюсь.
Если встреваю в тему, сильно не пинайте, потом удалюсь.
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А в чем проблема-то?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ха. Если бы я знал. На этих ногах должен висеть кварц, как альтернатива. Есть для этих ног фьюзы. Но как бы я их не конфигурировал, не подать, не принять на них ничего немогу. Например пишу PORTB.6 = 1 , на ноге получаю.... ничего неполучаю!
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Кроме состояния выводов порта PORTB=.... нужно еще и определить как будут выводы использоваться: DDRB=... По умолчанию DDRB=0, т.е. все ноги порта на ВХОД. Если выставить сейчас PORTB=1, то это ноги портаБ будут входом с ПОДТЯЖКОЙ, т.е. к ногам будет подключен внутренний резистор, второй стороной на +5вольт.
если нужно снять напряжение с ножек порта, то:
ну вот в кратце... это на выход.
а что конкретно нужно?
в ассемблере не пишут в такой форме:
зачем тебе ща внешний кварц. мега8 с внутренним сконфигурирована 1мГц, если фьюзы не трогать, все работает. портБ можешь как хочешь пользовать. Можно обойтись вообще без внешнего кварца. Внутренний настраиваится фьюзами SKSEL3...0 на 1,2,4,8 мГц.
Код: Выделить всё
ldi R16,0xFF или ldi R16,0b11111111
out DDRB,R16 ; порт на выход.
ldi R16,0xff ;на все выводы портаБ подать высокий уровень +5вольт. можешь светодиоды туда подключить через 1к резистор.
out PortB,R16если нужно снять напряжение с ножек порта, то:
Код: Выделить всё
ldi R16,0
out PortB,R16ну вот в кратце... это на выход.
а что конкретно нужно?
в ассемблере не пишут в такой форме:
Код: Выделить всё
PORTB.6 = 1зачем тебе ща внешний кварц. мега8 с внутренним сконфигурирована 1мГц, если фьюзы не трогать, все работает. портБ можешь как хочешь пользовать. Можно обойтись вообще без внешнего кварца. Внутренний настраиваится фьюзами SKSEL3...0 на 1,2,4,8 мГц.
Последний раз редактировалось Alexeus Сб апр 17, 2010 10:29:28, всего редактировалось 1 раз.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Блин я и на ASMе писал. Контроллерами занимаюсь не первый год, хоть слева и написанно что я родился! Проблема здесь не в программе. Проблема или в фъюзах или... на этом мысль обрывается.
а примеры записи пожалуйста
на С
DDRB=0xFF;
PORTB=0xFF;
или
PORTB.6=1;
PORTB.7=1;
а на асме был пример выше
ldi R16,0b00000011
out PortB,R16
Незнаю может с компилятором косяк, хотя на асме писал, та же проблема.
а примеры записи пожалуйста
на С
DDRB=0xFF;
PORTB=0xFF;
или
PORTB.6=1;
PORTB.7=1;
а на асме был пример выше
ldi R16,0b00000011
out PortB,R16
Незнаю может с компилятором косяк, хотя на асме писал, та же проблема.
Последний раз редактировалось Modest Сб апр 17, 2010 12:12:32, всего редактировалось 3 раза.
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
код в студию... сюда в смысле. а лучше в тему вопросы по CodeVision AVR -он Си использует.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Настраиваю весь порт б на выход, подаю в порт FF, горят все ноги кроме последних двух. Всё остальное прекрасно работает. В программе хоть использую переферию хоть нет, без разницы, результат один, последние 2 ноги неработают. Эт не на ед. мега8, а на всех скоко покупал. Разве никто не программил для меги 8 ? Разве токо у меня такие проблемы?
Последний раз редактировалось Modest Пн апр 19, 2010 07:05:37, всего редактировалось 1 раз.
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ну а запусти ДДРБ на выход ("1") в портБ тоже пусти "1" . по идее должны быть все в высоком уровне. и опроси затем пинБ и выведи куда нть- в портС или Д... если все пины будут в "1" значит может поджег внутри портБ.
таймер/счетчик2 у тебя не задействован?
прочти фьюзы, выложи сюда в каком они состоянии.
таймер/счетчик2 у тебя не задействован?
прочти фьюзы, выложи сюда в каком они состоянии.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[/quote]GP1 писал(а):Код: Выделить всё
dec key ;уменьшаем значение клавиши на 1, я так понимаю 0 - клавиша не нажата
;и умножаем на 16, как я говорил, иначе придется умножать на 15, а не все АВРки умеют это делать аппаратно
lsl key
lsl key
lsl key
lsl key
;и вуаля в key у нас смещение адреса для выбора массива
ldi ZL,low(button1*2) ;грузим в Z адрес первого массива
ldi ZH.high(button1*2)
;складываем адрес и смещение
add ZL,key
adc ZH,tmp ;tmp=0
;естественно при key=1 мы получим смещение 0, и получится адрес первого массива.
;дальше цикл
Очень хорошо! все так как нужно! Только пара нюансов:
1. если Key_buf=0 (кнопка не нажата), вычитаем 1, прибавляем к адресу начала первого массива и получаем адрес в памяти, стоящий за 16 байт до начала первого массива. -там может быть какие угодно значения... Ну да это не страшно, если в буфере "0", то я вообще не вызываю цикл обработки.
2. поясни пожалуйста для чего мы вычитаем еденицу от числа в буфере клавиш? все работает на ура, но я не пойму, откуда взялась такая мысль получить номер нажатой кнопки и обязательно вычесть из него еденицу, что бы потом расчитать смещение
3. мне еще подсказали что вместо 4 lsl можно один swap применить.
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
1. swap - применить можно, это точно
, только сначала надо старший нимбл обнулить,
просто когда мне нужно умножить на х2, х4, х8, х16 я пишу lsl -привычка
2. с Key_buf=0 все правильно, прежде чем вызывать цикл надо проверить на 0.
3. Почему вычитаем 1? Делов том что мк, как и все цифровые схемы считает 0-1-2-..., а у нас 0 - клавиша не нажата, нажатые клавиши соответственно 1-2-3-..., а так как мы вычисляем смещение относительно начального массива button1, то для кнопки с №1 должно быть нулевое смешение, т.е. для кнопки №1 имеем 16*(key_buf-1)=16*0=0, т.е. смещения нет и указатель содержит адрес "батон1".
что-то как-то не очень получилось объяснение
Код: Выделить всё
andi key_buf,0x0F
просто когда мне нужно умножить на х2, х4, х8, х16 я пишу lsl -привычка
2. с Key_buf=0 все правильно, прежде чем вызывать цикл надо проверить на 0.
3. Почему вычитаем 1? Делов том что мк, как и все цифровые схемы считает 0-1-2-..., а у нас 0 - клавиша не нажата, нажатые клавиши соответственно 1-2-3-..., а так как мы вычисляем смещение относительно начального массива button1, то для кнопки с №1 должно быть нулевое смешение, т.е. для кнопки №1 имеем 16*(key_buf-1)=16*0=0, т.е. смещения нет и указатель содержит адрес "батон1".
что-то как-то не очень получилось объяснение

Re: Ассемблер (ASM) для AVR в вопросах и ответах
зачем старший нимбл обнулять, в переменной будут только кнопки 0,1,2,3,4,5,6 старший нимбл и так 0х0х будет.
ничего, нормально объяснил. я понял. спс )
ничего, нормально объяснил. я понял. спс )
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Alexeus писал(а): мне еще подсказали ...
А кто подсказал, открой секрет
-
Mikhail
- Родился
- Сообщения: 9
- Зарегистрирован: Пт май 04, 2007 22:32:16
- Откуда: Великий Новгород
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Есть у кого-нибудь исходник для датчика ds18b20? А то у меня никак не получается.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
а у меня такой вопрос: что должно поменяться в коде если используется числа с фиксированной запятой?
.include "tn2313def.inc"
;инициализация USART
; Set baud rate
ldi r17,0 ;загружаем в регистр r17 ноль
ldi r16,0x33 ;загружаем в регистр r16 число 0b00110011
out UBRRH, r17 ;определяем старший байт скорости по USART
out UBRRL, r16 ;определяем младший байт скорости по USART
; Enable receiver and transmitter
ldi r16, (1<<RXEN)|(1<<TXEN) ;загружаем в r16 число 0b00011000
out UCSRB,r16 ;засылаем его в регистр управления и контроля В.
; Set frame format: 8data, 2stop bit
ldi r16, (1<<USBS)|(3<<UCSZ0) ;загружаем в r16 число 0b00001010
out UCSRC,r16 ;засылаем его в регистр управления и контроля С.
;прием первого числа
USART_Receive_1:
; Wait for data to be received
sbis UCSRA, RXC ;проверяем флаг приема
rjmp USART_Receive_1 ;если не готов, то снова ждем
; Get and return received data from buffer
in r16, UDR ;считываем принятый байт в r16
;прием второго числа
USART_Receive_2:
; Wait for data to be received
sbis UCSRA, RXC
rjmp USART_Receive_2
; Get and return received data from buffer
in r17, UDR ;считываем принятый байт в r17
;итак, получены два числа.
;Первое в r16, второе в r17
;
;перемножаем
MOV R0,R17 ;содержимое r17 посылаем в r0
SUB R17,R17 ;вычитаем из r17 содержимое r17
LDI R27,9 ;загружаем в r27 число 9
RJMP met1 ;переход на met1
met3:
BRCC met2 ;в случае сброшенного флага переноса уходим на met2
ADD R17,R0 ;складываем r17 и r0. Результат помещаетсяв r17.
met2:
LSR R17 ;сдвигаем r17 вправо (логический).
met1:
ROR R16 ;ротация r16 вправо
DEC R27 ;вычитаем из r27 единницу
BRNE met3 ;если результат не равен нулю, то переходим на met3.
;результат перемножения в r16
;отправляем
USART_Transmit:
; Wait for empty transmit buffer
sbis UCSRA,UDRE ;проверяем готовность регистра передачи
rjmp USART_Transmit ;если не готов, то опять ждем
; Put data (r16) into buffer, sends the data
out UDR,r16 ;засылаем содержимое r16 в регистр передачи USART
;
;ALLES IN ORDNUNG!!!
;
.include "tn2313def.inc"
;инициализация USART
; Set baud rate
ldi r17,0 ;загружаем в регистр r17 ноль
ldi r16,0x33 ;загружаем в регистр r16 число 0b00110011
out UBRRH, r17 ;определяем старший байт скорости по USART
out UBRRL, r16 ;определяем младший байт скорости по USART
; Enable receiver and transmitter
ldi r16, (1<<RXEN)|(1<<TXEN) ;загружаем в r16 число 0b00011000
out UCSRB,r16 ;засылаем его в регистр управления и контроля В.
; Set frame format: 8data, 2stop bit
ldi r16, (1<<USBS)|(3<<UCSZ0) ;загружаем в r16 число 0b00001010
out UCSRC,r16 ;засылаем его в регистр управления и контроля С.
;прием первого числа
USART_Receive_1:
; Wait for data to be received
sbis UCSRA, RXC ;проверяем флаг приема
rjmp USART_Receive_1 ;если не готов, то снова ждем
; Get and return received data from buffer
in r16, UDR ;считываем принятый байт в r16
;прием второго числа
USART_Receive_2:
; Wait for data to be received
sbis UCSRA, RXC
rjmp USART_Receive_2
; Get and return received data from buffer
in r17, UDR ;считываем принятый байт в r17
;итак, получены два числа.
;Первое в r16, второе в r17
;
;перемножаем
MOV R0,R17 ;содержимое r17 посылаем в r0
SUB R17,R17 ;вычитаем из r17 содержимое r17
LDI R27,9 ;загружаем в r27 число 9
RJMP met1 ;переход на met1
met3:
BRCC met2 ;в случае сброшенного флага переноса уходим на met2
ADD R17,R0 ;складываем r17 и r0. Результат помещаетсяв r17.
met2:
LSR R17 ;сдвигаем r17 вправо (логический).
met1:
ROR R16 ;ротация r16 вправо
DEC R27 ;вычитаем из r27 единницу
BRNE met3 ;если результат не равен нулю, то переходим на met3.
;результат перемножения в r16
;отправляем
USART_Transmit:
; Wait for empty transmit buffer
sbis UCSRA,UDRE ;проверяем готовность регистра передачи
rjmp USART_Transmit ;если не готов, то опять ждем
; Put data (r16) into buffer, sends the data
out UDR,r16 ;засылаем содержимое r16 в регистр передачи USART
;
;ALLES IN ORDNUNG!!!
;
- Gudd-Head
- Друг Кота
- Сообщения: 20091
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Mikhail писал(а):Есть у кого-нибудь исходник для датчика ds18b20? А то у меня никак не получается.
Что именно не получается?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
как их задать числа с фиксированной точкой? как они описываются? как и куда вставить?
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
На АСМе числа не описываются, нужно просто определиться с разрядностью и забронировать необходимое количество регистров/ЯП.
-
Mikhail
- Родился
- Сообщения: 9
- Зарегистрирован: Пт май 04, 2007 22:32:16
- Откуда: Великий Новгород
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Gudd-Head писал(а):Mikhail писал(а):Есть у кого-нибудь исходник для датчика ds18b20? А то у меня никак не получается.
Что именно не получается?
Я использовал этот кусок кода для датчика. И при симуляции в протеусе выдает ошибку (мк давит землю а датчик держит высокий уровень. Или наоборот.), и считывает все единицы.
- Вложения
-
- DS18B20.txt
- (4.52 КБ) 301 скачивание
