Перейти к содержанию

Установка Ножки В Единицу Не Всегда Работает


novarobotix

Рекомендуемые сообщения

простой код:

if (zsteps>0){PORTC.3=1;}

if (zsteps<0){PORTC.3=0;}

либо включает светодиод либо выключает. но раз на раз не приходится. иногда срабатывает иногда нет. обычно советуют поставить задержку после команды чтоб сработало, но в моём случае задержку поставить нет возможности - реал тайм устройство. почему такая фигня вообще происходит? как от неё избавится?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

вот код

/*******************************************************
This program was created by the
CodeWizardAVR V3.14 Evaluation
Automatic Program Generator
© Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
[url="http://www.hpinfotech.com"]http://www.hpinfotech.com[/url]

Project :
Version :
Date	: 17.08.2014
Author  :
Company :
Comments:


Chip type			   : ATmega8
Program type			: Application
AVR Core Clock frequency: 10,000000 MHz
Memory model			: Small
External RAM size	   : 0
Data Stack size		 : 256
*******************************************************/

#include <mega8.h>

// Declare your global variables here

// Standard Input/Output functions
#include <stdio.h>
#include <string.h>
#include <delay.h>
Nod();
//int start;
int xsteps;
int ysteps;
int zsteps;
int tempx;
int tempy;
int tempz;
int xdir;
int ydir;
int zdir;
int z_w;
int z_f=1000;
int z_w_result=100;
int z_f_result;
int z_w_count;
int z_f_count;
int z_process;
int z_f_temp;


int i;
int data;
//int lng;
//char mystr[]="Atmega8 UART ready!";
#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 0

#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
#define RX_BUFFER_SIZE 32
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

char uart_data[5];


unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
// Voltage Reference: Int., cap. on AREF
#define ADC_VREF_TYPE ((1<<REFS1) | (1<<REFS0) | (0<<ADLAR))
// float result;
// ADC interrupt service routine
// with auto input scanning
interrupt [ADC_INT] void adc_isr(void)
{
static unsigned char input_index=0;
// Read the AD conversion result
adc_data[input_index]=ADCW;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
  input_index=0;
ADMUX=(FIRST_ADC_INPUT | ADC_VREF_TYPE)+input_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=(1<<ADSC);
}

// USART Receiver interrupt service routine
interrupt [uSART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};

//здесь мы помещаем приходящие данные в массив, заранее известно количество
//принимаемых символов = 5
//uart_data[i]=data;
//data=UDR;
//	  Nod();
  //PORTC.5=1;
  if(data=='9')
  {  
  zsteps=zsteps+1;
  //PORTC.2=1;

   }  

	 if(data=='8')
  {
  zsteps=zsteps-1;
  //PORTC.2=0;  
  }  


  //	   if(data=='7')
//  {
  //   PORTC.3=1;

//   }  

//	 if(data=='6')
//  {
  //   PORTC.3=0;  
  //   }  
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif


