Перейти к содержанию

igor_ryzhov

Members
  • Постов

    16
  • Зарегистрирован

  • Посещение

Информация

  • Пол
    Мужчина
  • Город
    Харьков

Электроника

  • Стаж в электронике
    3-5 лет
  • Сфера радиоэлектроники
    Микроконтроллеры
  • Оборудование
    Mastech MY64, Siglent sds1102cml

Посетители профиля

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

Достижения igor_ryzhov

Новичок

Новичок (1/14)

  • 10 постов на форуме
  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

4

Репутация

  1. Keil имеет ограничение по объему кода 32 кб в бесплатной версии. Есть еще visualGdb, платный. На торрентах можно найти все.
  2. Если рэле маломощное, то транзистор любой маломощный п-н-п диод 1н4007 и т. п.
  3. биты, отвечающие за настройку делителя таймера 1
  4. Можно установить TCCR1B |=(1 << CS12)|(1 << CS10); // :1024; OCR1A = 46875, при f_clk = 8000000гц. Но при этом будет небольшая погрешность, так как 800000/1024 = 7812.5, либо использовать дополнительную переменную для подсчета количества переполнений таймера при меньшем делителе таймера, либо понизить тактовую частоту контроллера
  5. Частоту шим-а можно настроить только с помощью делителя таймера, ну или использовать программный шим.
  6. 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);
  7. подключил так: MOSI -> MISO MISO -> MOSI, не работает((
  8. сейчас буду тестить..
  9. подтянул резистором на 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
  10. направление указывается с помощью регистра DDRB
  11. я читал про пин ss что нужно подтягивать резистором к питанию, но не придал значения. Попробую так сделать, вдруг в этом дело..
  12. PORTB&=~(1<<SS) - в других проектах так пишу, всегда работает может не правильно подключил модуль? подключил модуль так: МК---------------Радиомодуль MOSI ---------->MOSI MISO----------->MISO SCK------------>sck ss--------------->csn PC0---------------се PC2---------------irq
  13. ну функции чтения и записи 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); Или так нельзя?
×
×
  • Создать...