| AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
Как загрузить указатель стека в CVAVR
22.05.2014, 16:15
|
|
|
Временная регистрация
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как загрузить указатель стека в CVAVR
Сообщение от Boba_spb
|
Прога то на С написана. Стек может распухать только на вложенных прерываниях или реентерабельности подпрограмм.
Или АСМовские вставки кидают в стек и не вытаскивают.
Прерывания на этот УАРТ случаем не заряжены? А то кинули туды байт а он исчо и в прерывания скачет никому не нужные .
|
Сейчас скину весь код - найдите плиз ошибку. Отправку заменил назад через putchar ы, при этом стека хватает на 5 циклов при стеке 512 (при отправке через функцию было 40, при стеке 256 - 20)
|
Код:
|
/************************************************** ***
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date :
Author :
Company :
Comments:
Chip type : ATmega88PA
Program type : Application
AVR Core Clock frequency: 18.432000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
************************************************** ***/
#include ‹mega88a.h› // подключаем хэдэр микроконтроллера ATmega88a
#include ‹delay.h› // подключаем функцию задержки времени
#include ‹stdio.h› // подключаем стандартные функции ввода/вывода
unsigned char Uab; // объявляем переменную Uab для хранения оцифрованного значения напряжения аккумуляторной батареи
unsigned char adc_data; // объявляем переменную adc_data для хранения значения АЦП
unsigned char LOWperiod, HIGHperiod; // объявляем переменные LOWperiod, HIGHperiod для хранения числа периода засветки ФП
unsigned char Start, string11, string12; // объявляем переменные Start, string11, string12 для хранения стартового слова и состояния 1й строки
unsigned char string21, string22; // объявляем переменные string21, string22 для хранения состояния 2й строки
unsigned char string31, string32; // объявляем переменные string31, string32 для хранения состояния 3й строки
unsigned char string41, string42; // объявляем переменные string41, string42 для хранения состояния 4й строки
unsigned char string51, string52; // объявляем переменные string51, string52 для хранения состояния 5й строки
unsigned char string61, string62; // объявляем переменные string61, string62 для хранения состояния 6й строки
unsigned char string71, string72; // объявляем переменные string71, string72 для хранения состояния 7й строки
unsigned char string81, string82; // объявляем переменные string81, string82 для хранения состояния 8й строки
unsigned char string91, string92; // объявляем переменные string91, string92 для хранения состояния 9й строки
void receive_command(void); // объявляем функцию receive_command
void ask_to_fp(void); // объявляем функцию ask_to_fp
void output_code(void); // объявляем функцию output_code
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void) // прерывание при нажатии кнопки КОНТРОЛЬ
{
delay_ms(200); // задержка для пропуска дребезга контактов
EIFR.0 = 1; // сбрасываем флаг прерывания INT0
ask_to_fp(); // запускаем функцию опроса фотоприемников
}
#ifndef RXB8
#define RXB8 1
#endif
#ifndef TXB8
#define TXB8 0
#endif
#ifndef UPE
#define UPE 2
#endif
#ifndef DOR
#define DOR 3
#endif
#ifndef FE
#define FE 4
#endif
#ifndef UDRE
#define UDRE 5
#endif
#ifndef RXC
#define RXC 7
#endif
#define FRAMING_ERROR (1‹‹FE)
#define PARITY_ERROR (1‹‹UPE)
#define DATA_OVERRUN (1‹‹DOR)
#define DATA_REGISTER_EMPTY (1‹‹UDRE)
#define RX_COMPLETE (1‹‹RXC)
// USART Receiver buffer
#define RX_BUFFER_SIZE0 32
char rx_buffer0[RX_BUFFER_SIZE0];
#if RX_BUFFER_SIZE0 ‹= 256
unsigned char rx_wr_index0,rx_rd_index0,rx_counter0;
#else
unsigned int rx_wr_index0,rx_rd_index0,rx_counter0;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow0;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSR0A;
data=UDR0;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer0[rx_wr_index0++]=data;
#if RX_BUFFER_SIZE0 == 256
// special case for receiver buffer size=256
if (++rx_counter0 == 0) rx_buffer_overflow0=1;
#else
if (rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
if (++rx_counter0 == RX_BUFFER_SIZE0)
{
rx_counter0=0;
rx_buffer_overflow0=1;
}
#endif
}
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter0==0);
data=rx_buffer0[rx_rd_index0++];
#if RX_BUFFER_SIZE0 != 256
if (rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
#endif
#asm("cli")
--rx_counter0;
#asm("sei")
return data;
}
#pragma used-
#endif
// USART Transmitter buffer
#define TX_BUFFER_SIZE0 255
char tx_buffer0[TX_BUFFER_SIZE0];
#if TX_BUFFER_SIZE0 ‹= 256
unsigned char tx_wr_index0,tx_rd_index0,tx_counter0;
#else
unsigned int tx_wr_index0,tx_rd_index0,tx_counter0;
#endif
// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter0)
{
--tx_counter0;
UDR0=tx_buffer0[tx_rd_index0++];
#if TX_BUFFER_SIZE0 != 256
if (tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0;
#endif
}
}
#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter0 == TX_BUFFER_SIZE0);
#asm("cli")
if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0))
{
tx_buffer0[tx_wr_index0++]=c;
#if TX_BUFFER_SIZE0 != 256
if (tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0;
#endif
++tx_counter0;
}
else
UDR0=c;
#asm("sei")
}
#pragma used-
#endif
// Timer1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void) // обработчик прерывания по импульсу запуска (измерение временного интервала между импульсами)
{
// delay_ms(200); // задержка для пропуска дребезга контактов
// TIFR1 = 255; // Сбрасываем регистр флагов прерываний таймера/счётчика1
// if (PORTD.4 == 1) PORTD.4 = 0; // если 4й бит порта D равен 1, то сбрасываем его в 0
LOWperiod = ICR1L; // в регистр LOWperiod копируем младший байт захваченного значения
HIGHperiod = ICR1H; // в регистр HIGHperiod копируем старший байт захваченного значения
LOWperiod = LOWperiod ›› 1; // свигаем регистр LOWperiod вправо на 1 бит
LOWperiod |= 0b10000000; // ставим в старший бит LOWperiod "1-й" маркер
TIFR1 = 255; // Сбрасываем регистр флагов прерываний таймера/счётчика1
TCNT1H = 0; //
TCNT1L = 0; // Сбрасываем регистры хранения значения таймера/счётчика1
ICR1H = 0; //
ICR1L = 0; // Сбрасываем регистры хранения захваченного значения таймера/счётчика1
// receive_command();
ask_to_fp(); // запускаем функцию опроса фотоприемников
}
#define ADC_VREF_TYPE 0xE0
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
// Read the 8 most significant bits
// of the AD conversion result
adc_data=ADCH;
}
// Read the 8 most significant bits
// of the AD conversion result
// with noise canceling
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);
#asm
in r30,smcr
cbr r30,__sm_mask
sbr r30,__se_bit | __sm_adc_noise_red
out smcr,r30
sleep
cbr r30,__se_bit
out smcr,r30
#endasm
return adc_data;
}
// 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
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=In
// State7=P State6=P State5=P State4=P State3=P State2=1 State1=1 State0=P
PORTB=0xFF; //PORTB=0xFB;-рэле вкл
DDRB=0x06;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In
// State6=P State5=T State4=T State3=0 State2=T State1=T State0=P
PORTC=0x41; // 3 зеленый
DDRC=0x08; // DDRC=0x00;
// Port D initialization
// Func7=Out Func6=Out Func5=In Func4=Out Func3=Out Func2=In Func1=Out Func0=In
// State7=0 State6=0 State5=P State4=0 State3=0 State2=P State1=1 State0=P
PORTD=0x27; // PORTD=0xAF; // 3 красный, 7 желтый
DDRD=0xDA; // DDRD=0x52;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: System Clock / 1024
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x05;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 288.000 kHz
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: On
// Input Capture on Rising Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: On
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0xC3;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2A output: Disconnected
// OC2B output: Disconnected
ASSR=0x00;
TCCR2A=0x00;
TCCR2B=0x00;
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: Off
// Interrupt on any change on pins PCINT16-23: Off
EICRA=0x02;
EIMSK=0x01;
EIFR=0x01;
PCICR=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;
// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x20;
// Timer/Counter 2 Interrupt(s) initialization
TIMSK2=0x00;
// USART initialization
// Communication Parameters: 8 Data, 2 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART0 Mode: Asynchronous
// USART Baud Rate: 19200
UCSR0A=0x00;
UCSR0B=0xD8; //;-прерывание при передаче UCSR0B=0x98;-прерывания при передаче нет
UCSR0C=0x0E;
UBRR0H=0x00;
UBRR0L=0x3B;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR1=0x00;
// ADC initialization
// ADC Clock frequency: 144.000 kHz
// ADC Voltage Reference: Int., cap. on AREF
// ADC Auto Trigger Source: ADC Stopped
// Only the 8 most significant bits of
// the AD conversion result are used
// Digital input buffers on ADC0: Off, ADC1: On, ADC2: On, ADC3: On
// ADC4: On, ADC5: On
DIDR0=0x01;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x8F;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
// Global enable interrupts
#asm("sei")
receive_command(); // запускаем функцию приема команд в бесконечном цикле
}
void receive_command(void) // описание Функции приема команд в бесконечном цикле с разрешенными прерываниями
{
#asm("sei")
while (1)
{
unsigned char command1, command2; // объявляем переменные command1, command2 типа unsigned char (символ без знака)
if (rx_counter0) // если в буфере есть непрочитанные слова, то:
{
command1 = getchar(); // берем 1-е слово
command2 = getchar(); // берем 2-е слово
if ((command1 == command2)&&(command1 == 57)) // сравниваем и если оба равны 57, то
{
PORTB.2 = 0; // включаем аппаратуру
}
if ((command1 == command2)&&(command1 == 155)) // сравниваем и если оба равны 155, то
{
PORTB.2 = 1; // выключение аппаратуру
}
if ((command1 == command2)&&(command1 == 25)) // сравниваем и если оба равны 25, то
{
PORTD.4 = 1; // временно посылаем контроль на аппаратуру
delay_ms(10); // задержка на 10 мс
PORTD.4 = 0; // временно посылаем контроль на аппаратуру
}
}
}
}
void ask_to_fp(void) // описание функции опроса фотоприемников
{
unsigned char x; // объявляем вспомогательную переменную x
unsigned char fp[81]; // объявляем массив на 81 элемент для хранения данных с ФП
#asm("sei")
// запись данных в регистры
PORTB.1 = 1; // вход P/S регистров переводим в состояние "1" для записи данных с ФП в регистр
PORTD.6 = 1; // вход С регистров временно переводим в состояние "1" для записи данных с ФП в регистр
delay_us(10); // задержка на 10 мкс
PORTD.6 = 0; // вход С регистров переводим в состояние "0"
delay_us(10); // задержка на 10 мкс
// выдвижение последовательности данных из регистров и их запись в массив микроконтроллера
PORTB.1 = 0; // вход P/S регистров переводим в состояние "0" перед сдвигом данных
fp[0] = PIND.5; // копируем 1й элемент массива
for (x = 1; x ‹= 80; x = x + 1) // цикл для выдачи 80ти синхроимпульсов на вход С регистров для выдвижения остальных 80ти элементов массива
{
PORTD.6 = 1; // посылаем нарастающий фронт на вход С регистров
delay_us(10); // задержка на 10 мкс
PORTD.6 = 0; // посылаем спадающий фронт на вход С регистров
fp[x] = PIND.5; // в соответствующий элемент массива данных с ФП записываем состояние опрашиваемого ФП
delay_us(10); // задержка на 10 мкс
};
PORTB.1 = 1; // вход P/S регистров переводим в состояние "1" после сдвига данных (для последующей записи)
read_adc(0x00); // запускаем функцию аналого-цифрового преобразования со входа ADC0 (вычисление заряда аккумуляторной батареи)
Uab = adc_data; // копируем измеренное значение в регистр Uab
Start = 0b01010101; // в стартовое слово заносим значение 0b01010101
for (x = 0; x ‹= 80; x = x + 1) // в цикле формируем из принятой последовательности слова для выдачи на ПК
{
if (fp[0] == 1) string11 |= 0b00010000; // 1я строка
if (fp[1] == 1) string11 |= 0b00100000;
if (fp[2] == 1) string11 |= 0b01000000;
if (fp[3] == 1) string12 |= 0b00000001;
if (fp[4] == 1) string12 |= 0b00000010;
if (fp[5] == 1) string12 |= 0b00000100;
if (fp[6] == 1) string12 |= 0b00001000;
if (fp[7] == 1) string12 |= 0b00010000;
if (fp[8] == 1) string12 |= 0b00100000;
if (fp[9] == 1) string21 |= 0b00010000; // 2я строка
if (fp[10] == 1) string21 |= 0b00100000;
if (fp[11] == 1) string21 |= 0b01000000;
if (fp[12] == 1) string22 |= 0b00000001;
if (fp[13] == 1) string22 |= 0b00000010;
if (fp[14] == 1) string22 |= 0b00000100;
if (fp[15] == 1) string22 |= 0b00001000;
if (fp[16] == 1) string22 |= 0b00010000;
if (fp[17] == 1) string22 |= 0b00100000;
if (fp[18] == 1) string31 |= 0b00010000; // 3я строка
if (fp[19] == 1) string31 |= 0b00100000;
if (fp[20] == 1) string31 |= 0b01000000;
if (fp[21] == 1) string32 |= 0b00000001;
if (fp[22] == 1) string32 |= 0b00000010;
if (fp[23] == 1) string32 |= 0b00000100;
if (fp[24] == 1) string32 |= 0b00001000;
if (fp[25] == 1) string32 |= 0b00010000;
if (fp[26] == 1) string32 |= 0b00100000;
if (fp[27] == 1) string41 |= 0b00010000; // 4я строка
if (fp[28] == 1) string41 |= 0b00100000;
if (fp[29] == 1) string41 |= 0b01000000;
if (fp[30] == 1) string42 |= 0b00000001;
if (fp[31] == 1) string42 |= 0b00000010;
if (fp[32] == 1) string42 |= 0b00000100;
if (fp[33] == 1) string42 |= 0b00001000;
if (fp[34] == 1) string42 |= 0b00010000;
if (fp[35] == 1) string42 |= 0b00100000;
if (fp[36] == 1) string51 |= 0b00010000; // 5я строка
if (fp[37] == 1) string51 |= 0b00100000;
if (fp[38] == 1) string51 |= 0b01000000;
if (fp[39] == 1) string52 |= 0b00000001;
if (fp[40] == 1)
{
string52 |= 0b00000010;
PORTD.4 = 0; // устанавливаем контрольный порт PORTD.4 в исходное 0-е состояние
}
if (fp[41] == 1) string52 |= 0b00000100;
if (fp[42] == 1) string52 |= 0b00001000;
if (fp[43] == 1) string52 |= 0b00010000;
if (fp[44] == 1) string52 |= 0b00100000;
if (fp[45] == 1) string61 |= 0b00010000; // 6я строка
if (fp[46] == 1) string61 |= 0b00100000;
if (fp[47] == 1) string61 |= 0b01000000;
if (fp[48] == 1) string62 |= 0b00000001;
if (fp[49] == 1) string62 |= 0b00000010;
if (fp[50] == 1) string62 |= 0b00000100;
if (fp[51] == 1) string62 |= 0b00001000;
if (fp[52] == 1) string62 |= 0b00010000;
if (fp[53] == 1) string62 |= 0b00100000;
if (fp[54] == 1) string71 |= 0b00010000; // 7я строка
if (fp[55] == 1) string71 |= 0b00100000;
if (fp[56] == 1) string71 |= 0b01000000;
if (fp[57] == 1) string72 |= 0b00000001;
if (fp[58] == 1) string72 |= 0b00000010;
if (fp[59] == 1) string72 |= 0b00000100;
if (fp[60] == 1) string72 |= 0b00001000;
if (fp[61] == 1) string72 |= 0b00010000;
if (fp[62] == 1) string72 |= 0b00100000;
if (fp[63] == 1) string81 |= 0b00010000; // 8я строка
if (fp[64] == 1) string81 |= 0b00100000;
if (fp[65] == 1) string81 |= 0b01000000;
if (fp[66] == 1) string82 |= 0b00000001;
if (fp[67] == 1) string82 |= 0b00000010;
if (fp[68] == 1) string82 |= 0b00000100;
if (fp[69] == 1) string82 |= 0b00001000;
if (fp[70] == 1) string82 |= 0b00010000;
if (fp[71] == 1) string82 |= 0b00100000;
if (fp[72] == 1) string91 |= 0b00010000; // 9я строка
if (fp[73] == 1) string91 |= 0b00100000;
if (fp[74] == 1) string91 |= 0b01000000;
if (fp[75] == 1) string92 |= 0b00000001;
if (fp[76] == 1) string92 |= 0b00000010;
if (fp[77] == 1) string92 |= 0b00000100;
if (fp[78] == 1) string92 |= 0b00001000;
if (fp[79] == 1) string92 |= 0b00010000;
if (fp[80] == 1) string92 |= 0b00100000;
};
// в слова, предназначенные для выдачи на ПК, в определенные места заносим маркеры и номера строк
string11 |= 0b10000001; // ставим в старший бит string11 "1-й" маркер и номер 1й строки
string12 |= 0b00000000; // ставим в два старших бита string12 "о-е" маркеры
string21 |= 0b10000010; // ставим в старший бит string21 "1-й" маркер и номер 2й строки
string22 |= 0b00000000; // ставим в два старших бита string22 "о-е" маркеры
string31 |= 0b10000011; // ставим в старший бит string31 "1-й" маркер и номер 3й строки
string32 |= 0b00000000; // ставим в два старших бита string32 "о-е" маркеры
string41 |= 0b10000100; // ставим в старший бит string41 "1-й" маркер и номер 4й строки
string42 |= 0b00000000; // ставим в два старших бита string42 "о-е" маркеры
string51 |= 0b10000101; // ставим в старший бит string51 "1-й" маркер и номер 5й строки
string52 |= 0b00000000; // ставим в два старших бита string52 "о-е" маркеры
string61 |= 0b10000110; // ставим в старший бит string61 "1-й" маркер и номер 6й строки
string62 |= 0b00000000; // ставим в два старших бита string62 "о-е" маркеры
string71 |= 0b10000111; // ставим в старший бит string71 "1-й" маркер и номер 7й строки
string72 |= 0b00000000; // ставим в два старших бита string72 "о-е" маркеры
string81 |= 0b10001000; // ставим в старший бит string81 "1-й" маркер и номер 8й строки
string82 |= 0b00000000; // ставим в два старших бита string82 "о-е" маркеры
string91 |= 0b10001001; // ставим в старший бит string91 "1-й" маркер и номер 9й строки
string92 |= 0b00000000; // ставим в два старших бита string92 "о-е" маркеры
for (x = 0; x ‹= 80; x = x + 1) // в цикле обнуляем массив
{ //
fp[x]=0; //
} //
output_code(); // запускаем функцию выдачи кода
}
void output_code(void) // описание функции выдачи кода
{
#asm("sei")
putchar(Start); // отправляем в передатчик USART первое ключевое слово с помощью стандартных функций ввода/вывода (1е слово)
putchar(string11); // отправляем в передатчик USART 1е слово 1й строки с помощью стандартных функций ввода/вывода (2е слово)
putchar(string12); // отправляем в передатчик USART 2е слово 1й строки с помощью стандартных функций ввода/вывода (3е слово)
putchar(string21); // отправляем в передатчик USART 1е слово 2й строки с помощью стандартных функций ввода/вывода (4е слово)
putchar(string22); // отправляем в передатчик USART 2е слово 2й строки с помощью стандартных функций ввода/вывода (5е слово)
putchar(string31); // отправляем в передатчик USART 1е слово 3й строки с помощью стандартных функций ввода/вывода (6е слово)
putchar(string32); // отправляем в передатчик USART 2е слово 3й строки с помощью стандартных функций ввода/вывода (7е слово)
putchar(string41); // отправляем в передатчик USART 1е слово 4й строки с помощью стандартных функций ввода/вывода (8е слово)
putchar(string42); // отправляем в передатчик USART 2е слово 4й строки с помощью стандартных функций ввода/вывода (9е слово)
putchar(string51); // отправляем в передатчик USART 1е слово 5й строки с помощью стандартных функций ввода/вывода (10е слово)
putchar(string52); // отправляем в передатчик USART 2е слово 5й строки с помощью стандартных функций ввода/вывода (11е слово)
putchar(string61); // отправляем в передатчик USART 1е слово 6й строки с помощью стандартных функций ввода/вывода (12е слово)
putchar(string62); // отправляем в передатчик USART 2е слово 6й строки с помощью стандартных функций ввода/вывода (13е слово)
putchar(string71); // отправляем в передатчик USART 1е слово 7й строки с помощью стандартных функций ввода/вывода (14е слово)
putchar(string72); // отправляем в передатчик USART 2е слово 7й строки с помощью стандартных функций ввода/вывода (15е слово)
putchar(string81); // отправляем в передатчик USART 1е слово 8й строки с помощью стандартных функций ввода/вывода (16е слово)
putchar(string82); // отправляем в передатчик USART 2е слово 8й строки с помощью стандартных функций ввода/вывода (17е слово)
putchar(string91); // отправляем в передатчик USART 1е слово 9й строки с помощью стандартных функций ввода/вывода (18е слово)
putchar(string92); // отправляем в передатчик USART 2е слово 9й строки с помощью стандартных функций ввода/вывода (19е слово)
putchar(LOWperiod); // отправляем в передатчик USART младший байт измеренного значения периода засветки ФП с помощью стандартных функций ввода/вывода (20е слово)
putchar(HIGHperiod); // отправляем в передатчик USART старший байт измеренного значения периода засветки ФП с помощью стандартных функций ввода/вывода (21е слово)
putchar(Uab); // отправляем в передатчик USART измеренное значение АЦП с помощью стандартных функций ввода/вывода (22е слово)
Start = 0; // обнуляем все слова после передачи
string11 = 0; //
string12 = 0; //
string21 = 0; //
string22 = 0; //
string31 = 0; //
string32 = 0; //
string41 = 0; //
string42 = 0; //
string51 = 0; //
string52 = 0; //
string61 = 0; //
string62 = 0; //
string71 = 0; //
string72 = 0; //
string81 = 0; //
string82 = 0; //
string91 = 0; //
string92 = 0; //
LOWperiod = 0; //
HIGHperiod = 0; //
Uab = 0; //
receive_command(); // запускаем функцию приема команд в бесконечном цикле
} |
|
|
|
|
22.05.2014, 16:58
|
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,394
Сказал спасибо: 2,016
Сказали Спасибо 1,356 раз(а) в 591 сообщении(ях)
|
Re: Как загрузить указатель стека в CVAVR
Ну и чудеса тут... Ну, во первых, delay в прерывании само по себе сразу бросается в глаза. Ну а глюки - сами прикиньте - обработчик прерывания вызывает процедуру, та другую, другая - третью, кторая к тому же не имеет выхода. Да еще в этих процедурах разрешается прерывание зачем-то.
Сделано все, чтобы рекурсию вызвать.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
|
22.05.2014, 17:22
|
|
|
Временная регистрация
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как загрузить указатель стека в CVAVR
Сообщение от nml
|
Ну и чудеса тут... Ну, во первых, delay в прерывании само по себе сразу бросается в глаза. Ну а глюки - сами прикиньте - обработчик прерывания вызывает процедуру, та другую, другая - третью, кторая к тому же не имеет выхода. Да еще в этих процедурах разрешается прерывание зачем-то.
Сделано все, чтобы рекурсию вызвать.
|
да не в рекурсии тут дело. пробовал просто из процедуры внешнего прерывания послать 22 раза любые слова - работае, но все виснет через 20 повторов (при 256 стеке и при посылке не через функцию putchar)
|
|
|
|
22.05.2014, 17:29
|
|
|
Заблокирован
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
|
Re: Как загрузить указатель стека в CVAVR
Надо из output_code() выкинуть receive_command(), потому что эта самая receive_command() уже крутится в main(). Именно из-за receive_command() программа не может выйти из прерывания, поэтому прерывания вкладываются друг в друга и сжирают весь стек ...
Последний раз редактировалось Yurkin2014; 22.05.2014 в 17:35.
|
|
|
|
Сказали "Спасибо" Yurkin2014
|
|
|
22.05.2014, 17:34
|
|
|
Временная регистрация
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как загрузить указатель стека в CVAVR
Сообщение от Yurkin2014
|
|
Надо из output_code() выкинуть receive_command(), потому что эта самая receive_command() уже крутится в main();
|
поясните поподробнее плиз, получается функцию из других функций нельзя вызывать дважды??? а переход к ask_to_fp(); в двух обработчиках прерываний как же???я попробую конечно, но это уже завтра будет - сейчас нет возможности
|
|
|
|
22.05.2014, 17:40
|
|
|
Заблокирован
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
|
Re: Как загрузить указатель стека в CVAVR
У Вас receive_command() не имеет выхода, там бесконечный цикл while(1){}. Поэтому когда программа доходит до receive_command(), она навсегда там остаётся. Это хорошо делать в main(). Но из прерываний программа должна выходить. Именно из-за receive_command() программа не может выйти из текущего прерывания, поэтому следующее прерывание прерывает прерыдущее и т.д. А каждая обработка прерываний - это расход стека. Вот он и кончается.
Оставьте receive_command() только в main(), это будет достаточно для приёма команд.
Последний раз редактировалось Yurkin2014; 22.05.2014 в 17:47.
|
|
|
|
Сказали "Спасибо" Yurkin2014
|
|
|
22.05.2014, 18:03
|
|
|
Временная регистрация
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как загрузить указатель стека в CVAVR
Сообщение от Yurkin2014
|
У Вас receive_command() не имеет выхода, там бесконечный цикл while(1){}. Поэтому когда программа доходит до receive_command(), она навсегда там остаётся. Это хорошо делать в main(). Но из прерываний программа должна выходить. Именно из-за receive_command() программа не может выйти из текущего прерывания, поэтому следующее прерывание прерывает прерыдущее и т.д. А каждая обработка прерываний - это расход стека. Вот он и кончается.
Оставьте receive_command() только в main(), это будет достаточно для приёма команд.
|
Да я Вас понял, огромное Вам спасибо, если поможет, да и если не поможет - все равно спасибо. Завтра отпишусь о результате.
|
|
|
|
27.05.2014, 09:45
|
|
|
Временная регистрация
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как загрузить указатель стека в CVAVR
Сообщение от Yurkin2014
|
У Вас receive_command() не имеет выхода, там бесконечный цикл while(1){}. Поэтому когда программа доходит до receive_command(), она навсегда там остаётся. Это хорошо делать в main(). Но из прерываний программа должна выходить. Именно из-за receive_command() программа не может выйти из текущего прерывания, поэтому следующее прерывание прерывает прерыдущее и т.д. А каждая обработка прерываний - это расход стека. Вот он и кончается.
Оставьте receive_command() только в main(), это будет достаточно для приёма команд.
|
Да вы были правы - программа не выходила нормально из прерывания. Вся загвоздка была в единственной строчке receive_command() в функции receive_command(), закоментировав ее все сразу заработало. Всем, кто поучавствовал огромное спасибо.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:22.
|
|