Nod(){

for (i=0; i < 10; i++)	{







  if (PINC.4==1){ zdir=1;}
  if (PINC.4==0){ zdir=0;}

  if (PINC.5==1 && tempz==0){tempz=1;z_w=0;
  if (z_f_temp<10000){ z_f=z_f_temp;z_f_temp=0;}
  }
  if (PINC.5==1 && tempz==1){z_w=z_w+1;}  

  if (PINC.5==0 && zdir==1 && tempz==1){ tempz=0;z_w_result=z_w;zsteps=zsteps+1;}
  if (PINC.5==0 && zdir==0 && tempz==1){ tempz=0;z_w_result=z_w;zsteps=zsteps-1;}


  z_f_temp=z_f_temp+1;  

	if (zsteps>0){PORTC.3=1;}  
   if (zsteps<0){PORTC.3=0;}  

 ///////////////////////  
	 if (PIND.5==1){ xdir=1;}
  if (PIND.5==0){ xdir=0;}

  if (PIND.4==1 && tempx==0 && xdir==1){xsteps=xsteps+1 ;tempx=1;}
  if (PIND.4==1 && tempx==0 && xdir==0){xsteps=xsteps-1 ;tempx=1;}
  if (PIND.4==0){ tempx=0;}		  

  if (PIND.7==1){ ydir=1;}
  if (PIND.7==0){ ydir=0;}  

  if (PIND.6==1 && tempy==0 && ydir==1){ysteps=ysteps+1 ;tempy=1;}
  if (PIND.6==1 && tempy==0 && ydir==0){ysteps=ysteps-1 ;tempy=1;}
  if (PIND.6==0){ tempy=0;}  



 /////////////////////////////

   z_f=30;z_w_result=5;
   if (zsteps>0 && z_w_count==0 && z_f_count==0){ zsteps=zsteps-1;PORTC.2=1;z_w_count=z_w_result;z_f_count=z_f;z_process=1;}
   if (zsteps<0 && z_w_count==0 && z_f_count==0){ zsteps=zsteps+1;PORTC.2=1;z_w_count=z_w_result;z_f_count=z_f;z_process=1;}
   if (z_w_count>0){z_w_count=z_w_count-1;}
   if (z_f_count>0){z_f_count=z_f_count-1;}  
   if (z_w_count==0 && z_process==1){PORTC.2=0;z_process=0;}



 }
  }


void main(void)
{


// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Port C initialization
// Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (1<<DDC3) | (1<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);

// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=(0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
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
// OC2 output: Disconnected
ASSR=0<<AS2;
TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<TOIE0);

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 1200


UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(1<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
UBRRH=0x00;
UBRRL=0x07;

//UCSRA=0x00;
//UCSRB=0x90;
//UCSRC=0x86;
//UBRRH=0x00;
//UBRRL=0x07;

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

// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
SFIOR=(0<<ACME);

// ADC initialization
// ADC Clock frequency: 78,125 kHz
// ADC Voltage Reference: Int., cap. on AREF
ADMUX=FIRST_ADC_INPUT | ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
SFIOR=(0<<ACME);

// SPI initialization
// SPI disabled
SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);

// TWI initialization
// TWI disabled
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);

while (1)
  {	  

  //PORTC.5=1;  
  //startscan:



 // if (start==1){

  //delay_us (1);
  UDR=0xAA;  
  Nod();
  //delay_us (10);
  UDR=xsteps;
  Nod();
  //delay_us (10);
  UDR=ysteps;
  Nod();
 //delay_us (10);  
  UDR=ADCH;
  Nod();	
// delay_us (10);  
  UDR=ADCL;
  Nod();
// delay_us (10);

  //start=0;  

 // data=UDR;
//  Nod();
 //  if(data=='9')
//  {
  //  PORTC.5=1;
  //   Nod();  
  //   }
//  if(data=='8')
  //   {
//  PORTC.5=0;
  //   Nod();
 //	}  

 // Nod();
  //return ();

	// goto startscan;

	 // }


 //	 lng=strlen(mystr);

 //  for (i=0; i < lng; i++)	{
 //	  while ( !( UCSRA & (1<<5)) ) {}
  //	 UDR=mystr[i];
  //	 }

//	 delay_ms(100); //ждем 100 мс

  }
}

раньше в таких случаях когда такое было ставил паузу после команды и всё работало, а сейчас паузу немогу поставить

Изменено пользователем Alex
Тег [CODE]
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

если написать в основном цикле то работает нормально

while (1)
  {     

	   if (zsteps!=0){temp=zsteps;}
    if (temp>0){PORTC.3=1;}  
    if (temp<0){PORTC.3=0;}  

    zsteps=0; }

если же в подпрограмме то раз на раз.то сработает то нет.

while (1)
  {	    Nod(); }


