Atmega8, spi, pwm
- Сообщения: 24
- Зарегистрирован: Пн фев 15, 2016 17:33:36
Atmega8 работает по spi с модулем nrf24. Думал использовать ШИМ 1го таймера, освободил ноги рв1 и рв2. А не работает, потом думаю просто высокий уровень на этих ногах установить, а нету его. Инициализацию nrf24 убрал, уровень на рв1 и 2 поднять получается. Spi и ШИМ вместе не выйдет использовать?
- Реклама
[uquote="Bald_79",url="/forum/viewtopic.php?p=3868535#p3868535"]Atmega8 работает по spi с модулем nrf24. Думал использовать ШИМ 1го таймера, освободил ноги рв1 и рв2. А не работает[/uquote]
Если использовать свою библиотеку для nrf24 по SPI то использования ШИМ таймера1 проблем не должно возникать. Если сторонняя библиотека для nrf24 по SPI, то её придётся править (в плане использования вывода SS - РВ2).
Если использовать свою библиотеку для nrf24 по SPI то использования ШИМ таймера1 проблем не должно возникать. Если сторонняя библиотека для nrf24 по SPI, то её придётся править (в плане использования вывода SS - РВ2).
- Сообщения: 24
- Зарегистрирован: Пн фев 15, 2016 17:33:36
[uquote="Самсусамыч",url="/forum/viewtopic.php?p=3868592#p3868592"][uquote="Bald_79",url="/forum/viewtopic.php?p=3868535#p3868535"]Atmega8 работает по spi с модулем nrf24. Думал использовать ШИМ 1го таймера, освободил ноги рв1 и рв2. А не работает[/uquote]
Если использовать свою библиотеку для nrf24 по SPI то использования ШИМ таймера1 проблем не должно возникать. Если сторонняя библиотека для nrf24 по SPI, то её придётся править (в плане использования вывода SS - РВ2).[/uquote]
Да в тот то и дело что своя, ноги 1и2 свободны. 2 перенёс и передатчик работает с перенесенным ss
Если использовать свою библиотеку для nrf24 по SPI то использования ШИМ таймера1 проблем не должно возникать. Если сторонняя библиотека для nrf24 по SPI, то её придётся править (в плане использования вывода SS - РВ2).[/uquote]
Да в тот то и дело что своя, ноги 1и2 свободны. 2 перенёс и передатчик работает с перенесенным ss
Значит не корректно написан код… ищите ошибку… не может таймер-счётчик1 влиять на работу аппаратного SPI. Так и аппаратный SPI не может влиять на работу таймера1.
- Реклама
- Сообщения: 24
- Зарегистрирован: Пн фев 15, 2016 17:33:36
[uquote="Самсусамыч",url="/forum/viewtopic.php?p=3868788#p3868788"]Значит не корректно написан код… ищите ошибку… не может таймер-счётчик1 влиять на работу аппаратного SPI. Так и аппаратный SPI не может влиять на работу таймера1.[/uquote]
Ну до работы таймера дело даже не дошло. Просто если прошла инициализация передатчика по spi то тупо высокий уровень на В1 и В2 не установлен. Если закомеетить инициализацию то диодики горят
Ну до работы таймера дело даже не дошло. Просто если прошла инициализация передатчика по spi то тупо высокий уровень на В1 и В2 не установлен. Если закомеетить инициализацию то диодики горят
Вы модуль SPI настраиваете сами или используете какую-то библиотеку? При самостоятельной настройки модуля SPI никаких проблем не должно возникать… если используется библиотека, то необходимо посмотреть, в каком состоянии она настраивает вывод SS (РВ2) – на вход или на выход. В случае SPI Master (а это как раз Ваш случай), SS – как правило используется как выход… а значит и ШИМ должен работать… к тому же что настройка модуля SPI никак не затрагивает вывод РВ1 который по Вашим заявлениям так же не работает… «значит дело не в бабине…» (С). 
- Сообщения: 24
- Зарегистрирован: Пн фев 15, 2016 17:33:36
[uquote="Самсусамыч",url="/forum/viewtopic.php?p=3868981#p3868981"]… «значит дело не в бабине…» (С).
[/uquote]
установить 1 получилось. при инициализации порта spi была строка
DDRB |= ((1<<PORTB0)|(1<<PORTB3)|(1<<PORTB5));
после инициализации
DDRB |= ((1<<PORTB1)|(1<<PORTB2));
если все это записать в одну строку то работает. нельзя в коде несколько раз ноги определять?
установить 1 получилось. при инициализации порта spi была строка
DDRB |= ((1<<PORTB0)|(1<<PORTB3)|(1<<PORTB5));
после инициализации
DDRB |= ((1<<PORTB1)|(1<<PORTB2));
если все это записать в одну строку то работает. нельзя в коде несколько раз ноги определять?
[uquote="Bald_79",url="/forum/viewtopic.php?p=3869694#p3869694"]нельзя в коде несколько раз ноги определять?[/uquote]
Можно хоть 100500 раз… главное с пониманием и расстановкой.
Можно хоть 100500 раз… главное с пониманием и расстановкой.
- Сообщения: 24
- Зарегистрирован: Пн фев 15, 2016 17:33:36
[uquote="Самсусамыч",url="/forum/viewtopic.php?p=3869695#p3869695"][uquote="Bald_79",url="/forum/viewtopic.php?p=3869694#p3869694"]нельзя в коде несколько раз ноги определять?[/uquote]
Можно хоть 100500 раз… главное с пониманием и расстановкой.
[/uquote]
подскажите где я туплю?
так на ногах PB1 и PB2 высокого уровня нет
а так есть
Можно хоть 100500 раз… главное с пониманием и расстановкой.
подскажите где я туплю?
так на ногах PB1 и PB2 высокого уровня нет
Спойлер
Код: Выделить всё
int main(void)
{
//инициализация spi и ножек nrf24
DDRB |= ((1<<PORTB0)|(1<<PORTB3)|(1<<PORTB5)); //ножки SPI , CSN, MOSI, SCK
DDRD |= (1<<PORTD6); //на выход CE
DDRB &= ~(1<<PORTB4); //MISO на вход
DDRD &= ~(1<<PORTD7); //IRQ на вход
PORTB &= ~((1<<PORTB3)|(1<<PORTB5)); //низкий уровень MOSI, SCK
PORTB |= (1<<PORTB0); //высокий уровень CSN (0 - запись и чтение)
PORTD |= (1<<PORTD6); //высокий уровень CE (прием-0, передача-1)
PORTD |= (1<<PORTD7); // подтяжка IRQ к 1
SPCR = ((1<<SPE)|(1<<MSTR)|(1<<SPR0));//включим шину, объявим ведущим
//передача байта в nrf24
PORTB &= ~(1<<PORTB0); //низкий уровень CSN
SPDR = 0x20;
while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся
SPDR = 0x3E;
while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся
data = SPDR;
PORTB |= (1<<PORTB0); //высокий уровень CSN
//попытка установить высокий уровень
DDRB|=((1<<PORTB1)|(1<<PORTB2));
PORTB |=((1<<PORTB1)|(1<<PORTB2));
while (1)
{
}
}Спойлер
Код: Выделить всё
int main(void)
{
//инициализация spi и ножек nrf24
DDRB |= ((1<<PORTB0)|(1<<PORTB3)|(1<<PORTB5)|(1<<PORTB1)|(1<<PORTB2)); //ножки SPI , CSN, MOSI, SCK
DDRD |= (1<<PORTD6); //на выход CE
DDRB &= ~(1<<PORTB4); //MISO на вход
DDRD &= ~(1<<PORTD7); //IRQ на вход
PORTB &= ~((1<<PORTB3)|(1<<PORTB5)); //низкий уровень MOSI, SCK
PORTB |= (1<<PORTB0); //высокий уровень CSN (0 - запись и чтение)
PORTD |= (1<<PORTD6); //высокий уровень CE (прием-0, передача-1)
PORTD |= (1<<PORTD7); // подтяжка IRQ к 1
SPCR = ((1<<SPE)|(1<<MSTR)|(1<<SPR0));//включим шину, объявим ведущим
//передача байта в nrf24
PORTB &= ~(1<<PORTB0); //низкий уровень CSN
SPDR = 0x20;
while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся
SPDR = 0x3E;
while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся
data = SPDR;
PORTB |= (1<<PORTB0); //высокий уровень CSN
//попытка установить высокий уровень
PORTB |=((1<<PORTB1)|(1<<PORTB2));
while (1)
{
}
}- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
Что-то вы недоговариваете. Судя по отсутствующему определению переменной data, видать не весь код показан. Не могут эти 2 кода сильно по-разному работать.
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
Естественно, так как включен модуль SPI.Bald_79 писал(а):подскажите где я туплю?
так на ногах PB1 и PB2 высокого уровня нет
Вы сконфигурировали вывод SS PORTB2 на выход до включения модуля SPI, теперь вы можите им управлять на свое усмотрение.Bald_79 писал(а):а так есть
- Сообщения: 24
- Зарегистрирован: Пн фев 15, 2016 17:33:36
[uquote="NStorm",url="/forum/viewtopic.php?p=3869729#p3869729"]Что-то вы недоговариваете. Судя по отсутствующему определению переменной data, видать не весь код показан. Не могут эти 2 кода сильно по-разному работать.[/uquote]
вот только этого не хватает. понимаю что немного странный код, но именно это я загружаю. в одном случае светодиоды горят, в другом нет. эту выдержку я из основного сделал попроще, что бы понять почуму так происходит
Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
char data;
int main(void)
{
//инициализация spi и ножек nrf24- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
[uquote="Dimon456",url="/forum/viewtopic.php?p=3869733#p3869733"]Естественно, так как включен модуль SPI.[/uquote]
Это где вы такое прочитали?
[uquote="Dimon456",url="/forum/viewtopic.php?p=3869733#p3869733"]Вы сконфигурировали вывод SS PORTB2 на выход до включения модуля SPI, теперь вы можите им управлять на свое усмотрение.[/uquote]
А такое где вы прочитали? И как это влияет на PORTB1 тогда?
Добавлено after 2 minutes 18 seconds:
[uquote="Bald_79",url="/forum/viewtopic.php?p=3869734#p3869734"]вот только этого не хватает. понимаю что немного странный код, но именно это я загружаю. в одном случае светодиоды горят, в другом нет. эту выдержку я из основного сделал попроще, что бы понять почуму так происходит[/uquote]
Соберите мегу на макетке. К SPI ничего не подключайте, просто пусть ноги в воздухе болтаются, но код оставьте. На PB1, PB2 будет высокий уровень? Вот прям должен.
Добавлено after 4 minutes 43 seconds:
Это конечно не настоящая мега, а симуляция в протеусе, но всё работает как надо.

Это где вы такое прочитали?
[uquote="Dimon456",url="/forum/viewtopic.php?p=3869733#p3869733"]Вы сконфигурировали вывод SS PORTB2 на выход до включения модуля SPI, теперь вы можите им управлять на свое усмотрение.[/uquote]
А такое где вы прочитали? И как это влияет на PORTB1 тогда?
Добавлено after 2 minutes 18 seconds:
[uquote="Bald_79",url="/forum/viewtopic.php?p=3869734#p3869734"]вот только этого не хватает. понимаю что немного странный код, но именно это я загружаю. в одном случае светодиоды горят, в другом нет. эту выдержку я из основного сделал попроще, что бы понять почуму так происходит[/uquote]
Соберите мегу на макетке. К SPI ничего не подключайте, просто пусть ноги в воздухе болтаются, но код оставьте. На PB1, PB2 будет высокий уровень? Вот прям должен.
Добавлено after 4 minutes 43 seconds:
Это конечно не настоящая мега, а симуляция в протеусе, но всё работает как надо.
- Вложения
-
- m8-spi+pb12.png
- (4.26 КБ) 573 скачивания
Чёт мистика какая-то((
Лично я бы попробовал:
1. Отключить оптимизацию;
2. Заменить буржуйские записи типа PORTB2, PORTB3 на правоверные 2 и 3.
3. Пройтись симулятором.
4. Бухнуть и приступить с утра.
Больше вариантов неимею.
Лично я бы попробовал:
1. Отключить оптимизацию;
2. Заменить буржуйские записи типа PORTB2, PORTB3 на правоверные 2 и 3.
3. Пройтись симулятором.
4. Бухнуть и приступить с утра.
Больше вариантов неимею.
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
NStorm писал(а):Это где вы такое прочитали?
В даташите частично указано. Остальное из личного опыта.NStorm писал(а):А такое где вы прочитали?
А вот это ни знаю. Возможно надо было не такNStorm писал(а):И как это влияет на PORTB1 тогда?
Код: Выделить всё
//попытка установить высокий уровень
DDRB|=((1<<PORTB1)|(1<<PORTB2));
PORTB |=((1<<PORTB1)|(1<<PORTB2));Код: Выделить всё
//попытка установить высокий уровень
DDRB|=(1<<PORTB1);
PORTB |=(1<<PORTB1);Спойлер
Код: Выделить всё
char data;
int main(void)
{
//инициализация spi и ножек nrf24
DDRB |= ((1<<PORTB0)|(1<<PORTB3)|(1<<PORTB5)|(1<<PORTB1)|(1<<PORTB2)); //ножки SPI , CSN, MOSI, SCK
DDRD |= (1<<PORTD6); //на выход CE
DDRB &= ~(1<<PORTB4); //MISO на вход
DDRD &= ~(1<<PORTD7); //IRQ на вход
PORTB &= ~((1<<PORTB3)|(1<<PORTB5)); //низкий уровень MOSI, SCK
PORTB |= (1<<PORTB0); //высокий уровень CSN (0 - запись и чтение)
PORTD |= (1<<PORTD6); //высокий уровень CE (прием-0, передача-1)
PORTD |= (1<<PORTD7); // подтяжка IRQ к 1
TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x40;
OCR1BH=0x00;
OCR1BL=0x80;
SPCR = ((1<<SPE)|(1<<MSTR)|(1<<SPR0));//включим шину, объявим ведущим
//передача байта в nrf24
PORTB &= ~(1<<PORTB0); //низкий уровень CSN
SPDR = 0x20;
while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся
SPDR = 0x3E;
while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся
data = SPDR;
PORTB |= (1<<PORTB0); //высокий уровень CSN
while (1)
{
}
}[uquote="Dimon456",url="/forum/viewtopic.php?p=3869733#p3869733"]
Каким образом включённый SPI может влиять на уровень вывода РВ2 а тем более на РВ1? Аппаратная часть SPI не может автоматически менять уровень на выводе SS (PB2).
из даташита:
Естественно, так как включен модуль SPI.[/uquote]Bald_79 писал(а):подскажите где я туплю?
так на ногах PB1 и PB2 высокого уровня нет
При конфигурации регистров SPI, вывод SS (РВ2) необходимо установить на выход и можно менять уровень на данном выводе в любой момент времени… в случае ТС это будет производить тааймер1 (в режиме работы ШИМ).19.3.2 Master Mode
When the SPI is configured as a Master (MSTR in SPCR is set), the user can determine the direction of the SS pin.
If SS is configured as an output, the pin is a general output pin which does not affect the SPI system.
Мастер режим
Если SPI настроен как мастер (установлен бит MSTR в SPCR), то пользователь
может задать желаемое направление вывода SS. Если SS настроен на выход, то он работает как обычная линия цифрового вывода и не оказывает влияния на систему SPI.
- Сообщения: 24
- Зарегистрирован: Пн фев 15, 2016 17:33:36
[uquote="NStorm",url="/forum/viewtopic.php?p=3869779#p3869779"]Соберите мегу на макетке. К SPI ничего не подключайте, просто пусть ноги в воздухе болтаются, но код оставьте. На PB1, PB2 будет высокий уровень? Вот прям долж[/uquote]
Чистота эксперимента пропадет. Тогда передачи по spi не дождусь
Чистота эксперимента пропадет. Тогда передачи по spi не дождусь
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
[uquote="Dimon456",url="/forum/viewtopic.php?p=3869833#p3869833"]В даташите частично указано. Остальное из личного опыта.[/uquote]
Нигде там такого не указано. Наоборот прямым текстом сказано про ~SS.
Добавлено after 2 minutes 47 seconds:
[uquote="Bald_79",url="/forum/viewtopic.php?p=3869837#p3869837"]Чистота эксперимента пропадет. Тогда передачи по spi не дождусь[/uquote]
Чистота эксперимента как раз-таки повышается. Я вон выше вывод привел. Всё должно работать. Варианта только 2 - где-то что-то у вас на плате мешает установится высокому уровню, или же вы что-то напутали. Ну еще маловероятный вариант паленой атмеги, которая таким странным образом глючит.
Нигде там такого не указано. Наоборот прямым текстом сказано про ~SS.
Добавлено after 2 minutes 47 seconds:
[uquote="Bald_79",url="/forum/viewtopic.php?p=3869837#p3869837"]Чистота эксперимента пропадет. Тогда передачи по spi не дождусь[/uquote]
Чистота эксперимента как раз-таки повышается. Я вон выше вывод привел. Всё должно работать. Варианта только 2 - где-то что-то у вас на плате мешает установится высокому уровню, или же вы что-то напутали. Ну еще маловероятный вариант паленой атмеги, которая таким странным образом глючит.
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
Ну а что тогда пытаетесь вогнать?NStorm писал(а):Нигде там такого не указано. Наоборот прямым текстом сказано про ~SS.
Код: Выделить всё
//попытка установить высокий уровень
DDRB|=((1<<PORTB1)|(1<<PORTB2));
PORTB |=((1<<PORTB1)|(1<<PORTB2));


