#126 2018-07-10 16:33:45

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Помогите запустить WeMos XI

Green пише:

Главное не забыть изменить фьюзы.) Которых нет.))
Ничего не даст. При сбросе ВСЕГДА работает встроенный 32 мгц генератор.
Только если переписать загрузчик.(

Так она, что изначально на 32МГц  работает?  Помоему на 16 ...

Восток дело тонкое - может там есть автоопределение кварца  big_smile

Неактивний

#127 2018-07-10 17:16:14

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: Помогите запустить WeMos XI

Генератор на 32 мгц делится на 2 прескаллером, получается 16.
Могли бы джампер на плате поставить, а загрузчик бы выбирал.)

Неактивний

#128 2018-07-10 17:51:51

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Помогите запустить WeMos XI

Green пише:

Генератор на 32 мгц делится на 2 прескаллером, получается 16.
Могли бы джампер на плате поставить, а загрузчик бы выбирал.)

Не совсем понятно зачем этот огород...

Неактивний

#129 2018-07-10 19:00:46

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: Помогите запустить WeMos XI

renoshnik пише:
Green пише:

Генератор на 32 мгц делится на 2 прескаллером, получается 16.
Могли бы джампер на плате поставить, а загрузчик бы выбирал.)

Не совсем понятно зачем этот огород...

С чего вы взяли, что он делится на 2? Черным по белому написано, даже по китайски понятно, 32MIPS! И внутренний генератор есть, на 32 МГц. Читайте 主时钟预分频寄存器 CLKPR. Включаете CLKPS = 0,  вместо CLKPS = 8(默认配置), и можно "гулять" на полную. smile

Неактивний

#130 2018-07-10 19:02:14

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: Помогите запустить WeMos XI

Мне тоже не понятно зачем IntRC на 32 мгц. Наверно, что бы люди пробовали разгонять...) А так, чем плохо. Хоть 3 источника тактирования - играйся с любым, причём по ходу дела (программы).

Остання редакція Green (2018-07-11 07:12:42)

Неактивний

#131 2018-07-10 19:13:17

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: Помогите запустить WeMos XI

Вячеслав Азаров пише:

С чего вы взяли, что он делится на 2? Черным по белому написано, даже по китайски понятно, 32MIPS! И внутренний генератор есть, на 32 МГц. Читайте 主时钟预分频寄存器 CLKPR. Включаете CLKPS = 0,  вместо CLKPS = 8(默认配置), и можно "гулять" на полную. smile

Это пиар.)) Я конечно прочёл мельком, но не мог не заметить.
【important】 :
LGT8FX8D maximum operating frequency of 20MHz, so when the choice of internal 32MHz RC as the main clock source, be sure to
Make sure CLKPR is set to the correct frequency division (minimum 2).

Неактивний

#132 2018-07-10 20:22:52

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: Помогите запустить WeMos XI

Green пише:
Вячеслав Азаров пише:

С чего вы взяли, что он делится на 2? Черным по белому написано, даже по китайски понятно, 32MIPS! И внутренний генератор есть, на 32 МГц. Читайте 主时钟预分频寄存器 CLKPR. Включаете CLKPS = 0,  вместо CLKPS = 8(默认配置), и можно "гулять" на полную. smile

Это пиар.)) Я конечно прочёл мельком, но не мог не заметить.
【important】 :
LGT8FX8D maximum operating frequency of 20MHz, so when the choice of internal 32MHz RC as the main clock source, be sure to
Make sure CLKPR is set to the correct frequency division (minimum 2).

Это не пиар. Это, наверно, не получилось, затеянное. Где вы это прочитали?

Неактивний

#133 2018-07-11 07:10:17

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: Помогите запустить WeMos XI

Переведенный с китайского
LGT8FX8D Series - Programming Manual 1.0.5 LogicGreen Technologies Co., LTD
System clock prescaler control
- twenty one - page

Неактивний

#134 2018-07-11 07:49:20

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: Помогите запустить WeMos XI

Green пише:

Переведенный с китайского
LGT8FX8D Series - Programming Manual 1.0.5 LogicGreen Technologies Co., LTD
System clock prescaler control
- twenty one - page

Странно, в оригинале, ничего про это нет.

Неактивний

#135 2018-07-11 08:27:29

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: Помогите запустить WeMos XI

