Помогите новичку с внешними прирываниями ATMEGA48

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение ibiza11 »

вместо sts пишите out. остальной код логически верный. единственное не проверял настройку таймера, у вас там число сразу вводится, а чтобы узнать какие биты вы выставляется не хочется в даташит лезть. если нужно выставить несколько битов удобнее(читабельнее код получается) использовать следующую конструкцию:

Код: Выделить всё

ldi temp, (1<<CS00)|(1<<WGM00)

при этом в регистре temp выставляются биты под номерами, соответствующими номерам битов WGM00 и CS00, а остальные биты сбрасываются.
Ставим плюсы: )
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение спящий »

и еще раз спасибо. Надеюсь больше небуду спрашивать такие простые ошибки - самому стыдно,прогу раз 20 проверил,думал что косяк в прерываниях ,а сдесь проще.
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение спящий »

ну уж и последний вопрос ) вдруг ктонибудь делал: прерывания по PINKT0 (1-7 вывод) сделать отдельно кнопки,или отдно прерывание и допустим через SBIC вывода 2 и т.д ?
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение ChipKiller »

спящий писал(а):вдруг ктонибудь делал: прерывания по PINKT0 (1-7 вывод) сделать отдельно кнопки,или отдно прерывание и допустим через SBIC вывода 2 и т.д ?
... еще бы "расшифровать"....
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение спящий »

расшифрование(извините неправильно написал):
прерывание по PCINT - на 7 входов одно прерывание,можноли какнибудь сделать так чтобы можно было использовать все входы,например:

прерывание PCINT :
проверка порта В1;

действие.....;

иначе ;
проверка порта В2;
дейтвие;
иначе возврат прерывание PCINT ;
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение Engineer_Keen »

Т.е. чтобы прерывание сработало по любому из пинов PCINT0...PCINT7, а у же в обработчике определять что делать в зависимости от их состояния? А по другому и не получится если нужно более одного пина из номеров 0...7 опрашивать...
Аватара пользователя
simpleX
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Сб май 30, 2009 00:51:42
Откуда: Россия, г. Курск
Контактная информация:

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение simpleX »

спящий писал(а):и еще раз спасибо. Надеюсь больше небуду спрашивать такие простые ошибки - самому стыдно,прогу раз 20 проверил,думал что косяк в прерываниях ,а сдесь проще.


Лучше всего отлаживать код в AVRStudio - там можно посмотреть регистры и сэмулировать некоторую периферию. Таких ошибок было бы гораздо меньше
"Никогда не опускайся чего б тебе ни стоило, как бы ни было плохо.
А если отступил и сдал немного, то, считай, душа продалась и сдохла!
Честь и кровь - сохрани свою совесть, свобода и любовь - вот она русская гордость"
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение спящий »

подскажите почему непроисходит прерывания?(простая программа по "захвату" на ножке icp1)мега48



;
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m48def.inc"
.list
.nolist
.list



;

.def temp = r16;
.def counter = r17;
.def delay = r27;
.def delay1 = r18;
.def delay2 = r19;
.def temp1 = r22;
.def temp2 = r23;
.def temp3 = r24;
.def temp4 = r25;

.org 0x000
rjmp unit;


.org 0x00A
rjmp preriv1;

unit:
ldi temp,0b11111110;
out DDRB,temp;
ldi temp,0b00111111;
out DDRD,temp;
ser temp;
out DDRc,temp;

ldi r16,high(RAMEND) ;
out SPH,r16 ;
ldi r16,low(RAMEND) ;
out SPL,r16 ;


ldi temp, (icie1<<1) ;
sts timsk1,temp;
ldi temp, (cs11<<1) | (ices1<<1);
sts tccr1b,temp;


sei;

start:



rjmp start;

preriv1:

lds r26,icr1l;
lds r27,icr1h;


reti
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение спящий »

как я понял у меня неработает маска :
ldi temp, (icie1<<1);
sts timsk1,temp;
ldi temp,(ices1<<1)+ (cs11<<1) ;
sts tccr1b,temp;

почему???
заменил на
ldi temp,0b00100000;
sts timsk1,temp;
ldi temp,0b11000101;
sts tccr1b,temp;

