6 каналов ШИМ на ATMega128.
6 каналов ШИМ на ATMega128.
Задача: запустить 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-м у одного чела была такая же неувязочка, но его проигнорили. Вообщем выслушаю любые предложения. Заранее спасибо.
;----------
;какие надо ножки делаем выходами....(эт понятно)
; ВКЛЮЧАЕМ НЕБХОДИМЫЕ УСТРОЙСТВА
; 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-м у одного чела была такая же неувязочка, но его проигнорили. Вообщем выслушаю любые предложения. Заранее спасибо.
- Roman Venom
- Сверлит текстолит когтями
- Сообщения: 1135
- Зарегистрирован: Сб июл 11, 2009 18:42:21
- Откуда: Украина, г.Николаев
Re: 6 каналов ШИМ на ATMega128.
запись в регистровые пары происходит в формате старший-младший. Чтение наоборот. Это на всякий случай.
Теперь директивы касательно ячейки OCR1CL в студию.
Я этой командой никогда не пользовался, всегда записывал/читал косвенно. Приведу пример как я работаю с оперативкой (косвенно).
При включении чистим, ибо там может быть всё что угодно.
Запись в память. В данном случае из АЦП. Чтение аналогично, только с ld.
Теперь директивы касательно ячейки OCR1CL в студию.
Я этой командой никогда не пользовался, всегда записывал/читал косвенно. Приведу пример как я работаю с оперативкой (косвенно).
При включении чистим, ибо там может быть всё что угодно.
Код: Выделить всё
.equ ADC0_ram=0x0 ;0x0
Код: Выделить всё
clear_SRAM:
clr work1
clr work
;---------clr ADC0_ram
ldi YH,0x1
ldi r28,ADC0_ram
clear_ADC0_ram:
inc work1
st Y+,work
cpi work1,20
brne clear_ADC0_ram
clr work1
Запись в память. В данном случае из АЦП. Чтение аналогично, только с ld.
Код: Выделить всё
ADC_0:
ldi YH,0x1
in work,ADCL
in work1,ADCH
ldi r28,ADC0_ram
st Y+,work;ADC0H
st Y+,work1;ADC0L,
rjmp exit_ADC
Успех - императив!
Re: 6 каналов ШИМ на ATMega128.
JTAG не оказывает влияния. Косвенная запись также не оправдала надежд. Через пару часиков скину весь проект с протеусом вдогонку.
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: 6 каналов ШИМ на ATMega128.
да, JTAG нипричем в этом случае. Фьюз совместимости с атмега103 не установлен случайно?
Ставим плюсы: )
Re: 6 каналов ШИМ на ATMega128.
ОЛОЛО!!!! Чел где ты раньше был!!! Действительно фьюс совместимости с ATMega103. Убрал галку в понипрог, и проблема над которой я бился 10часов решена! 
Re: 6 каналов ШИМ на ATMega128.
Кидаю вам исходник (asm для AVR Studio) с протеуснёй в комплекте. И большущее СПАСИБА ibiza11!
