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

 
 
19 страниц V  « < 11 12 13 14 15 > »   
Reply to this topicStart new topic
> Проблема с TWI
картошка
сообщение Dec 30 2005, 19:05
Сообщение #181


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-12-05
Из: Odessa
Пользователь №: 12 673



Цитата(bodja74 @ Dec 30 2005, 21:02) *
1 А я не вижу радости в программном TWI.Тоже делал,тоже прошел.
2 Не вижу кода для слейва.
3 Код для мастера обсуждался и работает и куда коротче вашего,при таком раскладе.
4 Преимужества?Как насчет возможности использовать мастер по прерыванию и разгрузить основной проц процентов на 90 ?
5 А как насчет того ,если мы захотим вцепить 2 мастера?Ваш код будет дожидаться когда освободиться шина?Или среагирует при арбитраже?


Простите. Недоглядел. blink.gif
Go to the top of the page
 
+Quote Post
bodja74
сообщение Dec 30 2005, 19:24
Сообщение #182


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Без проблем.

Не ошибается тот ,кто ничего не делает.
Go to the top of the page
 
+Quote Post
James D.
сообщение Dec 30 2005, 21:04
Сообщение #183


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



Новый вариант слейв2:

Код
TWI_Obr:in  temp,TWSR
  cpi  temp,$60;Проверка принятого адреса от мастера
  breq Address
  cpi  temp,$80;Прием данных
  breq DataR

  cpi  temp,$A8;Передача данных
  breq DataT1
  cpi  temp,$B0;
  breq DataT1
  cpi  temp,$B8;
  breq DataT2

  ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
  out  TWCR,temp
  reti

;*******
Address:ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
  out  TWCR,temp
  reti

;Прием данных:

DataR: in  Byte_1,TWDR ;Прием: Byte_1
  rcall TW_NT_n  ;Прием: Byte_2
  in  Byte_2,TWDR

  rjmp STOP_n

;*******************************************************************
TW_NT_n:ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
  out  TWCR,temp

wait2n: in  temp,TWCR ;Ожидаем ответа от мастера
  sbrs temp,TWINT
  rjmp wait2n

  ret

;*******************************************************************
;Все данные приняты - STOP (линия приема/передачи переходит в высокоимпедансное состояние)

STOP_n: ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
  out  TWCR,temp
  reti

;*******************************************************************

;Передача данных:

DataT1: out  TWDR,Byte_1 ;Отправка: Byte_1
  rcall Write

  ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
  out  TWCR,temp
  reti

DataT2: out  TWDR,Byte_2 ;Отправка: Byte_2
  rcall Write
  out  TWDR,Byte_3 ;Отправка: Byte_3
  rcall Write
  out  TWDR,Byte_4 ;Отправка: Byte_4
  rcall Write
  out  TWDR,Byte_5 ;Отправка: Byte_5
  rcall Write
  out  TWDR,Byte_6 ;Отправка: Byte_6
  rcall Write

  rjmp STOP_n
  
;*******************************************************************
Write: ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
  out  TWCR,temp

wait3n: in  temp,TWCR;Ожидаем ответа от мастера
  sbrs temp,TWINT
  rjmp wait3n

  ret

;*******************************************************************


Код мастера для передачи/приема на слейв2:

Код
;*************************
;Передача на слейв2:
;*************************

  ldi  temp,$14;Установка скорости передачи= 71429 Hz
  out  TWBR,temp
  ldi  temp,$00
  out  TWSR,temp

Pusk_Sr:ldi  temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
  out  TWCR,temp;Посылка сигнала "START"

wait1r: in  temp,TWCR;Ожидаем ответа интерфейса
  sbrs temp,TWINT
  rjmp wait1r

SLA_Wr: ldi  temp,$40;Загрузка адреса слейв2 + "WRITE"
  out  TWDR,temp
  ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
  out  TWCR,temp

wait2r: in  temp,TWCR;Ожидаем ответа от слейв2
  sbrs temp,TWINT
  rjmp wait2r

;Начинаем передавать данные:

DATA_r: out  TWDR,Byte_1 ;Отправка: Byte_1
  rcall Writer
  out  TWDR,Byte_2 ;Отправка: Byte_2
  rcall Writer
  
  rjmp STOP_r  ;Передача данных завершена

;*******************************************************************
Writer: ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
  out  TWCR,temp

wait3r: in  temp,TWCR;Ожидаем ответа от слейв2
  sbrs temp,TWINT
  rjmp wait3r

  ret
;*******************************************************************
;Все данные переданы - STOP (линия приема/передачи переходит в высокоимпедансное состояние)

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

PAUSE: ldi  temp,$FF;Пауза, чтобы модуль TWI смог завершить команду СТОП
P_cikl: dec  temp
  cpi  temp,0
  brne P_cikl

;*************************
;Прием со слейв2:
;*************************

  ldi  temp,$14;Установка скорости передачи= 71429 Hz
  out  TWBR,temp
  ldi  temp,$00
  out  TWSR,temp

Pusk_R: ldi  temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
  out  TWCR,temp;Посылка сигнала "START"

waitT1: in  temp,TWCR;Ожидаем ответа интерфейса <<< Зависает здесь <<<
  sbrs temp,TWINT
  rjmp waitT1

  ldi  temp,$41;Загрузка адреса слейв2 + "READ"
  out  TWDR,temp
  ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
  out  TWCR,temp

waitR2: in  temp,TWCR;Ожидаем ответа слейв2
  sbrs temp,TWINT
  rjmp waitR2

;*******
;Прием данных:

Data: rcall TW_NT_R  ;Прием: Byte_1
  in  temp,TWDR
  sts  Byte_1,temp
  rcall TW_NT_R  ;Прием: Byte_2
  in  temp,TWDR
  sts  Byte_2,temp
  rcall TW_NT_R  ;Прием: Byte_3
  in  temp,TWDR
  sts  Byte_3,temp
  rcall TW_NT_R  ;Прием: Byte_4
  in  temp,TWDR
  sts  Byte_4,temp
  rcall TW_NT_R  ;Прием: Byte_5
  in  temp,TWDR
  sts  Byte_5,temp

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

d2:     in  temp,TWCR
  sbrs temp,7
        rjmp d2

        in  temp,TWDR ;Прием: Byte_6
  sts  Byte_6,temp

  rjmp STOP_RD  ;Прием данных завершен

;*******************************************************************
TW_NT_R:ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
  out  TWCR,temp

waitRr: in  temp,TWCR ;Ожидаем ответа от слейв2
  sbrs temp,TWINT
  rjmp waitRr

  in  temp,TWSR
  cpi  temp,$50
  brne STOP_RD  ;Переход, если данные от слейв2 не получены

  ret

;*******************************************************************
STOP_RD:ldi  temp,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)
  out  TWCR,temp

PAUSE2: ldi  temp,$FF;Пауза, чтобы модуль TWI смог завершить команду СТОП
P_cikl2:dec  temp
  cpi  temp,$00
  brne P_cikl2

;*******************************************************************


Зависает в цикле waitT1...
Go to the top of the page
 
+Quote Post
bodja74
сообщение Dec 31 2005, 10:47
Сообщение #184


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Как я и предполагал этот участок кода в слейве не работает.

Код
Write: ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
  out  TWCR,temp

wait3n: in  temp,TWCR;Ожидаем ответа от мастера
  sbrs temp,TWINT
  rjmp wait3n

  ret





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

Так что будем делать по методе которую я предлагал раннее.
Делаем да буфера по 16 байт
Адресс приемного $80-$8F оперативке ,указатель регистр Х
Адресс передающего $90-$F,указатель регистр Y
Расположение и размер буферов можно изменить по своему усмотрению

Кстати выяснил что при посылке последнего байта не обязательно указывать TWCR=$85


Вот код

Код
; TWI Slave
; Specify Device.
.include "m8def.inc"
                    
; Variable Declarations
.def temp     = r16
.def temp_a   = r17
.def adress   = r18
.def data     = r19


.cseg                ; CODE segment.

.org 0          
                rjmp PROG    ; origin.
        reti
        reti
        reti
        reti
        reti
        reti
        reti
        reti
        reti
        reti
        reti
        reti
        reti
        reti
        reti
        reti
        rjmp TWI_Finished
        reti
           
                          
PROG:           ldi r16,$04    ; Initialize the stack.
            out SPH,r16
                ldi r16,$5F            
            out SPL,r16
                ldi temp,$00    ;
        out TWSR,temp
                ldi temp,$00    ;
        out TWBR,temp
                ldi temp,$40
        out TWAR,temp
                ldi temp,$45
        out TWCR,temp
                ldi temp,$FF    ;
        out DDRD,temp
        sei    
