реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Запуск таймера 16бит по внешнему прерыванию, Атмега+CodeVision
Vny4ek
сообщение Dec 4 2008, 06:27
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 145
Регистрация: 11-01-08
Пользователь №: 34 001



Никак не могу разобраться как сделать так:
При перепаде сигнала на входе от 0 до 5 срабатывает прерывание и запускает отсчет 16 битный счетчик
я правильно понял что нужно подовать сигнал на INT0 ножку и выбирать Rising Edge в мастере генерации кода? Если можно киньте плиз шаблон. как начать. по сути хочу вывести на дисплей значение таймера
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение Dec 4 2008, 12:51
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



Цитата(Vny4ek @ Dec 4 2008, 09:27) *
Никак не могу разобраться как сделать так:
При перепаде сигнала на входе от 0 до 5 срабатывает прерывание и запускает отсчет 16 битный счетчик

я правильно понял что нужно подовать сигнал на INT0 ножку и выбирать Rising Edge [skipped]?


Ну да, поняли правильно. Только в чем проблема? Таймер работает? Внешнее прерывание вызывается? Если с этим по отдельности справились - проблем быть не должно.
Go to the top of the page
 
+Quote Post
Vny4ek
сообщение Dec 4 2008, 14:57
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 145
Регистрация: 11-01-08
Пользователь №: 34 001



Неа, в том то и дело что не получилось, хочу вывести значение таймера на дисплей, но никак не получается. С дисплеем разобрался. Может кините пример кода. Что я не так делаю не пойму. я даже делал так: В функции прерывания присваивал переменной например число 10 а до этого в main 5, вот и на дисплее все время 5. функция прерывания у меня выше а ниже функция мейн.
Может дадите способ или код, как можно отдельно проверить чтоли, что сработало прерывание, или таймер запустился по условию. Вот с этим у меня сложности

Сообщение отредактировал Vny4ek - Dec 4 2008, 14:59
Go to the top of the page
 
+Quote Post
vik0
сообщение Dec 4 2008, 18:48
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233



Цитата(Vny4ek @ Dec 4 2008, 16:57) *
Может дадите способ или код

Давайте лучше вы дадите свой код, а мы посмотрим и поможем..
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение Dec 4 2008, 21:16
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



2Vny4ek
Всецело согласен с предыдущим оратором. От того, что мы Вам просто напишем код, понимания у Вас не прибавится. Итак, как Вы пытаетесь инициализировать таймеры и прерывания?
Go to the top of the page
 
+Quote Post
SysRq
сообщение Dec 4 2008, 21:18
Сообщение #6


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(Vny4ek @ Dec 4 2008, 17:57) *
В функции прерывания присваивал переменной например число 10 а до этого в main 5, вот и на дисплее все время 5.

А может надо почитать что такое volatile всего лишь...
Go to the top of the page
 
+Quote Post
Vny4ek
сообщение Dec 5 2008, 06:02
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 145
Регистрация: 11-01-08
Пользователь №: 34 001



ОК понял! я домой приду вечером и выложу свой код. а вы уж оцените и скажите что не так
Go to the top of the page
 
+Quote Post
Vny4ek
сообщение Dec 10 2008, 06:25
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 145
Регистрация: 11-01-08
Пользователь №: 34 001



Вот код зацените пожалуйста что не так


#include <mega16.h>
#include <stdio.h> // sprintf
#include <delay.h> // delay_ms


#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>

unsigned int s=1; // !!!Esli s=1 to na LCD vivodit TEXT!!!
// !!!Signal idet na PD2 (INT0)

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
s=1;
}

void main(void)
{

PORTA=0x00;
DDRA=0x00;

PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: T1 pin Rising Edge
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x07;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
// INT2: Off
GICR|=0x40;
MCUCR=0x03;
MCUCSR=0x00;
GIFR=0x40;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization
lcd_init(16);

if (s==1) {
delay_ms(20);
lcd_clear();

lcd_gotoxy(0,1);
lcd_putsf("Interrupt work!");
};

#asm("sei")

while (1)
{

};
}
Go to the top of the page
 
+Quote Post
_Ivan_33
сообщение Dec 10 2008, 06:35
Сообщение #9


fpga designer
****