Nod(){  
for (i=0; i < 10; i++)    {
 if (zsteps!=0){temp=zsteps;}
    if (temp>0){PORTC.3=1;}  
    if (temp<0){PORTC.3=0;}  

    zsteps=0;  } 

вот такая вот фигня творится.

Ссылка на комментарий
Поделиться на другие сайты

А с отключенной оптимизацией? -O0 вместо -Os в аргументах компилятора.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

А с отключенной оптимизацией? -O0 вместо -Os в аргументах компилятора.

а где это в CodeVisionAVR?

i, temp, zsteps описать как статик или нет?

непомогло
Ссылка на комментарий
Поделиться на другие сайты

i, temp, zsteps описать как статик или нет?

Блестящая идея. Можете привести свои соображения, как это могло помочь?

volatile для zsteps может и поможет, но и то не факт из-за "работает нормально" и "то сработает, то нет".

У вас при формировании прошивки выскакивают какие-либо предупреждения?

Ссылка на комментарий
Поделиться на другие сайты

У вас при формировании прошивки выскакивают какие-либо предупреждения?

да но их куча накопилось в процессе.пока не разбирался с ними.
Ссылка на комментарий
Поделиться на другие сайты

А какое значение приобретает temp, если zsteps равно 0? Судя по коду - предыдущее. И какой уровень тогда должна принимать линия порта PORTC.3?

Ссылка на комментарий
Поделиться на другие сайты

А какое значение приобретает temp, если zsteps равно 0? Судя по коду - предыдущее. И какой уровень тогда должна принимать линия порта PORTC.3?

в этомм случае предыдущее. я это специально сделал так как дальше по ходу выполнения программы zsteps обнуляется, и чтобы МК успел выполнить это сравнение и ввёл переменную темп.но это эксперименты. раньше было

if (zsteps>0){PORTC.3=1;} 
if (zsteps<0){PORTC.3=0;}

смысл тот же и также не работало.это DIR у шаговика.

Ссылка на комментарий
Поделиться на другие сайты

а что за скорость 76800? так надо?

ну да ладно. погадаю и я. вангую тупо ресет МК и программа выполняется заново, потому и сбос из 1 в 0.

Ссылка на комментарий
Поделиться на другие сайты

Тут надо гадать, что будет, если смена уровня на PINе призойдет посередине таких конструкций:

if (PINC.4==1){ zdir=1;}
  if (PINC.4==0){ zdir=0;}


if (PIND.5==1){ xdir=1;}
if (PIND.5==0){ xdir=0;}


if (PIND.7==1){ ydir=1;}
if (PIND.7==0){ ydir=0;}

Разве нельзя использовать условие ИНАЧЕ.

Ссылка на комментарий
Поделиться на другие сайты

i, temp, zsteps описать как статик или нет?

Блестящая идея. Можете привести свои соображения, как это могло помочь?
Нормальный вопрос, в чём проблема ?

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

Что не так в вопросе ?

ЗЫ: У меня, например, после поста #6 тоже возник такой вопрос. Естественно, в ту предыдущую простынь я даже и не смотрел, т.к. очевидно, что мало кто захочет в ней разбираться.

Ссылка на комментарий
Поделиться на другие сайты

и ради чего?

ради мира во всем мире! если вам не понятно значение фразы:
Человек в функции сохраняет значение переменных до следующего вызова, естественно, они должны быть статические.

о чем говорить? хотя после таких перлов:

PORTB &= (0 << PINB1)

и ваших громких заявлений
Для того чтобы писать программы для МК , знания железа и само железо, не нужны абсолютно
, напомнить откуда цитатки? проводить с вами дискуссию и что либо доказывать на тему статик/волейтайл желания нет абсолютно....
Ссылка на комментарий
Поделиться на другие сайты

Тут надо гадать, что будет, если смена уровня на PINе призойдет посередине таких конструкций:

if (PINC.4==1){ zdir=1;}
if (PINC.4==0){ zdir=0;}


if (PIND.5==1){ xdir=1;}
if (PIND.5==0){ xdir=0;}


if (PIND.7==1){ ydir=1;}
if (PIND.7==0){ ydir=0;}

Разве нельзя использовать условие ИНАЧЕ.

я ради экспериментов всё закоментировал оставил только

if (zsteps!=0){temp=zsteps;}
		    if (temp>0){PORTC.3=1;} 
		    if (temp<0){PORTC.3=0;} 

в цикле while(1) работает нормально, как только выносиш в подпрограмму и вызываеш её - глючит.

а остальной код работает нормально.

а что за скорость 76800? так надо?

ну да ладно. погадаю и я. вангую тупо ресет МК и программа выполняется заново, потому и сбос из 1 в 0.

там комменты старые.кварц поставил другой на 14.765 скорость 115200

, потому и сбос из 1 в 0.

это где?

Ссылка на комментарий
Поделиться на другие сайты

этот код чтобы накладок не было? это прерывание появляется редко, когда я жму на кнопку в программе. к примеру раз в секунду.

причём самое интересное, что после кода установки ножки DIR(который глючит)

if (zsteps!=0){temp=zsteps;}
		 if (temp>0){PORTC.3=1;}
		 if (temp<0){PORTC.3=0;}

следует код формирования импульса STEP который прекрасно отрабатывает.

z_f=30;z_w_result=5;
	 if (zsteps>0 && z_w_count==0 && z_f_count==0){ zsteps=zsteps-1;PORTC.2=1;z_w_count=z_w_result;z_f_count=z_f;z_process=1;}
	 if (zsteps<0 && z_w_count==0 && z_f_count==0){ zsteps=zsteps+1;PORTC.2=1;z_w_count=z_w_result;z_f_count=z_f;z_process=1;}
	 if (z_w_count>0){z_w_count=z_w_count-1;}
	 if (z_f_count>0){z_f_count=z_f_count-1;}
	 if (z_w_count==0 && z_process==1){PORTC.2=0;z_process=0;}

Изменено пользователем novarobotix
Ссылка на комментарий
Поделиться на другие сайты

это прерывание появляется редко, когда я жму на кнопку в программе. к примеру раз в секунду.
Зато в основном цикле часто.

Вы не предполагайте, а пробуйте :)

