Страница 1 из 1
регулятор тока
Добавлено: Вт янв 10, 2012 20:27:03
супер мегакотэ
Братцы, помогите пожалста.
В общем мне нужно чтобы лампочка при нажатии на одну из кнопок (двух) горела ярче а на вторую тусклее.
Я так понимаю нужно регулировать ток, текущий через лампочку.
Лампочка минимум на 5в
З.Ы. с кнопками я разобрался, мне нужно только что писать в обработчике прерывания
Re: регулятор тока
Добавлено: Вт янв 10, 2012 20:32:24
les1982
ШИМ вам в помощь
Re: регулятор тока
Добавлено: Вт янв 10, 2012 20:36:30
супер мегакотэ
сейчас загуглим, спасибо
Re: регулятор тока
Добавлено: Вт янв 10, 2012 20:54:08
Payalnick
Да-да, шим.
Re: регулятор тока
Добавлено: Ср янв 11, 2012 20:38:48
супер мегакотэ
Стесняюсь спросить, а может ли кто проверить код?
Код: Выделить всё
.include "m16def.inc"
.include "macro.inc"
.cseg
.org $000
rjmp RESET
.org $002
rjmp INT0
.org $004
rjmp INT1
.org $006
rjmp TIMER2_COMP
.org $008
rjmp TIMER2_OVF
.org $00A
rjmp TIMER1_CAPT
.org $00C
rjmp TIMER1_COMPA
.org $00E
rjmp TIMER1_COMPB
.org $010
rjmp TIMER1_OVF
.org $012
rjmp TIMER0_OVF
.org $014
rjmp SPI_STC
.org $016
rjmp USART_RXC
.org $018
rjmp USART_UDRE
.org $01A
rjmp USART_TXC
.org $01C
rjmp ADC
.org $01E
rjmp EE_RDY
.org $020
rjmp ANA_COMP
.org $022
rjmp TWI
.org $024
rjmp INT2
.org $026
rjmp TIMER0_COMP
.org $028
rjmp SPM_RDY
.org INT_VECTORS_SIZE
ldi R16,RamEnd ;настройка стека
out SPL,R16
ldi R16,0b00000000 ;настройка порта D
out DDRD,R16
ldi R16,0b11111111 ;настройка порта C
out DDRC,R16
ldi R16,0b11111111 ;настройка порта A
out DDRD,R16
LOOP: rjmp LOOP
RESET:
;INT0:
;INT1:
TIMER2_COMP:
TIMER2_OVF:
TIMER1_CAPT:
TIMER1_COMPA:
TIMER1_COMPB:
TIMER1_OVF:
TIMER0_OVF:
SPI_STC:
USART_RXC:
USART_UDRE:
USART_TXC:
ADC:
EE_RDY:
ANA_COMP:
TWI:
INT2:
TIMER0_COMP:
SPM_RDY:
reti
ldi R16,1
SETB DDRD,4,R16
SETB DDRD,5,R16
OUTI TCCR1A,2<<COM1A0|2<<COM1B0|0<<WGM11|1<<WGM10
OUTI TCCR1B,0<<WGM13|1<<WGM12|1<<CS10
LDI R16,128
LOOPA: CLI
OUTI OCR1AH,0
OUTI OCR1AL,R16
OUTI OCR1BH,0
OUTI OCR1BL,R16
SEI
LOOP: rjmp LOOP
rjmp LOOPA
INT1: SUB R16,10
rjmp LOOPA
Re: регулятор тока
Добавлено: Чт янв 12, 2012 07:25:28
GP1
Ну вот опять, очередная жертва обучалки.
1. посмотри куда у тебя переход по RESET, который заканчивается reti.
Куда уйдет прога после такого старта? Причем порты и стек никогда не будут инициализированы.
2. стек поинтер у меги16 2х байтовый, поэтому инициализировать надо оба байта SPH:SPL
3. двойное определение метки LOOP, ты хотя бы пробовал скомпилить прогу?
дальше даже не смотрел, полная каша

