trofim2 писал(а):Это моя глобальная ошибка?
вот это - глобальнейшая ошибища:
trofim2 писал(а):Включаем файл (инклюдом) с программой, написаной на асм
никогда никаких инклюдов других файлов с исходными текстами быть не должно! в Си инклюдятся только заголовочные файлы, которые не должны содержать реализаций функций - только описания и определения, да и то с ограничениями!
asm - это "оператор" ассемблерной вставки, он имеет особый формат, сильно отличающийся от привычного ассемблерного исходника.
сравните сами:
ассемблерная вставка
Спойлер
Код: Выделить всё
asm volatile ( "; \n\t \
ldi %[status],%[TX_Disable] \n\t \
sts %[UCSRnB_addr], %[status] \n\t \
sbi %[cs_port],%[cs_pin] \n\t \
ldi %[counter], %[delay] ;1 \n \
WAIT_LOOP%=: \n\t \
dec %[counter] ;1 \n\t \
brne WAIT_LOOP%= ;1/2 \n\t \
cbi %[cs_port],%[cs_pin] ;2 \n\t \
ldi %[status],%[TX_Enable] \n\t \
sts %[UCSRnB_addr], %[status] \n \
"
: [counter] "=d" (counter), [status] "=d" (status)
: [delay] "I" (_ST7735_SPI_RAMRD_DELAY_CYCLES_/3+1),
[UCSRnB_addr] "M" (_ST7735_SPI_UCSRnB_ADDRESS_),
[TX_Enable] "M" ((0<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0)|(0<<RXEN0)|(1<<TXEN0)),
[TX_Disable] "M" ((0<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0)|(0<<RXEN0)|(0<<TXEN0)),
[cs_port] "I" (PIN_TO_PORTn_OFFSET(ST7735_CHIPSELECT_PIN)),
[cs_pin] "I" (PIN_TO_PINn_BIT(ST7735_CHIPSELECT_PIN))
: "cc" );
обычный ассемблерный код примерно с тем же функционалом
Спойлер
Код: Выделить всё
ldi r16,TX_Disable
sts UCSRnB_addr, r16
sbi PORTB, cs_pin
ldi r22, delay
WAIT_LOOP:
dec r22
brne WAIT_LOOP
cbi PORTB, cs_pin
ldi r16, TX_Enable
sts UCSRnB_addr, r16
поэтому правильное использование ассемблерного модуля должно быть таким:
1. создаем проект WinAVR (в AVR Studio 4.xx - как в более новых, не знаю)
2. создаем файл с расширением .S
3. добавляем его в проект
4. задаем опции проекта - тип МК, частоту и т.п.
5. компилируем
в файле .S у вас могут быть описанные по правилам синтаксиса avr-as функции, которые можно использовать в других исходниках (файлы .c или .S), причем сами эти функции тоже могут использовать глобальные переменные, определенные в других файлах проекта... но в самом простейшем случае у вас может быть единственный исходник .S - в этом случае он обязательно должен содержать глобальную метку main - это и будет главная функция. при этом следует знать, что ДО перехода на эту метку автоматически будет настроен указатель стека и проведена очистка памяти под глобальные неинициализированные переменные, а инициализированные будут проинициализированы - все как в Си.