В 1.0.5 добавили. Только на официальном сайте не выложили.
  【重要说明】: 
LGT8FX8D 最高运行频率为20MHz,  因此当选择内部32MHz RC作为主时钟源时,一定要
保证CLKPR设置为正确的分频配置(最低2分频)。

Неактивний

#136 2018-07-11 09:53:40

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Помогите запустить WeMos XI

запускаю такой код

void setup() {
  Serial.begin(19200);
  Serial.print("F_CPU = ");
  Serial.println(F_CPU);
 }

void loop() {}

получаю :

F_CPU = 16000000

ставлю кварц 32МГц результат НЕ меняется ... sad

Неактивний

#137 2018-07-11 10:35:19

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Помогите запустить WeMos XI

проверяю АЦП ...

uint16_t value;
uint8_t res;

void setup() {
	Serial.begin(57600);	
//	analogReadResolution(12); 	
	analogReference (INTERNAL2V56);		// 2.560 V
//	analogReference (INTERNAL2V048);    // 2.048 V
//	analogReference (INTERNAL4V096);    // 4.096 V
	// VCAL = VCAL1; // 1.024V
	}

void loop() {
res = 1;
while(res < 13){
		analogReadResolution(res); 
	Serial.print("analogReadResolution = "); Serial.println(res);  delay(10);
	value = analogRead(VCCM);
	Serial.print("VCCM = "); Serial.print(value);  delay(10);
	value = analogRead(A0);
	Serial.print("  A0 = "); Serial.print(value);  delay(10);
	value = analogRead(A1);
	Serial.print("  A1 = "); Serial.print(value);  delay(10);
	value = analogRead(A2);
	Serial.print("  A2 = "); Serial.print(value);  delay(10);
	value = analogRead(A3);
	Serial.print("  A3 = "); Serial.print(value);  delay(10);
	value = analogRead(A4);
	Serial.print("  A4 = "); Serial.println(value);  delay(10);
	res++;
  delay(1000);	
}	
Serial.println("= = = = = = = = = = = = = = = ");	
  delay(5000);
}

На входе А1 напряжение 1,34 Вольта (батарейку подключил).

результат :

analogReadResolution = 1
VCCM = 0  A0 = 1  A1 = 1  A2 = 1  A3 = 1  A4 = 1
analogReadResolution = 2
VCCM = 1  A0 = 3  A1 = 2  A2 = 3  A3 = 3  A4 = 3
analogReadResolution = 3
VCCM = 2  A0 = 7  A1 = 4  A2 = 7  A3 = 7  A4 = 7
analogReadResolution = 4
VCCM = 4  A0 = 15  A1 = 8  A2 = 15  A3 = 15  A4 = 15
analogReadResolution = 5
VCCM = 9  A0 = 31  A1 = 16  A2 = 31  A3 = 31  A4 = 31
analogReadResolution = 6
VCCM = 19  A0 = 62  A1 = 33  A2 = 62  A3 = 62  A4 = 62
analogReadResolution = 7
VCCM = 39  A0 = 124  A1 = 67  A2 = 124  A3 = 124  A4 = 124
analogReadResolution = 8
VCCM = 79  A0 = 248  A1 = 135  A2 = 248  A3 = 248  A4 = 248
analogReadResolution = 9
VCCM = 159  A0 = 496  A1 = 270  A2 = 496  A3 = 496  A4 = 496
analogReadResolution = 10
VCCM = 318  A0 = 992  A1 = 541  A2 = 992  A3 = 992  A4 = 992
analogReadResolution = 11
VCCM = 638  A0 = 1984  A1 = 1084  A2 = 1984  A3 = 1984  A4 = 1984
analogReadResolution = 12
VCCM = 1277  A0 = 3968  A1 = 2164  A2 = 3968  A3 = 3968  A4 = 3968
= = = = = = = = = = = = = = =

Остання редакція renoshnik (2018-07-11 10:49:03)

Неактивний

#138 2018-07-11 10:42:00

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Помогите запустить WeMos XI

uint16_t value;
uint8_t res;

void setup() {
	Serial.begin(57600);	
//	analogReadResolution(12); 	
//	analogReference (INTERNAL2V56);		// 2.560 V
//	analogReference (INTERNAL2V048);    // 2.048 V
	analogReference (INTERNAL4V096);    // 4.096 V
	// VCAL = VCAL1; // 1.024V
	}

