roboforum.ru

Технический форум по робототехнике.

MEGA16 startup

Резисторы, транзисторы, конденсаторы, микросборки, чип компоненты ...
Вопросы согласования управляющих модулей с периферией.

MEGA16 startup

Сообщение exx » 31 мар 2011, 15:37

Вообщем давненько не занимался радиоелектроникой, решил подтянуть левел в кодинге - получилось, но теперь надо подтягивать мк-шки, т.к. атмеловские "впаяные" девайсы хочеться юзать по полной:)
Решил в первую очередь разобраться с модулем ШИМ, целый день вчера запускал его - запустил, но на avr123 по одному написано (перевел на асм) - не работает, нашел еще гдет кусок кода, заделал - работает, НО нифига не понятно. Даташит вообще понять не реально, видать потому что давно не сталкивался,а мож просто там написано не для тех кто не шарит) Вообщем хочу попросить помочь разобраться со всем этим :friends:
И так что не ясно по ШИМ:
1. Какие регистры\биты конфигурируют режим? Я взялся сразу за FastMode т.к. хочу макс частоту получить(в обучающих целях) <The fast Pulse Width Modulation or fast PWM mode (WGM01:0 = 3)> выходит WGM01 - и есть наш конфиг, но если залесть в хедеры, то
Код: Выделить всёРазвернуть
; ***** TIMER_COUNTER_0 **************
; TCCR0 - Timer/Counter Control Register
.equ   CS00   = 0   ; Clock Select 1
.equ   CS01   = 1   ; Clock Select 1
.equ   CS02   = 2   ; Clock Select 2
.equ   WGM01   = 3   ; Waveform Generation Mode 1
.equ   CTC0   = WGM01   ; For compatibility
.equ   COM00   = 4   ; Compare match Output Mode 0
.equ   COM01   = 5   ; Compare Match Output Mode 1
.equ   WGM00   = 6   ; Waveform Generation Mode 0
.equ   PWM0   = WGM00   ; For compatibility
.equ   FOC0   = 7   ; Force Output Compare


WGM01 - дефайн всеголишь WGM01:0 = 3 - в даташите имелось ввиду что 3-й бит установить и будет нам FastMode? Немножко непонятен "синтаксис" того даташита(
едем дальше..
2. Задаем частоту - тут ваще не понятно нифига - если можно в двух словах о главных регистрах\каунтерах - буду крайне признателен!
TCCR1A - каунтер 1 часть А = на конфиг самого таймера (дефаны выше, по ним както проще понять чем по даташиту.) Тут вроде все понятно как и с TCCR1B.
TCNT1H & TCNT1L - сюда как понимаю мы инитим начальное значение в таймере, например - захотели чтобы первый импульс\пауза были короче чем последующие(ну как пример_для смысла понятия)
Теперь то что не понятно:
ICR1H - ху из ит? == регистр(число) с которым будут сравниваться inc\dec-ты TCNT1? Вроде с OCR1AH сравниваеться = тут беда полная :sorry: Зачем тафмер, число для сравнения и еще какойто регистр...если там есть ток два варианта 1 или 0 ну и время для 1 и 0:) - таймер просто юзаеться модулем PWM как таймер а ICR1 и OCR1A уже как - до скольки считать и сколько на паузу выделить(соответственно)?
3. Частота. Вот это интересный момент, т.к. сам МК работает припустим на 8Мгц, все что у меня вышло с него выжать - 7.5*0.5мкс = 3.75мкс(26.6666Кгц) период при ICR1=0xFF, т.е. сильно много не разгонишься при регулировке мошности(15 позиций, маловато) - Беру формулу из даташита для фаст режима fOCnPWM = fclk_I/O \ N ⋅ 256, <The N variable represents the prescale factor (1, 8, 64, 256, or 1024)> = N - wtf??, как понял это наш TCCR0 0-2 биты?
4. Вот нашкрябаный кодез который вроде робит, но быстрей никак не хочет шуршать)
Код: Выделить всёРазвернуть
.include "m16def.inc"

