roboforum.ru

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

6 каналов ШИМ на ATMega128.

6 каналов ШИМ на ATMega128.

ladvip » 11 янв 2011, 15:01

Задача: запустить 6 каналов ШИМ АППАРАТНО! (а не программно с прерываниями, потому что в моём случае МК слишком загружен другими делами). Речь идёт о ATMega128. Самое странное то что в симуляции компилятора AVR Studio всё работает. Протеус тоже одобряет. А на деле (на реальном железе) работают только 2 ШИМ-а из 6. :O: Ножки НЕ горелые, проверял несколько раз. Тестовый код программы прозрачнее льда:
;какие надо ножки делаем выходами....(эт понятно)
; ВКЛЮЧАЕМ НЕБХОДИМЫЕ УСТРОЙСТВА
; 3 канала ШИМ, на таймере 3
ldi r16,0x7F
sts OCR3AL,r16 ;записать значение 0x007F в число A
ldi r16,0x00
sts OCR3BH,r16
ldi r16,0x7F
sts OCR3BL,r16 ;записать значение 0x007F в число B
ldi r16,0x00
sts OCR3CH,r16
ldi r16,0x7F
sts OCR3CL,r16 ;записать значение 0x007F в число C
ldi r16,0b01010101
sts TCCR3A,r16 ;работает все каналы, 8-разрядный ШИМ
ldi r16,0b00001001
sts TCCR3B,r16 ;частота работы счётчика f/1, ускоренный ШИМ
; 3 канала ШИМ, на таймере 1
ldi temp,0x00
out OCR1AH,temp
ldi temp,0x7F
out OCR1AL,temp ;записать значение 0x007F в число A
ldi temp,0x00
out OCR1BH,temp
ldi temp,0x7F
out OCR1BL,temp ;записать значение 0x007F в число B
ldi temp,0x00
sts OCR1CH,temp
ldi temp,0x7F
sts OCR1CL,temp ;записать значение 0x000F в число C
ldi r16,0b01010101
out TCCR1A,r16 ;работает все каналы, 8-разрядный ШИМ
ldi r16,0b00001001
out TCCR1B,r16 ;частота работы счётчика f/1, ускоренный ШИМ
... Дальше идёт основная программа

Зашиваю....и что получаю:
ШИМ_1А - работает
ШИМ_1В - работает
ШИМ_1С - НЕ работает
ШИМ_3А - НЕ работает
ШИМ_3В - НЕ работает
ШИМ_3С - НЕ работает

Как вы можете заметить, собака зарыта под командой STS. С командами OUT прокатывает. Как обойти эту проблему мне совершенно не понятно. Может кто спотыкался на таких камнях.
Перед тем как создать тему, я хорошенько погуглил: в далёком 2005-м у одного чела была такая же неувязочка, но его проигнорили. Вообщем выслушаю любые предложения. Заранее спасибо.

Re: 6 каналов ШИМ на ATMega128.

avr123.nm.ru » 11 янв 2011, 15:36

Сделать тоже на Си в CVAVR или WinAVR и посмотреть АСМ код. Научиться у разработчиков компилеров :D Ножки ШИМ надо назначить выходами и это не должен быть включеный JTAG.
Последний раз редактировалось avr123.nm.ru 11 янв 2011, 15:40, всего редактировалось 1 раз.

Re: 6 каналов ШИМ на ATMega128.

Vovan » 11 янв 2011, 15:39

Не помню когда, но встречал подобную проблему... Тонкостей проблемы не помню (за давностью), но запомнил решение: разделил РОН, т.е. записывал в разные регистры.
ladvip писал(а):Вообщем выслушаю любые предложения.

Если не попал - извиняйте, но, как и Вы, косяков не нахожу :oops:

Re: 6 каналов ШИМ на ATMega128.

$ilent » 11 янв 2011, 16:25

У меня как-то было чёрти что если писать в старшие и младшие регистры раздельно. Но тут вероятней всего JTAG. Если он как раз на этих портах, то 100%.

Re: 6 каналов ШИМ на ATMega128.

Radist » 11 янв 2011, 17:07

