Ср авг 26, 2020 13:30:21
посмотрел... оказалось, я даже участвовал в той теме... с 2008 года позабыл.Demiurg писал(а):Вот обсуждение, в топике ссылки. Ссылка 1, Ссылка 2.
Ср авг 26, 2020 13:52:57
Тяжелый случай.Demiurg писал(а):Убрал засветку.
void handle_commons_clr (void) {
u08 *p;
for (u08 i = 0; i < MAX_LED_INDS; i++)
{
p = commons_pins [i] .port;
*p &= (~commons_pins [i] .mask);
}
}
case 2:
if (handle_soft_timer (ST_PROC_7_SEGM_IND))
{
//handle_commons ();
//handle_segments ();
handle_commons_clr();
handle_segments ();
handle_commons ();
if (++cnt_commons >= MAX_LED_INDS) cnt_commons = 0;
}
break;
Ср авг 26, 2020 14:09:42
Ср авг 26, 2020 22:02:00
#include <avr/io.h>
#include <avr/interrupt.h>
typedef struct{
volatile uint8_t * port;
uint8_t and;
uint8_t or;
} seg_pin_t;
#define pn(p,b) {&PORT ## p, ~_BV(b), _BV(b)}
#define A _BV(0)
#define B _BV(1)
#define C _BV(2)
#define D _BV(3)
#define E _BV(4)
#define F _BV(5)
#define G _BV(6)
#define H _BV(7)
#define DIG0 (A+B+C+D+E+F)
#define DIG1 (B+C)
#define DIG2 (A+B+G+E+D)
#define DIG3 (A+B+C+D+G)
#define DIG4 (B+F+G+C)
#define DIG5 (A+F+G+C+D)
#define DIG6 (A+C+D+E+F+G)
#define DIG7 (A+B+C)
#define DIG8 (A+B+C+D+E+F+G)
#define DIG9 (A+B+C+D+F+G)
#define FLASH
const __flash uint8_t digs[10] = {DIG0, DIG1, DIG2, DIG3, DIG4, DIG5, DIG6, DIG7, DIG8, DIG9};
const FLASH seg_pin_t pins[8] = {
pn(B,0),
pn(C,0),
pn(D,0),
pn(B,2),
pn(C,2),
pn(D,2),
pn(B,4),
pn(C,4)
};
const FLASH seg_pin_t commons[4] = {
pn(D,1),
pn(D,4),
pn(B,1),
pn(C,1)
};
#define COM_CAT ((PIND & _BV(7)) == 0)
extern uint8_t data[4];
uint8_t scr[4] = {DIG5,DIG2,DIG3,DIG4};
ISR(TIMER0_OVF_vect){
static uint8_t com;
const FLASH seg_pin_t *p = commons+com;
if(COM_CAT)
*p->port |= p->or;
else
*p->port &= p->and;
if(++com >= 4) com = 0;
uint8_t d = scr[com];
if(!COM_CAT) d = ~d;
p = pins;
for(uint8_t i=0; i<8; i++, d>>=1){
*p->port = (*p->port & p->and) | (d & 1 ? p->or : 0);
p++;
}
p = commons+com;
if(COM_CAT)
*p->port &= p->and;
else
*p->port |= p->or;
}
int main(void){
DDRB = 255;
DDRC = 255;
DDRD = 0x7F;
PORTD = 0x80;
TCCR0 = 4;
TIMSK = _BV(TOIE0);
sei();
while(1);
}
Ср авг 26, 2020 23:07:43
Чт авг 27, 2020 20:27:00
все в одном файле, без наворотов, с магическими числами
Чт авг 27, 2020 21:30:24
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
typedef struct{
volatile uint8_t * port;
uint8_t and;
uint8_t or;
} seg_pin_t;
#define SCR_SZ 4
#define pn(p,b) {&PORT ## p, ~_BV(b), _BV(b)}
#define A _BV(0)
#define B _BV(1)
#define C _BV(2)
#define D _BV(3)
#define E _BV(4)
#define F _BV(5)
#define G _BV(6)
#define H _BV(7)
#define DIG0 (A+B+C+D+E+F)
#define DIG1 (B+C)
#define DIG2 (A+B+G+E+D)
#define DIG3 (A+B+C+D+G)
#define DIG4 (B+F+G+C)
#define DIG5 (A+F+G+C+D)
#define DIG6 (A+C+D+E+F+G)
#define DIG7 (A+B+C)
#define DIG8 (A+B+C+D+E+F+G)
#define DIG9 (A+B+C+D+F+G)
#define SYM1 (A+B+F+G)
#define SYM2 (C+D+E+G)
#define FLASH
const __flash uint8_t digs[10] = {DIG0, DIG1, DIG2, DIG3, DIG4, DIG5, DIG6, DIG7, DIG8, DIG9};
const FLASH seg_pin_t pins[8] = {
pn(B,0),
pn(C,0),
pn(D,0),
pn(B,2),
pn(C,2),
pn(D,2),
pn(B,4),
pn(C,4)
};
const FLASH seg_pin_t commons[SCR_SZ] = {
pn(D,1),
pn(D,4),
pn(B,1),
pn(C,1)
};
#define COM_CAT ((PIND & _BV(7)) == 0)
extern uint8_t data[4];
uint8_t scr[SCR_SZ] = {DIG5,DIG2,DIG3,DIG4};
ISR(TIMER0_OVF_vect){
static uint8_t com;
const FLASH seg_pin_t *p = commons+com;
if(COM_CAT)
*p->port |= p->or;
else
*p->port &= p->and;
if(++com >= SCR_SZ) com = 0;
uint8_t d = scr[com];
if(!COM_CAT) d = ~d;
p = pins;
for(uint8_t i=0; i<8; i++, d>>=1){
*p->port = (*p->port & p->and) | (d & 1 ? p->or : 0);
p++;
}
p = commons+com;
if(COM_CAT)
*p->port &= p->and;
else
*p->port |= p->or;
}
static void clr(void){
for(uint8_t i=0; i<SCR_SZ; i++){
scr[i] = 0;
}
}
int main(void){
DDRB = 255;
DDRC = 255;
DDRD = 0x7F;
PORTD = 0x80;
TCCR0 = 4;
TIMSK = _BV(TOIE0);
sei();
while(1){
for(uint8_t i=0; i<SCR_SZ; i++){
clr();
scr[i] = SYM1;
_delay_ms(200);
}
for(int8_t i=SCR_SZ-1; i >= 0; i--){
clr();
scr[i] = SYM2;
_delay_ms(200);
}
}
}
while(1){
for(uint8_t i=0; i<SCR_SZ; i++){
clr();
scr[i] = SYM1;
_delay_ms(200);
}
for(int8_t i=SCR_SZ-1; i >= 0; i--){
clr();
scr[i] = SYM2;
_delay_ms(200);
}
}
uint8_t tmp = scr[0];
scr[0]=scr[1];
scr[1]=scr[2];
scr[2]=scr[3];
scr[3]=tmp;
_delay_ms(200);
Чт авг 27, 2020 22:06:40
в же делали скрипты эффектов DIGISCRIPT, с его примитивным языком, неужели на Си, с его богатыми возможностями, не можете ничего придумать?!
Чт авг 27, 2020 23:38:29
volatile u08 *p;
// Отключение общего вывода.
p = commons_pins [cnt_commons] .port;
if (commons_level == HI)
*p &= commons_pins [cnt_commons] .and;
else
*p |= commons_pins [cnt_commons] .or;
if (++cnt_commons >= MAX_LED_INDS) cnt_commons = 0;
u08 a;
if (status == STATUS_EFFECTS)
a = dsp_buf [cnt_commons];
else
a = table_7_segm_char [dsp_buf [cnt_commons]];
if (segments_level != HI) a = ~a;
for (u08 i = 0; i < 8; i++, a >>= 1)
{
p = segments_pins [i] .port;
if (a & (1<<0))
*p |= segments_pins [i] .or;
else
*p &= segments_pins [i] .and;
}
// Включение общего вывода.
p = commons_pins [cnt_commons] .port;
if (commons_level == HI)
*p |= commons_pins [cnt_commons] .or;
else
*p &= commons_pins [cnt_commons] .and;
Пт авг 28, 2020 08:02:18
проблема засветки никак не связана с общими катодами или анодами, она связана с очередностью переключений пинов.Demiurg писал(а):Что значительно решило проблему засветку
IAR традиционно генерирует более оптимальный код.Demiurg писал(а):23.13 мкс
Пт авг 28, 2020 08:36:48
Пт авг 28, 2020 09:22:38
Пт авг 28, 2020 12:20:35
const FLASH char effect_1[][SCR_SZ]=
{ {A, 0, 0, 0},
{A, A, 0, 0},
{A, A, A, 0},
{A, A, A, A},
{0, A, A, A+B},
{0, 0, A, A+B+C},
{0, 0, 0, A+B+C+D},
{0, 0, D, B+C+D},
{0, D, D, C+D},
{D, D, D, D},
{E+D, D, D, 0},
{F+E+D, D, 0, 0},
{F+E+D, 0, 0, 0},
{F+E, 0, 0, 0},
{F, 0, 0, 0},
};
unsigned int sizeArray;
sizeArray = sizeof(effect_1)/(sizeof(char)*SCR_SZ);
clr();
for(int8_t a=0; a < 5; a++) // число повторов
for(int8_t i=0; i < sizeArray; i++){
scr[0] = effect_1[i][0];
scr[1] = effect_1[i][1];
scr[2] = effect_1[i][2];
scr[3] = effect_1[i][3];
_delay_ms(500);
}
Пт авг 28, 2020 12:37:34
Пт авг 28, 2020 12:51:26
Пт авг 28, 2020 12:57:13
Пт авг 28, 2020 13:25:11
обычные: PORTx объявлен, как volatile uint8_t, соответственно и указатель на него должен быть volatile uint8_t *.OKF писал(а):А какие причины "помыслить"?
Пт авг 28, 2020 22:56:25
Пт авг 28, 2020 23:05:48
Пт авг 28, 2020 23:15:43