cycle:        rjmp cycle            


TWI_Finished:    
        sts $0F0,temp
        in temp,TWSR
                cpi temp,$60
                breq t1
                in temp,TWSR
                cpi temp,$80
                breq t2
        in temp,TWSR
                cpi temp,$A8
                breq t3
        in temp,TWSR
                cpi temp,$B0
                breq t3
        in temp,TWSR    ;
                cpi temp,$B8
                breq t4
       
    
                ldi temp,$C5
        out TWCR,temp
        lds temp,$0F0
        reti



t1:        ldi XH,$00
        ldi XL,$80
        ldi temp,$C5
        out TWCR,temp
        lds temp,$0F0
        reti

t2:             cpi XL,$90
                breq t2_1
        in temp,TWDR
        st X+,temp
        out PORTD,temp
        ldi temp,$C5
        out TWCR,temp
        lds temp,$0F0                    
        reti
t2_1:        in temp,TWDR
        st X,temp
        out PORTD,temp
        ldi temp,$C5
        out TWCR,temp
        lds temp,$0F0                        
        reti

t3:        ldi YH,$00
        ldi YL,$90
        ld temp,Y+
        out TWDR,temp
        ldi temp,$C5
        out TWCR,temp
        lds temp,$0F0
        reti

t4:             cpi YL,$A0
                breq t4_1
        ld temp,Y+
        out TWDR,temp
        ldi temp,$C5
        out TWCR,temp
        lds temp,$0F0    
        reti
t4_1:        ld temp,Y
        out TWDR,temp
        ldi temp,$C5
        out TWCR,temp
        lds temp,$0F0    
        reti
Go to the top of the page
 
+Quote Post
James D.
сообщение Dec 31 2005, 11:32
Сообщение #185


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



Огромное спасибо за помощь!
Буду пробовать новый вариант.
С Новым Годом! И удачи!!! santa2.gif
Go to the top of the page
 
+Quote Post
bodja74
сообщение Dec 31 2005, 11:57
Сообщение #186


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



И Вас с тем же ,и Вам того же.

Пора водку пить,согреваться до лета,а то в следующем году будем сидеть без газа.Удачи!!!
Go to the top of the page
 
+Quote Post
James D.
сообщение Dec 31 2005, 15:35
Сообщение #187


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



Нет, не получилось - мастер зависает в том же месте.
Ниже привожу прогу мастера (передача на слейв1 и передача/прием на слейв2
осуществляются в пределах одного обработчика прерывания таймера (Timer/Counter2 Переполнение)).

Мастер (передача 1-го байта на слейв 1):

Код
To_sl_1:ldi  temp,$14;Установка скорости передачи= 71429 Hz
  out  TWBR,temp
  ldi  temp,$00
  out  TWSR,temp

Pusk_Sn:ldi  temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
  out  TWCR,temp;Посылка сигнала "START"

wait1n: in  temp,TWCR;Ожидаем ответа от интерфейса TWI
  sbrs temp,TWINT
  rjmp wait1n

SLA_Wn: ldi  temp,$20;Загрузка адреса слейв1 + "WRITE"
  out  TWDR,temp
  ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
  out  TWCR,temp

wait2n: in  temp,TWCR;Ожидаем ответа от слейв1
  sbrs temp,TWINT
  rjmp wait2n

;Начинаем передавать данные:

DATA_n: out  TWDR,Byte_1 ;Отправка: Byte 1
  rcall Writen

  rjmp STOP_n  ;Передача данных завершена

;*******************************************************************
Writen: ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
  out  TWCR,temp

wait3n: in  temp,TWCR;Ожидаем ответа от слейв1
  sbrs temp,TWINT
  rjmp wait3n

  ret
;*******************************************************************
;Все данные переданы - STOP (линия приема/передачи переходит в высокоимпедансное состояние)

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

PAUSE_n:ldi  temp,$40
p:  dec  temp
  cpi  temp,$00
  brne p
;*******************************************************************


После этого идет дальнейшее выполнение программы обработчика таймера.
Далее:
Мастер (передача 1-го байта на слейв2, и прием со слейв2 3-х байт):

Код
;*************************
;Передача на слейв 2:
;*************************

  ldi  temp,$14;Установка скорости передачи= 71429 Hz
  out  TWBR,temp
  ldi  temp,$00
  out  TWSR,temp

