у меня тогда такой вопрос, кто или что, устанавливает разрядность адреса?
не пойму как цитаты вставлять правильно..
правильно ли я понимаю:Gudd-Head писал(а):2 байта. Просто старший байт адреса ОЗУ полагается равным нулю.Gmp писал(а):так а сколько же?
1. так и естьGmp писал(а):правильно ли я понимаю:Gudd-Head писал(а): 2 байта. Просто старший байт адреса ОЗУ полагается равным нулю.
1. адреса регистровой памяти записываются числом в 1 байт- с размером информации по каждому адресу в 1 байт
2. адреса SRAM - 2 байта, с размером информации по каждому адресу в 1 байт
3. FLASH- ячейки адресов не имеют, но в каждую из них нужно записать 2 байта информации.. или имеют адреса?
4. EEPROM - аналогично FLASH?
простите за терминалогию
Да как хочешь, так и делай. Хочешь одновременно, хочешь - последовательно. А усложнит или нет - реализуй один программный канал, и сам поймёшьzvykov писал(а):а это сильно усложнит код программы??? и еще можно ли будет иметь функцию одновременной записи данных во все микрухи, или если они будут на разных шинах то писать в них одновременно нельзя, сильно прошу не пинать за вопросы, еще только учусь программированию.
Программный порт I2C выглядит примерно так:zvykov писал(а):а это сильно усложнит код программы?
Код: Выделить всё
//------------------------------ Константы: ----------------------------------
#define I2C_QP_DELAY 2.5 //I2C quarter period delay 2.5 us
#define I2C_HP_DELAY 5.0 //I2C half period delay 5 us
//--------------------- Генерация условия "Старт": ---------------------------
void I2C_Start(void)
{
Port_SDA_0; //force SDA low
Delay_us(I2C_QP_DELAY); //quarter period delay
}
//----------------------- Передача байта по I2C: -----------------------------
bool I2C_Wr(char b)
{
bool ask = 0;
for(char i = 0; i < 8; i++)
{
Port_SCL_0; //force SCL low
if(b & 0x80)
Port_SDA_Z; //release SDA
else Port_SDA_0; //force SDA low
b = b << 1;
Delay_us(I2C_HP_DELAY); //half period delay
Port_SCL_1; //release SCL
Delay_us(I2C_HP_DELAY); //half period delay
}
Port_SCL_0; //force SCL low
__delay_cycles(2); //delay
Port_SDA_Z; //release SDA
Delay_us(I2C_HP_DELAY); //half period delay
Port_SCL_1; //release SCL
Delay_us(I2C_HP_DELAY); //half period delay
if(!Pin_SDA) ask = 1; //receive ASK
Delay_us(I2C_HP_DELAY); //half period delay
return(ask);
}
//-------------------- Чтение байта данных по I2C + ACK: ---------------------
char I2C_RdAck(void)
{
char data;
for(char i = 0; i < 8; i++)
{
Port_SCL_0; //force SCL low
__delay_cycles(2); //delay
Port_SDA_Z; //release SDA
Delay_us(I2C_HP_DELAY); //half period delay
Port_SCL_1; //release SCL
Delay_us(I2C_HP_DELAY); //half period delay
data = data << 1; //shift data
if(Pin_SDA) data |= 0x01; //input data bit
}
Port_SCL_0; //force SCL low
__delay_cycles(2); //delay
Port_SDA_0; //force SDA low (ASK=0)
Delay_us(I2C_QP_DELAY); //quarter period delay
Port_SCL_1; //release SCL
Delay_us(I2C_HP_DELAY); //half period delay
return(data);
}
//-------------------- Чтение байта данных по I2C + NAK: ---------------------
char I2C_RdNak(void)
{
char data;
for(char i = 0; i < 8; i++)
{
Port_SCL_0; //force SCL low
__delay_cycles(2); //delay
Port_SDA_Z; //release SDA
Delay_us(I2C_HP_DELAY); //half period delay
Port_SCL_1; //release SCL
Delay_us(I2C_HP_DELAY); //half period delay
data = data << 1; //shift data
if(Pin_SDA) data |= 0x01; //input data bit
}
Port_SCL_0; //force SCL low
Delay_us(I2C_HP_DELAY); //half period delay
Port_SCL_1; //release SCL
Delay_us(I2C_HP_DELAY); //half period delay
return(data);
}
//------------------------ Генерация условия "Стоп": -------------------------
void I2C_Stop(void)
{
Port_SCL_0; //force SCL low
__delay_cycles(2); //delay
Port_SDA_0; //force SDA low
Delay_us(I2C_HP_DELAY); //half period delay
Port_SCL_1; //release SCL
Delay_us(I2C_QP_DELAY); //quarter period delay
Port_SDA_Z; //release SDA
Delay_us(I2C_HP_DELAY); //half period delay
}
//----------------------------------------------------------------------------
Вот так на ассемблере (тут пример для DS1307, но работа практически полная - чтение/запись):Ничегонеработает писал(а):Программный порт I2C выглядит примерно так:zvykov писал(а):а это сильно усложнит код программы?
Код: Выделить всё
;=========================
; Работа с IIC
;=========================
iic_10clock: ; даёт 10 тактовых импульсов на линию
ldi rx1,10 ; для приведения в чувства slave'а
iic_10_1: ; после перезагрузки или подачи питания
pull_scl
rcall iic_delay
release_scl
dec rx1
brne iic_10_1
ret
;-------------------------------------------------------------------------------
iic_full_reset:
ldi XH,high(clock_buf) ; полный сброс часов
ldi XL,low(clock_buf)
ldi rx1,7
full_res1:
st X+,null
dec rx1
brne full_res1
rcall transmit_iic
rjmp reset
ret
;-------------------------------------------------------------------------------
iic_test_sda: ; проверка занятости SDA
clt ; устанавливает флаг Т если линия занята
sbis sda_pin,sda_bit
set
ret
;-------------------------------------------------------------------------------
iic_test_scl: ; проверка занятости SCL
clt ; устанавливает флаг Т если линия занята
sbis scl_pin,scl_bit
set
ret
;-------------------------------------------------------------------------------
iic_test2line: ; проверка занятости двух линий
rcall iic_test_sda ; если хоть одна занята, ставится флаг T
brtc iic_test2line0
ret
iic_test2line0:
rcall iic_test_scl
ret
;-------------------------------------------------------------------------------
iic_delay: ; простая задержка
ldi del,delay
i2c_delay0:
dec del
brne i2c_delay0
ret
;-------------------------------------------------------------------------------
iic_start: ; даёт на линию команду start
pull_sda
rcall iic_delay
pull_scl
rcall iic_delay
release_sda
ret
;-------------------------------------------------------------------------------
iic_stop: ; даёт на линию команду stop
pull_sda
rcall iic_delay
release_scl
rcall iic_delay
release_sda
ret
;-------------------------------------------------------------------------------
iic_check_ask: ; Проверяет сигнал ASK на линии
release_sda ; Если есть - ставит бит T
rcall iic_delay
release_scl
rcall iic_delay
rcall iic_test_sda
pull_scl
pull_sda
ret
;-------------------------------------------------------------------------------
transmit_iic: ; Передача 7-ми байтного буфера
ldi XH,high(clock_buf)
ldi XL,low(clock_buf)
rcall iic_test2line ; если хоть одна линия занята
brts iic_error0 ; выводится ошибка 0 и зацикливается
rcall iic_start ; даётся на линию start
ldi rx1,write1307adr ; ; передаётся адрес и команду на запись
rcall send_byte
clr rx1 ; адрес, с какого писать (ноль)
rcall send_byte
ldi rx9,7
tr_iic_0: ; пересылаем весь буфер
ld rx1, X+
rcall send_byte
dec rx9
brne tr_iic_0
rcall iic_stop ; отправляется stop на линию
ret
;-------------------------------------------------------------------------------
send_byte: ; отправка байта
; в rx1 должен быть пересылаемый байт
ldi rx2,8 ; обе линии в нуле
send_byte_0:
mov rx3,rx1
andi rx3,128 ; выделим старший бит.
breq send_byte_1 ; если он в нуле, оставляем линии как есть
release_sda ; иначе поднимаем SDA
send_byte_1:
rcall iic_delay
release_scl
rcall iic_delay
pull_scl
rcall iic_delay
pull_sda
lsl rx1
dec rx2
brne send_byte_0
rcall iic_delay ; Слушаем ASK. Если нет - ошибка 1
rcall iic_check_ask
brtc iic_error1
ret
#include <pic.h>К@Т писал(а):Начал изучать си,в мплаб впихнул компилятор без оганичения кода и получил следующую картину
Что я не так сделал?
тоже самое выдаётSoir писал(а):#include <pic.h>К@Т писал(а):Начал изучать си,в мплаб впихнул компилятор без оганичения кода и получил следующую картину
Что я не так сделал?
void main() {
}
А если на ошибку посмотреть, ничего не проясняется? Или нафиг не надо на них смотреть?Ещё есть какие-нибуть идеи?
Не понял вопросаploop писал(а):
Компилятор-то активирован?
Или ещё надо чтото делать чтобы его активировать?Запускаем HI-TECH_PICC_9.50_PL2.exe. Папка назначения «C:Program Files» + Извлечь. Происходит распаковка. После распаковки запускаем
C:\Program Files\HI-TECH Software\PICC\9.50\resources\PICC9.50PL2_REG.reg
и добавляем информацию в реестр. Далее запускаем конфигуратор
C:\Program Files\HI-TECH Software\PICC9.50\bin\MPLABConfig.exe
В окне указывается расположение папки C:\HTSOFT\MPLAB_toolsuites + Install . В следующем окне стоит галочка и предлагается сразу же запустить MPLAB IDE ; галочку оставляем и жмем Finish. Автоматически запускается оболочка MPLAB IDE.
Код: Выделить всё
DDRB = 0b00001010;
TCCR1A = 0b10100011;
TCCR1B = 0b00000001;
TCCR1C = 0;
TCCR1D = 0;
OCR1C = 0xFF;
Я не знаю, что за хренью вы пользуетесь, но он пишет явно, что не активирован. Дальше уж сами разбирайтесь. Или покупайте по честному.Не понял вопроса Я сделал так как в инструкции написано