Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2012, 17:17   #1
pimple2006
Пользователь
 
Регистрация: 29.11.2011
Сообщений: 26
Радость ШИМ для мк atmega8

Здравствуйте,помогите разобраться в коде по реализации ШИМ,можно сказать что я ноль в ассемблере,приспичило сделать цифровой регулятор двигателя(печка в машине),механический регулятор стоит 1600,на цифре обойдется дешевле.
Код:
01.; Atmega8, crystal 1MHZ (internal)
02.; Timer Counter 1
03.; Fast PWM & ADC
04. 
05..include "m8def.inc"
06. 
07..def wreg  =R16
08..def duration =R17
09..def wreg2  =R18
10. 
11. 
12.init:
13. 
14.ldi  wreg,low(RAMEND)           
15.out  SPL,wreg
16. 
17.ldi  wreg,high(RAMEND) ; Stack Pointer = $45F
18.out  SPH,wreg
19. 
20.cli       ; запретить прерывания
21. 
22. 
23.ldi wreg, 0b10000011  ; Вкл. Ацп, Однокр. преобр., Прерывание запрещено, СК/8 (125 kHz)
24.out ADCSR, wreg
25. 
26.ldi wreg, 0b01101110  ; AVcc, Внеш. конд. на Aref, Выравн. по лев. краю, channel 1.23V bg
27.out ADMUX, wreg
28. 
29.rcall adc_convert
30. 
31. 
32.;*******************    TIMER1    ***********************
33. 
34.ldi  wreg,0x00 
35.out  PORTB,wreg   ; Запись 0 в порт
36. 
37.ldi  wreg,0b00000010  ; PortB.1 (OC1A) - Output
38.out  DDRB,wreg
39. 
40. 
41.ldi wreg, 0b10000001  ; неинв. 8 битный ШИМ
42.out TCCR1A, wreg
43. 
44.ldi wreg, 0b00001001  ; CK/1
45.out TCCR1B, wreg
46. 
47.ldi wreg, 0b00000000
48.out TIMSK, wreg
49. 
50. 
51.main:
52. 
53.ldi wreg, 250    ; 25mS
54.rcall delay
55. 
56.ldi wreg, 0b01100101  ; ADC Channel 5 (PortC.5 ; pin 28)
57.rcall adc_convert
58. 
59.ldi wreg2, 0x00
60.out OCR1AH, wreg2
61. 
62.out OCR1AL, wreg
63. 
64. 
65.rjmp main
66. 
67. 
68. 
69.;*********************** DELAYS **************************
70. 
71.delay:       ; 0.1mS * wreg
72.ldi duration, 24
73.cycle:
74.nop
75.dec  duration
76.brne cycle
77.dec  wreg
78.brne delay
79.ret
80. 
81. 
82.;********************** AD CONVERTION *******************
83. 
84.adc_convert:
85. 
86.out ADMUX, wreg    ; wreg contains channel
87. 
88.sbi ADCSR, ADSC    ; Start Convertion
89.sbic ADCSR , ADSC
90.rjmp PC-1
91.in wreg, ADCL    ; просто формальность (первым всегда читается ADCL)
92. 
93.in wreg, ADCH    ; wreg contains result
94. 
95.ret
меня интересуют Timer и Delays,сначала про задержку:
как я понимаю
строчка 72 кладет в регистр число 24
вместе со строкой 75 76 они реализуют как раз величину 0.1м сек
а дальше в потемках,команды я разобрал,а как работает не могу понять.
то что 71 строчка это объявление функции понимаю и то,что она вызывается в функции Main тоже понятно.
помогите чем могите

Последний раз редактировалось pimple2006; 07.02.2012 в 17:20.
pimple2006 вне форума Ответить с цитированием
Старый 08.02.2012, 14:26   #2
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
Сообщение от pimple2006 Посмотреть сообщение
как я понимаю
строчка 72 кладет в регистр число 24
вместе со строкой 75 76 они реализуют как раз величину 0.1м сек
так и есть. здесь реализован такт задержки = 0,1 мсек

Цитата:
Сообщение от pimple2006 Посмотреть сообщение
а дальше в потемках,команды я разобрал,а как работает не могу понять.
то что 71 строчка это объявление функции понимаю и то,что она вызывается в функции Main тоже понятно.
помогите чем могите
судя по коду, wreg содержит количество тактов и дальше просто реализован внешний цикл по отсчёту этих тактов. и возврат из данной процедуры.
например, посмотрите на строки 53 и 54 - перед вызовом задержки обязательно инициализируется значение wreg (в данном случае - значением в 250 тактов, что равносильно 250*0,1 = 25мсек)
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 08.02.2012, 15:16   #3
pimple2006
Пользователь
 
Регистрация: 29.11.2011
Сообщений: 26
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
так и есть. здесь реализован такт задержки = 0,1 мсек



судя по коду, wreg содержит количество тактов и дальше просто реализован внешний цикл по отсчёту этих тактов. и возврат из данной процедуры.
например, посмотрите на строки 53 и 54 - перед вызовом задержки обязательно инициализируется значение wreg (в данном случае - значением в 250 тактов, что равносильно 250*0,1 = 25мсек)
а можно обойтись без 0.1 мсек
мне нужно вместо механического переключателя печки в машине ,сделать цифровым,нужно несколько режимов 0-25-50-75-100
pimple2006 вне форума Ответить с цитированием
Старый 08.02.2012, 15:44   #4
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Скажу честно - нужно разбираться с руководством по данному конкретному микроконтроллеру, т.к. могут быть ограничения по разрядности регистров. Но, если регистры 13 и более разрядов, то в качестве задержки хватит и такого варианта:
Код:
71.delay:       ; 25mS * wreg
72.ldi duration, 6000
73.cycle:
74.nop
75.dec  duration
76.brne cycle
77.dec  wreg
78.brne delay
79.ret
тогда вызов будет выглядеть примерно так:
Код:
53.ldi wreg, 1    ; 1 = 25mS, 2 = 50mSи т.д.
54.rcall delay
но, по-сути, от этого мало что изменится)
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 09.02.2012, 04:11   #5
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
а можно обойтись без 0.1 мсек
А зачем?
Цитата:
мне нужно вместо механического переключателя печки в машине ,сделать цифровым,нужно несколько режимов 0-25-50-75-100
Вот сюда гляньте, если ещё сами не нашли:
http://radiokot.ru/circuit/digital/automat/26/

Ваша программа работает по такому же принципу. Только на другом контроллере, и индикации нет.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
програматор для ATmega8. все это длля чайника! pufystyj Микроконтроллеры, робототехника, схемотехника, 3D принтеры 14 28.05.2011 00:57
ШИМ для шагового двигателя V0lk Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 04.01.2011 20:38
Аналог ATmega8-16PU PDIP28 iukash Компьютерное железо 20 16.09.2010 23:58
Включить двойную буферизацию для формы в VBA для MsAccess 2003 dplz Microsoft Office Access 0 16.05.2010 17:00
Срочно : Требуется поставить запрет для иностранных IP для просмотра сайта. pornodiller Фриланс 2 06.11.2008 22:02