Писать ассеблерные вставки для узких мест. И вылизывать, вылизывать, вылизывать.alex38779 писал(а):Как повысить быстродействие кода.
7 сегментный индикатор + 74hc595 + atmega 8
Docendo discimus
- Реклама
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
С ассмом у меня туговато. Но можно попробовать...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;
}
}глазами пока смотрим.alex38779 писал(а):Как на такое смотрите?
оно бы все нормально, но ощущение такое, что у вас последовательно вызываются f_rele_1() ... f_rele_4() - какой смысл в конечном автомате?
чтобы работало так, как вы написали, переменная status должна быть объявлена static
лично я противник кнопок в прерываниях, но каждому охота наступать на собственные грабли...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
С этим разобрался)
Подскажите совместимый мк с атмегой 8? Боюсь памяти не хватит мне...
Подскажите совместимый мк с атмегой 8? Боюсь памяти не хватит мне...
- Реклама
168/328 по ножкам совместимы.
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
потихоньку пилю код... и возникают вопросы. будет много константных значений, то есть настройки которыми можно будет восстановить устройство к изначальной настройке. где их лучше хранить в eeprom либо объявить как константы?
Константы объявите как константы.
Docendo discimus
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
столкнулся с такой ошибкой в протеусе, шлю данные на 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;- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
вот схема

настройка порта
настройка порта
Код: Выделить всё
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);- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
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.
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
Блин что бы я без Вас делал Олег)oleg110592 писал(а):SS это PB2 настроен похоже на вход, из документации:
Здравствуйте. Подскажите пожалуйста следующие:
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 в единицу?
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) позиций влево.
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 ?
Прошу прощения за занудство)))
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
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) равносильна, два бита рядом - почему бы и нет
Теперь все понятно))
Спасибо большое за ответы)))
.
Спасибо большое за ответы)))
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
Понадобилось мне преобразовать переменные. uint8_t в uint16_t.
Пишу на си. А там вычитал про этот способ (тип)переменная. Т.е. (uint16_t)data . Будет ли так работать?
Есть функция которая принимает аргумент uint16, а мне нужно передать uint8 в нее. Или функция пережуют без преобразования?
Пишу на си. А там вычитал про этот способ (тип)переменная. Т.е. (uint16_t)data . Будет ли так работать?
Есть функция которая принимает аргумент uint16, а мне нужно передать uint8 в нее. Или функция пережуют без преобразования?
не хочу создавать новую тему, поэтому спрошу здесь, тем более похожая тема.
Есть регистр 74НС595. Если я у него вывод ST_CP тупо при разводке платы посажу (подтяну) к плюсу сразу. А данные буду слать на него как обычно, будет работать?
Почему спрашиваю? Потому что у меня на данный момент не пашет. Думаю где ошибку искать.
З.Ы. Уже подумал на этот вывод сделать цепь начального сброса при включении, как на РЕЗЕТ у АВР.
Похоже нашел... Без защелки действительно работать не хочет.
Есть регистр 74НС595. Если я у него вывод ST_CP тупо при разводке платы посажу (подтяну) к плюсу сразу. А данные буду слать на него как обычно, будет работать?
Почему спрашиваю? Потому что у меня на данный момент не пашет. Думаю где ошибку искать.
З.Ы. Уже подумал на этот вывод сделать цепь начального сброса при включении, как на РЕЗЕТ у АВР.
Станислав