.def savesreg   =r2
.def flags      =r16
  .equ f_complit =0
  .equ TOP      =0x0F

.def tmpa       =r17
.def cntstepL   =r26
.def cntstepH   =r27

.equ c_Tpwm     =1667

.cseg

.org 0          rjmp   _reset
.org INT_VECTORS_SIZE

_reset:   
      ldi   tmpa,high(RAMEND)
      out   SPH,tmpa
      ldi   tmpa,low(RAMEND)
      out   SPL,tmpa

      ldi   tmpa, 0xFF   ;0b00110000
      out   DDRD,tmpa
      out   PORTD,tmpa

   ldi      tmpa, 0xA0
   out      TCCR1A, tmpa
   ldi      tmpa, 0b00010001
   out      TCCR1B, tmpa

   ldi      tmpa, 0xFC
   out      TCNT1H, tmpa
   ldi      tmpa, 0x1
   out      TCNT1L, tmpa

   ldi      tmpa, high(TOP)
   out      ICR1H, tmpa
   ldi      tmpa, low(TOP)
   out      ICR1L, tmpa

   ldi      tmpa, 0x00
   out      OCR1AH, tmpa
   ldi      tmpa, 0x07
   out      OCR1AL, tmpa

   ldi      tmpa, 0x00
   out      OCR1BH, tmpa
   out      OCR1BL, tmpa

_stop:      rjmp   _stop

сори что он такой беспорядный, но первый сорс + это куски чьихто исходников + я там подописывал своего уже(переписывал сишкин код. Возможно ли поднять частоту, и как вообще правильно его подправить дабы оно начало валить на максимуме частоты?

ну и кодез который я перевёл с сишки камрада avr123
Код: Выделить всёРазвернуть
   ldi      tmpa, 0
   out      TCCR1B, tmpa

   ldi      tmpa, 0xFC
   out      TCNT1H, tmpa
   ldi      tmpa, 0x01
   out      TCNT1L, tmpa

   ldi      tmpa, 0x03
   out      OCR1AH, tmpa
   ldi      tmpa, 0xFF
   out      OCR1AL, tmpa

;   ldi      tmpa, 0x03
;   out      OCR1BH, tmpa
;   ldi      tmpa, 0xFF
;   out      OCR1BL, tmpa

   ldi      tmpa, 0x03   ;high(TOP)
   out      ICR1H, tmpa
   ldi      tmpa, 0xFF   ;low(TOP)
   out      ICR1L, tmpa

   ldi      tmpa, 0b10000011
   out      TCCR1A, tmpa
   ldi      tmpa, 0b00001001
   out      TCCR1B, tmpa

   ldi      tmpa, 0x01   ;high(TOP)
   out      ICR1H, tmpa
   ldi      tmpa, 0xFF   ;low(TOP)
   out      ICR1L, tmpa

но он не робит ваще - мож надо что-то там проконфигурировать, типа мастер йода из CVAVR в помощь)
это был мой первый курс по авр который надеюсь вы поможете пройти и я буду дальше разбираться с АЦП и тп. Благодарю за внимание, всегда рад помочь, я)
Аватара пользователя
exx
 
Сообщения: 53
Зарегистрирован: 25 дек 2008, 04:43
Откуда: Львов
прог. языки: c,asm

Re: MEGA16 startup

Сообщение Grofus » 31 мар 2011, 17:25

Полистай http://easyelectronics.ru/category/avr-uchebnyj-kurs
Про таймер http://easyelectronics.ru/avr-uchebnyj- ... jmery.html
про шим http://easyelectronics.ru/avr-uchebnyj- ... -shim.html
Вот фотка таблицы с режимами, она есть в Даташите
WGM01:0 = 3 значит мод под номером 3(смотрим в таблицу)
P1010881.jpg
Алокоголизм - излечим, пьянство - нет.
Peace-death.
Аватара пользователя
Grofus
 
