 |
|
|
|
| Автор |
Сообщение |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 07 Июл 2007, 12:12 Заголовок сообщения: |
|
|
Ну и постановка
опиши толком задачку, свое решение/мысли/рассуждения, проблему, и в чем именно загвоздка.
Хороший вопрос - половина ответа.
Я так думаю, что твой вопрос ... "нужен период таймера 1 секунда, а при моем кварце получается максимум 123мс выдавить"?
Угадал? _________________ AndryG |
|
| Вернуться к началу |
|
 |
Krik99 Знатный посетитель (>20)

Зарегистрирован: 15.12.2006 Сообщения: 26 Откуда: Одеская обл. г.Котовск
|
Добавлено: 07 Июл 2007, 18:16 Заголовок сообщения: |
|
|
Я хоу научится пользоватся внутренним таймером Atmega8... И для этого я хочу написать такую программу чтобы светодиод мигал каждую минуту. Всмысле я хочу чтобы мигал светодиод не программно а апаратно...  |
|
| Вернуться к началу |
|
 |
Negor Частый гость (>5)

Зарегистрирован: 07.07.2007 Сообщения: 8
|
Добавлено: 07 Июл 2007, 19:37 Заголовок сообщения: |
|
|
т.к. не указан тип контроллера, я приведу пример на тини2313... и для CodeVision...
для реализации задачи воспользуемся прерыванием таймера по совпадениюс OCR1A(остановим счёт, зажжём светодиод на 50мс и запустим счёт снова)
Для подсчёта предела таймера воспользуемся калькулятором для таймеров АВР(взято с AVRFreaks.net).
итак он нам сказал, что для 6000мс при частоте кварца 4МГц нам потребуется 16-разрядный таймер с пределителем 1024. Кроме того таймер должен считать до 0x73 в нижнем регистре и 0xa4 в верхнем. Значит нам потребуется режим таймера СТС. Делаем...
| Код: |
#include <tiny2313.h>
#include<delay.h>
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TCCR1B=0x09;
PORTB.0=1;
PORTB.0=0;
TCCR1B|=(1<<CS10)|(1<<CS12);
}
void main()
{
SREG|=1<<I;
DDRB=0x01;
OCR1AL=0x73;//zagruzhaem predely scheta
OCR1AH=0xa4;//
TCCR1A|=1<<WGM12;//rezhim CTC(sbros taimera po sovpadeniyu TCNT1 c OCR1A)
TCCR1B|=(1<<CS10)|(1<<CS12);//Predelitel' na 1024(posle ustanovki predelitelya
// taimer nachinaet schitat')
TIMSK|=1<<OCIE1A;//Razreshenie preryvaniya po sovpadeniju
while(1);
}
|
Примерно так...
Последний раз редактировалось: Negor (07 Июл 2007, 19:58), всего редактировалось 1 раз |
|
| Вернуться к началу |
|
 |
Krik99 Знатный посетитель (>20)

Зарегистрирован: 15.12.2006 Сообщения: 26 Откуда: Одеская обл. г.Котовск
|
Добавлено: 07 Июл 2007, 19:49 Заголовок сообщения: |
|
|
| Я под CodeVision видел много таких прог а мне надо под WinAVR... Да кстате контролёр Atmega8... |
|
| Вернуться к началу |
|
 |
Negor Частый гость (>5)

Зарегистрирован: 07.07.2007 Сообщения: 8
|
Добавлено: 07 Июл 2007, 20:01 Заголовок сообщения: |
|
|
| так проблема в переделке кода под WinAVR? |
|
| Вернуться к началу |
|
 |
Krik99 Знатный посетитель (>20)

Зарегистрирован: 15.12.2006 Сообщения: 26 Откуда: Одеская обл. г.Котовск
|
Добавлено: 07 Июл 2007, 20:11 Заголовок сообщения: |
|
|
Ну для начал я просто хочу посмотреть такую прогу под Winavr... А дальше будет видно.  |
|
| Вернуться к началу |
|
 |
Negor Частый гость (>5)

Зарегистрирован: 07.07.2007 Сообщения: 8
|
Добавлено: 07 Июл 2007, 20:19 Заголовок сообщения: |
|
|
Конечно я могу и ошибится.... но по моему в данном коде для компиляции под WinAvr достаточно изменить библиотеки и объявление прерываний... _________________ There is only 10 kind of people: those who understands binary code and those who dont!!! |
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 09 Июл 2007, 7:08 Заголовок сообщения: |
|
|
| Krik99 писал(а): | | Я под CodeVision видел много таких прог а мне надо под WinAVR... Да кстате контролёр Atmega8... |
Вчитайтесь сами ... какая разница, под каким компилятором пишете - регистры те же и С тот же ... другое дело. что с компилятором по другому работать нужно, тогда вопрос совсем не так задается ...
Вам не таймер нужно, а описание работы с компилятором надо. _________________ AndryG |
|
| Вернуться к началу |
|
 |
AVL Знатный посетитель (>20)


Зарегистрирован: 20.09.2006 Сообщения: 52 Откуда: Коломыя UA
|
Добавлено: 28 Янв 2008, 9:29 Заголовок сообщения: |
|
|
Всем ПРИВЕТ!
Вот простой пример любезно предоставленный мне AndryG, более года назад.
За это время я успешно в нём разобрался.
Но теперь решил углубить знания и опять есть пару вопросов даже в таком простом коде.
А именно:
- почему на терминал идёт только переменная putchar(fsc), хотя в вписываю putchar(v);, putchar(n);, putchar(p);?
- Как в Протерусе посмотреть эти самые переменные? Дело в том, что я выбираю "смотеть эти переменные". Но прога только выдаёт ихний адрес в памяти , а текущего (и никакого) значения не выдаёт.
Name Address value
.bss 0060
p -252 Item 1 ...
sc -251 Item 1 ...
psc -250 Item 1 ...
p R-252 Item (1 bytes at 0xFFFFFF04) not within memory block (0x00010000 bytes).
- Как в Потерусе смотреть ход выполнения программы? Ибо выбираю пункт "AVR Source Code - U1", а там мне пишут "No source line at PC address [PC=014A]."
Листинг:
/* А дальше надо будет сделать что б лампочка (pb1)
загоралась при нажатии и удерживании кнопки (pb0)
не мение чем 5 секунд, а выключалась моментально.
Это что б с дуру не "рвануло" .[/quote]
Другими словами ...
удержание кнопки 5 сек - ВКЛ. повторное нажатие - ВЫКЛ.
http://AndryG.ho.com.ua
Chip type : AT90S2313
Clock frequency : 1,000000 MHz
Memory model : Tiny
External SRAM size : 0
Data Stack size : 32
*****************************************************/
#include <90s2313.h>
#include <delay.h>
#include <stdio.h>
unsigned char p;
unsigned char sc;
unsigned char fsc;
#define bt_ 0x01 //Кнопка
#define ld_ 0x02 //Светодиод
#define ld_on PORTB &= ~ld_
#define ld_off PORTB |= ld_
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
unsigned char n,v;
TCNT0=0xCF;
n = PINB & bt_;
v = p ^ n;
if (v & p & bt_) // НАЖАЛИ (bt_=1 при отпущенной)
if (PORTB & ld_) //Если не горит
fsc = 1;
else
ld_off;
if (v & n & bt_) //отпустили
{
sc = 0;
fsc = 0;
}
if (sc > 0x38) //Тут надо 100 поставить для 5 секунд
ld_on;
else
sc += fsc;
p = n;
putchar(fsc);
putchar(sc);
}
void main(void)
{
PORTB=0x03;
DDRB=0x02;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x05;
TCNT0=0xCF;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1H=0x00;
OCR1L=0xCF;
GIMSK=0x00;
MCUCR=0x00;
TIMSK=0x02;
ACSR=0x80;
UCR=0x08;// Communication Parameters: 4800:8:1:no
UBRR=0x0C;
#asm("sei")
ld_off;
p = bt_; //В "прошлом" отпущена кнопка
while (1);
} |
|
| Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять вложения в этом форуме Вы можете просматривать вложения в этом форуме
|
|