Ассемблер (ASM) для AVR в вопросах и ответах
Похоже кварц не заводится. Если применен действительно 90S2313, попробуйте убрать кондесаторы рядом с кварцем, а корпус оного посадите на 10 лапу.
- Реклама
Попробовал, не помогло. Другой кварц поставил, результат тот-же. И вот в чем парадокс-то - на макетке все работало.
Если это поможет - вот видео.
Если это поможет - вот видео.
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Посмотрел видео. Проблема, по мне, в тактировании. Кварц к контроллеру поставить поближе. Хорошо вымыть в районе 4,5 лап.
Действительно, притчина в тактировании - отсутствовал контакт конденсаторов с минусом. Аж стыдно на такой мелочи завалится. 
PS. Во время сборки схема чуток изменилась - аноды индикаторов (bsr10011) питаются через нпн транзисторы, и на 6-ю ногу подтяжка "-" через 10кОм, иначе минуты и часы переставяются по ветру
PPS. Протупают сегменты из предидущего розряда. Как от этого избавится?
PS. Во время сборки схема чуток изменилась - аноды индикаторов (bsr10011) питаются через нпн транзисторы, и на 6-ю ногу подтяжка "-" через 10кОм, иначе минуты и часы переставяются по ветру
PPS. Протупают сегменты из предидущего розряда. Как от этого избавится?
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Выключить текущий разряд, включить сегменты следующего разряда, включить следующий разряд.Jetetex писал(а):PPS. Протупают сегменты из предидущего розряда. Как от этого избавится?
- Реклама
Напрямую к ШИМ этот вопрос не относится, поэтому задам его здесь.
Вот это надо двигать в цикле по кругу... Т.е. значение Capture1 сдвинуть на место Capture2 и т.д., а последнее на место первого. Как? Понятно, что надо какой-то массив сделать, в него выгрузить, потом обратно загрузить в переменные из массива, сдвигая каждый раз адрес на один...
Не. не так. Блин, туплю. Надо кольцом зафигачить.
Код: Выделить всё
ldi temp, 00 ; Загрузка коэффициентов для каналов
sts Capture1, temp
ldi temp, 60
sts Capture2, temp
ldi temp, 130
sts Capture3, temp
ldi temp, 170
sts Capture4, temp
ldi temp, 210
sts Capture5, temp
ldi temp, 225
sts Capture6, temp
ldi temp, 240
sts Capture7, temp
Не. не так. Блин, туплю. Надо кольцом зафигачить.
Станислав
Может двигать указатель?
http://radiokot.ru/forum/viewtopic.php? ... 1#p2671311
Код: Выделить всё
LDI YH,HIGH(Capture0)
LDI Yl,low(Capture0)
GO:
LD R0,Y+
OUT PORTB,R0
ANDI YL,0b00000111 ; для 8 точек
RCALL DELAY
RJMP GO
Поэтому сделал по тупому, просто по очереди переменные друг другу присваиваются... Не красиво, длинно, быдлокод, но работает.
Спойлер
Код: Выделить всё
lds temp1, Capture1
lds temp2, Capture2
sts Capture1, temp2
lds temp2, Capture3
sts Capture2, temp2
lds temp2, Capture4
sts Capture3, temp2
lds temp2, Capture5
sts Capture4, temp2
lds temp2, Capture6
sts Capture5, temp2
lds temp2, Capture7
sts Capture6, temp2
sts Capture7, temp1
Спойлер
Код: Выделить всё
Start:
cpi NEXT, 255 ; Эта переменная в прерывании инкрементируется.
brne Start
inc NEXT2
cpi NEXT2, 255
brne Start
rcall NEW2 ; А это вызов подпрограммы, которая по кольцу меняет переменные (см. выше)
rjmp Start ; Конец программы, переход на начало
З.Ы. Ладно, с этим всем я разобрался.
Зато появился другой вопрос: с помощью команды rjmp могу я отправится прямо из главного цикла на метку RESET, с которой начинается инициализация МК ?
З.З.Ы. Все вопросы себя исчерпали. ))) Всем благодарю, со всем разобрался.
Станислав
Код: Выделить всё
Start:
cpi NEXT, 255 ; Эта переменная в прерывании инкрементируется.
brne Start
inc NEXT2
cpse NEXT2, NEXT
brne Start
rcall NEW2 ; А это вызов подпрограммы, которая по кольцу меняет переменные (см. выше)
rjmp Start ; Конец программы, переход на начало
- Сообщения: 82
- Зарегистрирован: Вт дек 14, 2010 16:07:50
напомните, пожалуйста, в двух словах
почему rjmp имеет ограниченный радиус действия, а rcall дотягивается с одного конца программы до другого...
обе команды же относительные?
но, когда я леплю rjmp - вылетает out of reach, а с rcall'ом этого не было... пока не было
почему rjmp имеет ограниченный радиус действия, а rcall дотягивается с одного конца программы до другого...
обе команды же относительные?
но, когда я леплю rjmp - вылетает out of reach, а с rcall'ом этого не было... пока не было
Значит подпрограммы по RCALL находятся внутри интервала -2K ≤ PC < 2K (K-килослово).
Последний раз редактировалось akl Вс мар 13, 2016 02:10:15, всего редактировалось 2 раза.
- Сообщения: 82
- Зарегистрирован: Вт дек 14, 2010 16:07:50
вся прога ~700 байтakl писал(а):Значит подпрограммы по RCALL находятся внутри интервала -2K ≤ PC < 2K (K-килослово).
то есть получается, что у rcall радиус действия -2K ≤ PC < 2K
а у rjmp - много меньше?
Картинку смотрите... Они одинаковы, кроме стека (адреса возврата)... Это команды ветвления типа BRxx не могут улетать далеко, если память не изменяет, то -63....64 (строчек кода) диапазон.
Станислав
Ну только не строчек кода 
Станислав
Следовательно где-то ошибка.Denkot писал(а): вся прога ~700 байт
то есть получается, что у rcall радиус действия -2K ≤ PC < 2K
а у rjmp - много меньше?
По диапазону доступности адресного пространства rjmp=rcall (+\-2килослов).
На большинстве малых МК с ПЗУ до 4 килслов(8килобайт) этого вполне достаточно.
Вопрос в заявленной области ПЗУ и настройках компилятора.
Возможнр неверно заявлен *def.inc файл, или погрешность в разделе:
Спойлер
; ***** DATA MEMORY DECLARATIONS *****************************************.equ FLASHEND = 0x01ff ; Note: Word address
.equ IOEND = 0x003f
.equ SRAM_START = 0x0060
.equ SRAM_SIZE = 64
.equ RAMEND = 0x009f
.equ XRAMEND = 0x0000
.equ E2END = 0x003f
.equ EEPROMEND = 0x003f
.equ EEADRBITS = 6
#pragma AVRPART MEMORY PROG_FLASH 1024
#pragma AVRPART MEMORY EEPROM 64
#pragma AVRPART MEMORY INT_SRAM SIZE 64
#pragma AVRPART MEMORY INT_SRAM START_ADDR 0x60
Как вариант метки/точки входа/ у Ваших rcall в диапазоне заявленных адресов, а у rjmp за их пределами. Или метка назначения не выровнена по границам (указывает на нечетный адрес - ошибка при составлении таблиц).
- Сообщения: 82
- Зарегистрирован: Вт дек 14, 2010 16:07:50
Точно. Разобрался - так и было.СКАЗОЧНИК писал(а):Картинку смотрите... Они одинаковы, кроме стека (адреса возврата)... Это команды ветвления типа BRxx не могут улетать далеко, если память не изменяет, то -63....64 (строчек кода) диапазон.
Причина была не в rcall и не в rjmp.
Где-то между ними затесалась breq, нашел ее и все понял.
- Сообщения: 315
- Зарегистрирован: Пт янв 29, 2010 19:42:27
Кто то сможет написать для at90s1200
по появлении перепада 0->1 на одном пине на другом пине
"0"->"1" - 50 мсек
"0"- 500мсек
"1" - 50 мсек
"0"- 500мсек
"1" - 50 мсек
"0"- 500мсек
"1" - 50 мсек
"0"- 500мсек
"1" - 50 мсек
"0"- 500мсек
"1" - 50 мсек
"0"- 500мсек
Пины произвольные но желательно чтобы не цепляли mosi miso sck
Хочу влепить в старый лсд телик что бы при включении переходил на vga вход
нужно именно для at90s1200
более новое для этой цели жалко
по появлении перепада 0->1 на одном пине на другом пине
"0"->"1" - 50 мсек
"0"- 500мсек
"1" - 50 мсек
"0"- 500мсек
"1" - 50 мсек
"0"- 500мсек
"1" - 50 мсек
"0"- 500мсек
"1" - 50 мсек
"0"- 500мсек
"1" - 50 мсек
"0"- 500мсек
Пины произвольные но желательно чтобы не цепляли mosi miso sck
Хочу влепить в старый лсд телик что бы при включении переходил на vga вход
нужно именно для at90s1200
более новое для этой цели жалко
ух ты.... показывает
Вот в первом приближении. Вход PD2/INT0, выход PB0. Частота кварца 4608кГц. Замечу, команда на PD2/INT0 должна приходить 0. Контроллер выходит из режима POWER-DOWN, отрабатывает временную диаграмму и опять засыпает в режиме минимального потребления.
- Сообщения: 315
- Зарегистрирован: Пт янв 29, 2010 19:42:27
akl -Спасибо
немного не так работает
срабатывает по спаду "1"-->"0" а мне бы по фронту "0"-->"1"
и в конце бы на выходе чтобы был "0"
и еще на всяк Случай чтобы PORTB.1~=PORTB.0
немного не так работает
срабатывает по спаду "1"-->"0" а мне бы по фронту "0"-->"1"
и в конце бы на выходе чтобы был "0"
и еще на всяк Случай чтобы PORTB.1~=PORTB.0
- Вложения
-
- at90s1200.PNG
- (61.39 КБ) 447 скачиваний
ух ты.... показывает