Сообщения: 104
Зарегистрирован: 25 июл 2009, 16:35
Откуда: Ессентуки
прог. языки: ASM , Lisp , C# :)
ФИО: Алексей

Re: MEGA16 startup

Сообщение exx » 31 мар 2011, 17:31

Grofus, огромное благодарю!
-почитаю, и будем двигадся дальше.)
Аватара пользователя
exx
 
Сообщения: 53
Зарегистрирован: 25 дек 2008, 04:43
Откуда: Львов
прог. языки: c,asm

Re: MEGA16 startup

Сообщение exx » 16 апр 2011, 10:41

с PWM + ADC разобрался вроде как, но вот не пойму чо так, но посмотреть стейт бита на порте - не суждено :cry:

Код: Выделить всёРазвернуть
; Init IO ports
    ldi      tmp, 0b00000010
    out      DDRD, tmp

    ldi      tmp, 0b00000001
    out      DDRC, tmp

    ldi      tmp, 0b00000000
    out      DDRB, tmp

    ldi      tmp, 0b00000010
    out      PORTD, tmp
    ldi      tmp, 0b00000001
    out      PORTC, tmp
    ldi      tmp, 0xff
    out      PORTB, tmp            ;PB3 pullup

Main:
    sbic   PORTB, PORTB5
    rjmp   test
    ldi      tmp, 0b00000001
    out      PORTC, tmp
    rjmp   Main

test:
    ldi      tmp, 0b00000000
    out      PORTC, tmp
    rjmp   Main


мож я чот не то делаю, а мож и мк мёртв...хотя ADC работает норм /*mega8*/
плиз, глянте кусок кода - норм написал? мож чего есчо надо было инитить....(ех, скучаю за PIC16f84a))
**уже 4-е часа кликаю, все никак - ХЕЛП! :%)
Аватара пользователя
exx
 
Сообщения: 53
Зарегистрирован: 25 дек 2008, 04:43
Откуда: Львов
прог. языки: c,asm

Re: MEGA16 startup

Сообщение Vovan » 16 апр 2011, 10:50

sbic PORTB, PORTB5 - попробуйте написать комментарий к этой строке :shock:
_________
Sincerely,
Vovan
Аватара пользователя
Vovan
 
Сообщения: 3340
Зарегистрирован: 05 окт 2005, 12:03
Откуда: Литва
прог. языки: asm

Re: MEGA16 startup

Сообщение exx » 16 апр 2011, 10:56

:)
думаю вы догадалесь.)
да - чек 5-й бит на порту В))
можно поправить меня?

**
SBIC P, b Skip if Bit in I/O Register Cleared
вот и придумал себе что оно так должно быть
Аватара пользователя
exx
 
Сообщения: 53
Зарегистрирован: 25 дек 2008, 04:43
Откуда: Львов
прог. языки: c,asm

Re: MEGA16 startup

Сообщение Vovan » 16 апр 2011, 11:03

ну конечно! :)проверить состояние входа можно двумя способами:
1. проверить конкретный бит в регистре PinX, используя команды SBIC или SBIS
2. считать значение из регистра PinX в рабочий регистр с помощью команды IN
:)
к примеру 1:
Код: Выделить всёРазвернуть
   sbic pinb,5 
   rjmp tuda
   rjmp start

к примеру 2:
напишите самостоятельно :wink:
_________
Sincerely,
Vovan
Аватара пользователя
Vovan
 
Сообщения: 3340
Зарегистрирован: 05 окт 2005, 12:03
Откуда: Литва
прог. языки: asm

Re: MEGA16 startup

Сообщение exx » 16 апр 2011, 11:12

незнал об PinX..думал ток в сике есть PinX & PortX, заглянул в хедер -по разным адресам они%)
трудно мне с мегами..
заделал sbic PINB, PB1 - тож самое.
видать я уже сам глючить начал и чот упустил(

на PINC заработало - спасиб..видать порт В уже мёртв:)
Аватара пользователя
exx
 