void loop() {
res = 1;
while(res < 13){
		analogReadResolution(res); 
	Serial.print("analogReadResolution = "); Serial.println(res);  delay(10);
	value = analogRead(VCCM);
	Serial.print("VCCM = "); Serial.print(value);  delay(10);
	value = analogRead(A0);
	Serial.print("  A0 = "); Serial.print(value);  delay(10);
	value = analogRead(A1);
	Serial.print("  A1 = "); Serial.print(value);  delay(10);
	value = analogRead(A2);
	Serial.print("  A2 = "); Serial.print(value);  delay(10);
	value = analogRead(A3);
	Serial.print("  A3 = "); Serial.print(value);  delay(10);
	value = analogRead(A4);
	Serial.print("  A4 = "); Serial.println(value);  delay(10);
	res++;
  delay(1000);	
}	
Serial.println("= = = = = = = = = = = = = = = ");	
  delay(5000);
}

соответственно :

analogReadResolution = 1
VCCM = 1  A0 = 1  A1 = 1  A2 = 1  A3 = 1  A4 = 1
analogReadResolution = 2
VCCM = 3  A0 = 3  A1 = 3  A2 = 3  A3 = 3  A4 = 3
analogReadResolution = 3
VCCM = 7  A0 = 7  A1 = 7  A2 = 7  A3 = 7  A4 = 7
analogReadResolution = 4
VCCM = 15  A0 = 15  A1 = 15  A2 = 15  A3 = 15  A4 = 15
analogReadResolution = 5
VCCM = 31  A0 = 31  A1 = 31  A2 = 31  A3 = 31  A4 = 31
analogReadResolution = 6
VCCM = 62  A0 = 62  A1 = 62  A2 = 62  A3 = 62  A4 = 62
analogReadResolution = 7
VCCM = 124  A0 = 124  A1 = 124  A2 = 124  A3 = 124  A4 = 124
analogReadResolution = 8
VCCM = 248  A0 = 248  A1 = 248  A2 = 248  A3 = 248  A4 = 248
analogReadResolution = 9
VCCM = 496  A0 = 496  A1 = 496  A2 = 496  A3 = 496  A4 = 496
analogReadResolution = 10
VCCM = 992  A0 = 992  A1 = 992  A2 = 992  A3 = 992  A4 = 992
analogReadResolution = 11
VCCM = 1984  A0 = 1984  A1 = 1984  A2 = 1984  A3 = 1984  A4 = 1984
analogReadResolution = 12
VCCM = 3968  A0 = 3968  A1 = 3968  A2 = 3968  A3 = 3968  A4 = 3968
= = = = = = = = = = = = = = =

Неактивний

#139 2018-07-11 10:47:59

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Помогите запустить WeMos XI

uint16_t value;
uint8_t res;

void setup() {
	Serial.begin(57600);	
//	analogReadResolution(12); 	
//	analogReference (INTERNAL2V56);		// 2.560 V
//	analogReference (INTERNAL2V048);    // 2.048 V
//	analogReference (INTERNAL4V096);    // 4.096 V
	// VCAL = VCAL1; // 1.024V
	}

void loop() {
res = 1;
while(res < 13){
		analogReadResolution(res); 
	Serial.print("analogReadResolution = "); Serial.println(res);  delay(10);
	value = analogRead(VCCM);
	Serial.print("VCCM = "); Serial.print(value);  delay(10);
	value = analogRead(A0);
	Serial.print("  A0 = "); Serial.print(value);  delay(10);
	value = analogRead(A1);
	Serial.print("  A1 = "); Serial.print(value);  delay(10);
	value = analogRead(A2);
	Serial.print("  A2 = "); Serial.print(value);  delay(10);
	value = analogRead(A3);
	Serial.print("  A3 = "); Serial.print(value);  delay(10);
	value = analogRead(A4);
	Serial.print("  A4 = "); Serial.println(value);  delay(10);
	res++;
  delay(1000);	
}	
Serial.println("= = = = = = = = = = = = = = = ");	
  delay(5000);
}

результат :

