26.09.2017, 08:45
|
#1
|
Частый гость
Регистрация: 14.10.2016
Сообщений: 21
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Программный ШИМ на Attiny13
Подскажите как дальше делать для плавного включения светодиода:
//Chip type : ATtiny13
//AVR Core Clock frequency: 9,600000 MHz
#include ‹tiny13.h›
#include ‹delay.h›
// Declare your global variables here
void main(void)
{
//;
//;
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1‹‹CLKPCE);
CLKPR=(0‹‹CLKPCE) | (0‹‹CLKPS3) | (0‹‹CLKPS2) | (0‹‹CLKPS1) | (0‹‹CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
// Function: Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=Out
DDRB=(0‹‹DDB5) | (0‹‹DDB4) | (0‹‹DDB3) | (0‹‹DDB2) | (0‹‹DDB1) | (1‹‹DDB0);
// State: Bit5=T Bit4=P Bit3=P Bit2=T Bit1=T Bit0=0
PORTB=(0‹‹PORTB5) | (1‹‹PORTB4) | (1‹‹PORTB3) | (0‹‹PORTB2) | (0‹‹PORTB1) | (0‹‹PORTB0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 150,000 kHz
// Mode: Phase correct PWM top=0xFF
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
// Timer Period: 3,4 ms
// Output Pulse(s):
// OC0A Period: 3,4 ms Width: 0 us
TCCR0A=(0‹‹COM0A1) | (1‹‹COM0A0) | (1‹‹COM0B1) | (1‹‹COM0B0) | (1‹‹WGM01) | (1‹‹WGM00);
TCCR0B=(1‹‹WGM02) | (1‹‹CS02) | (0‹‹CS01) | (1‹‹CS00);
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0‹‹OCIE0B) | (0‹‹OCIE0A) | (0‹‹TOIE0);
// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=(0‹‹INT0) | (0‹‹PCIE);
MCUCR=(0‹‹ISC01) | (0‹‹ISC00);
// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1‹‹ACD) | (0‹‹ACBG) | (0‹‹ACO) | (0‹‹ACI) | (0‹‹ACIE) | (0‹‹ACIS1) | (0‹‹ACIS0);
ADCSRB=(0‹‹ACME);
// Digital input buffer on AIN0: On
// Digital input buffer on AIN1: On
DIDR0=(0‹‹AIN0D) | (0‹‹AIN1D);
// ADC initialization
// ADC disabled
ADCSRA=(0‹‹ADEN) | (0‹‹ADSC) | (0‹‹ADATE) | (0‹‹ADIF) | (0‹‹ADIE) | (0‹‹ADPS2) | (0‹‹ADPS1) | (0‹‹ADPS0);
while (1)
{
}
}
|
|
|
|
26.09.2017, 12:49
|
#2
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,069
Сказал спасибо: 3,054
Сказали Спасибо 3,223 раз(а) в 2,188 сообщении(ях)
|
Re: Программный ШИМ на Attiny13
1. Отредактируйте исходное сообщение с использованием тэга CODE.
2. В данном случае, без конкретной схемы - нельзя говорить о конкретной плавности.
__________________
Экзорцист 40-го уровня.
|
|
|
|
26.09.2017, 12:56
|
#3
|
Частый гость
Регистрация: 20.05.2015
Сообщений: 45
Сказал спасибо: 41
Сказали Спасибо 26 раз(а) в 14 сообщении(ях)
|
Re: Программный ШИМ на Attiny13
Не всё реализовано из описания, но ШИМ в этом примере рабочий, с плавным нарастанием по сигналу включения.
Код:
|
;************************************************* ****************
;* Программа предназначена для приёма сигнала от датчика *
;* присутствия человека, аналогового датчика уровня освещённости *
;* и плавного изменения заполнения ШИМ от 0% до значения в *
;* соответствии с уровнем освещённости для плавного включения *
;* и выключения светодиодного освещения *
;* *
;* Программа рассчитана на работу от внутреннего осциллятора на *
;* 128 кГц (CKSEL="11"). *
;* Тактовая частота ядра 32 кГц (CLKPR=CLKPS1) *
;* Частота дискретизации АЦП = 1 кГц *
;************************************************* ****************
.nolist
.include "tn13Adef.inc" ;Define chip particulars
.list
;***** Global register variables
.def wreg1 =R16 ;General use working register
.def light =R17
.def counter1 =R18
.def wreg3 =R19
.equ l_min = 0x50
rjmp RESET_handler ; Reset Handler
rjmp EXT_INT0_handler ; IRQ0 Handler
rjmp PCINT0_handler ; PCINT0 Handler
rjmp TIM0_OVF_handler ; Timer0 Overflow Handler
rjmp EE_RDY_handler ; EEPROM Ready Handler
rjmp ANA_COMP_handler ; Analog Comparator Handler
rjmp TIM0_COMPA_handler ; Timer0 CompareA Handler
rjmp TIM0_COMPB_handler ; Timer0 CompareB Handler
rjmp WATCHDOG_handler ; Watchdog Interrupt Handler
rjmp ADC_handler ; ADC Conversion Handler
RESET_handler:
ldi wreg1, low(RAMEND); Main program start
out SPL,wreg1 ; Set Stack Pointer to top of RAM
ldi wreg1,1‹‹ACD
out ACSR, wreg1 ;Отключение аналогового компаратора, чтобы не ел питание
;************************************************* ****************
; ldi wreg1, (0‹‹CS00)|(1‹‹CS02)
; out TCCR0B,wreg1
;CS02 CS01 CS00 Description
; 0 0 0 No clock source (Timer/Counter stopped)
; 0 0 1 clkI/O/(No prescaling)
; 0 1 0 clkI/O/8 (From prescaler)
; 0 1 1 clkI/O/64 (From prescaler)
; 1 0 0 clkI/O/256 (From prescaler)
; 1 0 1 clkI/O/1024 (From prescaler)
;************************************************* ****************
ldi wreg1,(1‹‹CLKPCE) ;Timer/Counter Clock Select
out CLKPR,wreg1 ;Clock Prescaler Change Enable
;************************************************* ****************
ldi wreg1,(1‹‹CLKPS1) ;Timer/Counter Clock Select
out CLKPR,wreg1 ;Clock Prescale
;CLKPS3 CLKPS2 CLKPS1 CLKPS0 Clock Division Factor
; 0 0 0 0 1
; 0 0 0 1 2
; 0 0 1 0 4
; 0 0 1 1 8
; 0 1 0 0 16
; 0 1 0 1 32
; 0 1 1 0 64
; 0 1 1 1 128
; 1 0 0 0 256
;************************************************* ****************
; Define pull-ups and set outputs high
; Define directions for port pins
ldi wreg1,(0‹‹PB4)|(0‹‹PB1)|(0‹‹PB0)
out PORTB,wreg1
ldi wreg1,(1‹‹DDB0)
out DDRB,wreg1
clr counter1
clr wreg3
;************************************************* ****************
; ISC01 ISC00 Description
; 0 0 The low level of INT0 generates an interrupt request.
; 0 1 Any logical change on INT0 generates an interrupt request.
; 1 0 The falling edge of INT0 generates an interrupt request.
; 1 1 The rising edge of INT0 generates an interrupt request.
;************************************************* ****************
ldi wreg1,(1‹‹SE)|(1‹‹SM1)|(0‹‹SM0)|(0‹‹ISC01)|(1‹‹ISC00)
out MCUCR,wreg1 ; sleep enable, power-down, any logical change on INT0 generates an interrupt request.
ldi wreg1,(1‹‹INT0)
out GIMSK,wreg1 ; External Interrupt Request 0 Enable, Pin Change Interrupt Disable
ldi wreg1,(1‹‹CS02)
out TCCR0B, wreg1 ; clkI/O/256 (From prescaler)
sei
main_loop:
; sei
; sleep
; in wreg1,PINB
; andi wreg1,1
; swap wreg1
;ml02:
; cpi counter1,5 ; For 10 minutes counter1=90
; brne ml01
; ldi wreg3,0x02
; clr counter1
; out TIMSK0,counter1 ; Timer/Counter0 Overflow Interrupt Disable
;ml01:
; or wreg1,wreg3
; out PORTB,wreg1
rjmp main_loop
EXT_INT0_handler:
ldi wreg1,0
out GIMSK,wreg1 ; External Interrupt Request 0 Disable
ldi wreg1,(1‹‹COM0A1)|(1‹‹WGM00)|(1‹‹WGM01)
out TCCR0A, wreg1 ; Clear OC0A on Compare Match, set OC0B at TOP, Fast PWM
ldi wreg1,(1‹‹TOIE0)
out TIMSK0,wreg1 ; Timer/Counter0 Overflow Interrupt Enable
clr wreg1
in wreg3,PINB
set
sbrs wreg3,1 ; пропустить следующую команду, если бит 1 в wreg1 установлен
clt
sbrs wreg3,1 ; пропустить следующую команду, если бит 1 в wreg1 установлен
dec wreg1
out TCNT0,wreg1 ; обнуляем значение счётчика таймера
ldi counter1,0
sbrs wreg3,1 ; пропустить следующую команду, если бит 1 в wreg1 установлен
dec counter1
out OCR0A,wreg1
reti
PCINT0_handler:
EE_RDY_handler:
ANA_COMP_handler:
TIM0_COMPA_handler:
ADC_handler:
TIM0_COMPB_handler:
WATCHDOG_handler:
reti
TIM0_OVF_handler:
brtc t1 ; если ширину импульса уменьшать, то переходим на t1
cpi counter1,0xff ; если ШИМ отработал на включение, то выставляем флаг
brne t0
ldi wreg1,0
out TCCR0A, wreg1 ; Normal port operation, OC0A disconnected
out TIMSK0,wreg1 ; Timer/Counter0 Overflow Interrupt Disable
out GIFR,wreg1 ; General Interrupt Flag Register Reset
inc wreg1
out PORTB,wreg1
ldi wreg1,(1‹‹INT0)
out GIMSK,wreg1 ; External Interrupt Request 0 Enable
reti
t0:
inc counter1
out OCR0A,counter1
reti
t1: cpi counter1,0
brne t2
ldi wreg1,0
out TCCR0A, wreg1 ; Normal port operation, OC0A disconnected
out TIMSK0,wreg1 ; Timer/Counter0 Overflow Interrupt Disable
out PORTB,wreg1
out GIFR,wreg1 ; General Interrupt Flag Register Reset
ldi wreg1,(1‹‹INT0)
out GIMSK,wreg1 ; External Interrupt Request 0 Ensable
reti
t2:
dec counter1
out OCR0A,counter1
reti |
Последний раз редактировалось CAIG; 26.09.2017 в 13:06.
|
|
|
|
26.09.2017, 16:14
|
#4
|
Прописка
Регистрация: 11.04.2009
Сообщений: 233
Сказал спасибо: 11
Сказали Спасибо 109 раз(а) в 66 сообщении(ях)
|
Re: Программный ШИМ на Attiny13
что такое (по - Вашему) аппаратный ШИМ? И где здесь программный?
|
|
|
|
26.09.2017, 20:01
|
#5
|
Частый гость
Регистрация: 14.10.2016
Сообщений: 21
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Программный ШИМ на Attiny13
Программный это шим который вы пишите программно, а аппаратный тот который вы настроили аппаратно.
|
|
|
|
26.09.2017, 20:04
|
#6
|
Частый гость
Регистрация: 14.10.2016
Сообщений: 21
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Программный ШИМ на Attiny13
CAIG, доброго дня!
Подскажите как отредактировать сообщение с использованием тэга CODE?Т.к. я еще новичок, ваш код можно адаптировать под компилятор кодэвижн?Т.к. я в нем начал свой проект, на счет схемы то мне нужно управлять полевиком и я хочу плавно зажечь лампу и что бы она просто потом горела.
|
|
|
|
26.09.2017, 21:31
|
#7
|
Почётный гражданин KAZUS.RU
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 8,016
Сказал спасибо: 0
Сказали Спасибо 4,954 раз(а) в 2,378 сообщении(ях)
|
Re: Программный ШИМ на Attiny13
Сообщение от Дмитрий_58
|
Программный это шим который вы пишите программно, а аппаратный тот который вы настроили аппаратно
|
аппаратно - с помощью своего аппарата? или все ж программно, настроив регистры счетчика?
|
|
|
|
26.09.2017, 23:17
|
#8
|
Гражданин KAZUS.RU
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 748
Сказал спасибо: 365
Сказали Спасибо 822 раз(а) в 386 сообщении(ях)
|
Re: Программный ШИМ на Attiny13
Сообщение от jump
|
аппаратно - с помощью своего аппарата?
|
Тут имеется простор для творчества. Сумматор уже ж существует; для плавного включения светодиода
осталось буквально запилить модуль (читайте 'аппарат') ШИМ из того же материала
|
|
|
|
27.09.2017, 00:19
|
#9
|
Почётный гражданин KAZUS.RU
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 8,016
Сказал спасибо: 0
Сказали Спасибо 4,954 раз(а) в 2,378 сообщении(ях)
|
Re: Программный ШИМ на Attiny13
Сообщение от j-Roger
|
Тут имеется простор для творчества
|
а если написать "аппарат"
|
|
|
|
27.09.2017, 07:14
|
#10
|
Частый гость
Регистрация: 14.10.2016
Сообщений: 21
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Программный ШИМ на Attiny13
Все уже настроено давно, а на счет даташита то читайте его сами, там не сказано как конкретно написать цикл, что тут не ясного или думаете здесь глупее вас сидят.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:03.
|
|