• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

SPI для ATmega 128A на ассемблере

  • Автор темы Автор темы Uragan
  • Дата начала Дата начала

Uragan

Ученик
Регистрация
13 Дек 2014
Сообщения
1
Реакции
0
Баллы
0
SPI для ATmega 128A на ассемблере

привет всем! гляньте, плиз! нужна помощь, делаем код для задержки(есть в коде от таймера), еще такая же тема нужна с uart, но там вообще глухо(

.include "m128def.inc"
.equ LowByte=60
.equ CS=PB0
.equ SCK=PB7

.org $000
rjmp reset
.org $001C
rjmp timer1_ovf

reset:
cli

ldi r16, TCNT1H
out TCNT1H, r16
ldi r16, LowByte
//ldi r16, TCNT1L
out LowByte, r16

ldi r16, (1<<TOIE1)
out TIMSK, r16
ldi r16, (1<<CS10)|(1<<CS11)
out TCCR1B, r16
ldi r17, (1<<4)
out DDRB, r17
clr r16
sei

main:
RJMP main

ldi r18, 1<<ADEN| 1<<ADIE|1<<ADPS2|1<<ADPS0
out ADCSRA, r18

timer1_ovf:
eor r16, r17
out PORTE, r16///


;start ADC 1/32=125; interrupt enable
ldi r18, 1<<ADEN| 1<<ADIE|1<<ADPS2|1<<ADPS0|1<<ADSC
out ADCSRA, r18
/*ldi r18, 1<<ADFR
out ADCSRA, r18
ldi r18, 1<<ADSC
out ADCSRA, r18*/



SPI_MasterInit:
; Установка MOSI и SCK на вывод, все остальные на ввод
ldi r17,(1<<DDB5)|(1<<DDB1)
out DDRB,r17
; Разрешение SPI в режиме мастера, установка скорости связи fck/16
ldi r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
out SPCR,r17
ret
SPI_MasterTransmit:
; Запуск передачи данных (r16)
out SPDR,r16
Wait_Transmit:
; Ожидание завершения передачи данных
sbis SPSR,SPIF
rjmp Wait_Transmit
ret

SPI_SlaveInit:
; Установка MISO на вывод и всех ост. на ввод
ldi r17,(1<<DDB3)
out DDRB,r17
; Разрешение SPI
ldi r17,(1<<SPE)
out SPCR,r17
ret
SPI_SlaveReceive:
; Ожидание завершения передачи
sbis SPSR,SPIF
rjmp SPI_SlaveReceive
; Чтение принятых данных и выход из процедуры
in r16,SPDR
ret
 
Не вижу установки указателя стека.
Код:
reset:
cli
    LDI    R22,HIGH(RAMEND)
    LDI    R23,LOW(RAMEND)
    OUT    SPH,R22
    OUT    SPL,R23
Выход из обработчика timer1_ovf сейчас лучше делать командой RETI, т.к. идет аппаратное разрешение прерываний (I-флаг в SREG устанавливается при выполнении команды). Команда RET состояние I-флага не меняет и после первого выхода из timer1_ovf будет банальное зависание.
 
Строки
Код:
 ldi r18, 1<<ADEN| 1<<ADIE|1<<ADPS2|1<<ADPS0
 out ADCSRA, r18
никогда не выполнятся

Дальше в коде много ошибок. Нет вызова подпрограмм. Первая же подпрограмма слилась с обработчиком прерываний..
 
Назад
Сверху