analogReadResolution = 1
VCCM = 0  A0 = 1  A1 = 0  A2 = 1  A3 = 1  A4 = 1
analogReadResolution = 2
VCCM = 0  A0 = 3  A1 = 1  A2 = 3  A3 = 3  A4 = 3
analogReadResolution = 3
VCCM = 1  A0 = 7  A1 = 3  A2 = 7  A3 = 7  A4 = 7
analogReadResolution = 4
VCCM = 3  A0 = 15  A1 = 6  A2 = 15  A3 = 15  A4 = 15
analogReadResolution = 5
VCCM = 7  A0 = 31  A1 = 12  A2 = 31  A3 = 31  A4 = 31
analogReadResolution = 6
VCCM = 15  A0 = 62  A1 = 25  A2 = 62  A3 = 62  A4 = 62
analogReadResolution = 7
VCCM = 30  A0 = 124  A1 = 51  A2 = 124  A3 = 124  A4 = 124
analogReadResolution = 8
VCCM = 60  A0 = 248  A1 = 102  A2 = 248  A3 = 248  A4 = 248
analogReadResolution = 9
VCCM = 120  A0 = 496  A1 = 204  A2 = 496  A3 = 496  A4 = 496
analogReadResolution = 10
VCCM = 240  A0 = 992  A1 = 408  A2 = 992  A3 = 992  A4 = 992
analogReadResolution = 11
VCCM = 481  A0 = 1984  A1 = 817  A2 = 1984  A3 = 1984  A4 = 1984
analogReadResolution = 12
VCCM = 960  A0 = 3968  A1 = 1634  A2 = 3968  A3 = 3968  A4 = 3968
= = = = = = = = = = = = = = =

Неактивний

#140 2018-07-11 11:24:59

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: Помогите запустить WeMos XI

renoshnik пише:

запускаю такой код

void setup() {
  Serial.begin(19200);
  Serial.print("F_CPU = ");
  Serial.println(F_CPU);
 }

void loop() {}

получаю :

F_CPU = 16000000

ставлю кварц 32МГц результат НЕ меняется ... sad

F_CPU это константа определення в программе. Кроме того, нужно переключить синхронизацию на кварц и сделать коррекцию работы таймера millis() Ардуино переопределив F_CPU, а может и ешё что-то.

Неактивний

#141 2018-07-11 12:20:26

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Помогите запустить WeMos XI

Вячеслав Азаров пише:
renoshnik пише:

запускаю такой код

void setup() {
  Serial.begin(19200);
  Serial.print("F_CPU = ");
  Serial.println(F_CPU);
 }

void loop() {}

получаю :

F_CPU = 16000000

ставлю кварц 32МГц результат НЕ меняется ... sad

F_CPU это константа определення в программе. Кроме того, нужно переключить синхронизацию на кварц и сделать коррекцию работы таймера millis() Ардуино переопределив F_CPU, а может и ешё что-то.

- так я вродибы и где не определял эту константу в программе...
- а как синхронизацию переключить ... ???  hmm

Неактивний

#142 2018-07-11 12:34:41

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: Помогите запустить WeMos XI

renoshnik пише:

- так я вродибы и где не определял эту константу в программе...
- а как синхронизацию переключить ... ???  hmm

Нужно рыть в исходниках и документации на чип. Для начала почитайте README-s на исходники платформы, может там есть настройки и достаточно, просто, указать частоту кварца и перекомпилировать.

Неактивний

#143 2018-07-11 13:07:25

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Помогите запустить WeMos XI

Вячеслав Азаров пише:
renoshnik пише:

- так я вродибы и где не определял эту константу в программе...
- а как синхронизацию переключить ... ???  hmm

Нужно рыть в исходниках и документации на чип. Для начала почитайте README-s на исходники платформы, может там есть настройки и достаточно, просто, указать частоту кварца и перекомпилировать.

wiring.c

/*
  wiring.c - Partial implementation of the Wiring API for the ATmega8.
  Part of Arduino - http://www.arduino.cc/

  Copyright (c) 2005-2006 David A. Mellis

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General
  Public License along with this library; if not, write to the
  Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  Boston, MA  02111-1307  USA
*/

#include "wiring_private.h"

// the prescaler is set so that timer0 ticks every 64 clock cycles, and the
// the overflow handler is called every 256 ticks.
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256))

