Страница 3 из 3
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Добавлено: Пт июл 31, 2015 10:26:13
pyzhman
alex38779 писал(а):Как повысить быстродействие кода.
Писать ассеблерные вставки для узких мест. И вылизывать, вылизывать, вылизывать.
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Добавлено: Пт июл 31, 2015 11:06:22
alex38779
pyzhman писал(а):
Писать ассеблерные вставки для узких мест.
С ассмом у меня туговато. Но можно попробовать...
Еще вопрос. Читал про конечные автоматы, у меня будут релюхи которые будут зависеть от многих условий... Хочу сделать обработку их вот так:
В кейсах по очереди будут проверятся состояние релюх и делаться действия если нужно..
Код: Выделить всё
void use_rele(){
uint8_t status = 0;
switch(status){
case 0: /*rele 1*/
f_rele_1();
status = 1;
break;
case 1: /*rele 2*/
f_rele_2();
status = 2;
break;
case 2: /*rele 3*/
f_rele_3();
status = 3;
break;
case 3: /*rele 4*/
f_rele_4();
status = 0;
break;
}
}
И запихнуть это в главный цикл. кнопки и индикация будут обрабатываться в прерывании. Как на такое смотрите?

Re: 7 сегментный индикатор + 74hc595 + atmega 8
Добавлено: Пт июл 31, 2015 11:23:06
ARV
alex38779 писал(а):Как на такое смотрите?
глазами пока смотрим.
оно бы все нормально, но ощущение такое, что у вас последовательно вызываются f_rele_1() ... f_rele_4() - какой смысл в конечном автомате?
чтобы работало так, как вы написали, переменная status должна быть объявлена static
лично я противник кнопок в прерываниях, но каждому охота наступать на собственные грабли...
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Добавлено: Пт июл 31, 2015 13:32:19
oleg110592
без static похоже будет только f_rele_1();
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Добавлено: Пн авг 03, 2015 05:52:02
alex38779
С этим разобрался)
Подскажите совместимый мк с атмегой 8? Боюсь памяти не хватит мне...
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Добавлено: Пн авг 03, 2015 06:13:58
WiseLord
168/328 по ножкам совместимы.
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Добавлено: Пн авг 03, 2015 10:04:37
alex38779
потихоньку пилю код... и возникают вопросы. будет много константных значений, то есть настройки которыми можно будет восстановить устройство к изначальной настройке. где их лучше хранить в eeprom либо объявить как константы?
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Добавлено: Вт авг 04, 2015 17:02:10
pyzhman
Константы объявите как константы.
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Добавлено: Ср авг 26, 2015 08:46:01
alex38779
столкнулся с такой ошибкой в протеусе, шлю данные на 595 регистр, контроллер atmega8. появляется иногда и неожиданно. что делать с ней? или это осяк шпротеуса?
код отправки такой, убирал задержки, не помогло, ставил разные то же самое.
Код: Выделить всё
void send_spi(uint8_t n12, uint8_t n21){
PORTB &= ~(1<<0);
SPDR = n21;
while(!(SPSR &(1<<SPIF)));
_delay_us(200);
SPDR = n12;
while(!(SPSR &(1<<SPIF)));
_delay_us(200);
PORTB |= (1<<0);
}
настройка спи
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Добавлено: Ср авг 26, 2015 12:20:55
oleg110592
вывод SS на выход настроен?
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Добавлено: Ср авг 26, 2015 18:16:03
alex38779
вот схема
настройка порта
Код: Выделить всё
DDRB |= (1<<0) | (0<<1) | (0<<2) | (1<<3) | (1<<4) | (1<<5) | (0<<6) | (0<<7);
PORTB |= (1<<1) | (1<<2) | (1<<6) | (1<<7);
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Добавлено: Ср авг 26, 2015 18:33:03
oleg110592
SS это PB2 настроен похоже на вход, из документации:
Master Mode When the SPI is configured as a Master (MSTR in SPCR is set), the user can determine the
direction of the SSpin.
If SSis configured as an output, the pin is a general output pin which does not affect the SPI
system. Typically, the pin will be driving the SSpin of the SPI Slave.
If SSis configured as an input, it must be held high to ensure Master SPI operation. If the SSpin
is driven low by peripheral circuitry when the SPI is configured as a Master with the SSpin
defined as an input, the SPI system interprets this as another Master selecting the SPI as a
Slave and starting to send data to it.
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Добавлено: Ср авг 26, 2015 18:39:17
alex38779
oleg110592 писал(а):SS это PB2 настроен похоже на вход, из документации:
Блин что бы я без Вас делал Олег)