Сообщения: 53
Зарегистрирован: 25 дек 2008, 04:43
Откуда: Львов
прог. языки: c,asm

Re: MEGA16 startup

Сообщение Vovan » 16 апр 2011, 11:18

"заделал sbic PINB, PB1" - это просто ошибка :)
пишется так:
Код: Выделить всёРазвернуть
sbic PINB,1
_________
Sincerely,
Vovan
Аватара пользователя
Vovan
 
Сообщения: 3340
Зарегистрирован: 05 окт 2005, 12:03
Откуда: Литва
прог. языки: asm

Re: MEGA16 startup

Сообщение exx » 16 апр 2011, 11:27

щапопробую, ток вот не пойму - 0.25В это же лог 0...какова оно считает что это 1 - хз(
закорочу нагло на массу тот пуллап - норм, оптопарой - не фурцает...хоть бери сам пуллапь его через килоом так 100)

ну и по поводу ошибки:
.equ PB1 = 1
:wink: порт мёртв.)
Аватара пользователя
exx
 
Сообщения: 53
Зарегистрирован: 25 дек 2008, 04:43
Откуда: Львов
прог. языки: c,asm

Re: MEGA16 startup

Сообщение Vovan » 16 апр 2011, 11:33

exx писал(а):0.25В это же лог 0...какова оно считает что это 1

наверное потому, что в данном случае нужно применить команду SBIS :wink:
А лучше не париться "вживую" с реальным МК, а использовать Протеус, потому что там не только ошибки указаны будут, но и МК не испортить палюбэ :)
И замерить там можно любые уровни и ваще посмотреть что происходит. Компилятор асм-а в протеусе наироднейший (т.е. самый родной) :)
_________
Sincerely,
Vovan
Аватара пользователя
Vovan
 
Сообщения: 3340
Зарегистрирован: 05 окт 2005, 12:03
Откуда: Литва
прог. языки: asm

Re: MEGA16 startup

Сообщение exx » 16 апр 2011, 11:35

в протеусе чот ADC не работает(
не пойму чо так...А обычно первым делом там усё тестю.
спасиб за помщь!
Аватара пользователя
exx
 
Сообщения: 53
Зарегистрирован: 25 дек 2008, 04:43
Откуда: Львов
прог. языки: c,asm

Re: MEGA16 startup

Сообщение Vovan » 16 апр 2011, 11:42

странно! именно в протеусе всегда отлаживаю работу АЦП используя вольтметры протеуса - точность - потрясающая! :good:
_________
Sincerely,
Vovan
Аватара пользователя
Vovan
 
Сообщения: 3340
Зарегистрирован: 05 окт 2005, 12:03
Откуда: Литва
прог. языки: asm

Re: MEGA16 startup

Сообщение exx » 16 апр 2011, 12:19

я компараторы настраивал там = норм, а вот с мегой не подружились пока, надеюсь :friends:
Аватара пользователя
exx
 
Сообщения: 53
Зарегистрирован: 25 дек 2008, 04:43
Откуда: Львов
прог. языки: c,asm

Re: MEGA16 startup

Сообщение Vovan » 16 апр 2011, 23:24

Тут на днях (2 апреля) писал (на заказ) простенькую прогу для мега8, для АЦП на три напряжения (заранее заданных). Если есть такая необходимость могу и исходник asm (с моими :oops: комментами на латинице) и hex выслать в личку. Программа коротенькая, но очень демонстрабельная. А если нужно, то и весь проект в протеусе (в нем есть всё).
ЗЫ: с АЦП нужно дружить :wink:
_________
Sincerely,
Vovan
Аватара пользователя
Vovan
 
Сообщения: 3340
Зарегистрирован: 05 окт 2005, 12:03
Откуда: Литва
прог. языки: asm

След.

Вернуться в Электроника, электротехника

Кто сейчас на конференции

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