Группа: Свой
Сообщений: 613
Регистрация: 20-04-08
Из: Зеленоград
Пользователь №: 36 928



хех...
1) если переменная сначала не объвлена как volatile то в прерывании с ней ничего не произойдет вообще
2) пусть прерывания сначала не было после включения... тогда программа пробежит по всем регистрам(что у тебя написано что надо установить) и затем сравнит если s=1 хотя s=0 так как прерывания у тебя не возникло и пойдет на след. строку... а там пустой бесконенчый цикл... так потом у тебя прерывание возникнет s=1 но все равно не включится так как проверку условия уже программа пробежала- поэтому нада проверку s сделать в бесконечном цикле...
в сами регистры не смотрел - тупо нет времени но надеюсь что правильно

по-моему так, если что наврал - скажите


--------------------
Go to the top of the page
 
+Quote Post
Vny4ek
сообщение Dec 10 2008, 07:05
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 145
Регистрация: 11-01-08
Пользователь №: 34 001



Тоесть эту строчку нужно поместить в цикл While?

if (s==1) {
delay_ms(20);
lcd_clear();

lcd_gotoxy(0,1);
lcd_putsf("Interrupt work!");
};
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение Dec 10 2008, 09:20
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



Цитата(_Ivan_33 @ Dec 10 2008, 09:35) *
1) если переменная сначала не объвлена как volatile то в прерывании с ней ничего не произойдет вообще

Это что, такая фича CodeVision-а? 07.gif
Go to the top of the page
 
+Quote Post
vik0
сообщение Dec 10 2008, 09:40
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233



Цитата
Тоесть эту строчку нужно поместить в цикл While?

Да.
И, как было сказано, заменить
unsigned int s=1;
на
volatile unsigned int s=1;

Цитата
Это что, такая фича CodeVision-а? 07.gif

Точно не знаю, но по-моему, это такое "понимание" значения квалификатора volatile.. sad.gif
Go to the top of the page
 
+Quote Post
Vny4ek
сообщение Dec 10 2008, 12:08
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 145
Регистрация: 11-01-08
Пользователь №: 34 001



Все учел что сказали, перекомпилил нарисовал в протеусе, но работать отказывается. Может я что то не так еще делаю. На ножку PD2 (INT0) кнопкой от линии питания +5В подаю как бы фронт. Но ничего на дисплей не идет. подскажите плиз. Привожу код:

Код
#include <mega16.h>
#include <stdio.h> // sprintf
#include <delay.h> // delay_ms


#asm
.equ __lcd_port=0x15;PORTC
#endasm
#include <lcd.h>

volatile unsigned int s=1; // !!!Esli s=1 to na LCD vivodit TEXT!!!
// !!!Signal idet na PD2 (INT0)

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
s=0;
}

void main(void)
{

PORTA=0x00;
DDRA=0x00;

PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: T1 pin Rising Edge
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x07;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
// INT2: Off
GICR|=0x40;
MCUCR=0x03;
MCUCSR=0x00;
GIFR=0x40;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization
lcd_init(16);
s=1;

#asm("sei")
while (1)
{
  
if (s==0) {
delay_ms(50);
lcd_clear();
delay_ms(50);
lcd_gotoxy(0,1);
delay_ms(50);
lcd_putsf("Interrupt work!");  
delay_ms(50);
};

};
}
Go to the top of the page
 
+Quote Post
_Ivan_33
сообщение Dec 10 2008, 12:59
Сообщение #14


fpga designer
****

Группа: Свой
Сообщений: 613
Регистрация: 20-04-08
Из: Зеленоград
Пользователь №: 36 928



а без всяких дополнительных извращений на LCD что нить выводится?!?


--------------------
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Dec 10 2008, 12:59
Сообщение #15


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(Vny4ek @ Dec 10 2008, 15:08) *
На ножку PD2 (INT0) кнопкой от линии питания +5В подаю как бы фронт. Но ничего на дисплей не идет. подскажите плиз.

Ключевое слово КАК БЫ. Реально дребезг кнопки. Может быть очень плохо от потока прерываний. Код не смотрел. smile.gif


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 10th July 2025 - 01:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01563 секунд с 7
ELECTRONIX ©2004-2016