Pusk_Sr:ldi  temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
  out  TWCR,temp;Посылка сигнала "START"

wait1r: in  temp,TWCR;Ожидаем ответа интерфейса
  sbrs temp,TWINT
  rjmp wait1r

SLA_Wr: ldi  temp,$40;Загрузка адреса слейв 2 + "WRITE"
  out  TWDR,temp
  ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
  out  TWCR,temp

wait2r: in  temp,TWCR;Ожидаем ответа от слейв 2
  sbrs temp,TWINT
  rjmp wait2r

;Начинаем передавать данные:

DATA_r: out  TWDR,Byte_1 ;Отправка: Byte 1
  rcall Writer

  rjmp STOP_r  ;Передача данных завершена

;*******************************************************************
Writer: ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
  out  TWCR,temp

wait3r: in  temp,TWCR;Ожидаем ответа от слейв 2
  sbrs temp,TWINT
  rjmp wait3r

  ret
;*******************************************************************
;Все данные переданы - STOP (линия приема/передачи переходит в высокоимпедансное состояние)

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

PAUSE: ldi  temp,$FF;Пауза, чтобы модуль TWI смог завершить команду СТОП

P_cikl: dec  temp
  cpi  temp,0
  brne P_cikl

;Прием данных:

  ldi  temp,$14;Установка скорости передачи= 71429 Hz
  out  TWBR,temp
  ldi  temp,$00
  out  TWSR,temp

Pusk_R: ldi  temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
  out  TWCR,temp;Посылка сигнала "START"

waitT1: in  temp,TWCR;Ожидаем ответа интерфейса
  sbrs temp,TWINT
  rjmp waitT1

  ldi  temp,$41;Загрузка адреса слейв 2 + "READ"
  out  TWDR,temp
  ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
  out  TWCR,temp

waitR2: in  temp,TWCR;Ожидаем ответа слейв 2
  sbrs temp,TWINT
  rjmp waitR2

;*******
;Прием данных:

Data: rcall TW_NT_R  ;Прием: Byte 1
  in  temp,TWDR
  sts  Byte_1,temp
  rcall TW_NT_R  ;Прием: Byte 2
  in  temp,TWDR
  sts  Byte_2,temp

TWI_DATA_R_NACK:
  ldi  temp,(1<<TWINT)|(1<<TWEN)
  out  TWCR,temp
d2:     in  temp,TWCR
  sbrs temp,7
        rjmp d2
        in  temp,TWDR ;Прием: Byte 3
  sts  Byte_3,temp

  rjmp STOP_RD  ;Прием данных завершен

;*******************************************************************
TW_NT_R:ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
  out  TWCR,temp

waitRr: in  temp,TWCR ;Ожидаем ответа от слейв 2
  sbrs temp,TWINT
  rjmp waitRr

  in  temp,TWSR
  cpi  temp,$50
  brne STOP_RD  ;Переход, если данные от слейв 2 не получены

  ret

;*******************************************************************
STOP_RD:ldi  temp,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)
  out  TWCR,temp

PAUSE2: ldi  temp,$FF;Пауза, чтобы модуль TWI смог завершить команду СТОП

P_cikl2:dec  temp
  cpi  temp,$00
  brne P_cikl2

;*******************************************************************




Прога слейв1 (прием 1-го байта):

Код
;*******************************************************************
;Режим - подчиненный-приемник:

TWI_Obr:in  temp,TWSR
  cpi  temp,$60;Проверка принятого адреса от мастера
  breq Address
  cpi  temp,$80;Прием данных
  breq Data
  cpi  temp,$00;
  breq Sob_00
  cpi  temp,$F8;
  breq Sob_F8

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

  reti

;***************************************************

Sob_00: ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWSTO)|(1<<TWEN)|(1<<TWIE)
  out  TWCR,temp
  reti

Sob_F8: reti

;*******
Address:ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
  out  TWCR,temp
  reti

;*******
;Прием данных:

Data: in  Byte_1,TWDR
  ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
  out  TWCR,temp
  reti

;*******************************************************************


Прога слейв2 (прием 1-го байта и передача 3-х байт мастеру):

Код
;*******************************************************************
;Режим - подчиненный-приемник/передатчик:

TWI_Obr:in  temp,TWSR
  cpi  temp,$60;Проверка принятого адреса от мастера
  breq Address
  cpi  temp,$80;Прием данных
  breq DataR

  cpi  temp,$A8;Передача данных
  breq DataT1
  cpi  temp,$B0;
  breq DataT1
  cpi  temp,$B8;
  breq DataT2

  ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
  out  TWCR,temp
  reti

;*******
Address:ldi  XH,$00
  ldi  XL,$80
  ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
  out  TWCR,temp
  reti

;*************************
;Прием от мастера:
;*************************
;Прием данных:

DataR: cpi  XL,$90
  breq DataR_2
  in  temp,TWDR
  st  X+,temp
  ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
  out  TWCR,temp
  reti

DataR_2:in  temp,TWDR
  st  X,temp
  ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
  out  TWCR,temp
  reti

;*************************
;Передача мастеру:
;*************************
;Передача данных:

DataT1: ldi  YH,$00
  ldi  YL,$90
  ld  temp,Y+
  out  TWDR,temp
  ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
  out  TWCR,temp
  reti

DataT2: cpi  YL,$A0
  breq t4_1
  ld  temp,Y+
  out  TWDR,temp
  ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
  out  TWCR,temp
  reti

t4_1: ld  temp,Y
  out  TWDR,temp
  ldi  temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)
  out  TWCR,temp
  reti

;*******************************************************************
Go to the top of the page
 
+Quote Post
bodja74
сообщение Jan 1 2006, 21:29
Сообщение #188


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



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

Насчет слейвов ,а где команда sei после инициализации?

Да еще декларация переменных по мастеру Byte_1 это регистр,остальные оперативка?
А то я не сразу вьехал.Предупреждайте.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 2 2006, 09:36
Сообщение #189


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(bodja74 @ Dec 31 2005, 12:47) *
Как я и предполагал этот участок кода в слейве не работает.

Вот код

Код
; TWI Slave
...                    
        sei    
cycle:        rjmp cycle            


TWI_Finished:    
        sts $0F0,temp
...
        lds temp,$0F0    
        reti


Скажите, а какой глубокий смысл (разумеется если он есть) в выделенном фрагменте? Для чего требуется сохранять temp по фиксированному адресу? Имеется ведь стек (команды push/pop), и самое главное если что и требует сохранения в реальной программе, так это в первую очередь SREG, почему же вы его не сохраняете?
Go to the top of the page
 
+Quote Post
James D.
сообщение Jan 2 2006, 13:40
Сообщение #190


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



Я привел здесь для слейвов только обработчики прерываний TWI.
После инициализации команда sei имеется.
У мастера Byte_1 и прочие - это или регистры, или ячейки ОЗУ. По смыслу. Я просто не стал приводить те специфические имена, которые использует программа. Чтобы было понятнее. А Byte_1, 2 и т.д. - это значит передаем/принимаем 1-ый байт, или 2-ой байт и т.д.
Говорите работает мастер? Прогу я представил практически в полном объеме - так пробую сейчас. Потом просто добавлю передачу/прием еще нескольких байт, только м всего.
А проверяете в симуляторе? В каком? Я пользуюсь только AVRStudio. Вот проверить бы это все хозяйство через JTAG! Совсем другое дело...
Go to the top of the page
 
+Quote Post
bodja74
сообщение Jan 2 2006, 15:07
Сообщение #191


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Цитата(defunct @ Jan 2 2006, 12:36) *
Скажите, а какой глубокий смысл (разумеется если он есть) в выделенном фрагменте? Для чего требуется сохранять temp по фиксированному адресу? Имеется ведь стек (команды push/pop), и самое главное если что и требует сохранения в реальной программе, так это в первую очередь SREG, почему же вы его не сохраняете?


Никакого смысла сохранения temp в предоставленном коде нет.
Я в этом цикле
cycle: rjmp cycle
присваивал для тестирования разные значения для отправки и использовал соответственно temp.Поэтому сохранял-востанавливал в подпрограмме.
Стек естественно имеется,но я его стараюсь не трогать и оставлять за ним право сохранять вектора возвратов из подпрограмм.
Стараюсь хранить переменные в оперативке.Так конкретно известно где какая переменная находиться.Но это все больше относиться к стилю написания программ.

SREG естественно стоит сохранять и не только его но и регистры X,Y,temp и другие если будут использоваться в подпрограмме.
Посмотрите внимательно на мой код,и скажите нужно ли сийчас все это?

