Ср апр 21, 2021 09:03:36
Ср апр 21, 2021 09:35:01
Ср апр 21, 2021 10:50:07
тогда мне было интересно, а в этот раз вообще нет интереса.Самсусамыч писал(а):Ранее Вы с лёгкостью дизассемблировали мой код, а что случилось в этот раз?
Ср апр 21, 2021 11:18:37
Ср апр 21, 2021 11:31:39
Ср апр 21, 2021 11:46:38
Ср апр 21, 2021 19:13:13
я говорил за других, кому тут интересно.Самсусамыч писал(а):раз не интересно, зачем тогда Вам исходник?
Чт апр 22, 2021 02:14:08
Чт апр 22, 2021 06:10:30
Чт апр 22, 2021 15:47:37
Чт апр 22, 2021 17:19:31
Чт апр 22, 2021 18:25:37
А я все нажму, это не соревнование, есть ТЗ, делайте, или не делайте.Demiurg писал(а):А пока предлагаю усложнить задачу. Несколько кнопок нажимать нельзя.
StartPotok(key_trigg);
{
static unsigned int key_trigg_EscapeIteration=1;
static unsigned char key_trigg_StepOfPotok=0;
if (key_trigg_EscapeIteration)
{
(key_trigg_EscapeIteration)--;
if ((key_trigg_EscapeIteration)==0)
{
switch (key_trigg_StepOfPotok)
{
case 0: (key_trigg_EscapeIteration)=0
if(!PINC.2) //проверка
{
//задержка 10 ms (номера могут быть не по порядку, главное, чтоб не повторялись и были от 1 до 255)
key_trigg_StepOfPotok=3; key_trigg_EscapeIteration=(10)+1;
goto key_trigg_End;
case(3): (key_trigg_EscapeIteration)=0
if(!PINC.2) //повторная проверка
{
PINC.0=1; // переключение d9 (записью 1 в регистр PIN производится переключение 1->0 0->1 порта)
do {
key_trigg_StepOfPotok=1; key_trigg_EscapeIteration=(0)+1;
goto key_trigg_End;
case(1): (key_trigg_EscapeIteration)=0
}while (!PINC.2);//ждём отпускания
};
}
default:
key_trigg_EscapeIteration=(tim)+1;
key_trigg_StepOfPotok=0;
key_trigg_End:
};
};
};
}
StartPotok(largeoperation);
{
static unsigned int largeoperation_EscapeIteration=1;
static unsigned char largeoperation_StepOfPotok=0;
if (largeoperation_EscapeIteration)
{
(largeoperation_EscapeIteration)--;
if ((largeoperation_EscapeIteration)==0)
{
switch (largeoperation_StepOfPotok)
{
case 0: (largeoperation_EscapeIteration)=0
PORTC.4=1; //мигаем желтым светодиодом D13
_delay_ms(300); //вот он - зависон (не знаю, какими вычислениями занять, поэтому просто делай)
PORTC.4=0;
largeoperation_StepOfPotok=1; largeoperation_EscapeIteration=(300)+1;
goto largeoperation_End;
case(1): (largeoperation_EscapeIteration)=0
default:
largeoperation_EscapeIteration=(tim)+1;
largeoperation_StepOfPotok=0;
largeoperation_End: asm("nop");
};
};
};
}
Чт апр 22, 2021 18:44:29
Чт апр 22, 2021 20:07:42
Ручками в блокноте Notepad++.Ivanoff-iv писал(а):а чем ты дефайны развернул?
Чт апр 22, 2021 22:06:03
Пт апр 23, 2021 03:11:53
Пт апр 23, 2021 05:58:26
///////// 1-я группа кнопок
StartPotok(Group1);
while (!PIND.0) {PORTB.0=1; PORTB.1=0; PORTB.2=0; PORTB.3=0; Delay_t(Group1,1,0);};
while (!PIND.1) {PORTB.1=1; PORTB.0=0; PORTB.2=0; PORTB.3=0; Delay_t(Group1,2,0);};
while (!PIND.2) {PORTB.2=1; PORTB.0=0; PORTB.1=0; PORTB.3=0; Delay_t(Group1,3,0);};
while (!PIND.3) {PORTB.3=1; PORTB.0=0; PORTB.1=0; PORTB.2=0; Delay_t(Group1,4,0);};
EndPotok(Group1);
///////// 2-ая группа кнопок
StartPotok(Group2);
if (!PIND.4) {PORTB.4=1; PORTB.5=0; PORTB.6=0; PORTB.7=0;};
if (!PIND.5) {PORTB.5=1; PORTB.6=0; PORTB.7=0; PORTB.4=0;};
if (!PIND.6) {PORTB.6=1; PORTB.4=0; PORTB.5=0; PORTB.7=0;};
if (!PIND.7) {PORTB.7=1; PORTB.4=0; PORTB.5=0; PORTB.6=0;};
while ((~PIND)&0b11110000){Delay_t(Group2,1,0);};
EndPotok(Group2);
char Key=~PIND; //сразу инвертировал чтоб 1 соответствовала нажатой кнопке
static char OldKey=0;
if ((1<<0)&(Key)&(~OldKey)) {PORTB.0=1; PORTB.1=0; PORTB.2=0; PORTB.3=0;};
if ((1<<1)&(Key)&(~OldKey)) {PORTB.1=1; PORTB.0=0; PORTB.2=0; PORTB.3=0;};
if ((1<<2)&(Key)&(~OldKey)) {PORTB.2=1; PORTB.0=0; PORTB.1=0; PORTB.3=0;};
if ((1<<3)&(Key)&(~OldKey)) {PORTB.3=1; PORTB.0=0; PORTB.1=0; PORTB.2=0;};
OldKey=Key;//запомнили уже нажатые кнопки
char Key=~PIND; //сразу инвертировал чтоб 1 соответствовала нажатой кнопке
static char OldKey=0;
char NewKey=Key&~OldKey;
if ((1<<0)&(NewKey)) {PORTB.0=1; PORTB.1=0; PORTB.2=0; PORTB.3=0;};
if ((1<<1)&(NewKey)) {PORTB.1=1; PORTB.0=0; PORTB.2=0; PORTB.3=0;};
if ((1<<2)&(NewKey)) {PORTB.2=1; PORTB.0=0; PORTB.1=0; PORTB.3=0;};
if ((1<<3)&(NewKey)) {PORTB.3=1; PORTB.0=0; PORTB.1=0; PORTB.2=0;};
OldKey=Key;//запомнили уже нажатые кнопки
Пт апр 23, 2021 07:17:01
Да, да, с шагом 1Гц и без джиттера.Ivanoff-iv писал(а):присоединяюсь к вопросу о генераторе: нужно ли его в этот мк добавить?
Пт апр 23, 2021 07:32:16
Пт апр 23, 2021 07:34:00
include <tiny13a.h>
#define K_speed 30
#define MIN 1
#define MAX 40000
#define Butt (~PINB&(1<<0))
#define Out() (PINB=(1<<4)) //переключение ножки
unsigned int Frq=10; //текущая частота
eeprom unsigned int E_Frq; //запомненная частота
unsigned int Tim=1000; //период
unsigned char Ost=0xff; //остаток
void Calc(void) //вычисляем период и довесок
{
unsigned long int tTim=12000000/Frq; //вычисляем период
unsigned char tOst=tTim; //последний байт (до256)
tOst>>=1; //делим на 2
tOst|=0x80; //прибавим 128 (вычисляем довесок)
//у нас 2 довеска - сумма их как-раз и получится 1 полный оборот и остаток (но их пришлось делить на 2 т.к. трудно обработать 2 близко стоящих прерывания)
tTim>>=8; //делим период на 256
#asm("cli")
Tim=tTim; //выводим в буфера
Ost=tOst;
#asm("sei")
};
// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
static unsigned int countS=0; //счетчик периодов таймера для работы
static unsigned char ReductK=0; //счетчик периодов таймера для опроса кнопки (делитель)
static unsigned char K_tim=0; //время нажатия кнопки
static unsigned char K_count=0; //количество нажатий кнопки
PORTB.5=1; //машем лапкой, обозначающей работу АЛУ (загрузка ЦП)
if (countS) {countS--;}
else
{
countS=Tim; //взводим таймер обратно
Out(); //работаем работу
};
OCR0A=(countS<2)? Ost:0xff; //выбираем скорость таймера
//if (SPL>0x9C) //проверял срыв стека...
{ //обрабатываем нажатие кнопки
#asm("sei") //это для того, чтобы основная работа продолжалась
ReductK++; //переменная сбрасывается по переполнению
if (ReductK==0)
{
if (K_tim)
{
K_tim++;
if (K_tim>K_speed)
{
if Butt
{
K_tim=K_speed;
if (K_count==2) Frq=(Frq>MIN)? Frq-1:MIN; //кнопка удерживается - убавляем скорость
if (K_count==4) Frq=(Frq<MAX)? Frq+1:MAX; //нажата 1 раз и удерживается - добавляем скорость
if (K_count>=6) if (E_Frq!=Frq) E_Frq=Frq; //нажата 3 раза (или более) - обновляем сохраненную скорость
Calc(); //возможно скорость изменилась - пересчитаем периоды
}
else{K_tim=0;}; //если кнопка уже отпущена - сбросим и остановим таймер
}
else
{
if Butt {if ((K_count&1)==1) K_count++;} //приращаем счет при каждом нажатии и отпускании кнопки
else {if ((K_count&1)==0) K_count++;};
};
}
else{if Butt K_tim++; K_count=1;}; //если кнопка нажата впервые - запускаем её таймер и устанавливаем счет
};
};
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 2
#pragma optsize-
CLKPR=0x80;
CLKPR=0x01;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
PORTB=0x7F;
DDRB=0x30;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 2400,000 kHz
// Mode: CTC top=OCR0A
TCCR0A=0x02;
TCCR0B=0x01;
TCNT0=0x00;
OCR0A=0xFF;
OCR0B=0x00;
// External Interrupt(s) Off
// sleepmode = sleep
GIMSK=0x00;
MCUCR=0x20;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x04;
// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR0=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
if (E_Frq==0xffff) E_Frq=10;
Frq=E_Frq;
//Frq=10000;
Calc();
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
PORTB.5=0;
//#asm("sleep")
}
}