Codevision avr помогите с tmr0 attiny13

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
igonzo
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс июл 18, 2010 23:17:10

Codevision avr помогите с tmr0 attiny13

Сообщение igonzo »

Я в микроконтролерах новичок помогите плиз

#include <tiny13.h>
#include <delay.h>
int get,but;


void main(void)
{

PORTB=0x00;
DDRB=0x1C;



while (1)

{

get = PINB.0;
but = get;
get = PINB.0;
if (get != but)
{
PORTB.2 = 1;(как сделать прерывание чтоб PORTB.2 = 1; 20секунд (delay_ms(...) не катит) )
PORTB.3 = 1;
PORTB.4 = 1;
}
else
{
PORTB.2 = 0;
PORTB.3 = 0;
PORTB.4 = 0;
}
}
}
[size=150][color=#FF0000]Во имя пpоцесса-отца, пpоцесса-сына и святаго root'а... АМИHЬ![/color][/size]
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Codevision avr помогите с tmr0 attiny13

Сообщение pyzhman »

Что вы понимаете под прерыванием? И если делай не катит, то зачем подключаете библиотеку?
Docendo discimus
Аватара пользователя
igonzo
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс июл 18, 2010 23:17:10

Re: Codevision avr помогите с tmr0 attiny13

Сообщение igonzo »

прерывание (остановка выполнения основной программы для выполнения той или иной подпрограммы (или части кода) )

delay для задержки отображения светодиода PORTB.4 и пищалки PORTB.3

я имел в виду что, при изменении уровня PORTB.0 должна запищать пищалка , загореться светодиод
а на PORTB.2 он должен загорется и гореть ~20сек. (при этом код


get = PINB.0;
but = get;
get = PINB.0;
if (get != but)
{
PORTB.3 = 1;
PORTB.4 = 1;
delay_ms(100);
}
else
{
PORTB.3 = 0;
PORTB.4 = 0;
должен выполнятся дальше)
[size=150][color=#FF0000]Во имя пpоцесса-отца, пpоцесса-сына и святаго root'а... АМИHЬ![/color][/size]
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Codevision avr помогите с tmr0 attiny13

Сообщение pyzhman »

Надо, стало быть, организовать это прерывание. Записью небходимой инфы в регистры таймера и постановкой перехода в области векторов прерываний.
Docendo discimus
Аватара пользователя
igonzo
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс июл 18, 2010 23:17:10

Re: Codevision avr помогите с tmr0 attiny13

Сообщение igonzo »

это я понял!!! а как реализовать не пойму, примеров почти не нашел или нашел но на asm.
А учить асму не горю желанием.
[size=150][color=#FF0000]Во имя пpоцесса-отца, пpоцесса-сына и святаго root'а... АМИHЬ![/color][/size]
Аватара пользователя
Smoker
Прорезались зубы
Сообщения: 202
Зарегистрирован: Пт июн 04, 2010 21:58:36

Re: Codevision avr помогите с tmr0 attiny13

Сообщение Smoker »

Типа такого наверное

#include <mega8.h>
#include <delay.h>
int TIM=0;
int SvetodiodOn=0; // где-то там в программе когда должен загореться светодиод
// этой переменной присваивается 1 .SvetodiodOn=1

// TIM-время таймера Start-рабочий режим =1
// Timer1 output compare A interrupt service routine

interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// Place your code here
// Прерывание появляется один раз в секунду
//при совпадении с регистром OCR1A сбросить счетчик в 0
// оба счетных регистра
TCNT1H=0x00;
TCNT1L=0x00;
TIM++; Каждую секунду плюсуем
if(SvetodiodOn==1) {TIM=0;SvetodiodOn=0;PORTB.2=0;} // Если нужно включить обнуляем счетчик секунд TIM
// зажигаем светодиод, и обнуляем переменную для зажигания светодиода, иначе гореть будет без конца
if(TIM==20){PORTB.2=1;} // по прошествии 20 секунд - гасим
if(TIM==30) TIM=0; // это чтобы значение счетчика не превысило мах для данной переменной, не знаю как контроллер
// себя в этом случае поведет.
}

В принципе в теле прерывания можно оставить только приращение счетчика секунд. А остальное вынести в
основную программу, если там особо больших задержек delay нету, так прерывание будет быстрее работать

типа этого
#include <mega8.h>
#include <delay.h>
int TIM=0;
// TIM-время таймера Start-рабочий режим =1
// Timer1 output compare A interrupt service routine
void Swetodiod(void)
{
// включает выключает светодиоды в зависимости от TIM
if(TIM>6600) PORTC.3=0; else PORTC.3=1;
if(TIM>6000) PORTC.2=0; else PORTC.2=1;
if(TIM>5400) PORTC.1=0; else PORTC.1=1;
if(TIM>4800) PORTC.0=0; else PORTC.0=1;
if(TIM>4200) PORTD.7=0; else PORTD.7=1;
if(TIM>3600) PORTD.6=0; else PORTD.6=1;
if(TIM>3000) PORTD.5=0; else PORTD.5=1;
if(TIM>2400) PORTD.4=0; else PORTD.4=1;
if(TIM>1800) PORTD.3=0; else PORTD.3=1;
if(TIM>1200) PORTD.2=0; else PORTD.2=1;
if(TIM>600) PORTD.1=0; else PORTD.1=1;
if(TIM> 0) PORTD.0=0; else PORTD.0=1;

}

interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// Place your code here
// Прерывание появляется один раз в секунду
//при совпадении с регистром OCR1A сбросить счетчик в 0
// оба счетных регистра
TCNT1H=0x00;
TCNT1L=0x00;
if(TIM>0) TIM--;
if(PORTB.1){PORTB.1=0;}else {PORTB.1=1;} // мигание светодиодом в такт секундам
}
Когда я был маленький, - микросхемы были большими. Имели четыре ножки и две ручки - для переноски.
Аватара пользователя
igonzo
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс июл 18, 2010 23:17:10

Re: Codevision avr помогите с tmr0 attiny13

Сообщение igonzo »

спасибо Smoker буду пробовать ! :)
[size=150][color=#FF0000]Во имя пpоцесса-отца, пpоцесса-сына и святаго root'а... АМИHЬ![/color][/size]
Аватара пользователя
igonzo
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс июл 18, 2010 23:17:10

Re: Codevision avr помогите с tmr0 attiny13

Сообщение igonzo »

немогу понять как расчитать таймер на 1сек (при этом в какой регистр он пишет при переполнении)

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.5a Evaluation
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 18.12.2011
Author : Freeware, for evaluation and
non-commercial use only
Company :
Comments:


Chip type : ATtiny13
AVR Core Clock frequency: 4,800000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 16
*****************************************************/

#include <tiny13.h>

#include <delay.h>

int get,but;
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here

}

#define ADC_VREF_TYPE 0x20

// Read the 8 most significant bits
// of the AD conversion result
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x1C;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 600,000 kHz
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x02;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x02;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR0=0x00;

// ADC initialization
// ADC Clock frequency: 600,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: Timer0 Overflow
// Only the 8 most significant bits of
// the AD conversion result are used
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On
DIDR0&=0x03;
DIDR0|=0x00;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0xA3;
ADCSRB&=0xF8;
ADCSRB|=0x04;

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

while (1)
{

get = PINB.0;

but = get;
get = PINB.0;
if (get != but)
{
PORTB.2 = 1;
PORTB.3 = 1;
PORTB.4 = 1;
delay_ms(100);
}
else
{
PORTB.2 = 0;
PORTB.3 = 0;
PORTB.4 = 0;
}
}
}
[size=150][color=#FF0000]Во имя пpоцесса-отца, пpоцесса-сына и святаго root'а... АМИHЬ![/color][/size]
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Codevision avr помогите с tmr0 attiny13

Сообщение ChipKiller »

Smoker писал(а):типа этого
... повторять такое точно не стОит :)

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

#include <mega8.h>
#include <delay.h>
int TIM=0;
// TIM-время таймера Start-рабочий режим =1
// Timer1 output compare A interrupt service routine
void Swetodiod(void)
{
// включает выключает светодиоды в зависимости от TIM
if(TIM>6600) PORTC.3=0; else PORTC.3=1;
if(TIM>6000) PORTC.2=0; else PORTC.2=1;
if(TIM>5400) PORTC.1=0; else PORTC.1=1;
if(TIM>4800) PORTC.0=0; else PORTC.0=1;
if(TIM>4200) PORTD.7=0; else PORTD.7=1;
if(TIM>3600) PORTD.6=0; else PORTD.6=1;
if(TIM>3000) PORTD.5=0; else PORTD.5=1;
if(TIM>2400) PORTD.4=0; else PORTD.4=1;
if(TIM>1800) PORTD.3=0; else PORTD.3=1;
if(TIM>1200) PORTD.2=0; else PORTD.2=1;
if(TIM>600) PORTD.1=0; else PORTD.1=1;
if(TIM> 0) PORTD.0=0; else PORTD.0=1;

igonzo писал(а):немогу понять как расчитать таймер на 1сек (при этом в какой регистр он пишет при переполнении)
... устанавливается флаг переполнения
Аватара пользователя
igonzo
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс июл 18, 2010 23:17:10

Re: Codevision avr помогите с tmr0 attiny13

Сообщение igonzo »

КАК Я ПОНЯЛ ПРИ ПЕРЕПОЛНЕНИИ ТАЙМЕРА УСТАНАВЛИВАЕТСЯ ФЛАГ (TOV0) ?

НО КАК С НЕГО СЧИТАТЬ ?
[size=150][color=#FF0000]Во имя пpоцесса-отца, пpоцесса-сына и святаго root'а... АМИHЬ![/color][/size]
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Codevision avr помогите с tmr0 attiny13

Сообщение ChipKiller »

igonzo писал(а):НО КАК С НЕГО СЧИТАТЬ ?
... с кого с НЕГО - мой твоя не понимай ... При разрешенных прерываниях установка TOV0 влечет запуск процедуры прерывания, по завершению которой, флаг TOV0 аппаратно сбрасывается.
Аватара пользователя
igonzo
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс июл 18, 2010 23:17:10

Re: Codevision avr помогите с tmr0 attiny13

Сообщение igonzo »

подскажите хоть где почитать про таймер (для новичков)
[size=150][color=#FF0000]Во имя пpоцесса-отца, пpоцесса-сына и святаго root'а... АМИHЬ![/color][/size]
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Codevision avr помогите с tmr0 attiny13

Сообщение ChipKiller »

гуглим Микроконтроллеры AVR - Евстифеев А.В.
Аватара пользователя
igonzo
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс июл 18, 2010 23:17:10

Re: Codevision avr помогите с tmr0 attiny13

Сообщение igonzo »

ChipKiller писал(а):гуглим Микроконтроллеры AVR - Евстифеев А.В.


так это asm

а мну с# нужен
[size=150][color=#FF0000]Во имя пpоцесса-отца, пpоцесса-сына и святаго root'а... АМИHЬ![/color][/size]
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Codevision avr помогите с tmr0 attiny13

Сообщение ChipKiller »

igonzo писал(а):так это asm
... это не asm, а справочник
asw
Открыл глаза
Сообщения: 50
Зарегистрирован: Вт апр 21, 2009 18:50:14
Откуда: МО, Орехово-Зуево

Re: Codevision avr помогите с tmr0 attiny13

Сообщение asw »

для нужной задержки вам нужно писать число в регистры OCR0A или OCR0B, у вас там нули по умолчанию вроде.
Устанавливаете режим работы таймера например сброс по переполнению (OVF) плюс к этому разрешаете прерывание по событию совпадение в А канале (или В, что больше нравится), как только досчитает до этого числа ,TCNT0 сбросится и будет сгенерено прерывание, а там в обработчике делайте что вам надо, например можно считать кол-во прерываний и в главной программе уже проверять прошло ли нужное количество если да, делаете то что вы там хотели), . итого время вызова прерывания будет определено числом в регистре сравнения(ну и как вы сами там логику построите), т.е. сколько времени например пройдёт до того, как совпадёт результат.

может чего упустил\не договорил, поправьте...
Аватара пользователя
Smoker
Прорезались зубы
Сообщения: 202
Зарегистрирован: Пт июн 04, 2010 21:58:36

Re: Codevision avr помогите с tmr0 attiny13

Сообщение Smoker »

Сделай так как в картинках, частота МК должна быть 128 кгц, на частоте 4.8 или 9.6 мгц прерывание 1 сек не получить. В принципе можно получить 100 или сколько там гц в секунду, просто считать не 20 прерываний а 2000. Т.е. если для остальной обвязки нужна высокая частота, - придется так и делать. Если по барабану можно 128 кгц.
Вложения
Таймер.doc
(175.5 КБ) 265 скачиваний
Когда я был маленький, - микросхемы были большими. Имели четыре ножки и две ручки - для переноски.
Аватара пользователя
Smoker
Прорезались зубы
Сообщения: 202
Зарегистрирован: Пт июн 04, 2010 21:58:36

Re: Codevision avr помогите с tmr0 attiny13

Сообщение Smoker »

asw писал(а):для нужной задержки вам нужно писать число в регистры OCR0A или OCR0B, у вас там нули по умолчанию вроде.
Устанавливаете режим работы таймера например сброс по переполнению (OVF) плюс к этому разрешаете прерывание по событию совпадение в А канале (или В, что больше нравится), как только досчитает до этого числа ,TCNT0 сбросится и

Вроде как он будет считать до конца, сгенерирует прерывание и считает дальше до переполнения. Поэтому и обнуляю TCNT0. Правда в этом не уверен, но так на всякий случай.
Когда я был маленький, - микросхемы были большими. Имели четыре ножки и две ручки - для переноски.
Аватара пользователя
adrenocrome
Потрогал лапой паяльник
Сообщения: 365
Зарегистрирован: Вт окт 21, 2008 15:03:06
Откуда: moscow
Контактная информация:

Re: Codevision avr помогите с tmr0 attiny13

Сообщение adrenocrome »

Вот скажите, зачем мусорить в основной ветке форума :facepalm: ?
Есть же темы :
По КодВижн :
http://radiokot.ru/forum/viewtopic.php?f=20&t=5560

Мелкие вопросы по МК :
http://radiokot.ru/forum/viewtopic.php?f=20&t=32
День прошёл, а ты всё жив
asw
Открыл глаза
Сообщения: 50
Зарегистрирован: Вт апр 21, 2009 18:50:14
Откуда: МО, Орехово-Зуево

Re: Codevision avr помогите с tmr0 attiny13

Сообщение asw »

Smoker да, прошу прощения, сброс при совпадении должно быть режим, не о том подумал, а сброс по переполнению нет режима, не то написал в общем...он же сам автоматом сбрасывается при переполнении...
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»