Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите разобраться с CV, выдаёт ошибку при компи
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Метценгерштейн
#include <90s2313.h>
#include <delay.h>

void LCD (unsigned char temp, unsigned char temp1){
unsigned char temp2
#asm
outind:
//temp1- адрес, temp2- данные

//запись адреса
LCD_WA:
mov temp,temp1
andi temp,0x0f
ori temp,0x10
out portb,temp

nop
nop

cbi portb, WR1
sbi portb, A0

//запись данных (запись тетрады)
LCD_WN:
mov temp,temp2 //запись младшей тетрады
andi temp,0x0f
ori temp,0x30
out portb,temp
nop
nop

cbi portb, WR1

nop
nop

swap temp2 //запись старшей тетрады
mov temp,temp2
andi temp,0x0f
ori temp,0x30
out portb,temp
nop
nop

cbi portb, WR1
ret
#endasm
}

void main(void) {
DDRB = 0x20; // 0010 0000 output pin pb5
LCD (2,3);

}

я назвал переменные темп, затем сразу пишу на асме, выдаёт ошибку, что- то там про мои переменные говорит, не знаю в чём дело, может нельзя так делать?
vet
Локальная переменная temp2 размещается в регистре r16 - работайте с ним
Параметры temp, temp1 передаются через стек данных - обращайтесь к ним соответствующим образом:
LDD Rxx,Y+2 ;к temp
LDD Rxx,Y+1 ;к temp1

А вообще, как писать ассемблерные функции - подробно описано во встроенной помощи CodeVisionAVR.

Моё мнение - это не тот случай, где оправдано переписывание кода на ассемблере. Напишите то же на C - проще и меньше проблем.

PS: ret в конце - ошибка, уберите.
Метценгерштейн
этот проект у меня полностью написан на асме, хотелось бы Си изучить, вот решил попробовать так. Не понял одного- от куда информация, что темп это r16? а остальные темпы у меня через стек идут? Я идеи не понял, если я в ф-ю передаю параметры с некими переменными, я что не могу эти переменные в асмовской вставе использовать? Или в асмовской вставке я должен с регистрами оперировать? Потом, если полностью на Си переписать, разве код компактней будет? Ведь это просто формирование импульсов. Не понятно.
vet
1. Повторюсь, почитайте хелп - вопросы пропадут сами собой. Там подробно описано, как CV размещает локальные переменные и параметры.
2. CV транслирует в ассемблерный код имена глобальных переменных и процедур, предваряя их символом "_". Имена параметров и локальные переменные не транслируются.
3. В данном конкретном случае сишный код и приведённый ассемблерный текст дадут после компиляции практически одно и то же. Единственное отличие будет в том, как функция обращается к параметрам.
yung
Компилятор все переменные размещает в ОЗУ, в то время как практически все команды ассемблера работают только с регистрами (mov, andi и т.д.). Если хочется сделать все это на ассемблере, то необходимо все эти переменные предварительно перегнать в регистры, а затем (при выходе из асма) - вернуть обратно. И не забудь использованные регистры сохранить в стеке при входе и забрать их при выходе. Но боюсь, что даже в этом случае могут начаться чудеса при Сишных прерываниях (какие-то из использованных регистров могут быть задействованы и там, и не факт, что Си вернет их обратно).
vet
Цитата(yung @ Apr 14 2005, 09:02)
Компилятор все переменные размещает в ОЗУ, в то время как практически все команды ассемблера работают только с регистрами (mov, andi и т.д.). Если хочется сделать все это на ассемблере, то необходимо все эти переменные предварительно перегнать в регистры, а затем (при выходе из асма) - вернуть обратно.
*

Вообще говоря, неверно; CV по умолчанию размещает часть глобальных переменных в нижних регистрах. Локальные переменные, сколько получится, размещаются в r16-r21, остальные - на стеке данных, там же, где и параметры функций.

Цитата(yung @ Apr 14 2005, 09:02)
И не забудь использованные регистры сохранить в стеке при входе и забрать их при выходе. Но боюсь, что даже в этом случае могут начаться чудеса при Сишных прерываниях (какие-то из использованных регистров могут быть задействованы и там, и не факт, что Си вернет их обратно).
*

Регистры r0,r1,r22-r27,r30,r31 в функции можно не сохранять, CV использует их, как временные. К прерываниям это, разумеется, не относится smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.