Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
27.11.2008, 14:00
|
#1
|
Прописка
Регистрация: 24.08.2005
Сообщений: 139
Сказал спасибо: 18
Сказали Спасибо 16 раз(а) в 15 сообщении(ях)
|
глюк динамической индикации
проблемам на индикаторах высвечивает до 64 потом индикация повисает до начала нового цикла и все повторряется прога простая но
где то какой то глюк немогу разобратся
//программа вывода на динамическую индекацию значение 0-9999
#include‹mega8535.h›
#include‹delay.h›
unsigned int iv = 0;
// int r;
void init (void){
#asm ("cli") //запретить глобальные прерывания
DDRA=0xff;
DDRC=0xff;
//DDRB=0xff;
//TCCR0 = 0b00000010; //предделитель тактовой частоты CK/8 нулевого таймера
//TIMSK = 0b00000001; //разрешить прерывание по переполнению нулевого таймера
//OCR0 = 0xE6; //230 тактов с предделителем /8
//TCNT0=0;
#asm("sei") //разрешить глобальные прерывания
// #asm("wdr") //обнуление сторожевого счетчика
}
//подпрограмма динамической индикации
//диапазон 9999
//внимание результат должен быть помещен разряды r30 ст, r31 мл
//разряды r8 r10 зарезервированы под индикацию
char fbinL; // ;двоичное значение,младший байт
char fbinH; // ;старший байт
char tBCD0; //двоично-десятичное
char tBCD1; //два байта
//int tBCD21= 0x77;
char Cntind;
// 0 1 2 3 4 5 6 7 8 9
char TableInd[] = { 0x3F , 0x06 , 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x7, 0x7F, 0x6F }; //массив индикации
void IntToBcd(unsigned int iv) { //двоичное в двоично десятичное
#asm
;************************************************* ******************
;1. Текст программы "bin16BCD5"- преобразование 16-битного двоичного
;значения в упакованный BCD формат
;************************************************* ******************
;* Количество слов кода :25 + возврат
;* Количество циклов :25/176 (Мин/Макс) + возврат
;* Использованные младшие регистры :нет
;* Использованные старшие регистры :4(fbinL,fbinH/tBCD0,tBCD1,tBCD2)
;* Использованные указатели :нет
;************************************************* ******************
;***** Регистровые переменные подпрограммы
.def fbinL =r16 ;двоичное значение, младший байт
.def fbinH =r17 ;двоичное значение, старший байт
.def tBCD0 =r17 ;BCD значение, цифры 1 и 0
.def tBCD1 =r18 ;BCD значение, цифры 3 и 2
;.def tBCD2 =r19 ;BCD значение, цифра 4
;Примечание: Переменные fbinH и tBCD0 должны размещаться в одном
;регистре.
;***** Код
bin16BCD5:
; ldi tBCD2, -1
mov r16,r9 ;обробатываемое значение копируем значения в
mov r17,r10 ;начальные регистры
bin16BCD5_loop_1:
; inc tBCD2
subi fbinL, low(10000)
sbci fbinH, high(10000)
brsh bin16BCD5_loop_1
subi fbinL, low(-10000)
sbci fbinH, high(-10000)
ldi tBCD1, -0x11
bin16BCD5_loop_2:
subi tBCD1, -0x10
subi fbinL, low(1000)
sbci fbinH, high(1000)
brsh bin16BCD5_loop_2
subi fbinL, low(-1000)
sbci fbinH, high(-1000)
bin16BCD5_loop_3:
inc tBCD1
subi fbinL, low(100)
sbci fbinH, high(100)
brsh bin16BCD5_loop_3
subi fbinL, -100
ldi tBCD0, -0x10
bin16BCD5_loop_4:
subi tBCD0, -0x10
subi fbinL, 10
brsh bin16BCD5_loop_4
subi fbinL, -10
add tBCD0, fbinL
mov r6,r17
mov r7,r18
ret
#endasm
return ;
}
void IndOut( unsigned int iv) {
char i; //8 битное
//#asm ("cli") //запретить прерывания при работе таймера
IntToBcd( iv ); //перевод числа в двоично десятичную форму
for(i=0; i!=10 ;i++) { //цикл индикации
switch( Cntind ) {
case 0: // индикация едениц
PORTC = TableInd[ tBCD0 & 0x0F ]; // значение в порт
PORTA = 0xfe; //выбор индикатора
delay_ms(2);
++Cntind;
break;
case 1: // индикация десяток
PORTC = TableInd[ ( tBCD0 ›› 4 ) & 0x0F ]; //сдвиг и побитная И
PORTA = 0xfd;
delay_ms(2);
++Cntind;
break;
case 2: // индикация сотен
PORTC = TableInd[ tBCD1 & 0x0F ];
PORTA = 0xfb;
delay_ms(2);
++Cntind;
break;
case 3: // индикация тысяч
PORTC = TableInd[ ( tBCD1 ›› 4 ) & 0x0F ];
PORTA = 0xf7;
delay_ms(2);
Cntind = 0;
break;
}
}
// #asm ("sei") //разрешить прерывания
}
void main() {
init ();
while (1)
{
iv++;
IndOut(iv);
if (iv == 9999) {iv = 0;}
}
}
|
|
|
|
27.11.2008, 14:45
|
#2
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,381
Сказал спасибо: 1,962
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
А почему вы решили, что значения в регистрах вам будут доступны вне процедуры перевода в строку? Компилятор волен использовать регистры как ему хочется. Думаю, стоит просмотреть листинг - как используются регистры R17,18,19 в процедуре IndOut
|
|
|
|
27.11.2008, 15:38
|
#3
|
Прописка
Регистрация: 24.08.2005
Сообщений: 139
Сказал спасибо: 18
Сказали Спасибо 16 раз(а) в 15 сообщении(ях)
|
Сообщение от nml
|
А почему вы решили, что значения в регистрах вам будут доступны вне процедуры перевода в строку? Компилятор волен использовать регистры как ему хочется. Думаю, стоит просмотреть листинг - как используются регистры R17,18,19 в процедуре IndOut
|
регистры привязаны чтоб в Си потом использовать (не искать)
прогу прогонял в AVR studio там все нормально работает, прошиваю в контролер все повторяется заново
такое ощущение что происходи переполнение "буфера или регитра отсчета или ..." и повисает индикация хотя отсщет идет и когда достигает нулевого значения все повторяется заново
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:23.
|
|