Итак, дело собственно вот в чем:
Занимаюсь я платой индикации в извещателе температуры. В моем распоряжении 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 не считывает.
Грешу на саму прогу у Слейва..
Уважаемые умные Инженеры, есть ли у кого примеры подобных программок для мастера и слейва?.. все что нужно - просто передать байт данных, любое число.
Типо хелп