Обозначения, хитрости на языке си

Здесь все вопросы по языку программирования С
ученик
Сообщения: 12
Зарегистрирован: 27 дек 2014, 14:52

Re: Обозначения, хитрости на языке си

Сообщение ученик » 01 янв 2015, 02:26

С НОВЫМ ГОДОМ !!!

ученик
Сообщения: 12
Зарегистрирован: 27 дек 2014, 14:52

Re: Обозначения, хитрости на языке си

Сообщение ученик » 03 янв 2015, 01:29

С наступившим!!! по поводу темы таймеры, все класно разжевано, но вопрос все-же остался:
Частота кварца равна 4 МГц. Отсюда 1с/4МГц получается за 1 такт 0,00000025 секунды.
Нам нужно получить 10 мс, это 0,01 секунды. Теперь делим 0,01 на 0,00000025 и
получаем 40000 тактов. Многовато, так как регистр сравнения 8-битный. Значит делим
частоту. 40000/8=5000 много. 40000/64=625 ближе, но много. 40000/256=156,25. О!
Проверяем. 1(4МГц/256)=0,000064. Теперь 0,01/0,000064=156,25. Все правильно.
Теперь нам нужно записать в регистр TCCR2 число 6. Так как в бинаре это будет
0b00000110 что означает делить входную частоту на 256. Так и запишем. TCCR2=0x06;

Теперь нам надо задать число в регистр сравнения. Мы его знаем, оно равно 156,25.
С учетом того что регистр 8-битный, то он дробную часть выкинет. Так и пишем.


вот тут, если нам для получения задержки 10мс , нужно число 156 записать в OCR2, то почему
0х9С , если 156= 0х6Е ??



OCR2=0x9С; А регистр счета пишем просто TCNT2=0x00; Все, мы настроили таймер.

Аватара пользователя
gurvinok
Сообщения: 1473
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Обозначения, хитрости на языке си

Сообщение gurvinok » 03 янв 2015, 09:01

Я погляжу новогодний праздник бурно пошёл. :D
156 в HEX будет именно 0x9C и никак иначе, а 0x6E будет 110.
Если долго мучиться, может быть получится.

ученик
Сообщения: 12
Зарегистрирован: 27 дек 2014, 14:52

Re: Обозначения, хитрости на языке си

Сообщение ученик » 03 янв 2015, 13:29

тогда у меня не стыковка с калькулятором ,
у него Hex=9C
Dec=-100
Okt=234
Bin=10011100, я так понимаю это одно и тоже число в
разных представлениях.

Аватара пользователя
gurvinok
Сообщения: 1473
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Обозначения, хитрости на языке си

Сообщение gurvinok » 03 янв 2015, 14:00

Все верно. 1001 это 9, а 1100 это С. Не забываем что в винде старший бит это бит знака. Если 0 то плюс, если 1 то минус. Чем отличается char от unsigned char?
Если долго мучиться, может быть получится.

ученик
Сообщения: 12
Зарегистрирован: 27 дек 2014, 14:52

Re: Обозначения, хитрости на языке си

Сообщение ученик » 03 янв 2015, 16:33

Благодарю, с калькулятором разобрался, когда калькулятор выставлен на отображение 1-байтовое, получается
то , что описал ранее, а если в 2х байтовое и выше, то 156 действительно 9С.

char - от -127до127
unsigned char - 256

Благодарю за поддержку, полезу дальше надо понять 7сег индикаторы.

ученик
Сообщения: 12
Зарегистрирован: 27 дек 2014, 14:52

Re: Обозначения, хитрости на языке си

Сообщение ученик » 11 янв 2015, 01:49

Может посоветуете в чем ошибка, в этой програмке выдает ошибка, а что просит не разберу. Программа отсюда https://www.youtube.com/watch?v=FE3NaNO6CMc чтоб заработала пришлось помучиться, как обучающемуся это не просто. вот что получилось

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

#define F_CPU 4000000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
volatile unsigned char Danie_Razrad_1,Danie_Razrad_2,Danie_Razrad_3,Danie;
unsigned char sifra[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char i ,n;
void preset(){
	DDRB=0xFF;
	PORTB=0x00;
	DDRD=(1<<4)|(1<<5)|(1<<6);
	PORTD&=~(1<<4);
	PORTD&=~(1<<5);
	PORTD&=~(1<<6);
}

 int Peresot  ( volatile unsigned char Temp )
{
	asm("cli");
	Danie_Razrad_1 = 0;
	Danie_Razrad_2 = 0;
	while( Temp >= 100 )
	{
		Temp = Temp - 100;
		Danie_Razrad_1++;
	}
	//============
	while( Temp >= 10 )
	{
		Temp = Temp - 10;
		Danie_Razrad_2++;
	}
	//============
	Danie_Razrad_3 = Temp;
	asm("sei");
}	 
	
ISR(TIMER0_COMP_vect){
	
	static unsigned char Vibor_Razrada;
	Vibor_Razrada++;
	PORTB=0x00;
	switch (Vibor_Razrada)
	{
		case 1:
		PORTB = sifra [ Danie_Razrad_1 ];
		PORTD |=(1<<4);
		PORTD |=(1<<5);
		PORTD &=~(1<<6);
		break;
		case 2:
		PORTB = sifra [ Danie_Razrad_2 ];
		PORTB |=(1<<7);
		PORTD |=(1<<4);
		PORTD |=(1<<6);
		PORTD &=~(1<<5);
		break;
		case 3:
		PORTB = sifra [ Danie_Razrad_3 ];
		PORTD |=(1<<6);
		PORTD |=(1<<5);
		PORTD &=~(1<<4);
		Vibor_Razrada = 0;
		break;
	}
	TCNT2=0x00;
}


int main (void)
{preset();
	
/*TCCR2=0x06;
TCNT2=0x00;
OCR2=0x9C;
TIMSK=0x80;
//Danie=25;
asm("sei");*/
	TCCR0|=(1<<CS00)|(1<<CS01);
	TCCR0&=~(1<<WGM00);
	TCCR0&=~(1<<WGM01);
	TIMSK|=(1<<1);
	OCR0=0x4E;
	asm("sei");
	while(1){
		asm("nop"); 	
	Peresot(n);
	if(n<222) n=n+1;
	else n=0;
	_delay_ms(200);
		asm("nop");
	}
}]

ругается на функцию ( int Peresot ( volatile unsigned char Temp ))
ругается вот так
//Warning 1 control reaches end of non-void function [-Wreturn-type] C:\atmel uroki\avr proba\avr proba\avr proba\avr proba.c 38 1 avr proba//

Аватара пользователя
gurvinok
Сообщения: 1473
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Обозначения, хитрости на языке си

Сообщение gurvinok » 11 янв 2015, 08:59

Правильно что ругается. Функция объявлена как int, а выход через break. Вот она и ругается. Заменил int на void и все заработает.
Если долго мучиться, может быть получится.

ученик
Сообщения: 12
Зарегистрирован: 27 дек 2014, 14:52

Re: Обозначения, хитрости на языке си

Сообщение ученик » 11 янв 2015, 16:59

Благодарю все верно, двигаемся дальше,правда не знаю как долго, в ноуте пол экрана стало поосатым, и цветным.

Аватара пользователя
gurvinok
Сообщения: 1473
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Обозначения, хитрости на языке си

Сообщение gurvinok » 11 янв 2015, 19:26

Видюха или шлейф.
Если долго мучиться, может быть получится.

Ответить