Например TDA7294

Форум РадиоКот • Просмотр темы - Ассемблер (ASM) для AVR в вопросах и ответах
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вс сен 28, 2025 08:23:04

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 7956 ]     ... , , , 11, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Вс фев 22, 2009 19:50:49 
Мучитель микросхем

Зарегистрирован: Вс июн 01, 2008 12:16:38
Сообщений: 459
Рейтинг сообщения: 0
Demontrup писал(а):
Ребята в процессе отладки в Протеусе выяснил что у меня не работает АЦП, кто может сказать почему? вот переписал без всего лишнего:

Тактовая частота контроллера какая?


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Вс фев 22, 2009 20:06:06 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Вт мар 25, 2008 16:23:57
Сообщений: 22
Откуда: Астрахань
Рейтинг сообщения: 0
16 МГЦ

_________________
Не бери от жизни все, а то не унесешь...


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Вс фев 22, 2009 20:41:04 
Нашел транзистор. Понюхал.

Карма: 1
Рейтинг сообщений: 3
Зарегистрирован: Пн сен 01, 2008 14:49:03
Сообщений: 151
Откуда: Казахстан
Рейтинг сообщения: 0
Ожидая конца преобразования, не надо постоянно ставить в "1" ADSC. Попробуй так:
Код:
start:
   sbi adcsra,ADSC
_wait_adc:
   sbic adcsr,ADSC
   rjmp _wait_adc
   in r17, ADCL
   in r18, ADCH


А ещё лучше так:
Код:
start:
   sbi adcsra,ADSC   ;запуск АЦП
_wait_adc:
    sbis    ADCSRA,ADIF   ;ждем конца преобразования(ADIF=1)
    rjmp    _wait_adc
    sbi    ADCSRA,ADIF   ;сбрасываем флаг ADIF
    in r17, ADCL
    in r18, ADCH


Честно говоря в первом варианте не уверен, т.к. всегда для контроля конца преобразования отслеживал именно флаг ADIF - он срабатывает когда данные готовы для считывания. Только надо не завывать его сбрасывать принудительно (если бы это было в прерывании, то он сбросился бы аппаратно).


Последний раз редактировалось YurkaM Вс фев 22, 2009 20:48:24, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Вс фев 22, 2009 20:47:13 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Вт мар 25, 2008 16:23:57
Сообщений: 22
Откуда: Астрахань
Рейтинг сообщения: 0
Спасибо, но все равно не хочет работать.. я уже начинаю нервничать..надо валерьяночки хлебнуть)))

_________________
Не бери от жизни все, а то не унесешь...


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Вс фев 22, 2009 21:11:25 
Нашел транзистор. Понюхал.

Карма: 1
Рейтинг сообщений: 3
Зарегистрирован: Пн сен 01, 2008 14:49:03
Сообщений: 151
Откуда: Казахстан
Рейтинг сообщения: 0
Ну, не знаю... В симуляторе АВР-студио всё работает. Только естественно PIND,2 приходится руками галку ставить/убирать.


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Вс фев 22, 2009 21:14:42 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Вт мар 25, 2008 16:23:57
Сообщений: 22
Откуда: Астрахань
Рейтинг сообщения: 0
Ну в Студии у меня тоже все работает.. и даже когда я это код для АЦП просто в программу пихаю.. а вот в прерывании в Протеусе не хочет и все.... может дело в симуляторе?

_________________
Не бери от жизни все, а то не унесешь...


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Вс фев 22, 2009 21:47:58 
Мучитель микросхем

Зарегистрирован: Вс июн 01, 2008 12:16:38
Сообщений: 459
Рейтинг сообщения: 0
Demontrup писал(а):
Ну в Студии у меня тоже все работает.. и даже когда я это код для АЦП просто в программу пихаю.. а вот в прерывании в Протеусе не хочет и все.... может дело в симуляторе?

Попробуйте делитель побольше поставить, при частоте 16 МГц у вас выставлен делитель тактирования АЦП - 8, т. е. тактовая частота АЦП - 2 МГц, а по даташиту должна быть до 200 КГц (в принципе можно и больше при уменьшении разрешающей способности, но думаю что 2МГц это перебор), могут быть из-за этого глюки, и YurkaM тоже верно говорит, я не заметил что у вас постоянно бит ADSC устанавливается. В вашем случае оптимальный делитель будет делитель 128, т.е.
Код:
   ldi r19, (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)
   out ADCSRA, r19