На данном этапе необходимо получить-отправить пару байтов от пары слейвов и убедиться в работоспособности.
Потом естественно все это можно улучшать и вылизывать.
Я уже об этом неоднократно говорил.И не устраиваю здесь "показательные выступления" своего кода.

Теперь James D.
Цитата
А проверяете в симуляторе? В каком? Я пользуюсь только AVRStudio. Вот проверить бы это все хозяйство через JTAG! Совсем другое дело...


Я работаю на ПРОТЕУСЕ,ИМХО самое лучшее что я когда либо встречал.
Проверяю не только на симуляторе,но и на макетке.
Правда на макетке у меня только два МК ,слейв и мастер.
В случае с двумя слейвами проверяю на ПРОТЕУСЕ,но то что я делал на нем ,было без проблем и по жизни .
Предоставленные кода рабочие и если вы добавляете что то свое, будте внимательны.
Нужно предусматривать сохранение-востановление регистров и установку масок если используються несколько прерываний и время на обработку прерывания и т.д. и т.п.
Всего я предусмотреть за Вас я не могу, во многом это зависит от Вас и вашей программы.
Go to the top of the page
 
+Quote Post
James D.
сообщение Jan 3 2006, 06:05
Сообщение #192


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



Если кода рабочие, а у меня на макетке не работает, то что же делать?
Можно ли в ПРОТЕУСЕ моделировать более двух МК? Я, наверное, скачаю ПРОТЕУС (где-то на этом форуме встречал ссылку), и попробую. Прога, случайно, не на русском?
Хотя, если честно, эти симуляторы, что-то не внушают мне доверия... ИМХО... Переубедите.
Go to the top of the page
 
+Quote Post
Petka
сообщение Jan 3 2006, 11:01
Сообщение #193


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

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



почему в проге "слейв2" не обрабатываете события $00 и $F8 ? я же говорил что это делать необходимо, иначе шина зависает. не наступайте на мои грабли.
Go to the top of the page
 
+Quote Post
bodja74
сообщение Jan 3 2006, 11:51
Сообщение #194


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Ну как не работает на макетке ?У меня же работает.
Посмотрите инициализацию стека,правильно ли указали вектор прерывания.
В меге32 они могут быть по другому расположены(не смотрел)Все делал под мегу8
Поставте еще паузу у мастера перед инициализацией,возможнослейв позже стартует после включения питания


ПРОТЕУС мною ценится не только из из за симулятора,может многие упускают ,но это по факту
среда разработки.
На нем можно писать программы,составлять проверять на симуляторе принципиальные схемы и экспортировать их в графические форматы со списками элементов,на месте развести печатку с
автотрассировкой и вручную,поддерживает не только AVR но и PIC ,МОТОРОЛА,80с51,80с52
и другие,на все это есть компиллеры.
Кроме того запустить симулятор можно не только с исходника но и с прошивки+МНОГО,МНОГО
одновремено симулируемых контроллеров.(лично проверял пять,больше не нужно было)

Коротче с этой проге можно полностью собрать весь проект со всей необходимой документацией.
А это все весьма удобно.

Естествено не забываю и про макетку,с этого начинал,правда теперь уже прошиваю реже
так как оперативно можно проверить ПРОТЕУСОМ.

Petka
Ну Вы мне скажите зачем слейву проверять промежуточное значение F8,если оно имеет место
когда TWIN=0, а если TWIN=0 то и прерывания нет ,а если пошло то F8 там и не пахнет.
Тоже и по $00 ,если ошибка на шине слейв ничего не определит,а если определит он все равно не
сможет ничего сделать.
Если эти проверки нужны то только для мастера,он заведует шиной и решает что с ней делать.
Go to the top of the page
 
+Quote Post
James D.
сообщение Jan 3 2006, 14:27
Сообщение #195


Местный
***

Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466



Нашел две версии: Proteus 6.5 SP5 (16.52 Mb) и Proteus 6.7 sp 3 (21.59 Mb).
М-да, многовато качать-то... Да еще если и демо окажется, то совсем будет круто...

Сообщение отредактировал James D. - Jan 3 2006, 14:37
Go to the top of the page
 
+Quote Post

19 страниц V  « < 11 12 13 14 15 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 10:42
Рейтинг@Mail.ru


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