Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
user75
3 / 3 / 0
Регистрация: 13.05.2012
Сообщений: 90
1

Работа с AT24/AT24xx на асме

06.07.2013, 23:14. Просмотров 2225. Ответов 8
Метки нет (Все метки)

нужен код работы с внешней памятью, на ассемблере по i2c (twi), либо библиотека (Си не предлагайте пожалуйста )
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2013, 23:14
Ответы с готовыми решениями:

STM8. ST Visual Develop. Работа с AT24 на асме
необходим код для работы с внешней памятью AT24 на ассемблере, если у кого то что то есть,...

Морфинг на Асме
Нужно реализировать прогу для морфинга изображение, при которой одно изображение плавно переходит в...

Вставка на асме
подскажите пожалуйста, как вот это правильно написать на асме: mov ah,data^ mov...

ошибка в асме
не могу найти ошибку :(( вычисляет не правильно в коде асма... #include "stdafx.h" #include...

Переписать на асме код Си. e^x
помогите с программой. Нужно зделать вставку на ассемблере в СИ код. Вставка должна выполнять...

8
raxp
10193 / 6575 / 493
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
07.07.2013, 10:55 2
for ATMega88:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
; Продцедуры для работы с I2C.
; Автор - Lpa
; [url]http://radioelektr.ru/[/url]
 
;=========================================================================
IIC_Start:
; Отправка стартовой посылки
; Регистры не трогает!
 
push temp; Ныкаем в стек temp
 
OUTI_OP TWCR,1<<TWINT|1<<TWSTA|1<<TWEN; Отправляем стартовую посылку
 
rcall iic_wait; Ожидаем, пока передатчик выполнит ЭКШН
 
pop temp; Достаём temp
 
ret; Выход из подпрограммы
 
 
;=========================================================================
IIC_Stop:
; Отправка стоповой посылки
; Регистры не страдают
 
push temp; Ныкаем в стек temp
 
OUTI_OP TWCR,1<<TWINT|1<<TWEN|1<<TWSTO; Отправляем стоповую посылку
 
pop temp; Достаём temp
 
ret; Выход из подпрограммы
 
;=========================================================================
iic_recieve: 
; Приём байта.
; Принятый байт помещается в temp
 
OUTI_OP TWCR,1<<TWINT|1<<TWEN|1<<TWEA; Настраиваем передатчик
    
rcall iic_wait; Ожидаем, пока передатчик выполнит ЭКШН
 
lds temp,TWDR; Считываем байт
 
ret; Выход из подпрограммы
 
;=========================================================================
iic_recieve_lst:
; Приём последнего байта (без ACK)
; Принятый байт помещается в temp
 
OUTI_OP TWCR,1<<TWINT|1<<TWEN; Настраиваем передатчик
    
rcall iic_wait; Ожидаем, пока передатчик выполнит ЭКШН
 
lds temp,TWDR; Считываем байт
 
ret; Выход из подпрограммы
 
;=========================================================================
iic_send: 
; Отправка байта
; Передаваемый байт помещается в temp
 
push temp; Ныкаем в стек temp
 
sts TWDR,temp; Отправляем байт
 
OUTI_OP TWCR,1<<TWINT|1<<TWEN; Настраиваем передатчик
    
rcall iic_wait; Ожидаем, пока передатчик выполнит ЭКШН
 
pop temp; Достаём temp
 
ret; Выход из подпрограммы
 
;=========================================================================
IIC_Wait:
; Ожидание готовности передатчика
 
lds temp,TWCR; Берём значение из TWCR и помещаем в temp
sbrs temp,TWINT; Пока флаг прерывания в 1 - идёт передача
rjmp PC-2
 
; Как только обнулился, выходим из подпрограммы
 
ret
for ATMega32 (ножкодрыгательство):
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
.include "m32Adef.inc"
.def     Temp=R16
.def     Temp1=R17
.cseg
.org 0
rjmp RESET ; Reset Handler
nop
reti; EXT_INT0 ; IRQ0 Handler
nop
reti; EXT_INT1 ; IRQ1 Handler
nop
reti; EXT_INT2 ; IRQ2 Handler
nop
reti; TIM2_COMP ; Timer2 Compare Handler
nop
reti; TIM2_OVF ; Timer2 Overflow Handler
nop
reti; TIM1_CAPT ; Timer1 Capture Handler
nop
reti; TIM1_COMPA ; Timer1 CompareA Handler
nop
reti; TIM1_COMPB ; Timer1 CompareB Handler
nop
reti; TIM1_OVF ; Timer1 Overflow Handler
nop
reti; TIM0_COMP ; Timer0 Compare Handler
nop
reti; TIM0_OVF ; Timer0 Overflow Handler
nop
reti; SPI_STC ; SPI Transfer Complete Handler
nop
reti; USORT_RXC ; USORT RX Complete Handler
nop
reti; USORT_UDRE ; UDR Empty Handler
nop
reti; USORT_TXC ; USORT TX Complete Handler
nop
reti; ADC ; ADC Conversion Complete Handler
nop
reti; EE_RDY ; EEPROM Ready Handler
nop
reti; ANA_COMP ; Analog Comparator Handler
nop
reti; TWI ; Two-wire Serial Interface Handler
nop
reti; SPM_RDY ; Store Program Memory Ready Handler
reset:
 
//////////////Инициализация стека ///////////////
ldi Temp,high(RamEnd)
out SPH,Temp
ldi Temp,low(RamEnd)
out SPL,Temp
ldi temp,255
out DDRA,temp  ; ПОРТ А настраиваем на выход....
///////////////////////////////////
 
rcall i2c_init //Инициализируем интерфейс i2c
rcall i2c_start // Отправляем стартовую посылку
ldi temp,0b10100000 //Отправляем адрес миросхемы
rcall i2c_send   
ldi temp,0  //Адрес с которого начинаем запись. 
rcall i2c_send
 
ldi temp1,0  //Обнуляем счётчик отправленых байт
cikl: //Цикл
cpi temp1,16 //Запишем 16 байт в микросхему
breq exitloop
 
mov temp,temp1 //Сначала нужно скопировать байт в регистр temp  
rcall i2c_send //Записываем байт
 
inc temp1   //Увеличиваем счётчик байтов на 1 
rjmp cikl
exitloop:  //конец цикла
rcall i2c_stop
 
rcall delay  //небольшая задержка 
 
rcall i2c_start // Отправляем стартовую посылку
ldi temp,0b10100000 //Адрес микросхемы
rcall i2c_send 
ldi temp,0x00 //Адрес ячейки памяти 
rcall i2c_send
rcall i2c_start //Повторный старт!
ldi temp,0b10100001 //Адрес микросхемы + БИТ ЧТЕНИЯ!
rcall i2c_send 
 
//Ну теперь просто читаем 16 раз и выводим данные в портА 
 
ldi temp1,0
cikl2:
cpi temp1,15
breq exitloop2
 
rcall i2c_recive
out PORTA,temp
rcall delay
inc temp1
rjmp cikl2
exitloop2:
 
rcall i2c_recive_last //Последний байт считаем при помощи i2c_recive_last
out PORTA,temp
rcall i2c_stop
 
 
///////////////Бесконечный цикл////////////////
Begin:
rjmp begin
///////////////////////////////////////////////
 
 
 
////////////////// ПРОЦЕДУРЫ РАБОТЫ С I2C //////////////////////
//////////////////  РАБОЧИЙ РЕГИСТР TEMP ///////////////////////
i2c_init: //Инициализация и2с
    ldi temp,5  
    out TWBR,temp
    ldi temp,(0<<TWPS1)|(0<<TWPS0)
    out TWSR,temp
ret
 
i2c_stop: //Отправляет стоповую посылку
    ldi temp, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
    out TWCR, temp
ret
 
i2c_start: //Передача стартовой посылки
    ldi temp, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
    out TWCR, temp
    wait1:
    in temp,TWCR
    sbrs temp,TWINT
    rjmp wait1
ret
 
 
i2c_recive_last: //Считать последний байт и записать в TEMP
    ldi temp, (1<<TWINT|1<<TWEN)
    out TWCR, temp
    wait3:
    in temp,TWCR
    sbrs temp,TWINT
    rjmp wait3
    in temp,TWDR
ret
 
i2c_recive: //Считывает байт и записывает его в TEMP 
    ldi temp, (1<<TWINT|1<<TWEN|1<<TWEA)
    out TWCR, temp
    wait4:
    in temp,TWCR
    sbrs temp,TWINT
    rjmp wait4
    in temp,TWDR
ret
 
i2c_send: //Будет передан байт из регистра TEMP
    out TWDR,temp
    ldi temp, (1<<TWINT)|(1<<TWEN)
    out TWCR, temp
    wait2:
    in temp,TWCR
    sbrs temp,TWINT
    rjmp wait2
ret
///////////////////////////////////////////////////////////////////////
 
 
 
 
 
////// Процедура задержки ////////
delay:
; ============================= 
;    delay loop generator 
;     1600000 cycles:
; ----------------------------- 
; delaying 1599999 cycles:
          ldi  R18, $F1
WGLOOP0:  ldi  R19, $0E
WGLOOP1:  ldi  R20, $9D
WGLOOP2:  dec  R20
          brne WGLOOP2
          dec  R19
          brne WGLOOP1
          dec  R18
          brne WGLOOP0
; ----------------------------- 
; delaying 1 cycle:
          nop
; ============================= 
ret
//////////////////////////////////////
1
user75
3 / 3 / 0
Регистрация: 13.05.2012
Сообщений: 90
08.07.2013, 15:03  [ТС] 3
а что есть в первом OUTI_OP?
я подразумеваю, это макрос, но описания самого макроса не вижу...

подскажите пожалуйста...

Добавлено через 54 минуты
что имеется ввиду: for ATMega32 (ножкодрыгательство):

то, что считанный код выводится в PORTA?


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

по поводу первого кода предполагаю, что где то еще кусок должен быть.... к автору на сайте обратился, пока молчит
0
user75
3 / 3 / 0
Регистрация: 13.05.2012
Сообщений: 90
09.07.2013, 14:10  [ТС] 4
1. проверял выход SPI

взял из даташита следующее:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SPI_MasterInit:
; Set MOSI and SCK output, all others input
ldi r17,(1<<DD_MOSI)|(1<<DD_SCK)
out DDR_SPI,r17
; Enable SPI, Master, set clock rate fck/16
ldi r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
out SPCR,r17
ret
SPI_MasterTransmit:
; Start transmission of data (r16)
out SPDR,r16
Wait_Transmit:
; Wait for transmission complete
sbis SPSR,SPIF
rjmp Wait_Transmit
ret
заменил на (для atmega169):

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SPI_MasterInit:
; Set MOSI and SCK output, all others input
ldi r17,(1<<PB2)|(1<<PB1) // делал и так: ldi r17,(1<<2)|(1<<1)
out DDRB,r17
; Enable SPI, Master, set clock rate fck/16
ldi r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
out SPCR,r17
ret
SPI_MasterTransmit:
; Start transmission of data (r16)
out SPDR,r16
Wait_Transmit:
; Wait for transmission complete
in r19, SPSR // проверяю SPIF
sbrs r19, SPIF // делал и так sbrs r19, 7
rjmp Wait_Transmit
ret

DDRB настраивал 0b00000111, 0b00000110, просто вызывал SPI_MasterInit никак, всегда тишина, смотрел в протеусе

2. что необходимо:

подключить память AT25XX №1 по железному и №2 по софтовому SPI (проверял пока только по железному)

вызывал в следующем порядке:
Assembler
1
2
3
rcall SPI_MasterInit
rcall SPI_MasterTransmit
rcall Wait_Transmit
почему нет ret в SPI_MasterTransmit не понял, но и так и с ним пробовал...

помогите пожалуйста разобраться

Добавлено через 1 минуту
нет последовательности на выходе SPI, нет SCK, максимум первый фронт и все, в этом положении остается...

Добавлено через 37 секунд
так же нет SS, делал программно, все равно не передается байт

Добавлено через 4 часа 26 минут
пока добился передачи данных по SPI:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
; инициализация портов и установка регистров
 
 .equ SS = PB0;
 .equ MOSI = PB2;
 .equ MISO = PB3;
 .equ SCK = PB1;
 
 
;........................
 
            clr r16;
            ldi r16, (1<<SPE)+(1<<MSTR);
            out SPCR, r16;
            clr r16;
            ldi r16, (1<<SCK)+(1<<MOSI)+(1<<SS);
            out DDRB, r16
            sbi PORTB, SS;
;........................
 
;вызов подпрограммы с тестовыми данными
 
            ldi r16, 0b01010101
            rcall  SPI_MasterTransmit
 
;........................
 
 
;рабочая подпрограмма
 
 
    SPI_MasterTransmit:
    ; Start transmission of data (r16)
    sbi PORTB, SS;
    cbi PORTB, SS; инициализация SS
 
    out SPDR,r16
    Wait_Transmit:
    ; Wait for transmission complete
    in r19, SPSR // проверяю SPIF
    sbrs r19,SPIF 
    rjmp Wait_Transmit
    sbi PORTB, SS; останов SS
    ret
 
;........................
0
09.07.2013, 14:10
user75
3 / 3 / 0
Регистрация: 13.05.2012
Сообщений: 90
11.07.2013, 05:12  [ТС] 5
так и есть, спасибо Lpa за ответ, вот недостающий макрос:

Assembler
1
2
3
4
.macro OUTI_OP
ldi r16,@1
sts @0,r16
.endm

так же от него же ответ по софтовому I2C, написатель так же Lpa, за что ему так же отдельное большое спасибо, все хорошо прокомментировано:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
;==========================================================================
;Библитека для реализации программного I2C в микроконтроллерах AVR
;Автор Lpa.
;[url]http://radioelektr.ru[/url]
;Библиотека написана на основе Атмеловскоко апноута 
;AVR300: Software I2C™ Master Interface
;==========================================================================
 
.equ SCL = PC5;Пин, который будет являться SCL
.equ SDA = PC4;Пин, который будет являться SDA
 
.equ IIC_PORT = PORTC;Порт, на котором будет I2C
.equ IIC_DDR =  DDRC; DDR, на котором будет I2C
.equ IIC_PIN =  PINC; Пин, на котором будет I2C
;==========================================================================
;Настройка портов. Просто вызывается в области инициализации и всё.
 
iic_init:
CBI IIC_PORT,SDA
CBI IIC_PORT,SCL
 
CBI IIC_DDR,SDA
CBI IIC_DDR,SCL
ret
 
;==========================================================================
;Данная подпрограмма делает старт на линии
;Никаких параметров она не имеет - 
;просто вызовите её и на линии будет старт
 
iic_start:
 
cbi IIC_DDR,SDA
cbi IIC_DDR,SCL
rcall iic_delay
 
SBIS IIC_PIN,SDA
rjmp iic_start
SBIS IIC_PIN,SCL
rjmp iic_start
 
SBI IIC_DDR,SDA
CBI IIC_PORT,SDA
rcall iic_delay
SBI IIC_DDR,SCL
CBI IIC_PORT,SCL
rcall iic_delay
 
ret
;==========================================================================
;Эта операция стопа. Также - параметров нет, посто вызываете и всё.
 
iic_stop:
 
sbi IIC_DDR,SDA
sbi IIC_DDR,SCL
rcall iic_delay
 
cbi IIC_DDR,SCL
rcall iic_delay
cbi IIC_DDR,SDA
rcall iic_delay
clc
sbic IIC_DDR,SDA
ret
sbic IIC_DDR,SCL
ret
sec
 
ret
;==========================================================================
;Отправка 1 байта. Байт помещяется в R16 перед вызовом пробцедуры.
;Если после этой операции флаг C регистра SREG в 1 - ACK не было,
;А если в 0 - был принят ACK.
 
iic_send:
push r16
push r17
 
ldi r17,8
 
x42:
    rol r16 
    brcs se1
    sbi IIC_DDR,SDA
    rjmp del_wr
 
se1:
 
   cbi IIC_DDR,SDA
 
del_wr:
 
  cbi IIC_DDR,SCL
  rcall iic_delay
  sbi IIC_DDR,SCL
  rcall iic_delay
  dec r17
  brne x42
  cbi IIC_DDR,SDA
  rcall iic_delay
  cbi IIC_DDR,SCL
  rcall iic_delay
 
 
  clc
  sbic IIC_PIN,SDA
  sec
 
  sbi IIC_DDR,SCL
  rcall iic_delay
 
 
  pop r17
  pop r16
 
ret
 
;==========================================================================
;Приём байта. Принятый байт помещяется в R16. ACK генерируется, если
;перед отправкой был установлен флаг T регистра SREG.
 
iic_recieve:
 
ldi r16,1
 
loop_read:
 
   sbi IIC_DDR,SCL
   cbi IIC_DDR,SDA
   rcall iic_delay
   cbi IIC_DDR,SCL
   rcall iic_delay
 
   clc
 
   sbic IIC_PIN,SDA
   sec
   rol r16
   brcc loop_read
 
   sbi IIC_DDR,SCL
   rcall iic_delay
   brts se0
   cbi IIC_DDR,SDA
   rjmp rd_
 
se0:
  sbi IIC_DDR,SDA
 
rd_:
 
  clc
  rcall iic_delay
  cbi IIC_DDR,SCL
  rcall iic_delay
 
ret
 
;========================================================================
;Задержка
 
iic_delay:
push r16
ldi r16,5
 
iic_lp:
dec r16
brne iic_lp
 
pop r16
 
ret
еще раз спасибо.
1
user75
3 / 3 / 0
Регистрация: 13.05.2012
Сообщений: 90
11.07.2013, 05:48  [ТС] 6
вот что получилось по работе по SPI с AT25F512:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
;инициализация аппаратного SPI для atmega169
;................................
 .include "m169Pdef.inc"
 
 .equ SS = PB0;
 .equ MOSI = PB2;
 .equ MISO = PB3;
 .equ SCK = PB1;
;................................
                        clr r16;
            ldi r16, (1<<SPE)+(1<<MSTR);
            out SPCR, r16;
            clr r16;
            ldi r16, (1<<SCK)+(1<<MOSI)+(1<<SS)+(1<<MISO);
            out DDRB, r16
;................................
 
            sbi PORTB, SS;подтягиваю SS, запрет обмена SPI
            cbi PORTB, SS;опускаю в ноль SS- разрешаю обмен по SPI с выбранным устройством, SS- выбирает устройство.
            ldi r16, 0x06;команда разрешения записи (конкретно для AT25F512), отправлять каждый раз перед командой записи
            rcall  SPI_MasterTransmit;передаю команду в память по SPI
            sbi PORTB, SS;подтягиваю SS- окончание передачи
            rcall delay_max;задержка
            //sbi PORTB, SS;
            cbi PORTB, SS;опускаю в ноль SS- разрешаю обмен по SPI с выбранным устройством, 
            ;далее будет произведена запись во flash память по тестовому адресу :0x000001, будет записан тестовый байт 0b01010101
            ldi r16, 0x02;команда запись!
            rcall  SPI_MasterTransmit;вызов подпрограммы передачи по SPI
            ldi r16, 0;первый байт адреса, все байты вместе с командой, адресом и данными передаются слитно за одну операцию, 
            ;то есть будет передано число: 0b0000001000000000000000000000000101010101, то есть 40 бит (5 байт)
            rcall  SPI_MasterTransmit;вызов подпрограммы передачи по SPI
            ldi r16, 0;второй байт адреса
            rcall  SPI_MasterTransmit;вызов подпрограммы передачи по SPI
            ldi r16, 0x01;третий байт адреса
            rcall  SPI_MasterTransmit;вызов подпрограммы передачи по SPI
            ldi r16, 0b01010101;запись тестового байта 0b01010101
            rcall  SPI_MasterTransmit;вызов подпрограммы передачи по SPI
            sbi PORTB, SS;окончание передачи - SS вверх
            rcall delay_max;задержка
            cbi PORTB, SS;разрешение передачи
            ldi r16, 0x03;передача опрации чтения
            rcall  SPI_MasterTransmit;вызов подпрограммы передачи по SPI
            ldi r16, 0;первый байт адреса
            rcall  SPI_MasterTransmit;
            ldi r16, 0;второй байт адреса
            rcall  SPI_MasterTransmit;
            ldi r16, 0x01;третий байт адреса, собственно получился адрес, по которому мы записывали тестовый байт: адрес: 0b000000000000000000000001, 
            ;байт 0b01010101, итого передаваемое число для чтения по этому адресу: 0b000000110000000000000000000000000000000
            rcall  SPI_MasterTransmit;
            ldi r16, 0;передача любого не значащего байта в память, для того чтобы обменять содержимое регистра флэша, 
            ;запрошенного по указанному адресу и поместить его в устройство инициатор, то есть в МК
            rcall  SPI_MasterTransmit;вызов подпрограммы передачи по SPI
            sbi PORTB, SS;поднимаем SS- завершение передачи
            in r16, SPDR;читаем принятые данные из SPDR
            out PORTF, r16;для демонстрации вывожу полученные данные в PORTF
            rcall delay_max;задержка, если планируем дальше общаться с этим же устройством по SPI, надо дать успеть переварить полученное в AT25F512
спасибо за книжку Юрию Ревичу. (revich.lib.ru)

Добавлено через 4 минуты
чуть не забыл, сама подпрограмма передачи:

Assembler
1
2
3
4
5
6
7
8
9
    SPI_MasterTransmit:
    ; Start transmission of data (r16)
    out SPDR,r16;
    Wait_Transmit:
    ; Wait for transmission complete
    in r19, SPSR // проверяю SPIF
    sbrs r19,SPIF 
    rjmp Wait_Transmit
    ret
все это для аппаратного SPI, чем пользоваться думаю удобнее, это мое мнение.
0
Voland_
1672 / 1059 / 101
Регистрация: 04.01.2010
Сообщений: 3,594
13.07.2013, 22:39 7
хотел добавить, что в CV AVR есть файлик I2C.h с хидерами к такой софтверной библиотечке на асме. В старой версии (1.хх) их можно было найти среди файлов IDE, соответственно выдрать готовое решение. Работает очень просто и вполне прилично.
Ну, и стоит ли говорить еще, что это софтверное решение, когда как в АВР есть нормальный хардверный I2C?
1
user75
3 / 3 / 0
Регистрация: 13.05.2012
Сообщений: 90
14.07.2013, 01:17  [ТС] 8
atmega169 i2c по-моему нет, а как настроить usi для работы с i2c пока не понял

Добавлено через 24 минуты
если не трудно, скиньте файлик i2c.h

Добавлено через 38 секунд
пока пишу свой
0
Voland_
1672 / 1059 / 101
Регистрация: 04.01.2010
Сообщений: 3,594
14.07.2013, 10:20 9
user75, в хидере нет ничего полезного - там только сказано какие дефайны нужны для привязки к конкретным пинам порта. А вот в асмовом файле есть. Установите версию CV AVR 1.хх и поищите среди файлов папки INC или ASM - точно не помню. У меня установлена CV AVR 2.xx, а в ней уже лежат только объектные файлы, исходников нет.
0
14.07.2013, 10:20
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2013, 10:20

Проект на асме в Eclipse
Коллеги, подкажите, как можно в Eclipse писать прошивку под AVR на голом асме? Отдельные функции я...

Логические операции на асме.
Дан массив из 5 байт. Рассматривая его как массив из 8 пятиразрядных слов, найти “исключающее или”...

Рекурсивный фильтр на асме
Добрый день! Подскажите пожалуйста, как наиболее эффективно реализовать на интеловском ассемблере...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru