Таймеры/счётчики в AVR

Обсуждаем контроллеры компании Atmel.
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Re: Таймеры/счётчики в AVR

Сообщение amd9800 »

Gudd-Head писал(а):Тогда только софтово

Для такой маленькой частоты как раз.
PlagueDoctor
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Пн ноя 24, 2014 12:02:44

таймеры 1 и 3 atmega128

Сообщение PlagueDoctor »

Всем доброго времени суток! Подскажите пожалуйста! Я настроил на atmega128 таймер 1 на OCR1A и OCR1B. Программирую в CodeVisionAVR. Когда дохожу до OCR1C, CVAVR пишет ошибку: "неизвестный символ OCR1C". В чём может быть проблема? Во фьюзах совместимость с atmega103 я отключил, пользуюсь всеми возможностями 128. И другой вопрос, когда настраиваю таймер 3 и пишу OCR3A=(значение), выдаёт такое же: "неизвестный символ OCR3A". Прошу помощи!
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Таймеры/счётчики в AVR

Сообщение Gudd-Head »

А что такое "OCR1C"?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
PlagueDoctor
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Пн ноя 24, 2014 12:02:44

Re: Таймеры/счётчики в AVR

Сообщение PlagueDoctor »

OCR1C - третий выход таймера 1
Вложения
atmega128a.png
(114.72 КБ) 655 скачиваний
Аватара пользователя
alexan9er
Открыл глаза
Сообщения: 54
Зарегистрирован: Пт окт 03, 2014 14:41:16

Re: Таймеры/счётчики в AVR

Сообщение alexan9er »

Листинг бы привели. У вас файл дефайнов правильный подключен? Там есть опеределение вашей лексемы?
PlagueDoctor
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Пн ноя 24, 2014 12:02:44

Re: Таймеры/счётчики в AVR

Сообщение PlagueDoctor »

Код: Выделить всё

#include <io.h>

#include <delay.h>

// Alphanumeric LCD functions
#include <alcd.h>

// Declare your global variables here

// Voltage Reference: AVCC pin
#define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (0<<ADLAR))

// Read the AD conversion result
unsigned int 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);
// Start the AD conversion
ADCSRA|=(1<<ADSC);
// Wait for the AD conversion to complete
while ((ADCSRA & (1<<ADIF))==0);
ADCSRA|=(1<<ADIF);
return ADCW;
}

void main(void)
{
// Declare your local variables here
int q=0x2EE;

// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);

// Port B initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRB=(1<<DDB7) | (1<<DDB6) | (1<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=0 Bit6=0 Bit5=0 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: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<<PORTC7) | (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);

// Port E initialization
// Function: Bit7=In Bit6=In Bit5=Out Bit4=Out Bit3=Out Bit2=In Bit1=In Bit0=In
DDRE=(0<<DDE7) | (0<<DDE6) | (1<<DDE5) | (1<<DDE4) | (1<<DDE3) | (0<<DDE2) | (0<<DDE1) | (0<<DDE0);
// State: Bit7=T Bit6=T Bit5=0 Bit4=0 Bit3=0 Bit2=T Bit1=T Bit0=T
PORTE=(0<<PORTE7) | (0<<PORTE6) | (0<<PORTE5) | (0<<PORTE4) | (0<<PORTE3) | (0<<PORTE2) | (0<<PORTE1) | (0<<PORTE0);

// Port F initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRF=(0<<DDF7) | (0<<DDF6) | (0<<DDF5) | (0<<DDF4) | (0<<DDF3) | (0<<DDF2) | (0<<DDF1) | (0<<DDF0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTF=(0<<PORTF7) | (0<<PORTF6) | (0<<PORTF5) | (0<<PORTF4) | (0<<PORTF3) | (0<<PORTF2) | (0<<PORTF1) | (0<<PORTF0);

// Port G initialization
// Function: Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRG=(0<<DDG4) | (0<<DDG3) | (0<<DDG2) | (0<<DDG1) | (0<<DDG0);
// State: Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTG=(0<<PORTG4) | (0<<PORTG3) | (0<<PORTG2) | (0<<PORTG1) | (0<<PORTG0);

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Fast PWM top=ICR1
// OC1A output: Non-Inverted PWM
// OC1B output: Non-Inverted PWM
// OC1C output: Non-Inverted PWM
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 8 us
// Output Pulse(s):
// OC1A Period: 8 us
// OC1B Period: 8 us
// OC1C Period: 8 us
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (1<<COM1C1) | (0<<COM1C0) | (1<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;

ICR1H=0x4E;
ICR1L=0x20;

OCR1AH=0x02;
OCR1AL=0xEE;

OCR1BH=0x02;
OCR1BL=0xEE;

OCR1CH=0x02;
OCR1CL=0xEE;

// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Fast PWM top=ICR3
// OC3A output: Non-Inverted PWM
// OC3B output: Non-Inverted PWM
// OC3C output: Non-Inverted
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 8 us
// Output Pulse(s):
// OC3A Period: 8 us
// OC3B Period: 8 us
// OC3C Period: 8 us
// Timer3 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR3A=(1<<COM3A1) | (0<<COM3A0) | (1<<COM3B1) | (0<<COM3B0) | (1<<COM3C1) | (0<<COM3C0) | (1<<WGM31) | (0<<WGM30);
TCCR3B=(0<<ICNC3) | (0<<ICES3) | (1<<WGM33) | (1<<WGM32) | (0<<CS32) | (1<<CS31) | (0<<CS30);
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x02;
OCR3AL=0xEE;
OCR3BH=0x02;;
OCR3BL=0xEE;
OCR3CH=0x02;
OCR3CL=0xEE;

// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
SFIOR=(0<<ACME);

// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTA Bit 0
// RD - PORTA Bit 1
// EN - PORTA Bit 2
// D4 - PORTA Bit 3
// D5 - PORTA Bit 4
// D6 - PORTA Bit 5
// D7 - PORTA Bit 6
// Characters/line: 16
lcd_init(16);

while (1)
      {
      // Place your code here
      read_adc(0);
      if (ADCW>=0) {
      q=750+ADCW*1.4;       
      OCR1A=q;
      delay_ms(150);
      }
       
      read_adc(1);
      if (ADCW>=0) {
      q=750+ADCW*1.4;       
      OCR1B=q;
      delay_ms(150);
      }

      /*read_adc(2);
      if (ADCW>=0) {
      q=750+ADCW*1.4;       
      OCR1C=q; // ВОТ ЭТА ЕРУНДА НЕ РАБОТАЕТ!!!
      delay_ms(150);
      }*/
      }
}


Вот листинг. С OCR1A и OCR1B всё прекрасно работает. А вот OCR1C не хочет... Почему, я не знаю...
Аватара пользователя
alexan9er
Открыл глаза
Сообщения: 54
Зарегистрирован: Пт окт 03, 2014 14:41:16

Re: Таймеры/счётчики в AVR

Сообщение alexan9er »

OCR1C в отличие от OCR1A и OCR1B в расширенной адресации находится.
Как на Си это разруливается не знаю, должно быть по идее параллельно на это.
PlagueDoctor
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Пн ноя 24, 2014 12:02:44

Re: Таймеры/счётчики в AVR

Сообщение PlagueDoctor »

А нет у Вас информации, как это делается?
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Таймеры/счётчики в AVR

Сообщение uk8amk »

В вашем же коде написано

Код: Выделить всё

OCR1CH=0x02;
OCR1CL=0xEE;

и работает. Что мешает сделать также?
А в заголовке CVAVR для контроллера может тупо не быть описания 16-битного доступа к этому регистру. Сталкивался на каких-то атмегах. После ручной правки начинало работать.
PlagueDoctor
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Пн ноя 24, 2014 12:02:44

Re: Таймеры/счётчики в AVR

Сообщение PlagueDoctor »

Так в блоке кода же написано

Код: Выделить всё

while (1)
      {
      // Place your code here
      read_adc(0);
      if (ADCW>=0) {
      q=750+ADCW*1.4;       
      OCR1A=q;
      delay_ms(150);
      }
       
      read_adc(1);
      if (ADCW>=0) {
      q=750+ADCW*1.4;       
      OCR1B=q;
      delay_ms(150);
      }

      /*read_adc(2);
      if (ADCW>=0) {
      q=750+ADCW*1.4;       
      OCR1C=q; // ВОТ ЭТА ЕРУНДА НЕ РАБОТАЕТ!!!
      delay_ms(150);
      }*/
      }


OCR1C я сделал по подобию OCR1A и OCR1B. Мне сам CVAVR выдаёт ошибку "неизвестный символ OCR1C". Мол, его обозначить надо в переменных или ещё что. Я ничего понять и не могу, это ж уже давно всё объявленное и зарезервированное. В чём прикол ошибки? Она априори быть не должна. Код верный, косяков не допустил.
Что за "ручную правку" Вы делали? Не поделитесь?
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Таймеры/счётчики в AVR

Сообщение uk8amk »

Для танкистов:

Код: Выделить всё

OCR1CH = q>>8;
OCR1CL = q&0xFF;

Примерно в это распутывается компилятором запись

Код: Выделить всё

OCR1C=q; // ВОТ ЭТА ЕРУНДА НЕ РАБОТАЕТ!!!

А ерунда может не работать из-за неполного заголовка mega128.h или как его там.
Вот, по крайней мере в старом заголовке у меня тоже их нет:

Код: Выделить всё

sfrb ICR1L=0x26;
sfrb ICR1H=0x27;
sfrw ICR1=0x26;   // 16 bit access
sfrb OCR1BL=0x28;
sfrb OCR1BH=0x29;
sfrw OCR1B=0x28;  // 16 bit access
sfrb OCR1AL=0x2a;
sfrb OCR1AH=0x2b;
sfrw OCR1A=0x2a;  // 16 bit access

Но просто так добавить тоже можно головную боль поймать, потому что OCR1CH/L доступны через другие асм инструкции. Там уж надо смотреть что генерирует компилятор.
Лучше всёже отдельный макрос сделать если лень по отдельности писать

Код: Выделить всё

#define OCR1C_WRITE(x) OCR1CH=x>>8; OCR1CL=x&0xFF;
PlagueDoctor
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Пн ноя 24, 2014 12:02:44

Re: Таймеры/счётчики в AVR

Сообщение PlagueDoctor »

Здравствуйте! Попробовал Ваш дефайн, попереписывал в программе всё, что мог, всё так и осталось: "Error: undefined symbol 'OCR1C' ". Очень нужна возможность этих всех шести таймеров. Может, кто ещё сталкивался? Прошу помощи!
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Таймеры/счётчики в AVR

Сообщение uk8amk »

Но ведь не ругается на
OCR1CH=123;
???
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Re: Таймеры/счётчики в AVR

Сообщение amd9800 »

Не знаю как поступить.

Хочу отправлять процессор в idle но он то запускает и АЦП в это время.

Без слипа программа работает так.

Timer 2 запускает прерывание раз в милисекунду. Частота МК 8МГц.

То есть через каждые 8000 тактов запускается прерывание таймера.
АЦП настроен на 62,5 КГц.
После каждого вызова прерывания уже в теле Функции прерывания я делаю кое какие фиксированные по длине времени операции, также выбираю другой канал АЦП и запускаю преобразование.

В теле основной программы трудятся разные функции по выводу информации на экран.
Выводится новая информация на экран 5 раз в секунду притом перерисовывается только изменения на экране.

Если бы цикл в основном цикле был бы небольшим по времени, я бы запускал в конце цикла idle, и запускалось бы и преобразование (без прерывания).
А уже при вызове прерывания от timer 2 я бы читал данные из АЦП.

Но инструкции в основном цикле могут длится по времени дольше чем следующий вызов прерывания таймера 2.
А это значит я при следующем вызове не буду иметь новых данных.

Можно ли как нибудь с включенным АЦП на атмега 8 запустить ражим idlе, но чтоб не началось преобразование?
Отключать АЦП не хочу потому что часто он используется, а это после запуска ждать да и первое преобразование более длинное.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Таймеры/счётчики в AVR

Сообщение uk8amk »

22.6 ADC Noise Canceler
...
1. Make sure that the ADC is enabled and is not busy converting. Single Conversion
mode must be selected
and the ADC conversion complete interrupt must be
enabled.


Это значит, что если включить ADC Free Running Select, то АЦП не будет запускаться во сне.
PlagueDoctor
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Пн ноя 24, 2014 12:02:44

Re: Таймеры/счётчики в AVR

Сообщение PlagueDoctor »

uk8amk, здравствуйте! Когда в настройках таймера прописываю, то там ни на что не ругается. Вот дефайн в библиотеке лежит, а как им пользоваться, я ума не приложу.

Код: Выделить всё

#define OCR1CL (*(unsigned char *) 0x78)
#define OCR1CH (*(unsigned char *) 0x79)
#define TCCR1C (*(unsigned char *) 0x7a)


С Вашей подсказкой нашёл и иностранный форум с этим же решением http://www.avrfreaks.net/forum/ocr1c-undefined-codevision , не пойму, как и что. Уже методом тыка проверяю, не выходит. У меня серводвигатель не встаёт в крайнее положение. Даже не шолохается. При OCR1A/B всё хорошо, встаёт и, когда пытаюсь рукой сдвинуть, ступор даёт. А с OCR1C вообще беда. :D
Вложения
222.jpg
Вот настройка в CodeWizard
(250.95 КБ) 610 скачиваний
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Таймеры/счётчики в AVR

Сообщение uk8amk »

1. Посмотрите прилагаемый исходник.
2. Изучите в даташите раздел 15.3 Accessing 16-bit Registers.
3. Посмотрите в даташите описание регистров

Код: Выделить всё

16-bit Timer/Counter (Timer/Counter1 and Timer/Counter3)
15.11 Register Description

Есть ли среди них регистр OCR1C и что такое OCR1CH/OCR1CL?
3. Познакомьтесь с ограничениями используемого компилятора.
Вложения
main.c
(1.19 КБ) 427 скачиваний
Аватара пользователя
DronVolk
Встал на лапы
Сообщения: 109
Зарегистрирован: Чт сен 03, 2015 15:52:10
Откуда: Сибирский федеральный округ

Re: Таймеры/счётчики в AVR

Сообщение DronVolk »

PlagueDoctor писал(а):uk8amk, здравствуйте! Когда в настройках таймера прописываю, то там ни на что не ругается. Вот дефайн в библиотеке лежит, а как им пользоваться, я ума не приложу.

Код: Выделить всё

#define OCR1CL (*(unsigned char *) 0x78)
#define OCR1CH (*(unsigned char *) 0x79)
#define TCCR1C (*(unsigned char *) 0x7a)


С Вашей подсказкой нашёл и иностранный форум с этим же решением http://www.avrfreaks.net/forum/ocr1c-undefined-codevision , не пойму, как и что. Уже методом тыка проверяю, не выходит. У меня серводвигатель не встаёт в крайнее положение. Даже не шолохается. При OCR1A/B всё хорошо, встаёт и, когда пытаюсь рукой сдвинуть, ступор даёт. А с OCR1C вообще беда. :D


не могу понять смысл OCR1A/B, OCR1C.
OCR1A/B - 8 битные как я понял из даташита, а вот OCR1C 16 битный и в заголовке
он разбит на 2-е 8 битные переменные OCR1CH и OCR1CL то есть H - high L - low что бы из них сделать 16 число нужно припилить его через приведение типов

Код: Выделить всё

unsigned int OCR1C = (unsigned int *)OCR1CL;
я повелитель электронов! Но иногда появляются электроны бунтари и делают, что им вздумается, например, прокладывают новые пути движения...

"Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного." Альберт Эйнштейн.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Таймеры/счётчики в AVR

Сообщение uk8amk »

DronVolk писал(а):что бы из них сделать 16 число нужно припилить его через приведение типов

Так то оно так. Но вы упускаете из виду что регистр таймера хоть и отображается в область ОЗУ, однако корректность его содержимого зависит от порядка обращения к байтам по этим адресам. Поясняю.
Для примера следующий код:

Код: Выделить всё

volatile uint16_t i;

*((uint16_t*)(0x78)) = (uint16_t) 0x01; // Какбы запись в OCR1C
i = *((uint16_t*)(0x78)); // его чтение

Смотрим во что это перемалывается компилятором:

Код: Выделить всё

;      49 *((uint16_t*)(0x78)) = (uint16_t) 0x01;
   LDI  R30,LOW(1)
   LDI  R31,HIGH(1)
   STS  120,R30
   STS  120+1,R31
;      50
;      51 i = *((uint16_t*)(0x78));
   LDS  R30,120
   LDS  R31,120+1
   ST   Y,R30
   STD  Y+1,R31

Сперва идёт запись в регистр L, а только потом в H. Хотя требуется с точностью до наоборот(пример из любимого ДШ):

Код: Выделить всё

; Set TCNTn to 0x01FF
ldi r17,0x01
ldi r16,0xFF
out TCNTnH,r17
out TCNTnL,r16
; Read TCNTn into r17:r16
in r16,TCNTnL
in r17,TCNTnH

А вот чтение в этом случае действительно будет работать правильно.
Аватара пользователя
DronVolk
Встал на лапы
Сообщения: 109
Зарегистрирован: Чт сен 03, 2015 15:52:10
Откуда: Сибирский федеральный округ

Re: Таймеры/счётчики в AVR

Сообщение DronVolk »

Да последовательность я упустил да и приведение типа не верно написано :)))
Просто почему то читая то что выше начал сомневаться в своем понимании использования 16 битного таймера (просто с легкой руки вошел и все что делал работало сразу как это не удивительно хоть и не давно).
я повелитель электронов! Но иногда появляются электроны бунтари и делают, что им вздумается, например, прокладывают новые пути движения...

"Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного." Альберт Эйнштейн.
Ответить

Вернуться в «AVR»