К сожалению, это не джитаг :( .

Re: 6 каналов ШИМ на ATMega128.

avr123.nm.ru » 11 янв 2011, 17:34

Вы их выходами назначили ?

Приложите прожект в Студии PROTEUS

Re: 6 каналов ШИМ на ATMega128.

Vovan » 11 янв 2011, 18:10

avr123.nm.ru: в первом посте читаем
ladvip писал(а):;какие надо ножки делаем выходами....(эт понятно)

Re: 6 каналов ШИМ на ATMega128.

mackross » 11 янв 2011, 20:53

Вообще, надо сначала писать в старший байт, потом в младший. Хотя тут наверное все равно, так как значения везде одинаковые пишутся.
Я бы на вашем месте попробывал что-то типа такого:
ldi r16,0x00
ldi r17,0x7F
sts OCR3AH,r16
sts OCR3AL,r17
sts OCR3BL,r17
sts OCR3СL,r17
но не утверждаю что это поможет

Re: 6 каналов ШИМ на ATMega128.

boez » 11 янв 2011, 20:55

А я бы глянул в листинг ассемблера - какие адреса сгенерились в командах out и sts? Вообще, как аврстудийный ассемблер умеет понимать что sts OCR1AL, r16 это sts $4B, r16, а out OCR1AL, r16 это out $2B, r16? Может эти имена можно использовать только в out, а в sts надо еще двадцатку как-нить ручками или макросом добавлять?

А вообще ИМХО забросить этот асм куда подальше, написать вместо это 10 строчек на С и не задумываться, что там потом получится, out или sts...

Re: 6 каналов ШИМ на ATMega128.

ladvip » 11 янв 2011, 20:59

JTAG не оказывает влияния. Косвенная запись также не оправдала надежд. Через пару часиков скину весь проект с протеусом вдогонку.

Re: 6 каналов ШИМ на ATMega128.

Michael_K » 11 янв 2011, 21:00

boez писал(а):Вообще, как аврстудийный ассемблер умеет понимать что sts OCR1AL, r16 это sts $4B, r16, а out OCR1AL, r16 это out $2B, r16?

+1 никак

Re: 6 каналов ШИМ на ATMega128.

boez » 11 янв 2011, 21:41

Ааа, вон они там какую засаду придумали:

Код: Выделить всёРазвернуть
.equ   OCR3AL   = 0x86   ; MEMORY MAPPED
.equ   OCR3AH   = 0x87   ; MEMORY MAPPED
.equ   OCR3BL   = 0x84   ; MEMORY MAPPED
.equ   OCR3BH   = 0x85   ; MEMORY MAPPED
.equ   OCR3CL   = 0x82   ; MEMORY MAPPED
.equ   OCR3CH   = 0x83   ; MEMORY MAPPED
...
.equ   OCR1AL   = 0x2a
.equ   OCR1AH   = 0x2b
.equ   OCR1BL   = 0x28
.equ   OCR1BH   = 0x29


То есть юзер обязан писать out для регистров, попадающих в IO Space, и sts для не попадающих. Тогда нифига непонятно, что не так, ну кроме конечно порядка записи - обязательно нужно старший, потом младший.

Re: 6 каналов ШИМ на ATMega128.

ladvip » 11 янв 2011, 21:52

Проблема решена (или задача)!! Нужно просто убрать галку в понипрог: фьюс совместимости с ATMega103. После чего вышеуказанный код оживит ножки камня.

Re: 6 каналов ШИМ на ATMega128.

boez » 11 янв 2011, 22:31

Ааа, точно, сам 2 раза на это натыкался, хотя и не с таймером, а с другими различиями.

Так что - вот два обязательных действия над фьюзами свежекупленной меги128: снять совместимость с м103 и выключить jtag (если нужна вторая половина порта F)

Re: 6 каналов ШИМ на ATMega128.

ladvip » 11 янв 2011, 22:57

Кидаю вам исходник (asm для AVR Studio) с протеуснёй в комплекте. И ещё раз, всем спасиба!
Вложения
m128_pwm тест 6 каналов ШИМ.rar
проект
(48.26 КиБ) Скачиваний: 0


cron
Rambler\'s Top100 Mail.ru counter