заработало((((мож я не правильно маску написал?
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение спящий »

и почему у меня в регистрах которые я сохраняю время длительности сигнала постоянно меняются значения? постоянно увеличиваются?
Аватара пользователя
VirZh
Встал на лапы
Сообщения: 86
Зарегистрирован: Вс фев 27, 2011 01:01:11
Откуда: Республика Крым

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение VirZh »

спящий писал(а):как я понял у меня неработает маска :
ldi temp, (icie1<<1);
sts timsk1,temp;
ldi temp,(ices1<<1)+ (cs11<<1) ;
sts tccr1b,temp;

почему???
заменил на
ldi temp,0b00100000;
sts timsk1,temp;
ldi temp,0b11000101;
sts tccr1b,temp;

заработало((((мож я не правильно маску написал?


Дело в том, что в нижнем участке в TCCR1B пишется 4 единичных значения, а в верхнем - два. :). Если вверху написать:
ldi temp, (icie1<<1);
sts timsk1,temp;
ldi temp,(1<< ICNC1)|(ICES1<<1)|(CS12<<1)|(CS10<<1) ;
sts tccr1b,temp;
то должно работать...
Опыт и мудрость приходят с годами... К некоторым годы приходят одни...
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение спящий »

VirZh я и так тоже писал непомогло(( сделал как всегда 0b00000000 ))


вот помогите разобраться уже давно мучаюсь немогу понять:

Прерывание по ЗАХВАТУ(определяет промежуток времени по спадающему фронту)
почему R26 и R27 постоянно увеличиваются если частота остается преждней..
основные положения выделил чтобы было понятно:

Программа что-то типо частотомера(подгоняю):





;
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m48def.inc"
.list
.nolist
.list



;

.def temp = r16;
.def counter = r17;
.def delay = r27;
.def delay1 = r18;
.def delay2 = r19;
.def temp1 = r22;
.def temp2 = r23;
.def temp3 = r24;
.def temp4 = r25;

.org 0x000
rjmp unit;


.org 0x00A
rjmp preriv1; настраиваем счетчик таймера




unit:
ldi temp,0b11111110;
out DDRB,temp;
ldi temp,0b00111111;
out DDRD,temp;
ser temp;
out DDRc,temp;

ldi r16,high(RAMEND) ; устанавливаем область стека
out SPH,r16 ;
ldi r16,low(RAMEND) ;
out SPL,r16 ;

ldi temp,0b00000010; выводим сразу 0
mov r0,temp;
out portB,temp;
ldi temp,0b0011110;
out portD,temp;


ldi temp,0b10011110;заполняем 1
mov r1,temp;
ldi temp,0b00100100;заполняем 2
mov r2,temp;
ldi temp,0b00001100;3
mov r3,temp;
ldi temp,0b10011000;4
mov r4,temp;
ldi temp,0b01001000;5
mov r5,temp;
ldi temp,0b01000000;6
mov r6,temp;
ldi temp,0b00011110;7
mov r7,temp;
ldi temp,0b00000000;8
mov r8,temp
ldi temp,0b00001000;9
mov r9,temp;


ldi temp,0b00100000; (icie1<<1) настраиваем прерывания по Захвату
sts timsk1,temp;
ldi temp,0b11000101;(icnc1<<1)+(ices1<<1)+(cs11<<1)
sts tccr1b,temp;


sei;

start:

mov r22,r11; зеленое просто выводим значение на табло!!!!!
mov r23,r12;
mov r24,r13;

mov r24,r13;
ldi ZL,0;
add zl,r24;
ld r24,z;
ldi temp,0b00000001;
out portd,temp;
out portB,r24;
ldi r16,0x00;
ldi r17,0x10;
loop:
subi r16,1;
sbci r17,0;
brcc loop;


mov r23,r12;
ldi ZL,0;
add zl,r23;
ld r23,z;
ldi temp,0b00000010;
out portd,temp;
out portB,r23;
ldi r16,0x00;
ldi r17,0x10;
loop1:
subi r16,1;
sbci r17,0;
brcc loop1;


mov r22,r11;
ldi ZL,0;
add zl,r22;
ld r22,z;
ldi temp,0b00000100;
out portd,temp;
out portB,r22;
ldi r16,0x00;
ldi r17,0x10;
loop2:
subi r16,1;
sbci r17,0;
brcc loop2;


mov r21,r10;
ldi ZL,0;
add ZL,r21;
ld r21,z;
ldi temp,0b00001000;
out portd,temp;
out portB,r21;
ldi r16,0x00;
ldi r17,0x10;

loop3:
subi r16,1;
sbci r17,0;
brcc loop3;


rjmp start;

preriv1:

clr r26;
clr r27;
lds r26,icr1l; вот тут постоянно увеличивается значение((( хотя поидее должно оставаться постонным
lds r27,icr1h;

clr r21;тысячи
clr r22;сотни
clr r23;десятки
clr r24;единицы

ldi r18,1;
div:
subi r26,5;делитель
sbci r27,0;
brcs vixod;единицы
adc r24,r18;
cpi r24,10

brne div; десятки
clr r24;
adc r23,r18;
cpi r23,10

brne div;сотни
clr r23;
adc r22,r18;
cpi r22,10

brne div;тысячи
clr r22;
adc r21,r18;
cpi r21,10
brne div;

vixod:


mov r10,r21;
mov r11,r22;
mov r12,r23;
mov r13,r24;
clr r16;
clr r18;
clr r26;
clr r27;

clr r16;
sts tcnt1l,r16;
sts tcnt1h,r16
sts icr1h,r16;
sts icr1l,r16;


reti
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение спящий »

подскажите почему АЦП ,когда перекидываеш регистр,значение меняеться сначало очень быстро,потом очень медленно - хотя сигнал входящий меняется плавно(синусоида)
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»