Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

ARV писал(а):в первом случае у вас не со сдвигом была проблема, а с начальным присваиванием константы 0x12345678
ARV, Вы, видимо, поторопились с ответом. Необдуманно... :)
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Аlex писал(а):
ARV писал(а):в первом случае у вас не со сдвигом была проблема, а с начальным присваиванием константы 0x12345678
ARV, Вы, видимо, поторопились с ответом. Необдуманно... :)
частично - согласен, но лишь частично - см. корректировку предыдущего моего поста :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

:))
Да я ж не в упрёк :)
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

КажиСЯ я понял логику компиля... вернее - компилерописателей...


В этом случае -

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

uint32_t temp = 0x12345678;
UartTransmitHexLong (temp & 0xffff0000);
раз переменная temp - 32-х разрядная, то и константа подтягивается автоматом к 32-м разрядам (та скать - автоматическое приведение типа) и результат нормальный...


В этом случае -

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

uint32_t var = 0x12345678;
UartTransmitHexLong (var & (0x0000ffff << 16));
сначала вычисление происходит со сдвигом константы, а она как выяснилось по умолчанию 16-ти разрядная... указатель сдвига тоже обычный, следовательно никакого приведения к 32-м разрядам не происходит... и мы благополучно теряем FFFF... остается чистый 16-ти разрядный нолик...
Потом уже вычисляется &, и естественно правый 16-ти разрядный нолик приводится к 32-м разрядам... но вот незадача, сколько нолик не приводи, он так и остается ноликом )))
В итоге - то что имеем...


PS.
Ой... пока писал, ARV уже практически все объяснил...

PPS.
Хотя... внимательнее ваше объяснение почитал, помоему у меня более правдоподобно :)...
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 81
Зарегистрирован: Вт май 08, 2012 23:15:45
Откуда: Санкт - Петербург

Сообщение ua1arn »

ARV писал(а): все числовые константы, если явно не указан их тип, имеют размерность int. поэтому даже число 0x23498579834759823476982347982347 все равно будет типа int.
Пункт стандарта 3.1.3.2 (кусочек):

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

   Значение  десятичной константы вычисляется по основанию 10,
значение  восьмеричной константы вычисляется по основанию 8, а
шестнадцатеричной константы - по основанию 16. Лексически пер-
вая цифра является старшей цифрой значения.
   Типом целой константы будет первый  из  перечисленных  ниже
типов,  в котором может быть представлено ее значение. Бессуф-
фиксные десятичные: int, long int, unsigned long int;  бессуф-
фиксные восьмеричные или шестнадцатеричные: int, unsigned int,
long  int,  unsigned long int; константы с беззнаковым суффик-
сом: unsigned int, unsigned long int;  константы  с  суффиксом
размера: long int, unsigned long int; константы с разными суф-
фиксами: unsigned long int.
ARV
Реклама
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

ua1arn, это Вы к чему ? Как эта вырезка относится к типу констант по-умолчанию ?
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 81
Зарегистрирован: Вт май 08, 2012 23:15:45
Откуда: Санкт - Петербург

Сообщение ua1arn »

Так относится, что ARV утверждает не совсем правду. Тип констант не всегда int, а зависит от значения (ну и суффиксов, разумеется).

Вот цитата из другой версии перевода стандарта на русский язык:
СпойлерИзображение
Вложения
constants.png
(117.98 КБ) 534 скачивания
Последний раз редактировалось ua1arn Пн сен 15, 2014 18:39:52, всего редактировалось 1 раз.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ua1arn писал(а):Тип констант не всегда int, а зависит от значения (ну и суффиксов, разумеется).
:oops: :?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Так я не понял... и шо... все чет намеками какими то изъясняются...

Вы мне по русски скажите... 0x12345678 - это 16-ти разрядная или 32-х разрядная константа?.....

Если все так как утверждал ARV, то вроде у меня в голове все прояснилось...

Если все так как утверждает ua1arn, то у меня опять "разрыв шаблона" .....
Встал на лапы
Аватара пользователя
Сообщения: 81
Зарегистрирован: Вт май 08, 2012 23:15:45
Откуда: Санкт - Петербург

Сообщение ua1arn »

0x12345678 - это 32-х разрядная константа. Для avr-gcc её тип signed long. Если написать 0xdeadbeaf - то unsigned long на этом же компиляторе. На arm-none-eabi-gcc её тип signed int, для второй unsigned int.
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Почему тогда этот пример:

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

uint32_t var = 0x12345678;
UartTransmitHexLong (var & (0x0000ffff << 16));
дает результат 0x00000000 ?
Т.е. константа 0x0000ffff трактуется как 16-ти разрядная... (о... чет подумалось... может не представление числа а его значение играет роль, скольки разрядным оно будет... т.е. в данном случае 0x0000ffff помещается в 16 разрядов, поэтому и назначается 16-ти разрядным... не?)

Компилирую в AVRSTUDIO4...
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Да... ua1arn прав...


этот вариант не работает

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

uint32_t temp = 0x12345678;
UartTransmitHexLong (temp & (0x0000ffff << 16));
т.к. тут константа 0x0000ffff не превышает 16 разрядов, соответственно константе и отводится 16 разрядов.....


а этот вариант работает

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

uint32_t temp = 0x12345678;
UartTransmitHexLong (temp & (0x000fffff << 16));
т.к. тут константа 0x000fffff превышает 16 разрядов, соответственно константе назначается 32 разряда...


Вроде разобрались, всем спасибо :) ...
В общем, если нужно гарантированно обеспечить 32 разряда константе, лучше это указать явно или так UL или так (uint32_t)...
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

возникла проблема одна ошибка и 2 предупреждения при компиляции
вот текст программки:
Спойлер

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

#define F_CPU 8000000UL
#include <avr/io.h>
//#include <stdio.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
unsigned char edinicy EEMEM;
unsigned char desyatki EEMEM;
unsigned char sotny EEMEM;
unsigned char ostatok_probega EEMEM;
//.....0.....1.....2.....3.....4.....5.....6.....7.....8.....9....пусто
const char digit[11] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10}; // масив цифр для отправки на К155ИД1
volatile char lev[7] = {255, 1, 1, 255, 255, 255, 255};
volatile uint8_t out[3] = {10, 10, 10};
volatile unsigned char lever;
unsigned int D1, D1N, p, S, df, t;
unsigned char k, sh, l1, l2, l3, l4, ds, n=0, sot, des, edin, batt_8, fuel_8, batt, fuel;
volatile uint8_t fr[3]; // какой разряд изменился
uint8_t tscr[3]; // временный экран
uint8_t iocr = 0, dig = 0;
char ms = 0, digr;
const uint8_t psc[25]={1,11,32,43,64,85,106,157,178,199,220,251,255,251,220,199,178,157,106,85,64,43,32,11,1}; // ступени яркости
const uint8_t lm1[21]={0,1,2,3,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5};//массивы для шкалы
const uint8_t lm2[21]={0,0,0,0,0,0,1,2,3,4,5,5,5,5,5,5,5,5,5,5,5};//----
const uint8_t lm3[21]={0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,5,5,5,5,5};//----
const uint8_t lm4[21]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5};//----
const uint8_t anod[4]={0,1,4,5};//распределение анодных портов для шкалы
volatile uint8_t catod[4]={0,0,0,0};//	временный массив
	
void epprom_convert(uint16_t prob)
{
 		sot = prob / 100;// сотни
		des = (prob / 10) % 10;//десятки
		edin = prob % 10;//еденицы	
}
	
void shkala(uint8_t l)	//разложение на разряды шкалы в пятиричной системе счисления 
{					//с занесением во временный ммассив
	catod[0]=lm1[l];
	catod[1]=lm2[l];
	catod[2]=lm3[l];
	catod[3]=lm4[l];
}

void code(char lever)//пятеричная система переводится на конкретные порты
{
	switch (lever)
	{
	case 0:	break;
	case 1:	PORTB|=(1<<0);	break;
	case 2:	PORTB|=(1<<0)|(1<<4);	break;
	case 3:	PORTB|=(1<<0)|(1<<4)|(1<<5);	break;
	case 4:	PORTB|=(1<<0)|(1<<4)|(1<<5)|(1<<6);	break;
	case 5:	PORTB|=(1<<0)|(1<<4)|(1<<5)|(1<<6)|(1<<7);	break;
	}
	
}

