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

 
 
 
Reply to this topicStart new topic
> 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
ILYAUL
сообщение Nov 29 2010, 20:52
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



1 . Очень сложно смотреть код в таком виде так , что в rar или в zip, плиз
2. Обозначьте ножки куда и что подключено.
3. Код выложите после того как расставите команды ret
4. Евстигнеев - это известный артист , вряд ли он писал , что-то о микропроцессорах , может всё таки Евстифеев


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 29 2010, 20:55
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Для начала возьмите любой аппаратный I2C-slave, типа м/с памяти EEPROM (24xx) или еще лучше расширитель портов типа PCF8574 или PCF8575 (к ней можно светодиодики навесить wink.gif ) и отладьте с ней работу I2C-master. Только потом подключайте свой "самописанный" slave. Программу вашу я не смотрел, т.к. во-первых, с asm для AVR не знаком. Во-вторых, слишком уж она у вас простая. Автомат состояний I2C для мастера, учитывающий все возможные состояния шины I2C и модуля TWI, должен быть на порядок посложнее вашего.
Go to the top of the page
 
+Quote Post
Maxim_Ka
сообщение Nov 30 2010, 15:41
Сообщение #4





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



Евстифеев да, ну главное что вы меня поняли )

Не важно там какие ножкии тд. Мне просто пример работающих прог нужен, там по нему уже и разберусь. Задача то самая простецкая..)
Где можно достать програмки "ведущий передатчик" и "ведомый приемник" на ассемблере?
Go to the top of the page
 
+Quote Post
diglook
сообщение Nov 30 2010, 16:06
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 99
Регистрация: 29-06-09
Пользователь №: 50 730



Не буду убеждать переходить на язык более высокого уровня, Но Си примеров много.
На АSМ вот Ссылка
Вообще Гугль рулит.

Бегло просмотрев Ваш код :
вызов rcall wait никуда не приводит- такой функции или метки у Вас нет .

Сообщение отредактировал diglook - Nov 30 2010, 16:17
Go to the top of the page
 
+Quote Post
нечитатель
сообщение Nov 30 2010, 19:55
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 235
Регистрация: 20-11-10
Пользователь №: 61 032



Как бы я делал:

- написал софтовый программный (вручную то есть) I2C *;
- временно навставлял бы в него больших задержек;
- посмотрел бы внимательно, как перемигиваются светодиодики на линиях SCL и SDA (считая в уме "старт, первый бит, второй бит...");
- ...
- изложил бы чёткое мной понимание логики работы в виде обычных человеческих слов карандашом на бумажке, после чего повторил третье.

Понравилось про расширитель портов для проверки. Не понравилось, что он не всегда есть под руками.

* а потом бы убрал задержки, но так и оставил софтовый программный его. Удобно плату разводить, когда любые ноги.

---

... но если надо готовый пример программки и/или вызовы с возвратами не поняты, тогда лучше ой от греха подальше.

Сообщение отредактировал нечитатель - Nov 30 2010, 20:04
Go to the top of the page
 
+Quote Post
Lexdaw
сообщение Dec 1 2010, 17:52
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 87
Регистрация: 5-02-08
Пользователь №: 34 772



Здесь из рабочего проекта.Прикрепленный файл  Master.doc ( 51.5 килобайт ) Кол-во скачиваний: 354
Go to the top of the page
 
+Quote Post
Maxim_Ka
сообщение Dec 14 2010, 10:33
Сообщение #8





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



Вообщем получилось у меня то, что хотел )
Спасибо всем кто постарался помочь )


Go to the top of the page
 
+Quote Post

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

 


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


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