|
|
  |
Перевод с Ассемблера на С, Таймер на ATMega 16 - |
|
|
|
Nov 9 2010, 08:47
|
Частый гость
 
Группа: Участник
Сообщений: 81
Регистрация: 25-10-10
Пользователь №: 60 395

|
Добрый день! Помогите плиз перевести код программы таймера на 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
|
|
|
|
|
Nov 9 2010, 09:37
|
Местный
  
Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940

|
Мда!!!!!! Дословный перевод (реализация 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; } Проверку на правильность алгоритма не проводил
|
|
|
|
|
Nov 9 2010, 14:19
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
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.
|
|
|
|
|
Nov 12 2010, 08:25
|
Частый гость
 
Группа: Участник
Сообщений: 81
Регистрация: 25-10-10
Пользователь №: 60 395

|
Цитата(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. Спасибо за поправки!"
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|