реклама на сайте
подробности

 
 
> TWI в AVR, громко кричу на помощь, Прошу откликнуться Ассемблеристов
Maxim_Ka
сообщение Nov 29 2010, 20:28
Сообщение #1





Группа: Участник
Сообщений: 12
Регистрация: 29-11-10
Из: Ленинградушка
Пользователь №: 61 260



Итак, дело собственно вот в чем:

Занимаюсь я платой индикации в извещателе температуры. В моем распоряжении ATmega32A и ATmega16.
Нужно чтобы мега16(далее именуемая Мастер) по нажатию кнопки пересылала байт данных меге32(очевидно Слейв), которая по прерыванию от ТиВиАй этот байт принимала бы и обрабатывала. В простейшем случае просто инвертировала полученную инфу и выдавала на любой порт, дабы загорелись светодиодики.
Проблема в том что я не знаю как написать это все так чтоб работало как надо. Сколько не читал Евстигнеева, так и не получилось. Голову ломал долго. На сайте этом все что можно обыскал, нет здесь такого простого примера.
Могу прицепить прогу для Мастера:
CODE

; Мастер АТмега16
; Программа передачи данных по TWI
;

;----------------Команды управления

.include "m16def.inc"
.list
.def temp = R16
.def data = R17
.def loop = R18
.def adr = R19


;----------------Начало программного кода
.cseg
.org 0

;----------------Инициализация стека ($4FF)

ldi temp,Low(RAMEND)
out SPL,temp
ldi temp,High(RAMEND)
out SPH,temp

;----------------Инициализация портов ВВ
ldi r16, 0
out DDRA, r16 ; порт A на ввод
out DDRD, r16 ; порт D на ввод
out DDRC, r16 ; порт C на ввод

ldi r16, 0xFF
out DDRB, r16 ; порт B на вывод

out PORTC, r16 ; включаем внутр резисторы
out PORTA, r16 ; включаем внутр резисторы
out PORTD, r16 ; включаем внутр резисторы

;----------------Начало основного цикла

main: ldi adr, 0x08

mm1: in temp, PINA
sbrc temp, 0 ; если не ноль - переходим в начало
rjmp mm1
rcall wait
cbi PORTA, 1
rcall prog

mm2: in temp, PINA ; Цикл ожидания отпускания кнопки
sbrs temp, 0
rjmp mm2
rcall wait
rjmp main

;----------------Подпрограмма

prog: in temp, PIND
ldi data, 0xFF
eor data, temp

pusk_start:
ldi temp, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
out TWCR, temp

wait1: in temp, TWCR
sbrs temp, TWINT
rjmp wait1

in temp, TWSR
andi temp, 0xF8
cpi temp, 0x08
brne pusk_start

pusk_adr:
mov temp, adr
out TWDR, temp
ldi temp, (1<<TWINT)|(1<<TWEN)
out TWCR, temp

wait2: in temp, TWCR
sbrs temp, TWINT
rjmp wait2

in temp, TWSR
andi temp, 0xF8
cpi temp, 0x18
brne pusk_adr
pusk_data:
mov temp, data
out TWDR, temp
ldi temp, (1<<TWINT)|(1<<TWEN)
out TWCR, temp

wait3: in temp, TWCR
sbrs temp,TWINT
rjmp wait3

in temp, TWSRс
andi temp, 0xF8
cpi temp, 0x28
brne pusk_data

ldi temp, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
out TWCR, temp

ret


Эта штукенция то работает то зависает на втором восстановлении TWINT (wait2 зацикливается). Когда убирал все BRNE, смотрел на цифровом осциллографе - картинка как из учебника. Все идеально.
Далее пытался соединить оба МК, они просто на разных платах. Соеденить соединил, а работать отказывается, само прерывание по TWI у меги32 срабатывает, но данные с TWDR не считывает.
Грешу на саму прогу у Слейва..


Уважаемые умные Инженеры, есть ли у кого примеры подобных программок для мастера и слейва?.. все что нужно - просто передать байт данных, любое число.

Типо хелп help.gif
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th August 2025 - 18:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01354 секунд с 7
ELECTRONIX ©2004-2016