// the whole number of milliseconds per timer0 overflow
#define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000)

// the fractional number of milliseconds per timer0 overflow. we shift right
// by three to fit these numbers into a byte. (for the clock speeds we care
// about - 8 and 16 MHz - this doesn't lose precision.)
#define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3)
#define FRACT_MAX (1000 >> 3)

volatile unsigned long timer0_overflow_count = 0;
volatile unsigned long timer0_millis = 0;
static unsigned char timer0_fract = 0;

#if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
ISR(TIM0_OVF_vect)
#else
ISR(TIMER0_OVF_vect)
#endif
{
	// copy these to local variables so they can be stored in registers
	// (volatile variables must be read from memory on every access)
	unsigned long m = timer0_millis;
	unsigned char f = timer0_fract;

	m += MILLIS_INC;
	f += FRACT_INC;
	if (f >= FRACT_MAX) {
		f -= FRACT_MAX;
		m += 1;
	}

	timer0_fract = f;
	timer0_millis = m;
	timer0_overflow_count++;
}

unsigned long millis()
{
	unsigned long m;
	uint8_t oldSREG = SREG;

	// disable interrupts while we read timer0_millis or we might get an
	// inconsistent value (e.g. in the middle of a write to timer0_millis)
	cli();
	m = timer0_millis;
	SREG = oldSREG;

	return m;
}

unsigned long micros() {
	unsigned long m;
	uint8_t oldSREG = SREG, t;
	
	cli();
	m = timer0_overflow_count;
#if defined(TCNT0)
	t = TCNT0;
#elif defined(TCNT0L)
	t = TCNT0L;
#else
	#error TIMER 0 not defined
#endif

#ifdef TIFR0
	if ((TIFR0 & _BV(TOV0)) && (t < 255))
		m++;
#else
	if ((TIFR & _BV(TOV0)) && (t < 255))
		m++;
#endif

	SREG = oldSREG;
	
	return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond());
}

void delay(unsigned long ms)
{
	uint32_t start = micros();

	while (ms > 0) {
		yield();
		while (ms > 0 && (micros() - start) >= 1000) {
			ms--;
			start += 1000;
		}
	}
}

