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

 
 
> Шпак индикатор мигающий каждую секунду
zeonix0
сообщение Aug 18 2011, 12:04
Сообщение #1


Участник
*

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



Цитата
/*Индикатор, мигающий каждую секунду AT90S8515
К выводу 0 порта В подключен светодиодный индикатор, который должен переключаться каждую секунду.
Это можно сделать с помощью прерывания при переполнении таймера.
Воспользуемся, например, таймером/счетчиком Т/С1.
С помощью разрядов CS10-CS12 регистра TCCR1B устанавливается коэффициент деления частоты системной
синхронизации для тактирования таймера. Выберем коэффициент 1024, что соответствует значению 0b101
или просто 5.
Таким образом, в случае рабочей частоты микроконтроллера в 4 МГц
значение счетного регистра TCNT1 будет увеличиваться через каждые 1024 / 4000000 = 0,000256 с.
Следовательно, необходимо установить такое стартовое значение счетчика, чтобы до его переполнения
отсчитывалось 1 / 0,000256 = 3906 импульсов. Поскольку с помощью 16 разрядов счетчика можно
получить максимальное значение 65535 (0xFFFF), то он должен инициализироваться значением 65536-3906.*/

#include <avr/io.h>
#include <avr/interrupt.h> //Для доступа к функции sei()
#include <avr/signal.h> //Для доступа к макросу INTERRUPT

#define Freq 4000000 //Частота системной синхронизации в Гц
ISR(TIMER1_OVF_vect) //Подпрограмма обработки прерывания по
{ //переполнению счетчика Т/С1
//Инициализируем счетный регистр значением 61630
TCNT1 = 0x10000 - (Freq / 1024);
PORTB ^= 0x01; //Меняем состояние вывода 0 порта В
}

int main (void)
{
DDRB = 0x01; //Вывод 0 порта В — выход
TCCR1A = 0; //Т/С1 отсоединен от вывода ОС1, режим ШИМ отключен
TCCR1B = 5; //Коэффициент деления частоты системной
//синхронизации = 1024
//Инициализируем счетный регистр значением 61630
TCNT1 = 0x10000 - (Freq / 1024);
TIFR = 0; //Сбрасываем все флаги прерываний от Т/С1
TIMSK = 0x80; //Разрешаем прерывание при переполнении Т/С1
GIMSK = 0; //Запрет внешних прерываний
sei(); //Общее разрешение прерываний
while(1) ; //Ожидаем прерывания от Т/С1 каждую секунду
}


в результате

Цитата
> "make.exe" all

-------- begin --------
avr-gcc (WinAVR 20100110) 4.3.3
Copyright © 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Compiling C: test1.c
avr-gcc -c -mmcu=atmega16a -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./test1.lst -std=gnu99 -MMD -MP -MF .dep/test1.o.d test1.c -o test1.o
In file included from test1.c:16:
c:/winavr/lib/gcc/../../avr/include/avr/signal.h:36:2: warning: #warning "This header file is obsolete. Use <avr/interrupt.h>."
test1.c: In function 'main':
test1.c:36: error: 'GIMSK' undeclared (first use in this function)
test1.c:36: error: (Each undeclared identifier is reported only once
test1.c:36: error: for each function it appears in.)
make.exe: *** [test1.o] Error 1

> Process Exit Code: 2
> Time Taken: 00:00
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zeonix0
сообщение Aug 19 2011, 07:12
Сообщение #2


Участник
*

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



вообщем не знаю от чего такой глюк был, но светодиод замигал. Возможно на программаторе не контакт где-то. Так как по факту только провода подергал.

И так вернемся к нашим баранам.
Код
#include <avr/io.h>
#include <avr/interrupt.h>  
#include <avr/signal.h>  

#define Freq 4000000      
ISR(TIMER1_OVF_vect)  
{    
    TCNT1 = 0x10000 - (Freq / 1024);
    PORTB ^= 0x01;  
}

int main (void)
{
    DDRB = 0x01;
    TCCR1A = 0;
    TCCR1B = 5;
    TCNT1 = 0x10000 - (Freq / 1024);
    TIFR = 0x00;
    TIMSK = 0x80;
//    GICR = 0x00;
    sei();
    while(1){};
}


