novarobotix Опубликовано 9 сентября, 2014 Поделиться Опубликовано 9 сентября, 2014 простой код: if (zsteps>0){PORTC.3=1;} if (zsteps<0){PORTC.3=0;} либо включает светодиод либо выключает. но раз на раз не приходится. иногда срабатывает иногда нет. обычно советуют поставить задержку после команды чтоб сработало, но в моём случае задержку поставить нет возможности - реал тайм устройство. почему такая фигня вообще происходит? как от неё избавится? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
codenamehawk Опубликовано 9 сентября, 2014 Поделиться Опубликовано 9 сентября, 2014 Примерно 99,99%, что ошибка в коде. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
novarobotix Опубликовано 9 сентября, 2014 Автор Поделиться Опубликовано 9 сентября, 2014 (изменено) вот код /******************************************************* 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 мс } } раньше в таких случаях когда такое было ставил паузу после команды и всё работало, а сейчас паузу немогу поставить Изменено 10 сентября, 2014 пользователем Alex Тег [CODE] 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Hongfa для различных применений в Компэл. Большой выбор в наличии!Компания HONGFA - это не только крупнейший в мире производитель электромеханических реле, но также производитель конденсаторов, вакуумных прерывателей, трансформаторов и низковольтного коммутационного оборудования. На складе КОМПЭЛ регулярно поддерживаются около 100 самых популярных позиций электромеханических реле. Реле Hongfa могут заместить многие изделия производства недоступных брендов. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
novarobotix Опубликовано 9 сентября, 2014 Автор Поделиться Опубликовано 9 сентября, 2014 причём в другом месте программы отрабатывает нормально if(data=='9') { zsteps=zsteps+1; PORTC.3=1; } if(data=='8') { zsteps=zsteps-1; PORTC.3=0; } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Тренды и лучшие решения для разработки зарядных станций в РоссииК 2029 году в России прогнозируется увеличение числа зарядных станций до 40 000. При этом отечественный рынок электротранспорта имеет климатические, потребительские и географические особенности. Для успешной разработки и построения инфраструктуры станций заряда в России идеальным вариантом является использование решений и электронных компонентов китайских производителей – лидеров индустрии электротранспорта и возобновляемой энергетики, которые уже представлены в КОМПЭЛ. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
IMXO Опубликовано 9 сентября, 2014 Поделиться Опубликовано 9 сентября, 2014 выкладывая код пользуйтесь тегами: [CODE][/CODE] , кнопка "<>" панели инструментов.... 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Секреты депассивации литиевых батареек FANSO EVE EnergyСамыми лучшими параметрами по энергоемкости, сроку хранения, температурному диапазону и номинальному напряжению обладают батарейки литий-тионилхлоридной электрохимической системы. Но при длительном хранении происходит процесс пассивации. Разберем в чем плюсы и минусы, как можно ее избежать или уменьшить последствия и как проводить депассивацию батареек на примере продукции и рекомендаций компании FANSO EVE Energy. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
novarobotix Опубликовано 9 сентября, 2014 Автор Поделиться Опубликовано 9 сентября, 2014 если написать в основном цикле то работает нормально 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; } вот такая вот фигня творится. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 9 сентября, 2014 Поделиться Опубликовано 9 сентября, 2014 i, temp, zsteps описать как статик или нет? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
COKPOWEHEU Опубликовано 9 сентября, 2014 Поделиться Опубликовано 9 сентября, 2014 А с отключенной оптимизацией? -O0 вместо -Os в аргументах компилятора. 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
novarobotix Опубликовано 9 сентября, 2014 Автор Поделиться Опубликовано 9 сентября, 2014 А с отключенной оптимизацией? -O0 вместо -Os в аргументах компилятора. а где это в CodeVisionAVR? i, temp, zsteps описать как статик или нет? непомогло 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
BerZerKku Опубликовано 10 сентября, 2014 Поделиться Опубликовано 10 сентября, 2014 i, temp, zsteps описать как статик или нет? Блестящая идея. Можете привести свои соображения, как это могло помочь? volatile для zsteps может и поможет, но и то не факт из-за "работает нормально" и "то сработает, то нет". У вас при формировании прошивки выскакивают какие-либо предупреждения? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
novarobotix Опубликовано 10 сентября, 2014 Автор Поделиться Опубликовано 10 сентября, 2014 У вас при формировании прошивки выскакивают какие-либо предупреждения? да но их куча накопилось в процессе.пока не разбирался с ними. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 10 сентября, 2014 Поделиться Опубликовано 10 сентября, 2014 А какое значение приобретает temp, если zsteps равно 0? Судя по коду - предыдущее. И какой уровень тогда должна принимать линия порта PORTC.3? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
novarobotix Опубликовано 10 сентября, 2014 Автор Поделиться Опубликовано 10 сентября, 2014 А какое значение приобретает temp, если zsteps равно 0? Судя по коду - предыдущее. И какой уровень тогда должна принимать линия порта PORTC.3? в этомм случае предыдущее. я это специально сделал так как дальше по ходу выполнения программы zsteps обнуляется, и чтобы МК успел выполнить это сравнение и ввёл переменную темп.но это эксперименты. раньше было if (zsteps>0){PORTC.3=1;} if (zsteps<0){PORTC.3=0;} смысл тот же и также не работало.это DIR у шаговика. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
__alexander Опубликовано 10 сентября, 2014 Поделиться Опубликовано 10 сентября, 2014 а что за скорость 76800? так надо? ну да ладно. погадаю и я. вангую тупо ресет МК и программа выполняется заново, потому и сбос из 1 в 0. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 10 сентября, 2014 Поделиться Опубликовано 10 сентября, 2014 Тут надо гадать, что будет, если смена уровня на 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;} Разве нельзя использовать условие ИНАЧЕ. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 10 сентября, 2014 Поделиться Опубликовано 10 сентября, 2014 i, temp, zsteps описать как статик или нет? Блестящая идея. Можете привести свои соображения, как это могло помочь?Нормальный вопрос, в чём проблема ?Человек в функции сохраняет значение переменных до следующего вызова, естественно, они должны быть статические. Что не так в вопросе ? ЗЫ: У меня, например, после поста #6 тоже возник такой вопрос. Естественно, в ту предыдущую простынь я даже и не смотрел, т.к. очевидно, что мало кто захочет в ней разбираться. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
BerZerKku Опубликовано 10 сентября, 2014 Поделиться Опубликовано 10 сентября, 2014 Вы ворвались в мой мозг и крушите там все подряд. Какие переменные там должны быть статические и ради чего? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 10 сентября, 2014 Поделиться Опубликовано 10 сентября, 2014 и ради чего? ради мира во всем мире! если вам не понятно значение фразы:Человек в функции сохраняет значение переменных до следующего вызова, естественно, они должны быть статические. о чем говорить? хотя после таких перлов: PORTB &= (0 << PINB1) и ваших громких заявленийДля того чтобы писать программы для МК , знания железа и само железо, не нужны абсолютно , напомнить откуда цитатки? проводить с вами дискуссию и что либо доказывать на тему статик/волейтайл желания нет абсолютно.... 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
novarobotix Опубликовано 10 сентября, 2014 Автор Поделиться Опубликовано 10 сентября, 2014 Тут надо гадать, что будет, если смена уровня на 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. это где? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 10 сентября, 2014 Поделиться Опубликовано 10 сентября, 2014 #asm("cli") temp=zsteps; #asm("sei") if (temp>0){PORTC.3=1;} if (temp<0){PORTC.3=0;} 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
novarobotix Опубликовано 10 сентября, 2014 Автор Поделиться Опубликовано 10 сентября, 2014 (изменено) этот код чтобы накладок не было? это прерывание появляется редко, когда я жму на кнопку в программе. к примеру раз в секунду. причём самое интересное, что после кода установки ножки 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;} Изменено 10 сентября, 2014 пользователем novarobotix 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 10 сентября, 2014 Поделиться Опубликовано 10 сентября, 2014 это прерывание появляется редко, когда я жму на кнопку в программе. к примеру раз в секунду.Зато в основном цикле часто.Вы не предполагайте, а пробуйте 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
BerZerKku Опубликовано 10 сентября, 2014 Поделиться Опубликовано 10 сентября, 2014 Идея здравая, только остается непонятным момент: почему работает в основном цикле и не работает в вызываемой из нее функции. Для ув. товарщиа IMXO : пустой треп пропустим, толку от него нет. А вот ваше познание языка С поражает. Ув. товарищ Alex брякнул чушь, а вы ухватились за его слова. Я понимаю, что в наше время читать книги это не модно, и вопросы решаются на форумах, где на сотню постов найдется едва ли 1-2 полезных. Поэтому объясню на пальцах: для подобного шага как " Человек в функции сохраняет значение переменных до следующего вызова, естественно, они должны быть статические" необходимо объявить эти переменные внутри функции. Что, во-первых, в случае ZSTEPS никак не получится, т.к. она изменяется в обработчике прерывания. А во-вторых, в приведенной автором функции Nod() нет объявления этих переменных. Что вполне логично для меня, и видимо сюрприз для вас, эти переменные у автора являются глобальными. И какую же пользу мы можем получить добавив ключевое слово static к трем глобальным переменным? О боже, мы сузим область их видимости до текущего файла и все сразу же заработает!!! Точно, это же решение всех проблем !!! 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
novarobotix Опубликовано 10 сентября, 2014 Автор Поделиться Опубликовано 10 сентября, 2014 ещё момент важный. глючит как с данными приходящими от 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 мс } } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 10 сентября, 2014 Поделиться Опубликовано 10 сентября, 2014 Идея здравая, только остается непонятным момент: почему работает в основном цикле и не работает в вызываемой из нее функции. Совпадение. Возможно ?необходимо объявить эти переменные внутри функции. Что, во-первых, в случае 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; } вот такая вот фигня творится. Теперь скажите, товарищ экстрасенс, не порящий никогда чушь, что из этого поста можно узнать о переменных ?Половина кода из функций и основного цикла вырезано, ничего непонятно... ЗЫ: Поаккуратнее с оскорблениями. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.