ISR(TIMER0_OVF_vect)//шкала
{
 //организация отрезка выборки ~500ms c ДС
	if (p++>1950)
	{
		D1=S;//перекладываем насчитаное для дальнейшей обработки
		S=0;//сбрасываем насчитаное за 0,5сек
		p=0;
		D1N=D1N+D1/6; //суммируем пробег метры
		if (D1N>1000)// если насчитали больше км складываем в конечную копилку
			{
			df++;
			D1N=D1N/100; //тут оставшиеся десятки, а может даже и сотни возвращаем в сумматор
			}
	}
  PORTB&=~((1<<0)|(1<<4)|(1<<5)|(1<<6)|(1<<7));//сбрасываем катоды шкалы
  PORTD&=~((1<<0)|(1<<1)|(1<<4)|(1<<5));//сбрасываем аноды шкалы
  PORTD|=(1<<anod[k]);					//перебираем аноды
  code(catod[k]);						//выводим значение для каждого анода
	k++;
	if (k>3){k=0;}					//что бы начать все сначало
}
void batt_fuel(void)
{
	ADCSRA|=(1<<ADSC);
	ADMUX^=(1<<0); //меняем канал
	batt=(batt_8*200)/255;//формула расчета напряжения
	fuel=(255-fuel_8)/255;
	inki(batt);										//ругается на эту строчку! т.е. на переход в функцию inki
///// Warning	1	implicit declaration of function 'inki' /////Error	3	previous implicit declaration of 'inki' was here
	shkala(fuel);
}
// void inki (int D1)
// {
// 	
// }

void inki(int t) // эффект плавной смены цифр, здесь идет поиск тех цифр, которые надо менять ////Warning	2	conflicting types for 'inki'
{ 
 uint8_t i;// запомнили новое время для 3 разрядов и заносим в массив tscr[]
 		tscr[0] = t / 100;// сотни
		tscr[1] = (t / 10) % 10;//десятки
		tscr[2] = t % 10;//еденицы
		for (i = 0; (i < 3); i++) // сравнили с тем, что было 6 раз (цикл)
			if (tscr[i] != out[i]) // узнаём в каком разряде поменялась цифра, массив out[i] содержит текущие значения
				{fr[i] = 1;} // цифра изменилась создаем массив с индикатором 1 измененных цифр
			else
				{fr[i] = 0;} // цифра осталась
			iocr = 0;
}

ISR (TIMER2_OVF_vect) // реализация ШИМ управления яркостью ламп и подсветки
{
	uint8_t i;// переменная i
	PORTB &=~((1<<1)|(1<<2)|(1<<3));
	OCR2 = lev[dig]; // подготавливаемся к выводу следуйщего разряда. таймер по совпадению
	if (iocr < 25)// плавная смена яркости цифр
		{ 
		if (++ms == 18) // ~38ms
			{ 
			ms = 0;
			for (i = 0; i < 3; i++) //без 100грамм не разобраться:
				{
				if ((fr[i] == 1) || (iocr == 0))
					{
					lev[i] = psc[iocr];
					}
				if (iocr == 12)
					{
					out[i] = tscr[i];
					}					
				}
			iocr++;
			}
		}
}

ISR (TIMER2_COMP_vect) // реализация ШИМ управления яркостью ламп и подсветки
{
	if(dig < 3)// три разряда 0,1,2 digr3-еденицы
	{
		 PORTC = digit[out[dig]]; // выводим цифру на дешифратор катоды т.е.0-9
		 digr=dig+1;	
	if (dig==0){if (out[0]!=0){PORTB|=(1<<digr);}}// далее выбор анодов цифр с гашением 0
	if (dig==1){if ((out[0]!=0)||(out[1]!=0)){PORTB|=(1<<digr);}}
	if (dig==2){PORTB|=(1<<digr);}	
	}	
	if (++dig > 3){dig = 0;}
}

ISR(ADC_vect)
{
	if((ADMUX & 0xE6)==1) // Если был выбран канал ADC6 BATT
	{
		batt_8=ADCH;
		PORTC|=(1<<4);//зажигаем запятую
	}
	else
	{
		fuel_8=ADCH;
	}

}

ISR(INT0_vect)
{
S++;// здесь складываются импульсы от ДС
}

ISR(INT1_vect)
{
cli();
 PORTB=0x00;//тушим всю индикацию для снижения энергопотребления
 PORTD&=~((1<<0)|(1<<1)|(1<<4)|(1<<5));
 PORTC&=~((1<<0)|(1<<1)|(1<<2)|(1<<3));
epprom_convert(df);//раскладываем на разряды
if (eeprom_read_byte(&edinicy)!=edin)//если есть изменения, то:
	{
	eeprom_write_byte(&edinicy, edin);// сохраняем пробег поразрядно
	}
if (eeprom_read_byte(&desyatki)!=edin)
	{
	eeprom_write_byte(&desyatki, des);
	}
if (eeprom_read_byte(&sotny)!=edin)
	{
	eeprom_write_byte(&sotny, sot);
	}
if (eeprom_read_byte(&ostatok_probega)!=D1N)//не забываем про остаточек пробега
	{
		eeprom_write_byte(&ostatok_probega, D1N);
	}
}

int main(void)
{
	/**********************************настройка портов******************************/
	DDRB|=(1<<0)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<1)|(1<<2)|(1<<3);
	DDRD|=(1<<0)|(1<<1)|(1<<4)|(1<<5)|(1<<3);
	DDRC|=(1<<0)|(1<<1)|(1<<2)|(1<<3);//к дешифратору
/**********************************настройка таймера2 индикация цифр*****************************/
TCCR2 |= (1 << CS20) | (1 << CS21);	//предделитель на 32
TIMSK |= (1<<OCIE2) | (1<<TOIE2);
/**********************************настройка таймера1 индикация шкалы*****************************/
TCCR0 |= (1<<CS01);// | (1<<CS00); //предделитель на 8 //на 64
TIMSK |= (1<<TOIE0);
/**********************************настройка внешнего прерывания INT0*****************************/
MCUCR |= (1<<ISC01);				//по убывающему фронту
GICR |= (1<<INT0);		
/**********************************настройка внешнего прерывания INT1*****************************/
//для мониторинга питания, на случай его пропадания записать пробег в eeprom
MCUCR |= (1<<ISC11)|(1<<ISC10);		//по нарастающему фронту
GICR |= (1<<INT1);
/**********************************настройка ADC*****************************/
	ADMUX |= (1 << REFS0)|(1<<REFS1); // Vref=2,56V
	ADMUX |= (1 << MUX0)|(1<<MUX1)|(1<<MUX2)|(1<<ADLAR); // Подключаем канал ADC7, 8-bit ADC
	ADCSRA |= (1 << ADEN) // разрешение АЦП
	|(1 << ADSC) // запуск преобразования
	|(1 << ADPS2)|(1 << ADPS1)|(1 << ADPS0)|(1<<ADFR) // предделитель на 128
	|(1 << ADIE); // разрешение прерывания от АЦП
/********************************************************************************/
D1N=eeprom_read_byte(&ostatok_probega);//прочитали остаточек
df=(eeprom_read_byte(&sotny)*100)+(eeprom_read_byte(&desyatki)*10)+eeprom_read_byte(&edinicy);//прочитали пробег
	sei();
	while(1)//тестовые формулы и т.д.
	{
		sh=(ADCH*100)/1275;
		ds=D1/10;
		inki(df);
		shkala(ds);
// 		inki(batt);      ///если ставим здесь переход в функцию inki - ошибок нет!
// 		shkala(fuel);
		_delay_ms(1000);
		ADCSRA|=(1<<ADSC);
		//batt_fuel(); //отображение 3 режима
	}
	return 0;
}
ругается на переход в функцию inki
если ставить на 8 строку снизу ошибок нет, если переход из void batt_fuel(void) два предупреждения и ошибка (места ошибок закоментированы)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ну прочтите и, если не понятно, переведите варнинг и сообщение об ошибке, сразу все станет ясно.

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

Мой уютный бложик... заходите!
Контактная информация:
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

Огромное спасибо! добавил

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

void inki(int t);
еще не приходилось с этим сталкиваться.
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

Замучился с записью в eeprom, пишет всякую хрень :cry:
Спойлер

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

