Прерывания, паузы delay в AVR

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Re: Прерывания, паузы delay в AVR

Сообщение avr123.nm.ru » 01 май 2008, 23:22

Brainiac писал(а):если да то как???


можно вот так - http://avr123.nm.ru/z13.htm

а можно как в примерах к компилятору сделано - например в папке C:\CVAVR\examples или в C:\WinAVR\doc\avr-libc\examples
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: Прерывания, паузы delay в AVR

Сообщение Brainiac » 01 май 2008, 23:48

опять культ курса авр...
все это писали дядьки с умным мосхом...
а мне пока до них...
поэтому лучше будет если скажите 1 строчку и все...
Brainiac
 
Сообщения: 70
Зарегистрирован: 16 дек 2007, 20:14
Откуда: Владимир-Москва
Skype: brainiac9204
прог. языки: Basic, Pascal, Fortran, ANSI C, C++
ФИО: Ваня

Re: Прерывания, паузы delay в AVR

Сообщение SSG » 02 май 2008, 11:13

Brainiac писал(а):все сделал прерывание ...
вопрос... при объявлении функции можно писать в общем виде код который она выполняет...
в обработчике можно ли написать код в общем виде чтоб потом он выполнялся от переменной???
если да то как???

Что сие означает? Что значит в общем виде? Что значит выполнение кода от переменной? :(
I live My life!
Аватара пользователя
SSG
 
Сообщения: 1058
Зарегистрирован: 15 янв 2007, 19:23
Откуда: Беларусь, Барановичи
прог. языки: С для МК, Delphi для ПК

Re: Прерывания, паузы delay в AVR

Сообщение Brainiac » 05 май 2008, 14:32

такой детектор нуля пойдет???
if(PIND.6) {
if (!PIND.6) {.....}} else {if (PIND.6) {......}}
Brainiac
 
Сообщения: 70
Зарегистрирован: 16 дек 2007, 20:14
Откуда: Владимир-Москва
Skype: brainiac9204
прог. языки: Basic, Pascal, Fortran, ANSI C, C++
ФИО: Ваня

Re: Прерывания, паузы delay в AVR

Сообщение Brainiac » 31 май 2008, 22:28

у меня существен[/quote]ный прогресс!!!
я заставил лампочку гореть!!!

#include <tiny2313.h>
#include "delay.h"
volatile int a=0;
interrupt [PCINT] void pin_change_isr0(void)
{PORTB.1=0;
TIMSK=0x01;
TCNT0=0x00;
if(a==3) {PORTB.1=1;
OCR0A=0xFF;};
}

// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
PORTB.1=1;// Place your code here
TIMSK=0x00;}

// Declare your global variables here

void main(void)
{
// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In
// State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=T State1=0 State0=0
PORTB=0x01;
DDRB=0x1E;

// Port D initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// 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: 15,625 kHz
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x03;
TCNT0=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// 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=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: On
GIMSK=0x20;
MCUCR=0x00;
PCMSK=0x20;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;

// Global enable interrupts
#asm("sei")

while (1)
{
if(PINB==0x00) {
delay_ms(50);
if(PINB==0x00) {a++;};};
switch(a) {
case 0 : OCR0A=27; break;
case 1 : OCR0A=4E; break;
case 2 : OCR0A=75; break;
case 3 : OCR0A=0xFF; break;
case 4 : a=0; };
};}


но чета на кнопку она не реагирует - она изменяет мощность горения лампочки ...
и программа поработает секунд десять и выключится ...


дальше ... как мне реализовать следущую фигню:
у меня будет мигать 4 лампочками ... будет n программ мигания и 8 скоростей мигания лампочкой ...
и 4 вида мощности горения лампочки то есть будет 3 кнопки ... как мне с помощью них управлять этими параметрами ???
заранее благодарен!!!
Brainiac
 
Сообщения: 70
Зарегистрирован: 16 дек 2007, 20:14
Откуда: Владимир-Москва
Skype: brainiac9204
прог. языки: Basic, Pascal, Fortran, ANSI C, C++
ФИО: Ваня

Re: Прерывания, паузы delay в AVR

Сообщение rig » 01 июн 2008, 08:48

нарисуй схемку, не очень понятно что хочешь получить.
я не понял
на какой ноге кнопка
как идет опрос кнопки
как меняется мощность горения
как задумывалось работа схемы и программы
Аватара пользователя
rig
 
Сообщения: 1437
Зарегистрирован: 03 авг 2007, 19:43
Откуда: Екатеринбург
прог. языки: Си, асм со словарем

Re: Прерывания, паузы delay в AVR

Сообщение Brainiac » 01 июн 2008, 09:54

3) от 25% с щагом 25% до 100%
4)прерывание по 0... мы разрешаем прерывание по сранению регистра Т0 и записываем в счетный регистр TCNT0 значение 0... у меня есть переменная а. при нажатии кнопки она а++ затем в цикле главной программе написано при каких значениях а какие значения регистра сравнения... и затем возникает прерывание по сравнению счетчика ... включается порт на оставшееся время... - это описан цикл работы программы за полуволну сетевого напряжения ...
2)опрос кнопки написан в цикле главной программы.. я не знаю что отвечать...
1) немного тут напутал .. кнопка должна быть подключена к порту D.1...


как сделать опрос кнопки лучше???
и ответьте пжлста на мой последний вопрос в предыдущем сообщении....
Заранее благодарен...
Brainiac
 
Сообщения: 70
Зарегистрирован: 16 дек 2007, 20:14
Откуда: Владимир-Москва
Skype: brainiac9204
прог. языки: Basic, Pascal, Fortran, ANSI C, C++
ФИО: Ваня

Re: Прерывания, паузы delay в AVR

Сообщение Master » 01 июн 2008, 11:43

