Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Перевод с Ассемблера на С
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Slavast
Добрый день!
Помогите плиз перевести код программы таймера на Atmega16 с Ассемблера на С.
Огромный поклон.


.include "m16def.inc"
.device ATMEGA16


;--задаем имена регистрам------------------
.def temp = r16 ;рабочая переменная


; ---------------Проинициализировали указатель стека------

ldi r16,high(RAMEND) ; Начало
out SPH,r16 ; основной программы
ldi r16,low(RAMEND)
out SPL,r16

;--прерывания------------------------------
rjmp RESET ;Reset Handle
break
reti; jmp EXT_INT0 ; IRQ0 Handler
break
reti; jmp EXT_INT1 ; IRQ1 Handler
break
reti; jmp TIM2_COMP ; Timer2 Compare Handler
break

;reti; jmp TIM2_OVF ; Timer2 Overflow Handler
;break
;reti; jmp TIM1_CAPT ; Timer1 Capture Handler
;break
rjmp TIM1_COMPA
break
break; Timer1 CompareA Handler
break
break
ret; jmp TIM1_COMPB ; Timer1 CompareB Handler
break
break
reti; jmp TIM1_OVF ; Timer1 Overflow Handler
break
reti; jmp TIM0_OVF ; Timer0 Overflow Handler
break
reti; jmp SPI_STC ; SPI Transfer Complete Handler
break
reti; jmp USART_RXC ; USART RX Complete Handler
break
reti; jmp USART_UDRE ; UDR Empty Handler
break
reti; jmp USART_TXC ; USART TX Complete Handler
break
reti; jmp ADC ; ADC Conversion Complete Handler
break
reti; jmp EE_RDY ; EEPROM Ready Handler
break
reti; jmp ANA_COMP ; Analog Comparator Handler
break
reti; jmp TWSI ; Two-wire Serial Interface Handler
break
reti; jmp EXT_INT2 ; IRQ2 Handler
break
reti; jmp TIM0_COMP ; Timer0 Compare Handler
break
reti; jmp SPM_RDY ; Store Program Memory Ready Handler
break


RESET:
;------ Инициализация портов --------

ldi r17, 0x00
out PINA, r17 ; деактивируем Pull-up резисторы

ldi r17, 0x00
out DDRA, r17 ; порт на вывод



sei ;разрешаем прерывания



;------ Инициализация таймера --------


ldi r16, 0x10
out TIMSK, r16 ; разрешение прерывания по совпадению TCNT с OCR


ldi r22, 0x00
out OCR1AH, r22 ;
ldi r22, 0xАА
out OCR1AL, r22 ; устанавливаем предел счета 255




;------------- Тело ----------------------------

ldi r20, 0xAA ; загрузка 10101010 на вывод в PORTA
ldi r21, 0xFF ; слагаемое для Суммы по модулю 2

ldi r16, 0x00
out TCCR1A, r16 ; очистка TCCR1A
ldi r16, 0x0A ; запуск Таймера
out TCCR1B, r16 ; ставим предделитель в CLK/1024



Cycle: ; основной пустой цикл
out PORTA, r20
jmp Cycle


;------- Прерывание --------------



TIM1_COMPA:
nop
push R16 ;
in R16,SREG ; процедура прерывания
push R16 ;
eor r20, r21 ; Изменение 10101010 на 01010101
out PORTA, r20
jmp ttt ; выйти из прерывания

pop R16 ;Востанавливаем регистры
out SREG,R16
pop R16
nop

reti
ARV
offtopic: забодай вас комар! вы на всех форумах решили запостить эту ерундовину?!
Slavast
Простите, но еще новенький в этом деле. Это не ерундовина: для меня С - это скала, на которую мне кажется ну просто не взобраться! Потеть и потеть. А вот форумы - единственная возможность общаться с высокими профессионалами.
alexeyv
Мда!!!!!!
Дословный перевод (реализация WinAVR):

Код
#include <avr/interrupt.h>

volatile unsigned char temp,r20,r21;

int main (void)
{

  PINA = 0;
  DDRA = 0;
  sei();
  
  TIMSK = 0x10;
  OCR1AH = 0;
  OCR1AL = 0xAA;

  r20 = 0xAA;
  r21 = 0xFF;

  TCCR1A = 0;
  TCCR1B = 0x0A;

  while(1)
  {
   PORTA = r20;
  };
  return 0;
}

ISR(TIMER1_COMPA_vect)
{
  r20 ^= r21;
  PORTA = r20;
}


Проверку на правильность алгоритма не проводил
ae_
2 Slavast:
Код
ldi r17, 0x00
out DDRA, r17 ;  порт на вывод

это установка порта на ввод. на вывод надо:
ldi r17, 0xFF
out DDRA, r17

Код
ldi r22, 0x00
out OCR1AH, r22;
ldi r22, 0xАА
out OCR1AL, r22; устанавливаем предел счета 255

это устанавливает предел счёта не 255, а 170 (0xAA=170dec). 255dec=0xFF.
Slavast
Цитата(ae_ @ Nov 9 2010, 18:19) *
2 Slavast:
Код
ldi r17, 0x00
out DDRA, r17;  порт на вывод

это установка порта на ввод. на вывод надо:
ldi r17, 0xFF
out DDRA, r17

Код
ldi r22, 0x00
out OCR1AH, r22;
ldi r22, 0xАА
out OCR1AL, r22; устанавливаем предел счета 255

это устанавливает предел счёта не 255, а 170 (0xAA=170dec). 255dec=0xFF.



Спасибо за поправки!"
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.