CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
dimmar
Открыл глаза
Сообщения: 78
Зарегистрирован: Чт июл 07, 2011 14:42:13

Re: CodeVision AVR в вопросах и ответах

Сообщение dimmar »

Tenken писал(а):Здраствуйте изучать контроллеры начал недавно) по книге Белова) . Дошел до главы прерываний по таймеру и сдвига светодиодов) в книге устройства описано на 2313, но т к случайно "зашил"не тот фьюз контроллер пришлось пока отложить, но благо была атмега 8 попробывал написать хоть что- то для неё нифига не получилось... кварц на 4 мгц. Подскажите пожалуйста
Так у тебя во фьюзах выставлено внешнее тактирование.
Что поиск рулит знаю. Забанен во всех поисковых системах.
Реклама
Tenken
Встал на лапы
Сообщения: 93
Зарегистрирован: Чт янв 17, 2013 21:25:30
Откуда: Тула

Re: CodeVision AVR в вопросах и ответах

Сообщение Tenken »

ну так у меня и кварц на 4 мгц. Или что не так?(
Последний раз редактировалось Аlex Вс ноя 10, 2013 15:31:35, всего редактировалось 1 раз.
Причина: -
Реклама
dimmar
Открыл глаза
Сообщения: 78
Зарегистрирован: Чт июл 07, 2011 14:42:13

Re: CodeVision AVR в вопросах и ответах

Сообщение dimmar »

Вот именно, что запрграммирован ни внешний кварц а внешний генератор.
для внешнего кварца от 3 до 8 Mhz - 0111, а у тебя 0000
Что поиск рулит знаю. Забанен во всех поисковых системах.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

dimmar писал(а): а у тебя 0000
А вы уверены???? Вообще если не в курсе в КВ галка это ноль, галок нет, значит все 1111
Изображение
Реклама
Эиком - электронные компоненты и радиодетали
dimmar
Открыл глаза
Сообщения: 78
Зарегистрирован: Чт июл 07, 2011 14:42:13

Re: CodeVision AVR в вопросах и ответах

Сообщение dimmar »

vitalik_1984 писал(а):А вы уверены???? Вообще если не в курсе в КВ галка это ноль, галок нет, значит все 1111
Не знал. Не шью я через CV. На моём прогере наоборот.
Что поиск рулит знаю. Забанен во всех поисковых системах.
Реклама
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: CodeVision AVR в вопросах и ответах

Сообщение ILYAUL »

У кого нить от 3.0Х есть? Только не надо ссылок на офиц. сайт. Умные люди поймут
Реклама
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

Re: CodeVision AVR в вопросах и ответах

Сообщение pashaumnov »

помогите с написанием программки , алгоритм такой , опрос состояния pinb0 если 0 то не чего не делаем, если 1 то запускаем таймер работы на 20сек и на portb.1 подаем единицу. смотрим состояние во время отсчета таймера pinb0 , если 1 то снова накидываем 20 сек, если 0 то ждем завершения работы таймера и по истечении 20сек portb.1 переводим в 0. я не знаю как таймер прописать и за чем его поставить. вот то что я написал

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

#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 (т. е. внешний сигнал не подаётся или имеет нулевой лог. уровень), то гасим светодиод 
                  }
         }; 
      }
выполняет только часть программы ., при появлении на входе 1 зажигает светик с задержкой в 2 сек и при 0 на входе гасит его с задержкой в 2сек
не знаю как вставить сюда таймер и остальное.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

Возможный вариант:
Спойлер//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 в вопросах и ответах

Сообщение pashaumnov »

а можно подробнее расписать какая команда что делает , я только учусь и на премерах у меня лучше получается разбираться. можно в личку что бы тут не захломлять. или может кому еще полезно будет
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

Какая команда что делает ясно по комментариям. А суть следующая. Настраиваем таймер0 на работу с прерываниями по переполнению и запускаем его. Каждые 27мсек происходит прерывание. В этом прерывании наращиваем счетчик counter. Если его значение превысит 732, то значит прошли 20 сек (732 * 27мсек= 20 сек) и надо сбросить выход. Что мы и делаем. А взводим мы тот выход в основном теле программы при опросе входа. Там же и обнуляем счетчик для отсчета времени. Т.о. если вход == 0 , то ничего не делаем, таймер работает, ну пусть даже периодически сбрасывает выход(это нам не мешает). Как только на входе появилась "1", мы обнулили счетчик(начали отсчет 20-ти сек) и взвели выход.
Docendo discimus
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

Re: CodeVision AVR в вопросах и ответах

Сообщение pashaumnov »

еще пару вопросов. почему выбрана частотат именно 9.6?? и еще вопрос в коде вижен есть окошко при первом запуске где можно назначить ножки входами или выходами , там же есть и таймер, вот интересно вы от туда задавали таймер или в ручную прописывали в программе. если не в ручную то как назвается таймер переполнения в этом окошке??
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

1. Заводские установки фузов. Это чтоб потом не было криков/визгов: -"О, я тут напортачил с фузами! Как оживить?" :))
2. Оттуда. Это не таймер переполнения. Это просто Timer0. И у него можно задать прерывание по его переполнению - установить галку у Overflow Interrupt.
Docendo discimus
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

Re: CodeVision AVR в вопросах и ответах

Сообщение pashaumnov »

спасибо огромное, многое стало понятнее)))
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

Пожалуйста. Кричите, если что. "Аааааааааа, я фузы запорол! Как оживить?!" :))
Docendo discimus
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

Re: CodeVision AVR в вопросах и ответах

Сообщение pashaumnov »

да их же можно только убрав галочку spien запороть, так мне кажется. а у меня там стоит защита от дураков , снять галку нельзя.)) а остальное мжно запустить от внешнего кварца))
R_ura
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

Re: CodeVision AVR в вопросах и ответах

Сообщение R_ura »

Есть программа, в которой идет прямое управление пинами в порту А ( пример для одного пина):

#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 в вопросах и ответах

Сообщение 0867532 »

Я так и не понял что вы делаете.
Если вам нужно опрашивать состояние пина, то допустим:
DDRA = 0x00// на вход
. . .
PORTA.0 = 1; //запиливаем подтяжку
If (PINA.0 == 0) { . . . }//обращаемся к пину.
. . . //передаём

Если нужно обратиться ко всему порту, и потом передать его состояние, то можно так.

int PortAInfo;
PortAInfo = PINA; //Сохранили в переменную
. . . //передаём
Если возникнут вопросы - посмотрите на мой аватар.
R_ura
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

Re: CodeVision AVR в вопросах и ответах

Сообщение R_ura »

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 в вопросах и ответах

Сообщение 0867532 »

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

ЗЫ в конце концов нажмите Ctrl+F и замените все PORTA.0 на PORTAMASS[0] и т.д.
Если возникнут вопросы - посмотрите на мой аватар.
R_ura
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

Re: CodeVision AVR в вопросах и ответах

Сообщение R_ura »

0867532 писал(а):

ЗЫ в конце концов нажмите Ctrl+F и замените все PORTA.0 на PORTAMASS[0] и т.д.
Так у меня весь порт А занят исполнительными цепями.
Можно конечно ничего не меняя , завести байтную переменную, скажем PORT_OUT;

char PORT_OUT;

PORT_OUT = PORTA; // копировать состояние порта в переменную

putchar (PORT_OUT) ; // отправить переменную по юарт



нО В ТАКОМ СЛУЧАЕ уже никак не использовать в других целях целый портА.
Ответить

Вернуться в «AVR»