Что за регистр OCR0A? При инициализации контроллера мастер кода строит ШИМ на основе OCR1A, а у тебя 0А?

Добавлено спустя 1 минуту 40 секунд:
По поводу опроса кнопок, вот так я сделал управление часами:
Код: Выделить всё
while (1)
{
if (BUTTON_HOUR==0)
{
  Hour++;
  if (Hour>=24) {Hour=0;}
  LCDshow();
  delay_ms(300);
}
if (BUTTON_MIN==0)
{             
  Min++;
  if (Min>=60) {Min=0;}
  LCDshow();
  delay_ms(300);
}
if (BUTTON_SEC==0)
{             
  Sec++;
  if (Sec>=60) {Sec=0;}
  LCDshow();
  delay_ms(300);
}
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: Прерывания, паузы delay в AVR

Сообщение rig » 01 июн 2008, 11:53

Brainiac писал(а):1) немного тут напутал .. кнопка должна быть подключена к порту D.1...

тогда пол программы меняется, предлагаю сделать работу над ошибками.

Brainiac писал(а):2)опрос кнопки написан в цикле главной программы.. я не знаю что отвечать...

это опрос?

Brainiac писал(а):if(PINB==0x00)
{delay_ms(50);
if(PINB==0x00)
{a++;};
};

если кнопка на PIND.1! почему сравнивается весь порт да еще и PINВ?
учитывая что входы без подтяжек то на входе можно что угодно получить.
Brainiac писал(а):// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=T State1=0 State0=0 PORTB=0x01;DDRB=0x1E;

Master писал(а):Что за регистр OCR0A?

это регистр сравнения таймера 0
Код: Выделить всё
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 15,625 kHz
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x03;
TCNT0=0x00;
OCR0A=0x4E;// надо же будет от чегото отталкиватсья лампочке после вкл-я
OCR0B=0x00;

вырезан почемуто в теле программы при инициализации в исходнике автора
Аватара пользователя
rig
 
Сообщения: 1437
Зарегистрирован: 03 авг 2007, 19:43
Откуда: Екатеринбург
прог. языки: Си, асм со словарем

Re: Прерывания, паузы delay в AVR

Сообщение Brainiac » 01 июн 2008, 11:56

OCR0A - регистр сравнения счетчика Т0
так как в тиньке есть счетчики Т0 и Т1
и это не шим а счетчик ... просто считать!!!

а вот в коде непонятно - ведь будет дребезг контактов ...
Brainiac
 
Сообщения: 70
Зарегистрирован: 16 дек 2007, 20:14
Откуда: Владимир-Москва
Skype: brainiac9204
прог. языки: Basic, Pascal, Fortran, ANSI C, C++
ФИО: Ваня

Re: Прерывания, паузы delay в AVR

Сообщение rig » 01 июн 2008, 11:57

самого главнго нениписал, человек ведь не поймет откуда
Master писал(а):if (BUTTON_HOUR==0)
if (BUTTON_MIN==0)
if (BUTTON_SEC==0)

что это простая подстава
Код: Выделить всё
#define BUTTON_HOUR PIND.1
#define BUTTON_MIN  PIND.2
#define BUTTON_SEC  PIND.3
Аватара пользователя
rig
 
Сообщения: 1437
Зарегистрирован: 03 авг 2007, 19:43
Откуда: Екатеринбург
прог. языки: Си, асм со словарем

Re: Прерывания, паузы delay в AVR

Сообщение Brainiac » 01 июн 2008, 12:02

ну у меня же в майне написано что если а==0 то OCR0A=27


вообщем понятно какие ошибки - буду работать дальше ...
а вот насчет 3-х параметров - они же будут загоняться в обработчик прерывания по сравнению счетчика и он получится очень громоздким - что делать тогда???

да это я понял!!!!
Brainiac
 
Сообщения: 70
Зарегистрирован: 16 дек 2007, 20:14
Откуда: Владимир-Москва
Skype: brainiac9204
прог. языки: Basic, Pascal, Fortran, ANSI C, C++
ФИО: Ваня

Re: Прерывания, паузы delay в AVR

Сообщение rig » 01 июн 2008, 12:11

что значит громоздким?
20-30 лишних тактов отсчелкает и все. для текущей программы это мелочи.
если "а" меняется от 0 до 4х
зачем
volatile int a=0;
хватит char
и зачем volatile? я чтото не сталкивался, хотя что за штука нашел.
Аватара пользователя
rig
 
Сообщения: 1437
Зарегистрирован: 03 авг 2007, 19:43
Откуда: Екатеринбург
прог. языки: Си, асм со словарем

Re: Прерывания, паузы delay в AVR

Сообщение Brainiac » 01 июн 2008, 12:20

это чтоб эту переменную было видно в прерываниях!!!
Brainiac
 
Сообщения: 70
Зарегистрирован: 16 дек 2007, 20:14
Откуда: Владимир-Москва
Skype: brainiac9204
прог. языки: Basic, Pascal, Fortran, ANSI C, C++
ФИО: Ваня

Re: Прерывания, паузы delay в AVR

Сообщение rig » 01 июн 2008, 12:41

если переменная объявляется выше главной функции то она по умолчанию глобальная
// Declare your global variables here
такая надпись в мастере кодевижена вставляестя.

а слово volatile говорит компилятору предохранять значение переменной расположенной в регистрах, короче что то не очень понятное
"The volatile modifier must be used in order to prevent a variable to be allocated to registers and to warn the compiler that it may be subject to outside change during evaluation"
Аватара пользователя
rig
 
Сообщения: 1437
Зарегистрирован: 03 авг 2007, 19:43
Откуда: Екатеринбург
прог. языки: Си, асм со словарем

Пред.След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14