Уважаемые форумчане есть следующий код для МК ATmega 128:
/*
* DC_Voltmetr_Prog.cpp
*
* Created: 28.02.2018 11:19:19
* Author : LAN_Admin
*/
#include <avr/io.h>
void Prb()
{
asm("sbi 0x1B,2");
asm("nop");
asm("cbi 0x1B,2");
asm("nop");
};
void Drrb()
{
asm("sbi 0x15,0");
asm("nop");
asm("cbi 0x15,0");
asm("nop");
}
int main(void)
{
DDRA=0xFF;
DDRC=0xFF;
/* Replace with your application code */
while (1)
{
Drrb();
Prb();
}
}
По непонятной причине не выполняется функция Prb? В отладчике всё нормально, а смотрю на ножку при помощи осциллограаф там ничего нет ? Как такое может быть ? Подскажите пожалуйста ?
Программирование ATmega 128
Re: Программирование ATmega 128
Я с программатором всё правильно делаю. Это уже неоднократно проверялось. А глюки при залипании функции всё равно остаются. Например вот такой код не будет работать:
#define CS_ASM_Arg0 "sbi 0x1B,2"
#define CS_ASM_Arg1 "cbi 0x1B,2"
//----------
#include <avr/io.h>
//----------
void Proba()
{
asm(CS_ASM_Arg0);
asm(CS_ASM_Arg1);
};
//----------
int main(void)
{
/* Replace with your application code */
DDRA=0xff;
PORTA=0x00;
while (1)
{
Proba();
asm("sbi 0x1B,0"); --проверяем по установлению высокого уровня что программа запущена (до сюда не доходит!!!!!)
};
}
А вот такой уже будет:
#define CS_ASM_Arg0 "sbi 0x1B,2"
#define CS_ASM_Arg1 "cbi 0x1B,2"
//----------
#include <avr/io.h>
//----------
void Proba(uint8_t sr)
{
asm(CS_ASM_Arg0);
asm(CS_ASM_Arg1);
};
//----------
int main(void)
{
/* Replace with your application code */
DDRA=0xff;
PORTA=0x00;
while (1)
{
Proba(1);
asm("sbi 0x1B,0"); --проверяем по установлению высокого уровня что программа запущена ( а теперь доходит!!!!!)
};
}
Почему так???
Поясните пожалуйста!!!
#define CS_ASM_Arg0 "sbi 0x1B,2"
#define CS_ASM_Arg1 "cbi 0x1B,2"
//----------
#include <avr/io.h>
//----------
void Proba()
{
asm(CS_ASM_Arg0);
asm(CS_ASM_Arg1);
};
//----------
int main(void)
{
/* Replace with your application code */
DDRA=0xff;
PORTA=0x00;
while (1)
{
Proba();
asm("sbi 0x1B,0"); --проверяем по установлению высокого уровня что программа запущена (до сюда не доходит!!!!!)
};
}
А вот такой уже будет:
#define CS_ASM_Arg0 "sbi 0x1B,2"
#define CS_ASM_Arg1 "cbi 0x1B,2"
//----------
#include <avr/io.h>
//----------
void Proba(uint8_t sr)
{
asm(CS_ASM_Arg0);
asm(CS_ASM_Arg1);
};
//----------
int main(void)
{
/* Replace with your application code */
DDRA=0xff;
PORTA=0x00;
while (1)
{
Proba(1);
asm("sbi 0x1B,0"); --проверяем по установлению высокого уровня что программа запущена ( а теперь доходит!!!!!)
};
}
Почему так???
Поясните пожалуйста!!!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Программирование ATmega 128
изучите, как надо в avr-gcc оформлять ассемблерные вставки.
но лучше - ответьте на вопрос, зачем вы это делаете? у вас Си в руках, зачем в него вставки делать бессмысленные?!
но лучше - ответьте на вопрос, зачем вы это делаете? у вас Си в руках, зачем в него вставки делать бессмысленные?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Программирование ATmega 128
Задача проста как помидор нужно написать программный SPI. Собственно говоря посмотрел вчера внимательно дизасемблированный код.
Для первого варианта:
SER R24
Out 0x1A,R24
out 0x1B,R1
SBI 0x1B,2
CBI 0x1B,2
SBI 0x1B,0
RJMP PC-3
тут всё работает как нужно видны импульсы практически меандр Tполки=2uS период - 8uS
Для второго варианта:
основной цикл:
SER R24
Out 0x1A,R24
out 0x1B,R1
RCALL PC-6
в подпрограмме
SBI 0x1B,2
CBI 0x1B,2
RET
продолжение основного цикла:
SBI 0x1B,0
RJMP PC-2
а здесь работает уже не так как нужно видны импульсы Tполки=11uS период - 1.8mS
Я полагаю, что проблема именно в вызове.
rcall и ret. Стек инициализирован правильно!
Повторял данные коды в качестве отдельных проектов на ассемблере. Всё точно также.
Вопросы следующие:
1. В чём собственно проблема?
2. Можно ли дать пример написания таймера с использованием подпрограмм на ассемблере ?
Для первого варианта:
SER R24
Out 0x1A,R24
out 0x1B,R1
SBI 0x1B,2
CBI 0x1B,2
SBI 0x1B,0
RJMP PC-3
тут всё работает как нужно видны импульсы практически меандр Tполки=2uS период - 8uS
Для второго варианта:
основной цикл:
SER R24
Out 0x1A,R24
out 0x1B,R1
RCALL PC-6
в подпрограмме
SBI 0x1B,2
CBI 0x1B,2
RET
продолжение основного цикла:
SBI 0x1B,0
RJMP PC-2
а здесь работает уже не так как нужно видны импульсы Tполки=11uS период - 1.8mS
Я полагаю, что проблема именно в вызове.
rcall и ret. Стек инициализирован правильно!
Повторял данные коды в качестве отдельных проектов на ассемблере. Всё точно также.
Вопросы следующие:
1. В чём собственно проблема?
2. Можно ли дать пример написания таймера с использованием подпрограмм на ассемблере ?
Re: Программирование ATmega 128
Если Вам нужен программный SPI именно на ассемблере, то возьмите готовое решение от Atmel
- Вложения
-
- SOFTware SPI 8bit ASM.rar
- (53.96 КБ) 153 скачивания
Re: Программирование ATmega 128
Код: Выделить всё
RCALL PC-6Спойлер
Код: Выделить всё
LDI XH,HIGH(RAMEND)
LDI XL,LOW(RAMEND)
OUT SPH,XH
OUT SPL,XL
CLR R1
SER R24
Out 0x1A,R24 ; DDRA
out 0x1B,R1 ;PORTA
RCALL PROG_SCLK
SBI 0x1B,0
RJMP PC-2
PROG_SCLK:
SBI 0x1B,2
CBI 0x1B,2
RET
...Королева ходит куда угодно.
Куда угодно кому?..