/* Delay for the given number of microseconds.  Assumes a 1, 8, 12, 16, 20 or 24 MHz clock. */
void delayMicroseconds(unsigned int us)
{
	// call = 4 cycles + 2 to 4 cycles to init us(2 for constant delay, 4 for variable)

	// calling avrlib's delay_us() function with low values (e.g. 1 or
	// 2 microseconds) gives delays longer than desired.
	//delay_us(us);
#if F_CPU >= 24000000L
	// for the 24 MHz clock for the aventurous ones, trying to overclock

	// zero delay fix
	if (!us) return; //  = 3 cycles, (4 when true)

	// the following loop takes a 1/6 of a microsecond (4 cycles)
	// per iteration, so execute it six times for each microsecond of
	// delay requested.
	us *= 6; // x6 us, = 7 cycles

	// account for the time taken in the preceeding commands.
	// we just burned 22 (24) cycles above, remove 5, (5*4=20)
	// us is at least 6 so we can substract 5
	us -= 5; //=2 cycles

#elif F_CPU >= 20000000L
	// for the 20 MHz clock on rare Arduino boards

	// for a one-microsecond delay, simply return.  the overhead
	// of the function call takes 18 (20) cycles, which is 1us
	__asm__ __volatile__ (
		"nop" "\n\t"
		"nop" "\n\t"
		"nop" "\n\t"
		"nop"); //just waiting 4 cycles
	if (us <= 1) return; //  = 3 cycles, (4 when true)

	// the following loop takes a 1/5 of a microsecond (4 cycles)
	// per iteration, so execute it five times for each microsecond of
	// delay requested.
	us = (us << 2) + us; // x5 us, = 7 cycles

	// account for the time taken in the preceeding commands.
	// we just burned 26 (28) cycles above, remove 7, (7*4=28)
	// us is at least 10 so we can substract 7
	us -= 7; // 2 cycles

#elif F_CPU >= 16000000L
	// for the 16 MHz clock on most Arduino boards

	// for a one-microsecond delay, simply return.  the overhead
	// of the function call takes 14 (16) cycles, which is 1us
	if (us <= 1) return; //  = 3 cycles, (4 when true)

	// the following loop takes 1/4 of a microsecond (4 cycles)
	// per iteration, so execute it four times for each microsecond of
	// delay requested.
	us <<= 2; // x4 us, = 4 cycles

	// account for the time taken in the preceeding commands.
	// we just burned 19 (21) cycles above, remove 5, (5*4=20)
	// us is at least 8 so we can substract 5
	us -= 5; // = 2 cycles,

#elif F_CPU >= 12000000L
	// for the 12 MHz clock if somebody is working with USB

	// for a 1 microsecond delay, simply return.  the overhead
	// of the function call takes 14 (16) cycles, which is 1.5us
	if (us <= 1) return; //  = 3 cycles, (4 when true)

	// the following loop takes 1/3 of a microsecond (4 cycles)
	// per iteration, so execute it three times for each microsecond of
	// delay requested.
	us = (us << 1) + us; // x3 us, = 5 cycles

	// account for the time taken in the preceeding commands.
	// we just burned 20 (22) cycles above, remove 5, (5*4=20)
	// us is at least 6 so we can substract 5
	us -= 5; //2 cycles

#elif F_CPU >= 8000000L
	// for the 8 MHz internal clock

	// for a 1 and 2 microsecond delay, simply return.  the overhead
	// of the function call takes 14 (16) cycles, which is 2us
	if (us <= 2) return; //  = 3 cycles, (4 when true)

	// the following loop takes 1/2 of a microsecond (4 cycles)
	// per iteration, so execute it twice for each microsecond of
	// delay requested.
	us <<= 1; //x2 us, = 2 cycles

	// account for the time taken in the preceeding commands.
	// we just burned 17 (19) cycles above, remove 4, (4*4=16)
	// us is at least 6 so we can substract 4
	us -= 4; // = 2 cycles

#else
	// for the 1 MHz internal clock (default settings for common Atmega microcontrollers)

	// the overhead of the function calls is 14 (16) cycles
	if (us <= 16) return; //= 3 cycles, (4 when true)
	if (us <= 25) return; //= 3 cycles, (4 when true), (must be at least 25 if we want to substract 22)

	// compensate for the time taken by the preceeding and next commands (about 22 cycles)
	us -= 22; // = 2 cycles
	// the following loop takes 4 microseconds (4 cycles)
	// per iteration, so execute it us/4 times
	// us is at least 4, divided by 4 gives us 1 (no zero delay bug)
	us >>= 2; // us div 4, = 4 cycles
	

#endif

	// busy wait
	__asm__ __volatile__ (
		"1: sbiw %0,1" "\n\t" // 2 cycles
		"brne 1b" : "=w" (us) : "0" (us) // 2 cycles
	);
	// return = 4 cycles
}