Спасибо, заработало)
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Добавлено: Чт авг 27, 2015 12:18:30
Serhio
Здравствуйте. Подскажите пожалуйста следующие:
1). Строчка
SPCR= 0<<SPIE | 1<<SPE | 1<<DORD | 1<<MSTR | 0<<CPOL | 0<<CPHA | 1<<SPR1 | 1 <<SPR0;
Можно ли её просто записать так? Эти строки эквиваленты? Или в этих сложностях что-то кроется

?
SPCR= 0b01110011
2). В даташите на мегу8 есть пример
UCSRB=(1<<RXEN)|(1<<TXEN);
Если я правильно понял – это значит выставить бит RXEN в регистре UCSRB в единицу?!
И - бит ТXEN в регистре UCSRB в единицу?! Тогда почему не записывается это так:
UCSRB I=(1<<RXEN)|(1<<TXEN); (со значком логического поразрядного или)
3). Так же в даташите есть строка
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
Что значит (3<<UCSZ0 )??? Нашел, что это эквивалентно умножению на 8. Можно ли поподробнее про эту строчку? Умножить весь регистр UCSRC на 8 (на 0000 1000) ? Тогда зачем установка URSEL и TXEN в единицу?
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Добавлено: Чт авг 27, 2015 12:50:40
WiseLord
1. Записать SPCR= 0b01110011 можно, но эта запись плоха тем, что непонятно, что происходит, и для разъяснения нужно лезть в даташит, смотреть описание битов регистра SPCR. Тогда как первый вариант сразу же даёт понять, какой бит во что устанавливается. Но и в первом варианте надо бы скобки расставить.
2. Тут не совсем понял вопроса, так как толком не увидел разницы.
UCSRB=(1<<RXEN)|(1<<TXEN) - это не только значит выставить биты RXEN и TXEN в единицу. Это ещё и устанавливает в 0 другие биты этого регистра
А вот в случае UCSRB |= (1<<RXEN)|(1<<TXEN) затрагиваются только эти два бита.
3. (3<<UCSZ0) = это не умножение на 8. Это сдвиг числа 3 (0b00000011) на UCSZ0 (=1) позиций влево.
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Добавлено: Чт авг 27, 2015 16:16:29
Serhio
3. (3<<UCSZ0) = это не умножение на 8. Это сдвиг числа 3 (0b00000011) на UCSZ0 (=1) позиций влево.
Тут возникло еще больше вопросов.
1. Откуда нам известно, что "UCSZ0 =1", а не 0 ?
2. Тогда 1<<RXEN - это сдвиг числа 1 на RXEN позиций влево ? или это не так?
3. Равносильна ли запись "... (3<<UCSZ0)" этой - "...(1<<UCSZ0)I(1<<UCSZ1)". Как я понимаю это так сделали для сокращения записи в регистр UCSRC ?
Прошу прощения за занудство)))
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Добавлено: Чт авг 27, 2015 16:47:02
oleg110592
1) из хидера iom8.h
/* UCSRC */
#define URSEL 7
#define UMSEL 6
#define UPM1 5
#define UPM0 4
#define USBS 3
#define UCSZ1 2
#define UCSZ0 1
#define UCPOL 0
2) так, из того же хидера видно чему равен RXEN: #define RXEN 4
3) равносильна, два бита рядом - почему бы и нет
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Добавлено: Чт авг 27, 2015 18:07:45
Serhio
Теперь все понятно))
Спасибо большое за ответы)))

.
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Добавлено: Ср сен 09, 2015 13:09:18
alex38779
Понадобилось мне преобразовать переменные. uint8_t в uint16_t.
Пишу на си. А там вычитал про этот способ (тип)переменная. Т.е. (uint16_t)data . Будет ли так работать?
Есть функция которая принимает аргумент uint16, а мне нужно передать uint8 в нее. Или функция пережуют без преобразования?
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Добавлено: Вт сен 22, 2015 13:52:27
СКАЗОЧНИК
не хочу создавать новую тему, поэтому спрошу здесь, тем более похожая тема.
Есть регистр 74НС595. Если я у него вывод ST_CP тупо при разводке платы посажу (подтяну) к плюсу сразу. А данные буду слать на него как обычно, будет работать?
Почему спрашиваю? Потому что у меня на данный момент не пашет. Думаю где ошибку искать.
З.Ы. Уже подумал на этот вывод сделать цепь начального сброса при включении, как на РЕЗЕТ у АВР.

Похоже нашел... Без защелки действительно работать не хочет.