1. Насколько я знаю, в gcc-подобных компиляторах char-ы и так выравниваются по одному байту. То есть, если в структуре только char-ы, то они будут идти в памяти один за другим и без подобных ухищрений
2. 1) ага
2) ага
only pure true norwegian blackx 
Код: Выделить всё
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
int main(void)
{
DDRB=0b11111111;
DDRD=0b01110000;
PORTB=0b11111110;
PORTD=0b01110000;
while(1)
{
if (PORTB!=0b01111111)
{
PORTB=~PORTB; //0b11111110 ---> 0b00000001
PORTB=1<<PORTB; //0b00000001 ---> 0b00000010
PORTB=~PORTB; //0b00000010 ---> 0b11111101
_delay_ms(500);
}
else
{
PORTB=0b11111110;
}
}
}
Код: Выделить всё
PORTB=1<<PORTB;Код: Выделить всё
PORTB=PORTB<<1;
Мikа писал(а):На Асме всё проще работает
Мikа писал(а):А что же тогда происходит с числом при 1<<PORTB?
shads писал(а):А вы заставьте это сказать того кто после Си пытается АСМ освоить....
... Си-шник всегда напишет 0xFF вместо 0b11111111, и накатает макросов из любви к #define, чтобы сократить писанинуHHIMERA писал(а):Хм... и в чём здесь прикол???shads писал(а):А вы заставьте это сказать того кто после Си пытается АСМ освоить....
Аlex писал(а):А причём тут printf ? Деление с остатком не пойдёт ?
Код: Выделить всё
/* как пример */
long part1, part2;
float source = -66780.015;
char buf[20], *pp;
part1 = source;
part2 = labs((source - part1 + (part1>0 ? 0.00501 : -0.00501)) * 100); /* 100 - два знака после запятой */
pp=buf;
if(part1==0 && source<0) *pp++='-';
ltoa(part1, pp, 10);
strcat(buf, ".");
pp = buf + strlen(buf);
if(part2<10) *pp++='0'; /* зависит от точности, для более двух знаков нужно более сложный код */
ltoa(part2,pp,10);
/* Ну у теперь в buf сформирована строка и с ней можно что угодно делать */
puts(buf);HHIMERA писал(а):А вот в чём прикол с СИ на АСМ переползать???
Код: Выделить всё
part1 = source;
//...
if(part1==0 && source<0)
only pure true norwegian blackx 
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
int main(void)
{
DDRB = 0xff;
PORTB = 0x00;
OCR0 = 0xff;
TCCR0 = (1 << WGM01) | (1 << WGM00) | (1 << COM01) | (1 << COM00) | (1 << CS00);
TCNT0 = 0x00;
while (1)
{
while(OCR0 != 0xff)
{
_delay_ms(2);
OCR0++;
}
while(OCR0 != 0x00)
{
_delay_ms(2);
OCR0--;
}
}
}
blackx писал(а):А вы уверены что у вас эта проверка срабатывать будет? Если нужно сконвертить в строку отрицательное число,
то itoa сама добавит "-":Код: Выделить всё
part1 = source;
//...
if(part1==0 && source<0)
aleksandr5rikin писал(а):возможно ктонибуть подскажет более более качественую реализацию задания ?
Код: Выделить всё
int main(void)
{
signed char n=-1;
while (1)
{
_delay_ms(2);
OCR0+=n;
if(!OCR0 || OCR0==255) n*=-1;
}
}
решение в студию.aleksandr5rikin писал(а):P.S. проблема решена, спасибо за 'помощь' , возможно ктонибуть подскажет более более качественую реализацию задания ?