void init()
{
	// this needs to be called before setup() or some functions won't
	// work there
	sei();
	
	// on the ATmega168, timer 0 is also used for fast hardware pwm
	// (using phase-correct PWM would mean that timer 0 overflowed half as often
	// resulting in different millis() behavior on the ATmega8 and ATmega168)
#if defined(TCCR0A) && defined(WGM01)
	sbi(TCCR0A, WGM01);
	sbi(TCCR0A, WGM00);
#endif  

	// set timer 0 prescale factor to 64
#if defined(__AVR_ATmega128__)
	// CPU specific: different values for the ATmega128
	sbi(TCCR0, CS02);
#elif defined(TCCR0) && defined(CS01) && defined(CS00)
	// this combination is for the standard atmega8
	sbi(TCCR0, CS01);
	sbi(TCCR0, CS00);
#elif defined(TCCR0B) && defined(CS01) && defined(CS00)
	// this combination is for the standard 168/328/1280/2560
	sbi(TCCR0B, CS01);
	sbi(TCCR0B, CS00);
#elif defined(TCCR0A) && defined(CS01) && defined(CS00)
	// this combination is for the __AVR_ATmega645__ series
	sbi(TCCR0A, CS01);
	sbi(TCCR0A, CS00);
#else
	#error Timer 0 prescale factor 64 not set correctly
#endif

	// enable timer 0 overflow interrupt
#if defined(TIMSK) && defined(TOIE0)
	sbi(TIMSK, TOIE0);
#elif defined(TIMSK0) && defined(TOIE0)
	sbi(TIMSK0, TOIE0);
#else
	#error	Timer 0 overflow interrupt not set correctly
#endif

	// timers 1 and 2 are used for phase-correct hardware pwm
	// this is better for motors as it ensures an even waveform
	// note, however, that fast pwm mode can achieve a frequency of up
	// 8 MHz (with a 16 MHz clock) at 50% duty cycle

#if defined(TCCR1B) && defined(CS11) && defined(CS10)
	TCCR1B = 0;

	// set timer 1 prescale factor to 64
	sbi(TCCR1B, CS11);
#if F_CPU >= 8000000L
	sbi(TCCR1B, CS10);
#endif
#elif defined(TCCR1) && defined(CS11) && defined(CS10)
	sbi(TCCR1, CS11);
#if F_CPU >= 8000000L
	sbi(TCCR1, CS10);
#endif
#endif
	// put timer 1 in 8-bit phase correct pwm mode
#if defined(TCCR1A) && defined(WGM10)
	sbi(TCCR1A, WGM10);
#endif

	// set timer 2 prescale factor to 64
#if defined(TCCR2) && defined(CS22)
	sbi(TCCR2, CS22);
#elif defined(TCCR2B) && defined(CS22)
	sbi(TCCR2B, CS22);
//#else
	// Timer 2 not finished (may not be present on this CPU)
#endif

	// configure timer 2 for phase correct pwm (8-bit)
#if defined(TCCR2) && defined(WGM20)
	sbi(TCCR2, WGM20);
#elif defined(TCCR2A) && defined(WGM20)
	sbi(TCCR2A, WGM20);
//#else
	// Timer 2 not finished (may not be present on this CPU)
#endif

#if defined(TCCR3B) && defined(CS31) && defined(WGM30)
	sbi(TCCR3B, CS31);		// set timer 3 prescale factor to 64
	sbi(TCCR3B, CS30);
	sbi(TCCR3A, WGM30);		// put timer 3 in 8-bit phase correct pwm mode
#endif

#if defined(TCCR4A) && defined(TCCR4B) && defined(TCCR4D) /* beginning of timer4 block for 32U4 and similar */
	sbi(TCCR4B, CS42);		// set timer4 prescale factor to 64
	sbi(TCCR4B, CS41);
	sbi(TCCR4B, CS40);
	sbi(TCCR4D, WGM40);		// put timer 4 in phase- and frequency-correct PWM mode	
	sbi(TCCR4A, PWM4A);		// enable PWM mode for comparator OCR4A
	sbi(TCCR4C, PWM4D);		// enable PWM mode for comparator OCR4D
#else /* beginning of timer4 block for ATMEGA1280 and ATMEGA2560 */
#if defined(TCCR4B) && defined(CS41) && defined(WGM40)
	sbi(TCCR4B, CS41);		// set timer 4 prescale factor to 64
	sbi(TCCR4B, CS40);
	sbi(TCCR4A, WGM40);		// put timer 4 in 8-bit phase correct pwm mode
#endif
#endif /* end timer4 block for ATMEGA1280/2560 and similar */	

#if defined(TCCR5B) && defined(CS51) && defined(WGM50)
	sbi(TCCR5B, CS51);		// set timer 5 prescale factor to 64
	sbi(TCCR5B, CS50);
	sbi(TCCR5A, WGM50);		// put timer 5 in 8-bit phase correct pwm mode
#endif

#if defined(ADCSRA)
	// set a2d prescaler so we are inside the desired 50-200 KHz range.
	#if F_CPU >= 16000000 // 16 MHz / 128 = 125 KHz
		sbi(ADCSRA, ADPS2);
		sbi(ADCSRA, ADPS1);
		sbi(ADCSRA, ADPS0);
	#elif F_CPU >= 8000000 // 8 MHz / 64 = 125 KHz
		sbi(ADCSRA, ADPS2);
		sbi(ADCSRA, ADPS1);
		cbi(ADCSRA, ADPS0);
	#elif F_CPU >= 4000000 // 4 MHz / 32 = 125 KHz
		sbi(ADCSRA, ADPS2);
		cbi(ADCSRA, ADPS1);
		sbi(ADCSRA, ADPS0);
	#elif F_CPU >= 2000000 // 2 MHz / 16 = 125 KHz
		sbi(ADCSRA, ADPS2);
		cbi(ADCSRA, ADPS1);
		cbi(ADCSRA, ADPS0);
	#elif F_CPU >= 1000000 // 1 MHz / 8 = 125 KHz
		cbi(ADCSRA, ADPS2);
		sbi(ADCSRA, ADPS1);
		sbi(ADCSRA, ADPS0);
	#else // 128 kHz / 2 = 64 KHz -> This is the closest you can get, the prescaler is 2
		cbi(ADCSRA, ADPS2);
		cbi(ADCSRA, ADPS1);
		sbi(ADCSRA, ADPS0);
	#endif	
	// enable a2d conversions
	sbi(ADCSRA, ADEN);
#endif

	// the bootloader connects pins 0 and 1 to the USART; disconnect them
	// here so they can be used as normal digital i/o; they will be
	// reconnected in Serial.begin()
#if defined(UCSRB)
	UCSRB = 0;
#elif defined(UCSR0B)
	UCSR0B = 0;
#endif
}