#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
unsigned char edinicy EEMEM;
unsigned char desyatki EEMEM;
unsigned char sotny EEMEM;
unsigned char vid_ EEMEM;
unsigned int ostatok_probega EEMEM;
unsigned int calibration EEMEM;
unsigned char u_l EEMEM;	//хранит low калибровки бака
unsigned char u_f EEMEM;	//хранит full калибровки бака
unsigned int full_p EEMEM;
/////////////////////////
бла, бла...
////////////////////////
int main(void)
{
/////////////////////////
бла, бла...
////////////////////////
	
	if (eeprom_read_byte(&vid_)>4)
	{
	eeprom_write_byte(&u_l, 249);
	eeprom_write_byte(&u_f, 24);	
	eeprom_write_word(&ostatok_probega, 0);	
	eeprom_write_byte(&vid_, 2);
	
	eeprom_write_byte(&edinicy, 0);
	eeprom_write_byte(&desyatki, 0);
	eeprom_write_byte(&sotny, 0);
	eeprom_write_word(&full_p, 55555); здесь например 65535 при считывании
	eeprom_write_word(&calibration, 458); здесь 9
	}
sei();
D1N=eeprom_read_word(&ostatok_probega);//прочитали остаточек
df=(eeprom_read_byte(&sotny)*100)+(eeprom_read_byte(&desyatki)*10)+eeprom_read_byte(&edinicy);//прочитали и собрали пробег
vid=eeprom_read_byte(&vid_);
calib_v=eeprom_read_word(&calibration);
ul=eeprom_read_byte(&u_l);
uf=eeprom_read_byte(&u_f);

while(1)
	{....... и так далее.....
успевает записать несколько адресов от балды, в последних обычно уже FF либо FFFF в зависимости от размера ячейки.
в чем проблема может быть, с 3-4 строчками было все нормально, добавил еще адресов и усе, приплыли.....
спустя пару часов......
каким то чудным образом смог правильно записать значения после того как добавил еще два if распределив по 3 записи в каждом if :shock:
в чем прикол? компилятор или avr studio5? или оперативка в мк кончаетсяее.... хотя в железе вроде не подвисает.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Сделайте структуру с вашими полями, поисваивайте этим полям значения, а затем сохраняйте её одним обращением к функции eeprom_update_block
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

Интересный комментарий...
_update_ вместо _write_ - это, естественно, правильно...
и структура вместо кучи переменных = однозначно! :beer:

Но. Если у автора есть проблема в последовательной записи в ЕЕ через _write_ (что, ничему не противоречит, и имеет право быть),
то чем поможет _update_, если этому апдэйту придется также, например, ВСЕ поля структуры перезаписывать? ... и тогда он нарвётся на тот-же глюк через полгода?

Непонятно, что значит - "успевает"? Её (запись) кто-то торопит?
Может, питание?... :idea:
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

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

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

if (eeprom_read_byte(&vid_)>4)
	{
	eeprom_write_word(&full_p, 0);
	eeprom_write_word(&calibration, 275);
	eeprom_write_byte(&u_l, 219);
	eeprom_write_byte(&vid_, 1);
	}
	if (eeprom_read_word(&ostatok_probega)>3000)
	{
	eeprom_write_word(&ostatok_probega, 0);
	eeprom_write_byte(&u_f, 44);
	}
	if (eeprom_read_byte(&sotny)>9)
	{
	eeprom_write_byte(&edinicy, 3);
	eeprom_write_byte(&desyatki, 2);
	eeprom_write_byte(&sotny, 1);
	}
передвигал sei(); перед еппром не компилирует :shock:
и еще сразу же порсле проршивки не включая, считываю еепром там уже значения лежат, программатор TL866А по ICSP.
Нашел косяк!
это программатор пишет хрень какую то...
при программировании если снять галку поддержки питания и программировать при включенном устройстве то все норм, если устройство не включать и программировать с подпиткой МК от программатора то пишет всякую хрень в еепром :)))
спасибо всем за внимание вопрос закрываю.
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

Добрый день, как обратиться к регистру SREG на Си, проект на меге16.
Вот все что есть в файле iom16.h
http://screenshot.su/show.php?img=ef1cc ... 08e69e.jpg
Последний раз редактировалось baghear Пт сен 19, 2014 11:18:20, всего редактировалось 2 раза.
Ответить

Вернуться в «Разные вопросы по МК»