.
Re: регулятор тока
Добавлено: Чт янв 12, 2012 08:29:42
супер мегакотэ
извиняюсь, это первая моя личная прога
а если на ресет вообще ничего не делать?
и что с метками нетак? вроде ж не повторяются
Re: регулятор тока
Добавлено: Чт янв 12, 2012 08:54:05
pyzhman
Код: Выделить всё
ldi R16,0b11111111 ;настройка порта A
out DDRD,R16
LOOP: rjmp LOOP
.
.
.
SEI
LOOP: rjmp LOOP
А после метки RESET идет RETI. Ну и куда возвращаться?
Re: регулятор тока
Добавлено: Чт янв 12, 2012 09:51:35
GP1
обычно делают так:
Код: Выделить всё
; описание векторов
.org 0
jmp(rjmp) start ;здесь необходимо учитывать "дальность" перехода
...
...
дальше, ну кому как удобней, я предпочитаю размещать тело основной программы, другие здесь размещают обработчики прерываний, дело вкуса.
Код: Выделить всё
.org INT_VECTORS_SIZE
start:
;1. инициализируется стек!!!
...
;2. инициализируется перефирия
...
;3. если надо разрешаем прерывания (глобально!!!)
sei
;4. основной цикл
main_loop:
...
...
...
jmp(rjmp) main_loop
после этого у меня идут п/п и обработчики прерываний:
Код: Выделить всё
<имя_обработчика_прерывания>:
...
...
reti ; обработчик прерывания ВСЕГДА(!!!) должен заканчиваться reti
<имя_п/п>:
...
...
ret ;п/п заканчивается командой ret
ну вот как-то так.
инициализацию периферии лучше группировать по блокам - таймеры к таймерам, АЦП к АЦП, и т.д.
Re: регулятор тока
Добавлено: Чт янв 12, 2012 19:06:26
супер мегакотэ
pyzhman писал(а):А после метки RESET идет RETI. Ну и куда возвращаться?
дошло, я если rjmp не писать а сразу на адресе написать reti
Re: регулятор тока
Добавлено: Чт янв 12, 2012 19:09:59
pyzhman
И что мы делаем по команде RETI?
Re: регулятор тока
Добавлено: Чт янв 12, 2012 19:41:35
супер мегакотэ
GP1 писал(а):обычно делают так:
Код: Выделить всё
; описание векторов
.org 0
jmp(rjmp) start ;здесь необходимо учитывать "дальность" перехода
...
...
дальше, ну кому как удобней, я предпочитаю размещать тело основной программы, другие здесь размещают обработчики прерываний, дело вкуса.
Код: Выделить всё
.org INT_VECTORS_SIZE
start:
;1. инициализируется стек!!!
...
;2. инициализируется перефирия
...
;3. если надо разрешаем прерывания (глобально!!!)
sei
;4. основной цикл
main_loop:
...
...
...
jmp(rjmp) main_loop
после этого у меня идут п/п и обработчики прерываний:
Код: Выделить всё
<имя_обработчика_прерывания>:
...
...
reti ; обработчик прерывания ВСЕГДА(!!!) должен заканчиваться reti
<имя_п/п>:
...
...
ret ;п/п заканчивается командой ret
ну вот как-то так.
инициализацию периферии лучше группировать по блокам - таймеры к таймерам, АЦП к АЦП, и т.д.
а что такое п/п?
Re: регулятор тока
Добавлено: Чт янв 12, 2012 19:42:29
супер мегакотэ
pyzhman писал(а):И что мы делаем по команде RETI?
выход из обработчика
Re: регулятор тока
Добавлено: Чт янв 12, 2012 20:22:23
GP1
супер мегакотэ писал(а):
а что такое п/п?
ничего особенного, просто кусок кода, выполнение которого вызывается из определенного места основного цикла, в простонародии П(од)/П(рограмма)
Re: регулятор тока
Добавлено: Чт янв 12, 2012 20:24:00
GP1
супер мегакотэ писал(а):pyzhman писал(а):И что мы делаем по команде RETI?
выход из обработчика
pyzhman спрашивает куда выйдет программа после такого выхода.

стек - не определен, точка возврата в нем не загружена, до инициализации в нем случайное число, соответственно адрес возврата из прерывания тоже будет случайным.
Re: регулятор тока
Добавлено: Чт янв 12, 2012 21:47:48
супер мегакотэ
GP1 писал(а):супер мегакотэ писал(а):
выход из обработчика
pyzhman спрашивает куда выйдет программа после такого выхода.

стек - не определен, точка возврата в нем не загружена, до инициализации в нем случайное число, соответственно адрес возврата из прерывания тоже будет случайным.
можно ли просто не делать обработчика, оставить адрес $002 пустым? Компилятор не ругнется?
Re: регулятор тока
Добавлено: Чт янв 12, 2012 21:58:01
GP1
супер мегакотэ писал(а):
можно ли просто не делать обработчика, оставить адрес $002 пустым? Компилятор не ругнется?
можно все что угодно
можно основной цикл с $0000 писать, вот только
НИ ОДНО прерывание не получится использовать, а это очень редкий случай, когда можно без прерываний обойтись.
эх, жалко моя статейка в недрах КотоРеда сгинула, а я там все это уже объяснял
зы: хотелось бы уточнить возраст, образование - а то разговор получается "немого со слепым"
Re: регулятор тока
Добавлено: Чт янв 12, 2012 23:08:45
супер мегакотэ
GP1 писал(а):супер мегакотэ писал(а):
зы: хотелось бы уточнить возраст, образование - а то разговор получается "немого со слепым"
чего, мои что ли?
З.Ы. в личку скину