Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы

Как загрузить указатель стека в CVAVR

Непрочитано 22.05.2014, 16:15  
insiderbik
Временная регистрация
 
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
insiderbik на пути к лучшему
По умолчанию 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();                                                      // запускаем функцию приема команд в бесконечном цикле                
}
Реклама:
insiderbik вне форума  
Непрочитано 22.05.2014, 16:58  
nml
Супер-модератор
 
Аватар для nml
 
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,394
Сказал спасибо: 2,016
Сказали Спасибо 1,356 раз(а) в 591 сообщении(ях)
nml на пути к лучшему
По умолчанию Re: Как загрузить указатель стека в CVAVR

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

Сделано все, чтобы рекурсию вызвать.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
nml вне форума  
Сказали "Спасибо" nml
insiderbik (22.05.2014)
Непрочитано 22.05.2014, 17:22  
insiderbik
Временная регистрация
 
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
insiderbik на пути к лучшему
По умолчанию Re: Как загрузить указатель стека в CVAVR

Сообщение от nml Посмотреть сообщение
Ну и чудеса тут... Ну, во первых, delay в прерывании само по себе сразу бросается в глаза. Ну а глюки - сами прикиньте - обработчик прерывания вызывает процедуру, та другую, другая - третью, кторая к тому же не имеет выхода. Да еще в этих процедурах разрешается прерывание зачем-то.

Сделано все, чтобы рекурсию вызвать.
да не в рекурсии тут дело. пробовал просто из процедуры внешнего прерывания послать 22 раза любые слова - работае, но все виснет через 20 повторов (при 256 стеке и при посылке не через функцию putchar)
insiderbik вне форума  
Непрочитано 22.05.2014, 17:29  
Yurkin2014
Заблокирован
 
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
Yurkin2014 на пути к лучшему
По умолчанию Re: Как загрузить указатель стека в CVAVR

Надо из output_code() выкинуть receive_command(), потому что эта самая receive_command() уже крутится в main(). Именно из-за receive_command() программа не может выйти из прерывания, поэтому прерывания вкладываются друг в друга и сжирают весь стек ...

Последний раз редактировалось Yurkin2014; 22.05.2014 в 17:35.
Yurkin2014 вне форума  
Сказали "Спасибо" Yurkin2014
insiderbik (22.05.2014)
Непрочитано 22.05.2014, 17:34  
insiderbik
Временная регистрация
 
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
insiderbik на пути к лучшему
По умолчанию Re: Как загрузить указатель стека в CVAVR

Сообщение от Yurkin2014 Посмотреть сообщение
Надо из output_code() выкинуть receive_command(), потому что эта самая receive_command() уже крутится в main();
поясните поподробнее плиз, получается функцию из других функций нельзя вызывать дважды??? а переход к ask_to_fp(); в двух обработчиках прерываний как же???я попробую конечно, но это уже завтра будет - сейчас нет возможности
insiderbik вне форума  
Непрочитано 22.05.2014, 17:40  
Yurkin2014
Заблокирован
 
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
Yurkin2014 на пути к лучшему
По умолчанию Re: Как загрузить указатель стека в CVAVR

У Вас receive_command() не имеет выхода, там бесконечный цикл while(1){}. Поэтому когда программа доходит до receive_command(), она навсегда там остаётся. Это хорошо делать в main(). Но из прерываний программа должна выходить. Именно из-за receive_command() программа не может выйти из текущего прерывания, поэтому следующее прерывание прерывает прерыдущее и т.д. А каждая обработка прерываний - это расход стека. Вот он и кончается.
Оставьте receive_command() только в main(), это будет достаточно для приёма команд.

Последний раз редактировалось Yurkin2014; 22.05.2014 в 17:47.
Yurkin2014 вне форума  
Сказали "Спасибо" Yurkin2014
insiderbik (22.05.2014)
Непрочитано 22.05.2014, 18:03  
insiderbik
Временная регистрация
 
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
insiderbik на пути к лучшему
По умолчанию Re: Как загрузить указатель стека в CVAVR

Сообщение от Yurkin2014 Посмотреть сообщение
У Вас receive_command() не имеет выхода, там бесконечный цикл while(1){}. Поэтому когда программа доходит до receive_command(), она навсегда там остаётся. Это хорошо делать в main(). Но из прерываний программа должна выходить. Именно из-за receive_command() программа не может выйти из текущего прерывания, поэтому следующее прерывание прерывает прерыдущее и т.д. А каждая обработка прерываний - это расход стека. Вот он и кончается.
Оставьте receive_command() только в main(), это будет достаточно для приёма команд.
Да я Вас понял, огромное Вам спасибо, если поможет, да и если не поможет - все равно спасибо. Завтра отпишусь о результате.
insiderbik вне форума  
Непрочитано 27.05.2014, 09:45  
insiderbik
Временная регистрация
 
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
insiderbik на пути к лучшему
По умолчанию Re: Как загрузить указатель стека в CVAVR

Сообщение от Yurkin2014 Посмотреть сообщение
У Вас receive_command() не имеет выхода, там бесконечный цикл while(1){}. Поэтому когда программа доходит до receive_command(), она навсегда там остаётся. Это хорошо делать в main(). Но из прерываний программа должна выходить. Именно из-за receive_command() программа не может выйти из текущего прерывания, поэтому следующее прерывание прерывает прерыдущее и т.д. А каждая обработка прерываний - это расход стека. Вот он и кончается.
Оставьте receive_command() только в main(), это будет достаточно для приёма команд.
Да вы были правы - программа не выходила нормально из прерывания. Вся загвоздка была в единственной строчке receive_command() в функции receive_command(), закоментировав ее все сразу заработало. Всем, кто поучавствовал огромное спасибо.
insiderbik вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Решено] Так, рассказик :)) Я долго ржал :)) DK Отвлекитесь, эмбеддеры! 7 31.08.2007 22:33
[Решено] Сборник перлов любителей кабельщины mikesmith Отвлекитесь, эмбеддеры! 135 14.08.2007 15:49
[Решено] про блоки питания бу-га-га! zalman Отвлекитесь, эмбеддеры! 12 29.01.2007 10:46
[Решено] Всем эмбеддерам посвящается... Decan Отвлекитесь, эмбеддеры! 0 24.10.2005 14:43


Часовой пояс GMT +4, время: 01:22.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.