Писать ассеблерные вставки для узких мест. И вылизывать, вылизывать, вылизывать.alex38779 писал(а):Как повысить быстродействие кода.
7 сегментный индикатор + 74hc595 + atmega 8
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Docendo discimus
- Реклама
- alex38779
- Потрогал лапой паяльник
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
- Контактная информация:
Re: 7 сегментный индикатор + 74hc595 + atmega 8
С ассмом у меня туговато. Но можно попробовать...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;
}
}- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: 7 сегментный индикатор + 74hc595 + atmega 8
глазами пока смотрим.alex38779 писал(а):Как на такое смотрите?
оно бы все нормально, но ощущение такое, что у вас последовательно вызываются f_rele_1() ... f_rele_4() - какой смысл в конечном автомате?
чтобы работало так, как вы написали, переменная status должна быть объявлена static
лично я противник кнопок в прерываниях, но каждому охота наступать на собственные грабли...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: 7 сегментный индикатор + 74hc595 + atmega 8
без static похоже будет только f_rele_1();
- alex38779
- Потрогал лапой паяльник
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
- Контактная информация:
Re: 7 сегментный индикатор + 74hc595 + atmega 8
С этим разобрался)
Подскажите совместимый мк с атмегой 8? Боюсь памяти не хватит мне...
Подскажите совместимый мк с атмегой 8? Боюсь памяти не хватит мне...
- Реклама
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: 7 сегментный индикатор + 74hc595 + atmega 8
168/328 по ножкам совместимы.
- alex38779
- Потрогал лапой паяльник
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
- Контактная информация:
Re: 7 сегментный индикатор + 74hc595 + atmega 8
потихоньку пилю код... и возникают вопросы. будет много константных значений, то есть настройки которыми можно будет восстановить устройство к изначальной настройке. где их лучше хранить в eeprom либо объявить как константы?
- alex38779
- Потрогал лапой паяльник
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
- Контактная информация:
Re: 7 сегментный индикатор + 74hc595 + atmega 8
столкнулся с такой ошибкой в протеусе, шлю данные на 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);
}Код: Выделить всё
SPCR = 0b01110011;- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: 7 сегментный индикатор + 74hc595 + atmega 8
вывод SS на выход настроен?
- alex38779
- Потрогал лапой паяльник
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
- Контактная информация:
Re: 7 сегментный индикатор + 74hc595 + atmega 8
вот схема

настройка порта
настройка порта
Код: Выделить всё
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);- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: 7 сегментный индикатор + 74hc595 + atmega 8
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.
- alex38779
- Потрогал лапой паяльник
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
- Контактная информация:
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Блин что бы я без Вас делал Олег)oleg110592 писал(а):SS это PB2 настроен похоже на вход, из документации:
-
Serhio
- Прорезались зубы
- Сообщения: 249
- Зарегистрирован: Вс авг 15, 2010 20:42:44
- Откуда: Тюмень
- Контактная информация:
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Здравствуйте. Подскажите пожалуйста следующие:
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 в единицу?
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 в единицу?
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: 7 сегментный индикатор + 74hc595 + atmega 8
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) позиций влево.
2. Тут не совсем понял вопроса, так как толком не увидел разницы.
UCSRB=(1<<RXEN)|(1<<TXEN) - это не только значит выставить биты RXEN и TXEN в единицу. Это ещё и устанавливает в 0 другие биты этого регистра
А вот в случае UCSRB |= (1<<RXEN)|(1<<TXEN) затрагиваются только эти два бита.
3. (3<<UCSZ0) = это не умножение на 8. Это сдвиг числа 3 (0b00000011) на UCSZ0 (=1) позиций влево.
-
Serhio
- Прорезались зубы
- Сообщения: 249
- Зарегистрирован: Вс авг 15, 2010 20:42:44
- Откуда: Тюмень
- Контактная информация:
Re: 7 сегментный индикатор + 74hc595 + atmega 8
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 ?
Прошу прощения за занудство)))
Тут возникло еще больше вопросов.
1. Откуда нам известно, что "UCSZ0 =1", а не 0 ?
2. Тогда 1<<RXEN - это сдвиг числа 1 на RXEN позиций влево ? или это не так?
3. Равносильна ли запись "... (3<<UCSZ0)" этой - "...(1<<UCSZ0)I(1<<UCSZ1)". Как я понимаю это так сделали для сокращения записи в регистр UCSRC ?
Прошу прощения за занудство)))
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: 7 сегментный индикатор + 74hc595 + atmega 8
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) равносильна, два бита рядом - почему бы и нет
/* 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) равносильна, два бита рядом - почему бы и нет
-
Serhio
- Прорезались зубы
- Сообщения: 249
- Зарегистрирован: Вс авг 15, 2010 20:42:44
- Откуда: Тюмень
- Контактная информация:
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Теперь все понятно))
Спасибо большое за ответы)))
.
Спасибо большое за ответы)))
- alex38779
- Потрогал лапой паяльник
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
- Контактная информация:
Re: 7 сегментный индикатор + 74hc595 + atmega 8
Понадобилось мне преобразовать переменные. uint8_t в uint16_t.
Пишу на си. А там вычитал про этот способ (тип)переменная. Т.е. (uint16_t)data . Будет ли так работать?
Есть функция которая принимает аргумент uint16, а мне нужно передать uint8 в нее. Или функция пережуют без преобразования?
Пишу на си. А там вычитал про этот способ (тип)переменная. Т.е. (uint16_t)data . Будет ли так работать?
Есть функция которая принимает аргумент uint16, а мне нужно передать uint8 в нее. Или функция пережуют без преобразования?
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: 7 сегментный индикатор + 74hc595 + atmega 8
не хочу создавать новую тему, поэтому спрошу здесь, тем более похожая тема.
Есть регистр 74НС595. Если я у него вывод ST_CP тупо при разводке платы посажу (подтяну) к плюсу сразу. А данные буду слать на него как обычно, будет работать?
Почему спрашиваю? Потому что у меня на данный момент не пашет. Думаю где ошибку искать.
З.Ы. Уже подумал на этот вывод сделать цепь начального сброса при включении, как на РЕЗЕТ у АВР.
Похоже нашел... Без защелки действительно работать не хочет.
Есть регистр 74НС595. Если я у него вывод ST_CP тупо при разводке платы посажу (подтяну) к плюсу сразу. А данные буду слать на него как обычно, будет работать?
Почему спрашиваю? Потому что у меня на данный момент не пашет. Думаю где ошибку искать.
З.Ы. Уже подумал на этот вывод сделать цепь начального сброса при включении, как на РЕЗЕТ у АВР.
Станислав


