Codevision avr помогите с tmr0 attiny13
Codevision avr помогите с tmr0 attiny13
Я в микроконтролерах новичок помогите плиз
#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;
}
}
}
#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
Что вы понимаете под прерыванием? И если делай не катит, то зачем подключаете библиотеку?
Docendo discimus
Re: Codevision avr помогите с tmr0 attiny13
прерывание (остановка выполнения основной программы для выполнения той или иной подпрограммы (или части кода) )
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;
должен выполнятся дальше)
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
Надо, стало быть, организовать это прерывание. Записью небходимой инфы в регистры таймера и постановкой перехода в области векторов прерываний.
Docendo discimus
Re: Codevision avr помогите с tmr0 attiny13
это я понял!!! а как реализовать не пойму, примеров почти не нашел или нашел но на asm.
А учить асму не горю желанием.
А учить асму не горю желанием.
[size=150][color=#FF0000]Во имя пpоцесса-отца, пpоцесса-сына и святаго root'а... АМИHЬ![/color][/size]
Re: Codevision avr помогите с tmr0 attiny13
Типа такого наверное
#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;} // мигание светодиодом в такт секундам
}
#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;} // мигание светодиодом в такт секундам
}
Когда я был маленький, - микросхемы были большими. Имели четыре ножки и две ручки - для переноски.
Re: Codevision avr помогите с tmr0 attiny13
спасибо Smoker буду пробовать ! 
[size=150][color=#FF0000]Во имя пpоцесса-отца, пpоцесса-сына и святаго root'а... АМИHЬ![/color][/size]
Re: Codevision avr помогите с tmr0 attiny13
немогу понять как расчитать таймер на 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;
}
}
}
/*****************************************************
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
... повторять такое точно не стОит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сек (при этом в какой регистр он пишет при переполнении)
Re: Codevision avr помогите с tmr0 attiny13
КАК Я ПОНЯЛ ПРИ ПЕРЕПОЛНЕНИИ ТАЙМЕРА УСТАНАВЛИВАЕТСЯ ФЛАГ (TOV0) ?
НО КАК С НЕГО СЧИТАТЬ ?
НО КАК С НЕГО СЧИТАТЬ ?
[size=150][color=#FF0000]Во имя пpоцесса-отца, пpоцесса-сына и святаго root'а... АМИHЬ![/color][/size]
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Codevision avr помогите с tmr0 attiny13
... с кого с НЕГО - мой твоя не понимай ... При разрешенных прерываниях установка TOV0 влечет запуск процедуры прерывания, по завершению которой, флаг TOV0 аппаратно сбрасывается.igonzo писал(а):НО КАК С НЕГО СЧИТАТЬ ?
Re: Codevision avr помогите с tmr0 attiny13
подскажите хоть где почитать про таймер (для новичков)
[size=150][color=#FF0000]Во имя пpоцесса-отца, пpоцесса-сына и святаго root'а... АМИHЬ![/color][/size]
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Codevision avr помогите с tmr0 attiny13
гуглим Микроконтроллеры AVR - Евстифеев А.В.
Re: Codevision avr помогите с tmr0 attiny13
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
... это не asm, а справочникigonzo писал(а):так это asm
Re: Codevision avr помогите с tmr0 attiny13
для нужной задержки вам нужно писать число в регистры OCR0A или OCR0B, у вас там нули по умолчанию вроде.
Устанавливаете режим работы таймера например сброс по переполнению (OVF) плюс к этому разрешаете прерывание по событию совпадение в А канале (или В, что больше нравится), как только досчитает до этого числа ,TCNT0 сбросится и будет сгенерено прерывание, а там в обработчике делайте что вам надо, например можно считать кол-во прерываний и в главной программе уже проверять прошло ли нужное количество если да, делаете то что вы там хотели), . итого время вызова прерывания будет определено числом в регистре сравнения(ну и как вы сами там логику построите), т.е. сколько времени например пройдёт до того, как совпадёт результат.
может чего упустил\не договорил, поправьте...
Устанавливаете режим работы таймера например сброс по переполнению (OVF) плюс к этому разрешаете прерывание по событию совпадение в А канале (или В, что больше нравится), как только досчитает до этого числа ,TCNT0 сбросится и будет сгенерено прерывание, а там в обработчике делайте что вам надо, например можно считать кол-во прерываний и в главной программе уже проверять прошло ли нужное количество если да, делаете то что вы там хотели), . итого время вызова прерывания будет определено числом в регистре сравнения(ну и как вы сами там логику построите), т.е. сколько времени например пройдёт до того, как совпадёт результат.
может чего упустил\не договорил, поправьте...
Re: Codevision avr помогите с tmr0 attiny13
Сделай так как в картинках, частота МК должна быть 128 кгц, на частоте 4.8 или 9.6 мгц прерывание 1 сек не получить. В принципе можно получить 100 или сколько там гц в секунду, просто считать не 20 прерываний а 2000. Т.е. если для остальной обвязки нужна высокая частота, - придется так и делать. Если по барабану можно 128 кгц.
- Вложения
-
- Таймер.doc
- (175.5 КБ) 265 скачиваний
Когда я был маленький, - микросхемы были большими. Имели четыре ножки и две ручки - для переноски.
Re: Codevision avr помогите с tmr0 attiny13
asw писал(а):для нужной задержки вам нужно писать число в регистры OCR0A или OCR0B, у вас там нули по умолчанию вроде.
Устанавливаете режим работы таймера например сброс по переполнению (OVF) плюс к этому разрешаете прерывание по событию совпадение в А канале (или В, что больше нравится), как только досчитает до этого числа ,TCNT0 сбросится и
Вроде как он будет считать до конца, сгенерирует прерывание и считает дальше до переполнения. Поэтому и обнуляю TCNT0. Правда в этом не уверен, но так на всякий случай.
Когда я был маленький, - микросхемы были большими. Имели четыре ножки и две ручки - для переноски.
- adrenocrome
- Потрогал лапой паяльник
- Сообщения: 365
- Зарегистрирован: Вт окт 21, 2008 15:03:06
- Откуда: moscow
- Контактная информация:
Re: Codevision avr помогите с tmr0 attiny13
Вот скажите, зачем мусорить в основной ветке форума
?
Есть же темы :
По КодВижн :
http://radiokot.ru/forum/viewtopic.php?f=20&t=5560
Мелкие вопросы по МК :
http://radiokot.ru/forum/viewtopic.php?f=20&t=32
?Есть же темы :
По КодВижн :
http://radiokot.ru/forum/viewtopic.php?f=20&t=5560
Мелкие вопросы по МК :
http://radiokot.ru/forum/viewtopic.php?f=20&t=32
День прошёл, а ты всё жив
Re: Codevision avr помогите с tmr0 attiny13
Smoker да, прошу прощения, сброс при совпадении должно быть режим, не о том подумал, а сброс по переполнению нет режима, не то написал в общем...он же сам автоматом сбрасывается при переполнении...