похоже, что должен поддерживать боле 24 МГц....

Неактивний

#144 2018-07-11 13:40:12

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: Помогите запустить WeMos XI

renoshnik пише:

... похоже, что должен поддерживать боле 24 МГц....

Почему? Помоему таймер даже точнее будет.

Неактивний

#145 2018-07-11 14:12:59

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Помогите запустить WeMos XI

Вячеслав Азаров пише:
renoshnik пише:

... похоже, что должен поддерживать боле 24 МГц....

Почему? Помоему таймер даже точнее будет.

Вопрос - как его запустить на такой частоте...  корректировка в "боардс" (как при разгоне ПроМини) результата не дала...

Неактивний

#146 2018-07-11 18:17:05

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: Помогите запустить WeMos XI

renoshnik пише:

..Вопрос - как его запустить на такой частоте...  корректировка в "боардс" (как при разгоне ПроМини) результата не дала...

Если изменить xi.build.f_cpu=16000000L на xi.build.f_cpu=32000000L, без исправления загрузчика, то ваш тик будет в два раза больше, и все. Тактовый генератор настраивает загрузчик, нужно рыть там.

Неактивний

#147 2018-07-11 19:14:16

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: Помогите запустить WeMos XI

Сначала нужно понять что хочется. Если хочется что бы загрузчик тактировался от кварца - значит нужно перешивать загрузчик. Со всеми вытекающими. Кстати, есть  bootloaders\lgt8fx8e\optiboot_lgt8f328d_extosc.hex, неизвестно под какой кварц.)

Неактивний

#148 2018-07-11 19:30:31

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Помогите запустить WeMos XI

Вячеслав Азаров пише:
renoshnik пише:

..Вопрос - как его запустить на такой частоте...  корректировка в "боардс" (как при разгоне ПроМини) результата не дала...

Если изменить xi.build.f_cpu=16000000L на xi.build.f_cpu=32000000L, без исправления загрузчика, то ваш тик будет в два раза больше, и все. Тактовый генератор настраивает загрузчик, нужно рыть там.

Если у вас будет реально настроение поколдовать с этой платой и озвучить результаты - готов презентовать свой экземпляр.  hmm

Неактивний

#149 2018-07-11 21:05:02

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: Помогите запустить WeMos XI

renoshnik пише:

Если у вас будет реально настроение поколдовать с этой платой и озвучить результаты - готов презентовать свой экземпляр.  hmm

Если будет оплачиваемая задача, требуюшая такого чипа, поколдую. Еще ATxmega, в очереди, но отладчик дороговат, как для развлечения. Я сейчас занимаюсь с ATmega64(128), STM8, STM32, ну и Ардуино. Эта LGT8FX8 может стать лучшей альтернативой дорогой ATxmega, ведь у нее еще, похоже, и DSP ядро есть. Но качество документации и поддержки не сравнить.

Неактивний

#150 2018-07-11 22:00:18

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: Помогите запустить WeMos XI

Ой, да ладно. Я не вижу особого преимущества перед мега328. АЦП, ЦАП, кол-во ног, всё. Минус внятная документация, неизвестные баги... Какое там ещё DSP!))

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму