Re: Замешательство с программированием ATmega64A
Добавлено: Чт июн 26, 2014 22:27:14
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
Чтоб не заморачиваться с установками, по факту лучше сразу предусмотреть часы, чем сначала сделать безвозмездно неважно что, потом выкрасить, выбросить и начать делать уже нормально.чтобы свет в аквариуме
Там 2 уарта, вы используете оба?Саша Леськив писал(а):Собираю тест-плату с серцем на микроконтроллере ATmega64A
Почему не можете? Перемычку между MAX232 (или что там у Вас) и МК. И снимать ее на время программирования.P.P.S Эти ноги не могу использовать, ибо нужен юарт.
Код: Выделить всё
#include <tiny13.h>
unsigned char m_sec=0x00;//переменная мсек
unsigned char sec=0x00;//переменная сек
// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
m_sec++;//переменная увеличивается за одно прерывание
}
// 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=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State5=T State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0x1F;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: CTC top=OCR0A
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x02;
TCCR0B=0x03; //предделитель на 64
TCNT0=0x00;
OCR0A=0x7D; //значение сравнения 125
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=0x04;
// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR0=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
if(m_sec==100){m_sec=0;sec++;} //должна получатся 1 секунда
if(sec==100){PORTB.0=1;} //должно тикать 10 секунд
}
}

kLeR1k писал(а):И как можно отключить ШИМ и посадить ногу на землю?
Код: Выделить всё
TCCR0A &= ~((1<<COM0A0)|(1<<COM0A1)); // если выход А
TCCR0A &= ~((1<<COM0B0)|(1<<COM0B1)); // если выход B
PORT &= ~(1<<BIT);Компилятор ругается на COM0A0, как на неизвестную переменную. Если это имеет какое-то значение, пользуюсь CodeVisionAVR.ibiza11 писал(а):kLeR1k, код в студию!kLeR1k писал(а):И как можно отключить ШИМ и посадить ногу на землю?Код: Выделить всё
TCCR0A &= ~((1<<COM0A0)|(1<<COM0A1)); // если выход А TCCR0A &= ~((1<<COM0B0)|(1<<COM0B1)); // если выход B PORT &= ~(1<<BIT);
Код: Выделить всё
#include <tiny13.h>
#include <delay.h>
int cnt=0;
int pwmflag=1;
char Step=0xFF;
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if (pwmflag==1)
{
// Reinitialize Timer 0 value
TCNT0=0xFE;
// Place your code here
cnt++;
//Каждый 5000-й заход в прерывание
if (cnt==5000)
//if (cnt==2)
{
cnt=0;
//254 шага увеличения ширины импульса
if (Step !=0xFE ) {
Step++;
OCR0A=Step;
}
}
}
}
// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
// Place your code here
}
// Declare your global variables here
void main(void)
{
//Задержка после включения поворота
int TurnOfDelay;
// 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=Out Func0=Out
// State5=P State4=P State3=P State2=P State1=0 State0=0
PORTB=0x3C;
DDRB=0x03;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 9600,000 kHz
// Mode: Fast PWM top=FFh
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
TCCR0A=0x83; //83=non-inverted, C3=inverted
/* TCCR0A
(10)=Clear OC0A on Compare Match, set OC0A at TOP
|
-- --(11)=Fast PWM + WGM02 in TCCR0B=0
10000011
*/
TCCR0B=0x01;
/* TCCR0B
-(0)=WGM02
00000001
*/
TCNT0=0x10;
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=0x06;
// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/1024k
// Watchdog Timer interrupt: Off
#pragma optsize-
WDTCR=0x39;
WDTCR=0x29;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Global enable interrupts
#asm("sei")
pwmflag=1;
TurnOfDelay = 1500;
while (1)
{
#asm("wdr"); //Сброс сторожевого таймера
if (PINB.3==0)
{
//Выключен поворотник
if (PINB.1==1)
{
// Гасим поворотник
PORTB.1 = 0;
}
if (TurnOfDelay<1500)
{
// Ждём n секунды после этого, ДХО держим выключенными
TurnOfDelay++;
if (pwmflag>0)
{
Step=0;
OCR0A=0;
PORTB=0x00;
DDRB=0x03;
PORTB.0=0;
cnt=0;
pwmflag=0;
}
}
else
{
if (PINB.4==0 && pwmflag==0)
{
//Прошло n секунд и не горят габариты - включаются ДХО
PORTB=0x3C;
DDRB=0x03;
pwmflag=1;
}
}
}
else
{
//Включен поворотник - выключаются ДХО, зажигается поворотник
TurnOfDelay = 0;
if (pwmflag>0)
{
Step=0;
OCR0A=0;
PORTB=0x00;
DDRB=0x03;
PORTB.0=0;
cnt=0;
pwmflag=0;
}
if (PINB.1==0)
{
PORTB.1 = 1;
}
}
if (PINB.4==1)
{
//Если включены габариты - ДХО выключены
if (pwmflag>0)
{
Step=0;
OCR0A=0;
PORTB=0x00;
DDRB=0x03;
PORTB.0=0;
cnt=0;
pwmflag=0;
}
}
else
{
if (PINB.3==0 && TurnOfDelay>=1500 && pwmflag==0)
{
// Габариты выключены и поворотник выключен n секунд назад - включаются ДХО
PORTB=0x3C;
DDRB=0x03;
pwmflag=1;
}
}
// Не сработало ни одно из условий, но есть питание - ДХО включаются по прерыванию
delay_us(100);
};
}Так определите ее сами через #defineКомпилятор ругается на COM0A0, как на неизвестную переменную.
kLeR1k писал(а):Компилятор ругается на COM0A0, как на неизвестную переменную. Если это имеет какое-то значение, пользуюсь CodeVisionAVR.
Код: Выделить всё
#define COM0B0 4
#define COM0B1 5
#define COM0A0 6
#define COM0A1 7