Цитата
1. Проверить систему тактирования (генерит-ли кварц, если не от внутреннего RC-тактируетесь.)

из предыдущей проги удалось замаргать светодиод. Делаем вывод что кварц работает.

Petka
Код
#include <avr/io.h>
#include <avr/delay.h>

int main (void)
{
DDRB = 0xFF;
while(1)    
{
_delay_loop_2(300000);
PORTB=0xFF;    
_delay_loop_2(3000000);
PORTB=0x00;    
}
return 1;
}

замигал так.

Код
2. Проверить питание и пороги BOD.

на входе 4.78 В С порогами не может быть ничего наверно, так как 1 источник питания только же.

Код
3. Отключить watсhdog.

wdt_disable(); так ?
я хз я его не использовал в проге. Я так понял эта штука нужна для аварийных ситуаций, когда зависон какой-то происходит. Так?
Код
4. Отключить во фьюзах JTAG.

во фьюзах посмотрел нету вообще JTAG
Код
5. Подёргать ножкой без прерываний:

в предыдущем примере сделал, но по другому немного.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 19 2011, 07:30
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(zeonix0 @ Aug 19 2011, 11:12) *
я хз я его не использовал в проге. Я так понял эта штука нужна для аварийных ситуаций, когда зависон какой-то происходит. Так?
Не так. Если вы его не сбрасываете он сбрасывает вас, т.к. контроллер. А по умолчанию период WDTO очень мал что-то порядка десятков миллисекунд. Таким образом если вы его "не используете" он всё равно будет ресетить контроллер до тех пор пока вы явно его не выключите или не будете его самого сбрасывать регулярно.

Цитата(zeonix0 @ Aug 19 2011, 10:17) *
Linking: test2.elf
avr-gcc -mmcu=atmega16a -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=test2.o -std=gnu99 -MMD -MP -MF .dep/test2.elf.d test2.o --output test2.elf -Wl,-Map=test2.map,--cref -lm
Вы это видите? Какая у вас частота кварца?
Зачем delay_loop вызываете, вместо нормальной _delay_ms(x)?
Вы видите тип аргумета у функции _delay_loop_2?
Код
void _delay_loop_2 ( uint16_t      __count )

Какой диапазон у типа uint16_t? И что вы лепите?

Выкиньте Шпака на свалку. Читайте оригинальный datasheet, документацию на компилятор и его библиотеку, а также букварь по си. Прощайте...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- zeonix0   Шпак индикатор мигающий каждую секунду   Aug 18 2011, 12:04
- - Genadi Zawidowski   В исходном коде написано, что использует аппаратны...   Aug 18 2011, 19:28
- - zeonix0   Код#include <avr/io.h> #include <avr/i...   Aug 19 2011, 05:05
|- - demiurg_spb   Цитата(zeonix0 @ Aug 19 2011, 09:05) Что ...   Aug 19 2011, 05:35
- - zeonix0   чето у меня даже такое не катит Цитата#include ...   Aug 19 2011, 06:17
|- - Petka   Цитата(zeonix0 @ Aug 19 2011, 10:17) ... ...   Aug 19 2011, 06:23
- - zeonix0   могу вообще без _delay_loop_2 Код#include <avr...   Aug 19 2011, 06:51
|- - Petka   Цитата(zeonix0 @ Aug 19 2011, 10:51) чето...   Aug 19 2011, 06:56
|- - demiurg_spb   Цитата(zeonix0 @ Aug 19 2011, 11:12) во ф...   Aug 19 2011, 07:53
- - zeonix0   ЦитатаЗачем delay_loop вызываете, вместо нормально...   Aug 19 2011, 07:39
- - zeonix0   demiurg_spb, а, каюсь. Короче убрал его. Перепрогр...   Aug 19 2011, 08:33
|- - demiurg_spb   Цитата(zeonix0 @ Aug 19 2011, 12:33) Посо...   Aug 19 2011, 08:53
- - Genadi Zawidowski   Если не боитесь утонуть - посмотрите в проект в пе...   Aug 20 2011, 06:21


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

 


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


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