Ссылка на комментарий
Поделиться на другие сайты

Идея здравая, только остается непонятным момент: почему работает в основном цикле и не работает в вызываемой из нее функции.

Для ув. товарщиа IMXO : пустой треп пропустим, толку от него нет. А вот ваше познание языка С поражает. Ув. товарищ Alex брякнул чушь, а вы ухватились за его слова. Я понимаю, что в наше время читать книги это не модно, и вопросы решаются на форумах, где на сотню постов найдется едва ли 1-2 полезных. Поэтому объясню на пальцах: для подобного шага как " Человек в функции сохраняет значение переменных до следующего вызова, естественно, они должны быть статические" необходимо объявить эти переменные внутри функции. Что, во-первых, в случае ZSTEPS никак не получится, т.к. она изменяется в обработчике прерывания. А во-вторых, в приведенной автором функции Nod() нет объявления этих переменных. Что вполне логично для меня, и видимо сюрприз для вас, эти переменные у автора являются глобальными. И какую же пользу мы можем получить добавив ключевое слово static к трем глобальным переменным? О боже, мы сузим область их видимости до текущего файла и все сразу же заработает!!! Точно, это же решение всех проблем :buba: !!!

Ссылка на комментарий
Поделиться на другие сайты

ещё момент важный. глючит как с данными приходящими от UART типа ZSTEPS+1 так и с тем же ZSTEPS+1 нополученным при чтении ножки МК

if (PINC.5==0 && zdir==1 && tempz==1){ tempz=0;z_w_result=z_w;zsteps=zsteps+1;}
	  if (PINC.5==0 && zdir==0 && tempz==1){ tempz=0;z_w_result=z_w;zsteps=zsteps-1;}

это прерывание появляется редко, когда я жму на кнопку в программе. к примеру раз в секунду.
Зато в основном цикле часто.

Вы не предполагайте, а пробуйте :)

сделал вот последний код. глюк остался так же как был.

и на всяк случай сделал volatile static int zsteps;

volatile static int temp;

