-
Постов
16 -
Зарегистрирован
-
Посещение
Информация
-
Пол
Мужчина
-
Город
Харьков
Электроника
-
Стаж в электронике
3-5 лет
-
Сфера радиоэлектроники
Микроконтроллеры
-
Оборудование
Mastech MY64, Siglent sds1102cml
Посетители профиля
Блок последних пользователей отключён и не показывается другим пользователям.
Достижения igor_ryzhov
-
Keil имеет ограничение по объему кода 32 кб в бесплатной версии. Есть еще visualGdb, платный. На торрентах можно найти все.
-
Если рэле маломощное, то транзистор любой маломощный п-н-п диод 1н4007 и т. п.
-
Можно так
-
биты, отвечающие за настройку делителя таймера 1
-
7812*6сек = 46872
-
Можно установить TCCR1B |=(1 << CS12)|(1 << CS10); // :1024; OCR1A = 46875, при f_clk = 8000000гц. Но при этом будет небольшая погрешность, так как 800000/1024 = 7812.5, либо использовать дополнительную переменную для подсчета количества переполнений таймера при меньшем делителе таймера, либо понизить тактовую частоту контроллера
-
Частоту шим-а можно настроить только с помощью делителя таймера, ну или использовать программный шим.
- 2 ответа
-
1
-
uint8_t spi_writeread(uint8_t data) { SPDR = data; while((SPSR & (1<<SPIF)) == 0); return SPDR; } uint8_t mirf_read_register(uint8_t reg) { PORTB &=~(1 << SS); spi_writeread(R_REGISTER | reg); uint8_t result = spi_writeread(NOP); PORTB |= (1 << SS); return result; } void mirf_write_register(uint8_t reg, uint8_t value) { PORTB &=~(1 << SS); spi_writeread(W_REGISTER | reg); spi_writeread(value); PORTB |= (1 << SS); } int main(void) { SPCR = (1 << SPE) | (1 << MSTR); // режим 0, мастер, частота 1/4 от частоты ЦП DDRC |= (1<<CE); DDRC &=~(1<<IRQ); DDRB |= (1<<SCK)|(1<<MOSI)|(1<<SS)|(1<<PB1); DDRB &=~(1<<MISO); PORTB |= (1<<SS); mirf_write_register(RF_CH, 25); if((mirf_read_register(RF_CH) == 25)) { PORTB |= (1<<PB1); } while(1) { } } заработало!!! Попытаюсь найти ошибку у себя в коде Всем спасибо за помощь!!!) ошибка была здесь: вместо while (SPSR & (1 << SPIF)); нужно было написать while((SPSR & (1<<SPIF)) == 0);
-
подключил так: MOSI -> MISO MISO -> MOSI, не работает((
-
сейчас буду тестить..
-
подтянул резистором на 220 ои, все равно не записывается регистр.. DDRB |= (1<<SCK)|(1<<MOSI)|(1<<SS)|(1<<PB1); в 1 сообщении полный код со всеми настройками портов если написать так, то светодиод включается: write_register(RF_CH, 25); if(!(read_register(RF_CH) == 25)) { PORTB |= (1<<PB1); } соответственно в регистре явно не 25
-
направление указывается с помощью регистра DDRB
-
я читал про пин ss что нужно подтягивать резистором к питанию, но не придал значения. Попробую так сделать, вдруг в этом дело..
-
PORTB&=~(1<<SS) - в других проектах так пишу, всегда работает может не правильно подключил модуль? подключил модуль так: МК---------------Радиомодуль MOSI ---------->MOSI MISO----------->MISO SCK------------>sck ss--------------->csn PC0---------------се PC2---------------irq
-
ну функции чтения и записи 1 байта в Вашем примере точно такие как и у меня. По прежнему не работает ничего. uint8_t read_register(uint8_t address) //чтение байта из оз, address -адрес байта { address = address | R_REGISTER; PORTB &=~(1 << SS); //Прижимаем вывод CSN к земле, тем самым сообщаем о начале обмена данных. SPDR = address; while (SPSR & (1 << SPIF));//ожидаем когда освободится SPI для последующей записи байта if (!(address == STATUS)) { SPDR = NOP; while (SPSR & (1 << SPIF)); } PORTB |= (1 << SS);//Вывод CSN(SS) МК к питанию, обмен данных завершен. return SPDR; } void write_register(uint8_t address, uint8_t data) //адрес регистра,что пишем в регистр. { address = address | W_REGISTER; //накладываем маску PORTB &=~(1 << SS); SPDR = address; while (SPSR & (1 << SPIF)); SPDR = data; while (SPSR & (1 << SPIF)); address = SPDR; //это для сброса флага SPIF PORTB |= (1 << SS); } Это в Вашем примере: u08 spi_writeread(u08 data) { SPDR = data; while((SPSR & (1<<SPIF)) == 0); return SPDR; } u08 mirf_read_register(u08 reg) // чтение 1 байта { mirf_CSN_lo; spi_writeread(R_REGISTER | (REGISTER_MASK & reg)); u08 result = spi_writeread(NOP); mirf_CSN_hi; return result; } void mirf_write_register(u08 reg, u08 value) // запись 1 байта { mirf_CSN_lo; spi_writeread(W_REGISTER | (REGISTER_MASK & reg)); spi_writeread(value); mirf_CSN_hi; } единственно не пойму, для чего в этой строчке REGISTER_MASK spi_writeread(W_REGISTER | (REGISTER_MASK & reg)); если можно написать так: spi_writeread(W_REGISTER | reg); Или так нельзя?