Конечно есть шанс, что дело в симуляторе, вобщем железо - лучший симулятор!


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Вс фев 22, 2009 22:04:25 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Вт мар 25, 2008 16:23:57
Сообщений: 22
Откуда: Астрахань
Рейтинг сообщения: 0
Спасибо, но все равно не работает))))))) на днях сваяю в железе.. посмотрю может симулятор действительно врет..

_________________
Не бери от жизни все, а то не унесешь...


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Вс фев 22, 2009 22:22:34 
Нашел транзистор. Понюхал.

Карма: 1
Рейтинг сообщений: 3
Зарегистрирован: Пн сен 01, 2008 14:49:03
Сообщений: 151
Откуда: Казахстан
Рейтинг сообщения: 0
Да забей ты на этот Протеус - с ним постоянно будет вопрос "то-ли лыжи не едут, то-ли я еб...утый".........


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Ср фев 25, 2009 21:44:33 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Вт мар 25, 2008 16:23:57
Сообщений: 22
Откуда: Астрахань
Рейтинг сообщения: 0
Спасибо за помощь.. я нашел ошибки..теперь все работает!!
Если Вас не затруднит у меня еще вопрос: у меня в регистре число.Мне надо чтобы при попадании в определенный диапазон чисел я попадал на метку иначе дальше, как это реализовать на асме? например есть число 125 и два диапазона: 0-127(переход на метку 1), 128-255 (переход на метку 2), не догоню как слепить..))

_________________
Не бери от жизни все, а то не унесешь...


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Ср фев 25, 2009 23:28:58 
Мучитель микросхем

Зарегистрирован: Вс июн 01, 2008 12:16:38
Сообщений: 459
Рейтинг сообщения: 0
Demontrup писал(а):
....Мне надо чтобы при попадании в определенный диапазон чисел я попадал на метку иначе дальше, как это реализовать на асме? например есть число 125 и два диапазона: 0-127(переход на метку 1), 128-255 (переход на метку 2), не догоню как слепить..))

Код:
; r16 - число
cpi r16, 127 ; сравниваем число с 127
brcc metka1 ; если флаг переноса не установлен, т. е. r16 меньше или равно 127, то переходим на метку1, иначе далее
; далее поскольку если беззнаковое целое 8-ми битное число больше
; 127, то оно в любом случае входит в диапазон 128-255, т. е здесь
; сразу может быть метка 2
metka2:
     ...some code;
    rjmp end_of_compare
metka1:
    ...some code;
    rjmp end_of_compare;

end_of_compare:


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 26, 2009 19:02:48 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Вт мар 25, 2008 16:23:57
Сообщений: 22
Откуда: Астрахань
Рейтинг сообщения: 0
to smac Большое спасибо!!

_________________
Не бери от жизни все, а то не унесешь...


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 03, 2009 00:39:09 
Родился

Зарегистрирован: Пт фев 20, 2009 19:25:14
Сообщений: 10
Рейтинг сообщения: 0
вопрос такой: почему огонек всевремя бежит, а не показывает комбинацию 10101010 по истечении 3х пробегов. вопрос конечно детский но всетаки. файлик почемуто не прикрепляется поэтому вот код
Begin:

ldi Temp,RamEnd ;инициализация стека
out SPL,Temp

ldi Temp,0b11111111 ;настройка портов
out DDRB,Temp

ldi Temp,0b00000001 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки
ldi Temp,0b00000010 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки
ldi Temp,0b00000100 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки
ldi Temp,0b00001000 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки

ldi Temp4, 3 ;загрузка числа 3 в регистр Temp4
dec Temp4 ;вычитание из Temp4
brne Begin ;переход к метке если результат преведущего действия не 0
;*************************************************
ldi temp, 0b10101010 ;записываем в temp 10101010
out PortB, temp ;вывод на порт B 10101010
;задержка***
ldi Temp1,0
ldi Temp2,0
ldi Temp3,10

Loop1: dec Temp1
brne Loop1
dec Temp2
brne Loop1
dec Temp3
brne Loop1
;подпрограмма задержки**********************************
Delay: out PortB,Temp

ldi Temp1,0
ldi Temp2,0
ldi Temp3,10

Loop: dec Temp1
brne Loop
dec Temp2
brne Loop
dec Temp3
brne Loop
ret


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 03, 2009 00:48:23 
Родился

Зарегистрирован: Пт фев 20, 2009 19:25:14
Сообщений: 10
Рейтинг сообщения: 0
интересует вот это место
ldi Temp4, 3 ;загрузка числа 3 в регистр Temp4
dec Temp4 ;вычитание из Temp4
brne Begin ;переход к метке если результат преведущего действия не 0
почему не работает?
когда делаешь так
ldi Temp4, 3 ;загрузка числа 3 в регистр Temp4
dec Temp4 ;вычитание из Temp4
breq Begin1 ;переход к метке если результат преведущего действия 0
Begin1: ldi temp, 0b10101010 ; загружаем в temp 10101010
out PortB, temp ;вывод в порт B 10101010
все работает толькопробегает один раз а не 3


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 03, 2009 08:20:37 
Опытный кот
Аватар пользователя

Зарегистрирован: Вс янв 18, 2009 21:12:49
Сообщений: 703
Рейтинг сообщения: 0
Программа каждый раз перезагружает Temp4. Загрузку ldi Temp4, 3 нужно выносить за пределы цикла.


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Ср мар 04, 2009 19:18:29 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Вс мар 04, 2007 01:17:12
Сообщений: 690
Рейтинг сообщения: 0
Мега8

как в асме выставлять/снимать один бит порта не изменяя остальных?

например у меня пины портаБ на вход и что то на выход работает, мне нужно прочесть PB0 (вход) и выставить в зависимости от его значения на PB1 (выход) 0 или 1.

понятно что прочесть придется весь порт in r16,pinb
вход PB0 пусть оказался равен "0", это можно проверить SBRS или SBRC
а теперь мне нужно только на PB1 выставить "1" не меняя остальные биты (т.е. вариант послать в порт 0xFF не прокатывает)

как?


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Ср мар 04, 2009 20:00:12 
Нашел транзистор. Понюхал.

Карма: 1
Рейтинг сообщений: 3
Зарегистрирован: Пн сен 01, 2008 14:49:03
Сообщений: 151
Откуда: Казахстан
Рейтинг сообщения: 0
Alexeus писал(а):
понятно что прочесть придется весь порт in r16,pinb

Не обязательно. Применительно к твоей задаче, например так:
Код:
   sbic  PINB,0   ; если пин 0 порта B сброшен, то сл. команду пропустить
   rjmp  _clear   ; прыгаем на сброс B1 в "0"
   sbi   PORTB,1  ; ставим в "1" бит 1 порта B
   rjmp  _end     ; всё сделали, уходим
_clear:
   cbi   PORTB,1  ; обнуляем бит 1 порта B
_end:


Или так:
Код:
in tmpa,PINB   ;читаем пины порта B
com tmpa       ;инвертируем (это для твоего алгоритма)
bst tmpa,0     ;запоминаем в T значение 0-го бита
  cli  ;запрет прерываний. Это надо только если есть прерывания, работающие с портом B
in tmpa,PORTB   ;читаем текущее состояние PORTB
bld tmpa,1      ;пишем T в 1-й бит
out PORTB,tmpa  ;выводим в порт
  sei  ;разрешение прерываний. Если выше была команда cli


Можно ещё че-нить придумать наверное... :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Ср мар 04, 2009 20:12:07 
Нашел транзистор. Понюхал.

Карма: 1
Рейтинг сообщений: 3
Зарегистрирован: Пн сен 01, 2008 14:49:03
Сообщений: 151
Откуда: Казахстан
Рейтинг сообщения: 0
А если надо изменить сразу несколько пинов порта, то удобно делать логическое ИЛИ, предварительно погасив в ноль ненужные биты в обоих регистрах. Например так:
Код:
;tmpb содержит байт, биты 0-3 которого надо вывести в порт B
in tmpa,PORTB
andi  tmpa,0b11110000
andi  tmpb,0b00001111
or    tmpa,tmpb
out   PORTB,tmpa


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Ср мар 04, 2009 20:52:40 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Вс мар 04, 2007 01:17:12
Сообщений: 690
Рейтинг сообщения: 0
спасибище, пошел анализировать :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Чт мар 05, 2009 10:40:19 
Родился

Зарегистрирован: Чт мар 05, 2009 10:32:23
Сообщений: 12
Рейтинг сообщения: 0
Помогите пожалуйста с иницаализацией таймера мк AtMega2561
AVRStudio
Код:
      ldi    TMP_Y,(1<<CS00)+(1<<CS01);запускаем счетчик OSC/64 = 1.015 msec      
   out   TCCR0B,TMP_Y ; предделитель в регистр записался
   
   ldi   TMP_Y,1<<TOV0 ; здесь в регистр записыветься
   out    TIFR0,TMP_Y ; а здесь не как не перемещается и через sts тож не в какую
   
        ldi   TMP_Y,1<<TOIE0 ; здесь в регистр записыветься
   sts    TIMSK0,TMP_Y   ;Установливаеться флаг для прерывания по переполнению

Что не так пишу???


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 7956 ]     ... , , , 11, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y