/*******************************************************
This program was created by the
CodeWizardAVR V3.14 Evaluation
Automatic Program Generator
© Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date    : 17.08.2014
Author  :
Company :
Comments:

Chip type			   : ATmega8
Program type		    : Application
AVR Core Clock frequency: 10,000000 MHz
Memory model		    : Small
External RAM size	   : 0
Data Stack size		 : 256
*******************************************************/
#include <mega8.h>
// Declare your global variables here
// Standard Input/Output functions
#include <stdio.h>
#include <string.h>
#include <delay.h>
Nod();
//int start;
int xsteps;
int ysteps;
volatile static int zsteps;
volatile static int temp;
int tempx;
int tempy;
int tempz;
int xdir;
int ydir;
int zdir;
int z_w;
int z_f=1000;
int z_w_result=100;
int z_f_result;
int z_w_count;
int z_f_count;
int z_process;
int z_f_temp;

int i;
int data;
//int lng;
//char mystr[]="Atmega8 UART ready!";
#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 0
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// USART Receiver buffer
#define RX_BUFFER_SIZE 32
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
char uart_data[5];

unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
// Voltage Reference: Int., cap. on AREF
#define ADC_VREF_TYPE ((1<<REFS1) | (1<<REFS0) | (0<<ADLAR))
// float result;
// ADC interrupt service routine
// with auto input scanning
interrupt [ADC_INT] void adc_isr(void)
{
static unsigned char input_index=0;
// Read the AD conversion result
adc_data[input_index]=ADCW;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
  input_index=0;
ADMUX=(FIRST_ADC_INPUT | ADC_VREF_TYPE)+input_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=(1<<ADSC);
}
// USART Receiver interrupt service routine
interrupt [uSART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};

//здесь мы помещаем приходящие данные в массив, заранее известно количество
//принимаемых символов = 5
//uart_data[i]=data;
//data=UDR;
//	  Nod();
  //PORTC.5=1;
  if(data=='9')
  { 
  zsteps=zsteps+1;
  //PORTC.2=1;

   }  

	 if(data=='8')
  {
  zsteps=zsteps-1;
  //PORTC.2=0; 
  }  


  //	   if(data=='7')
   //  {
  //   PORTC.3=1;

   //   }  

   //	 if(data=='6')
   //  {
  //   PORTC.3=0; 
  //   } 
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

Nod(){

for (i=0; i < 20; i++)    {






  if (PINC.4==1){ zdir=1;}
  if (PINC.4==0){ zdir=0;}

  if (PINC.5==1 && tempz==0){tempz=1;z_w=0;
  if (z_f_temp<10000){ z_f=z_f_temp;z_f_temp=0;}
  }
  if (PINC.5==1 && tempz==1){z_w=z_w+1;} 

  if (PINC.5==0 && zdir==1 && tempz==1){ tempz=0;z_w_result=z_w;zsteps=zsteps+1;}
  if (PINC.5==0 && zdir==0 && tempz==1){ tempz=0;z_w_result=z_w;zsteps=zsteps-1;}


  z_f_temp=z_f_temp+1; 

#asm("cli")
temp=zsteps;
#asm("sei")
					 if (temp>0){PORTC.3=1;}
					 if (temp<0){PORTC.3=0;}

 /////////////////////// 
	 if (PIND.5==1){ xdir=1;}
  if (PIND.5==0){ xdir=0;}

  if (PIND.4==1 && tempx==0 && xdir==1){xsteps=xsteps+1 ;tempx=1;}
  if (PIND.4==1 && tempx==0 && xdir==0){xsteps=xsteps-1 ;tempx=1;}
  if (PIND.4==0){ tempx=0;}		  

  if (PIND.7==1){ ydir=1;}
  if (PIND.7==0){ ydir=0;} 

  if (PIND.6==1 && tempy==0 && ydir==1){ysteps=ysteps+1 ;tempy=1;}
  if (PIND.6==1 && tempy==0 && ydir==0){ysteps=ysteps-1 ;tempy=1;}
  if (PIND.6==0){ tempy=0;}

 /////////////////////////////

   z_f=30;z_w_result=5;
   if (zsteps>0 && z_w_count==0 && z_f_count==0){ zsteps=zsteps-1;PORTC.2=1;z_w_count=z_w_result;z_f_count=z_f;z_process=1;}
   if (zsteps<0 && z_w_count==0 && z_f_count==0){ zsteps=zsteps+1;PORTC.2=1;z_w_count=z_w_result;z_f_count=z_f;z_process=1;}
   if (z_w_count>0){z_w_count=z_w_count-1;}
   if (z_f_count>0){z_f_count=z_f_count-1;} 
   if (z_w_count==0 && z_process==1){PORTC.2=0;z_process=0;}



 }
  }


void main(void)
{

// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Port C initialization
// Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (1<<DDC3) | (1<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=(0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
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
// OC2 output: Disconnected
ASSR=0<<AS2;
TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<TOIE0);
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 1200

UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(1<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
UBRRH=0x00;
UBRRL=0x07;
//UCSRA=0x00;
//UCSRB=0x90;
//UCSRC=0x86;
//UBRRH=0x00;
//UBRRL=0x07;
// Global enable interrupts
#asm("sei")
// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
SFIOR=(0<<ACME);
// ADC initialization
// ADC Clock frequency: 78,125 kHz
// ADC Voltage Reference: Int., cap. on AREF
ADMUX=FIRST_ADC_INPUT | ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
SFIOR=(0<<ACME);
// SPI initialization
// SPI disabled
SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
// TWI initialization
// TWI disabled
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);
while (1)
  {	 

  //PORTC.5=1; 
  //startscan:



 // if (start==1){
  //delay_us (1);
  UDR=0xAA; 
  Nod();
  //delay_us (10);
  UDR=xsteps;
  Nod();
  //delay_us (10);
  UDR=ysteps;
  Nod();
 //delay_us (10); 
  UDR=ADCH;
  Nod();   
   // delay_us (10);  
  UDR=ADCL;
  Nod();
   // delay_us (10);

  //start=0;  

 // data=UDR;
   //  Nod();
 //  if(data=='9')
   //  {
  //  PORTC.5=1;
  //   Nod(); 
  //   }
   //  if(data=='8')
  //   {
   //  PORTC.5=0;
  //   Nod();
 //    } 

 // Nod();
  //return ();

    // goto startscan;

	 // }

 //	 lng=strlen(mystr);
 //  for (i=0; i < lng; i++)    {
 //	  while ( !( UCSRA & (1<<5)) ) {}
  //	 UDR=mystr[i];
  //	 }

   //	 delay_ms(100); //ждем 100 мс
  }
}

Ссылка на комментарий
Поделиться на другие сайты

Идея здравая, только остается непонятным момент: почему работает в основном цикле и не работает в вызываемой из нее функции.

Совпадение. Возможно ?
необходимо объявить эти переменные внутри функции. Что, во-первых, в случае ZSTEPS никак не получится, т.к. она изменяется в обработчике прерывания. А во-вторых, в приведенной автором функции Nod() нет объявления этих переменных. Что вполне логично для меня, и видимо сюрприз для вас, эти переменные у автора являются глобальными. И какую же пользу мы можем получить добавив ключевое слово static к трем глобальным переменным?
Ещё раз прочитайте мой пост внимательнее .

Речь была о посте №6 и о том, что лениво читать эту всю предыдущую простыню.

Вот пост:

если написать в основном цикле то работает нормально

while (1)
 {

	 if (zsteps!=0){temp=zsteps;}
 if (temp>0){PORTC.3=1;}
 if (temp<0){PORTC.3=0;}

 zsteps=0; }

если же в подпрограмме то раз на раз.то сработает то нет.

while (1)
 {	 Nod(); }


Nod(){
for (i=0; i < 10; i++) {
 if (zsteps!=0){temp=zsteps;}
 if (temp>0){PORTC.3=1;}
 if (temp<0){PORTC.3=0;}

 zsteps=0; } 

вот такая вот фигня творится.

Теперь скажите, товарищ экстрасенс, не порящий никогда чушь, что из этого поста можно узнать о переменных ?

Половина кода из функций и основного цикла вырезано, ничего непонятно...

ЗЫ: Поаккуратнее с оскорблениями.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...