Так у тебя во фьюзах выставлено внешнее тактирование.Tenken писал(а):Здраствуйте изучать контроллеры начал недавно) по книге Белова) . Дошел до главы прерываний по таймеру и сдвига светодиодов) в книге устройства описано на 2313, но т к случайно "зашил"не тот фьюз контроллер пришлось пока отложить, но благо была атмега 8 попробывал написать хоть что- то для неё нифига не получилось... кварц на 4 мгц. Подскажите пожалуйста
CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
Что поиск рулит знаю. Забанен во всех поисковых системах.
- Реклама
Re: CodeVision AVR в вопросах и ответах
ну так у меня и кварц на 4 мгц. Или что не так?(
Последний раз редактировалось Аlex Вс ноя 10, 2013 15:31:35, всего редактировалось 1 раз.
Причина: -
Причина: -
Re: CodeVision AVR в вопросах и ответах
Вот именно, что запрграммирован ни внешний кварц а внешний генератор.
для внешнего кварца от 3 до 8 Mhz - 0111, а у тебя 0000
для внешнего кварца от 3 до 8 Mhz - 0111, а у тебя 0000
Что поиск рулит знаю. Забанен во всех поисковых системах.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Не знал. Не шью я через CV. На моём прогере наоборот.vitalik_1984 писал(а):А вы уверены???? Вообще если не в курсе в КВ галка это ноль, галок нет, значит все 1111
Что поиск рулит знаю. Забанен во всех поисковых системах.
- Реклама
Re: CodeVision AVR в вопросах и ответах
У кого нить от 3.0Х есть? Только не надо ссылок на офиц. сайт. Умные люди поймут
- pashaumnov
- Прорезались зубы
- Сообщения: 236
- Зарегистрирован: Чт июн 25, 2009 16:00:25
- Откуда: нижний новгород
Re: CodeVision AVR в вопросах и ответах
помогите с написанием программки , алгоритм такой , опрос состояния pinb0 если 0 то не чего не делаем, если 1 то запускаем таймер работы на 20сек и на portb.1 подаем единицу. смотрим состояние во время отсчета таймера pinb0 , если 1 то снова накидываем 20 сек, если 0 то ждем завершения работы таймера и по истечении 20сек portb.1 переводим в 0. я не знаю как таймер прописать и за чем его поставить. вот то что я написал
выполняет только часть программы ., при появлении на входе 1 зажигает светик с задержкой в 2 сек и при 0 на входе гасит его с задержкой в 2сек
не знаю как вставить сюда таймер и остальное.
Код: Выделить всё
#include <tiny13.h>
#include <delay.h>
// Declare your global variables here
void main(void)
{
// Input/Output Ports initialization
// Port B initialization
// Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=In
// State5=0 State4=0 State3=0 State2=0 State1=0 State0=T
PORTB=0x00;
DDRB=0x3E;
while (1) {
delay_ms(2000);
if (PINB &= 1) // Считываем 0 пин порта b...
{
PORTB.1 = 1; // ...если 1 (т. е. внешний сигнал подаётся), то зажигаем светодиод
}
else
{
PORTB.1 = 0; // ...если 0 (т. е. внешний сигнал не подаётся или имеет нулевой лог. уровень), то гасим светодиод
}
};
}
не знаю как вставить сюда таймер и остальное.
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Возможный вариант:
//Chip type : ATtiny13
//Clock frequency : 9,600000 MHz
// опрос состояния pinb0 если 0 то не чего не делаем, если 1 то запускаем таймер
// работы на 20сек и на portb.1 подаем единицу. смотрим состояние во время
// отсчета таймера pinb0 , если 1 то снова накидываем 20 сек,
// если 0 то ждем завершения работы таймера и по истечении 20сек portb.1 переводим в 0.
// pashaumnov radiokot
#include <tiny13.h>
unsigned int counter;
// Timer 0 overflow interrupt service routine
// прерывание каждые 27,31мсек
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if(++counter > 732) PORTB.1= 0; // если истекли 20 сек
}
void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
PORTB=0x01;
DDRB=0x02;
// Timer/Counter 0 initialization
TCCR0A=0x00;
TCCR0B=0x05;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x02;
#asm("sei")
while (1)
{
if(PINB.0) // если вход == 1
{
counter= 0; // сбрасываем счетчик
PORTB.1= 1; // устанавливаем порт в "1"
}
};
}
Спойлер
//Date : 12.11.2013//Chip type : ATtiny13
//Clock frequency : 9,600000 MHz
// опрос состояния pinb0 если 0 то не чего не делаем, если 1 то запускаем таймер
// работы на 20сек и на portb.1 подаем единицу. смотрим состояние во время
// отсчета таймера pinb0 , если 1 то снова накидываем 20 сек,
// если 0 то ждем завершения работы таймера и по истечении 20сек portb.1 переводим в 0.
// pashaumnov radiokot
#include <tiny13.h>
unsigned int counter;
// Timer 0 overflow interrupt service routine
// прерывание каждые 27,31мсек
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if(++counter > 732) PORTB.1= 0; // если истекли 20 сек
}
void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
PORTB=0x01;
DDRB=0x02;
// Timer/Counter 0 initialization
TCCR0A=0x00;
TCCR0B=0x05;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x02;
#asm("sei")
while (1)
{
if(PINB.0) // если вход == 1
{
counter= 0; // сбрасываем счетчик
PORTB.1= 1; // устанавливаем порт в "1"
}
};
}
Docendo discimus
- pashaumnov
- Прорезались зубы
- Сообщения: 236
- Зарегистрирован: Чт июн 25, 2009 16:00:25
- Откуда: нижний новгород
Re: CodeVision AVR в вопросах и ответах
а можно подробнее расписать какая команда что делает , я только учусь и на премерах у меня лучше получается разбираться. можно в личку что бы тут не захломлять. или может кому еще полезно будет
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Какая команда что делает ясно по комментариям. А суть следующая. Настраиваем таймер0 на работу с прерываниями по переполнению и запускаем его. Каждые 27мсек происходит прерывание. В этом прерывании наращиваем счетчик counter. Если его значение превысит 732, то значит прошли 20 сек (732 * 27мсек= 20 сек) и надо сбросить выход. Что мы и делаем. А взводим мы тот выход в основном теле программы при опросе входа. Там же и обнуляем счетчик для отсчета времени. Т.о. если вход == 0 , то ничего не делаем, таймер работает, ну пусть даже периодически сбрасывает выход(это нам не мешает). Как только на входе появилась "1", мы обнулили счетчик(начали отсчет 20-ти сек) и взвели выход.
Docendo discimus
- pashaumnov
- Прорезались зубы
- Сообщения: 236
- Зарегистрирован: Чт июн 25, 2009 16:00:25
- Откуда: нижний новгород
Re: CodeVision AVR в вопросах и ответах
еще пару вопросов. почему выбрана частотат именно 9.6?? и еще вопрос в коде вижен есть окошко при первом запуске где можно назначить ножки входами или выходами , там же есть и таймер, вот интересно вы от туда задавали таймер или в ручную прописывали в программе. если не в ручную то как назвается таймер переполнения в этом окошке??
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
1. Заводские установки фузов. Это чтоб потом не было криков/визгов: -"О, я тут напортачил с фузами! Как оживить?"
2. Оттуда. Это не таймер переполнения. Это просто Timer0. И у него можно задать прерывание по его переполнению - установить галку у Overflow Interrupt.
2. Оттуда. Это не таймер переполнения. Это просто Timer0. И у него можно задать прерывание по его переполнению - установить галку у Overflow Interrupt.
Docendo discimus
- pashaumnov
- Прорезались зубы
- Сообщения: 236
- Зарегистрирован: Чт июн 25, 2009 16:00:25
- Откуда: нижний новгород
Re: CodeVision AVR в вопросах и ответах
спасибо огромное, многое стало понятнее)))
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Пожалуйста. Кричите, если что. "Аааааааааа, я фузы запорол! Как оживить?!" 
Docendo discimus
- pashaumnov
- Прорезались зубы
- Сообщения: 236
- Зарегистрирован: Чт июн 25, 2009 16:00:25
- Откуда: нижний новгород
Re: CodeVision AVR в вопросах и ответах
да их же можно только убрав галочку spien запороть, так мне кажется. а у меня там стоит защита от дураков , снять галку нельзя.)) а остальное мжно запустить от внешнего кварца))
Re: CodeVision AVR в вопросах и ответах
Есть программа, в которой идет прямое управление пинами в порту А ( пример для одного пина):
#define pin_left PORTA.1
pin_ltft = 1;
pin_left = 0;
if ( pin_left == 0) ......
Теперь потребовалось управляющие сигналы выводить не в портА, а передавать их по юарту. Т.е. встала задача ( чтобы не исправлять во всей программе управлением битами в портуА) сымитировать портА некоей переменной, к битам которой можно обращаться столь же просто, как и к портуА, что -то вроде
unsigned char PIN_OUT_PORT;
#define pin_left PIN_OUT_PORT.1;
pin_left = 1;
pin_left = 0;
if ( pin_left == 0) ...
Пробовал последний вариант, но компилятор не пропускает...
#define pin_left PORTA.1
pin_ltft = 1;
pin_left = 0;
if ( pin_left == 0) ......
Теперь потребовалось управляющие сигналы выводить не в портА, а передавать их по юарту. Т.е. встала задача ( чтобы не исправлять во всей программе управлением битами в портуА) сымитировать портА некоей переменной, к битам которой можно обращаться столь же просто, как и к портуА, что -то вроде
unsigned char PIN_OUT_PORT;
#define pin_left PIN_OUT_PORT.1;
pin_left = 1;
pin_left = 0;
if ( pin_left == 0) ...
Пробовал последний вариант, но компилятор не пропускает...
- 0867532
- Встал на лапы
- Сообщения: 142
- Зарегистрирован: Сб май 25, 2013 21:14:11
- Откуда: Москва
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Я так и не понял что вы делаете.
Если вам нужно опрашивать состояние пина, то допустим:
DDRA = 0x00// на вход
. . .
PORTA.0 = 1; //запиливаем подтяжку
If (PINA.0 == 0) { . . . }//обращаемся к пину.
. . . //передаём
Если нужно обратиться ко всему порту, и потом передать его состояние, то можно так.
int PortAInfo;
PortAInfo = PINA; //Сохранили в переменную
. . . //передаём
Если вам нужно опрашивать состояние пина, то допустим:
DDRA = 0x00// на вход
. . .
PORTA.0 = 1; //запиливаем подтяжку
If (PINA.0 == 0) { . . . }//обращаемся к пину.
. . . //передаём
Если нужно обратиться ко всему порту, и потом передать его состояние, то можно так.
int PortAInfo;
PortAInfo = PINA; //Сохранили в переменную
. . . //передаём
Если возникнут вопросы - посмотрите на мой аватар.
Re: CodeVision AVR в вопросах и ответах
Есть рабочая довольно большая программа, в которой на порт А выведены исполнительные цепи. Конкретно включаются эл.двигатели.0867532 писал(а):Я так и не понял что вы делаете.
Если вам нужно опрашивать состояние пина, то допустим:
DDRA = 0x00// на вход
. . .
PORTA.0 = 1; //запиливаем подтяжку
If (PINA.0 == 0) { . . . }//обращаемся к пину.
. . . //передаём
Если нужно обратиться ко всему порту, и потом передать его состояние, то можно так.
int PortAInfo;
PortAInfo = PINA; //Сохранили в переменную
. . . //передаём
Теперь возникла задача соединить выносной пульт управления с исполнительным устройством через юарт вместо многожильного кабеля.
Задумка такая - не изменяя основную программу, оставить ее в выносном пульте, но освободить в нем порт А для графического ЖКИ.
Но ведь программа заточена под управление пинами порта А. Вот и вопрос, как мне реальный порт А заменить виртуальным ( какой-то переменной) , чтобы не изменять в программе обращение к отдельным битам , потому как такой вариант не работает:
char OUT_PORT; // вместо PORTA определяю переменную
#define pin_left OUT_PORT.1 // определяю в переменной один бит
if ( pin_left == 0) {} // пытаюсь проверить состояние бита 1 в переменной OUT_PORT - не работает
Фактически, мне нужно - как заменить PORTA переменной размером в тот же байт, чтобы к битам в ней обращаться так же, как и к битам в PORTA , переназначить исполнительные выводы вместо порта А на биты в этой переменной, чтобы ничего больше не менять в программе?
Т.е. вместо
#define pin_left PORTA.1;
указать:
unsigned char PORT_OUT;
#define pin_left PORT_OUT.1;
И далее в программе обращаться к этим битам так же, ка ки к битам в порту:
if (pin_left == 1) {
}
pin_left = 0;
pin_left = ~ pin_left;
pin_left = 1;
- 0867532
- Встал на лапы
- Сообщения: 142
- Зарегистрирован: Сб май 25, 2013 21:14:11
- Откуда: Москва
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
А, тогда я не знаю. наверное надо класс(проще массив) создать.
Не знаю... ещё нагружать контроллер переменными и их обработкой, мне кажется лучше позаменять обращение к битам(в программе) на обращение к частям массива, и их формировать в чар, и передавать.(по прерывания например.)
ЗЫ в конце концов нажмите Ctrl+F и замените все PORTA.0 на PORTAMASS[0] и т.д.
Не знаю... ещё нагружать контроллер переменными и их обработкой, мне кажется лучше позаменять обращение к битам(в программе) на обращение к частям массива, и их формировать в чар, и передавать.(по прерывания например.)
ЗЫ в конце концов нажмите Ctrl+F и замените все PORTA.0 на PORTAMASS[0] и т.д.
Если возникнут вопросы - посмотрите на мой аватар.
Re: CodeVision AVR в вопросах и ответах
Так у меня весь порт А занят исполнительными цепями.0867532 писал(а):
ЗЫ в конце концов нажмите Ctrl+F и замените все PORTA.0 на PORTAMASS[0] и т.д.
Можно конечно ничего не меняя , завести байтную переменную, скажем PORT_OUT;
char PORT_OUT;
PORT_OUT = PORTA; // копировать состояние порта в переменную
putchar (PORT_OUT) ; // отправить переменную по юарт
нО В ТАКОМ СЛУЧАЕ уже никак не использовать в других целях целый портА.



