Понял что надо хотя бы поверхностно познакомиться с асамблером чтобы хоть немного понимать принцип действия и архитектуру мк
мне на си нужно хотябы знать как написать бегущий огонь таймер или что-то не очень сложное
либо объясняли вам плохо, либо вы поняли не так. архитектура МК - это голая аппаратура, логика - на уровне регистров, триггеров и т.п. чтобы понять, как она работает, нужно немного шарить в цифровой схемотехнике, хотя бы на уровне "что такое 2И-НЕ" или "что такое параллельный регистр с третьим состоянием выходов". взаимодействие отдельных аппаратных частей МК можно на первых порах понять на уровне "когда сюда поступает такой-то сигнал, то здесь происходит вот это" - буквально "на пальцах". для всего этого ассемблер совершенно не нужен.ATtiny13 писал(а):Понял что надо хотя бы поверхностно познакомиться с асамблером чтобы хоть немного понимать принцип действия и архитектуру мк
Пушистый, те-то чё волноваться, ты-же у нас "многостаночник"..BOB51 писал(а):пока досконально все изучить успееш - того и гляди
мелкосхемку уж с производства сняли
Пример последовательного вывода байта на С под C-M3 в студию!Могу сказать, что на моем любимом M3 это делается еще легче и без необходимости прибегать к машинным кодам.
А вы даташит на МК прочтите. Для этого не нужны знания ни Assembler, ни Cнемного понимать принцип действия и архитектуру мк
У с/с++ есть одно неоспоримое преимущество - навыки программирования на нем могут пригодится абсолютно на любой платформе, т.к. язык напрямую не привязан к железу.ploop писал(а):Как бы тут не холиварили, я бы советовал первые программы начинать писать на асме.
http://infocenter.arm.com/help/index.js ... cjiic.htmlYS писал(а): Пример последовательного вывода байта на С под C-M3 в студию!
Код: Выделить всё
uint8_t byte,i;
...
for (i=0; i<8; i++)
{
if (byte & 1)
{
//"1" bit code
}
else
{
//"0" bit code
}
byte=byte >> 1;
}
Ну, знаете ли, интересно поглядеть на свежее решение.Если ты знаком, чего тебе не понятно ?
Я как бы кроме AVR мало с чем знаком, кто-нибудь может показать, во что превратит этот код компилятор?YS писал(а):ОК, вот для затравки:
Код: Выделить всё
void transmit_byte(unsigned char const *byte)
{
unsigned char mask;
for (mask=0x80;mask;mask>>1) (*byte&mask)? (PORTW|=(1<<BIT)):(PORTW&=~(1<<BIT));
}
Код: Выделить всё
void transmit_byte(unsigned char const *byte, unsigned char direct)
{
unsigned char mask;
for (mask=(direct)? 1:0x80;mask;mask=(direct)? mask<<1:mask>>1)
(*byte&mask)? (PORTW|=(1<<BIT)):(PORTW&=~(1<<BIT));
}
Этот код (Atmega8):ploop писал(а): Я как бы кроме AVR мало с чем знаком, кто-нибудь может показать, во что превратит этот код компилятор?
Код: Выделить всё
#include <avr/io.h>
#define PORTW PORTD
#define BIT 1
void transmit_byte(unsigned char const byte)
{
unsigned char mask;
for (mask=0x80;mask;mask>>1) (byte&mask)? (PORTW|=(1<<BIT)):(PORTW&=~(1<<BIT));
}
int main(void)
{
unsigned char data=0;
for(;;)
{
transmit_byte(data);
data++;
}
return 0;
}
Код: Выделить всё
void transmit_byte(unsigned char const byte)
{
unsigned char mask;
for (mask=0x80;mask;mask>>1) (byte&mask)? (PORTW|=(1<<BIT)):(PORTW&=~(1<<BIT));
38: 80 78 andi r24, 0x80 ; 128
3a: 88 23 and r24, r24
3c: 11 f0 breq .+4 ; 0x42 <__SREG__+0x3>
3e: 91 9a sbi 0x12, 1 ; 18
40: 01 c0 rjmp .+2 ; 0x44 <__SREG__+0x5>
42: 91 98 cbi 0x12, 1 ; 18
44: 92 b3 in r25, 0x12 ; 18
46: f9 cf rjmp .-14 ; 0x3a <transmit_byte+0x2>
00000048 <main>:
}
int main(void)
{
48: 1f 93 push r17
4a: 10 e0 ldi r17, 0x00 ; 0
unsigned char data=0;
for(;;)
{
transmit_byte(data);
4c: 81 2f mov r24, r17
4e: f4 df rcall .-24 ; 0x38 <transmit_byte>
data++;
50: 1f 5f subi r17, 0xFF ; 255
52: fc cf rjmp .-8 ; 0x4c <main+0x4>
...
Код: Выделить всё
#include <avr/io.h>
#define PORTW PORTD
#define BIT 1
void transmit_byte(unsigned char byte)
{
unsigned char i;
for (i=0; i<8; i++)
{
if (byte & 1)
{
PORTW|=1<<BIT; //"1" bit code
}
else
{
PORTW&=~(1<<BIT);//"0" bit code
}
byte=byte >> 1;
}
}
int main(void)
{
unsigned char data=0;
for(;;)
{
transmit_byte(data);
data++;
}
return 0;
}
Код: Выделить всё
void transmit_byte(unsigned char byte)
{
38: 90 e0 ldi r25, 0x00 ; 0
unsigned char i;
for (i=0; i<8; i++)
{
if (byte & 1)
3a: 80 ff sbrs r24, 0
3c: 02 c0 rjmp .+4 ; 0x42 <__SREG__+0x3>
{
PORTW|=1<<BIT; //"1" bit code
3e: 91 9a sbi 0x12, 1 ; 18
40: 01 c0 rjmp .+2 ; 0x44 <__SREG__+0x5>
}
else
{
PORTW&=~(1<<BIT);//"0" bit code
42: 91 98 cbi 0x12, 1 ; 18
void transmit_byte(unsigned char byte)
{
unsigned char i;
for (i=0; i<8; i++)
44: 9f 5f subi r25, 0xFF ; 255
46: 98 30 cpi r25, 0x08 ; 8
48: 11 f0 breq .+4 ; 0x4e <__SREG__+0xf>
else
{
PORTW&=~(1<<BIT);//"0" bit code
}
byte=byte >> 1;
4a: 86 95 lsr r24
4c: f6 cf rjmp .-20 ; 0x3a <transmit_byte+0x2>
4e: 08 95 ret
00000050 <main>:
}
}
int main(void)
{
50: 1f 93 push r17
52: 10 e0 ldi r17, 0x00 ; 0
unsigned char data=0;
for(;;)
{
transmit_byte(data);
54: 81 2f mov r24, r17
56: f0 df rcall .-32 ; 0x38 <transmit_byte>
data++;
58: 1f 5f subi r17, 0xFF ; 255
5a: fc cf rjmp .-8 ; 0x54 <main+0x4>