помогите с индикацией
-
Demon123456789
- Первый раз сказал Мяу!
- Сообщения: 23
- Зарегистрирован: Вс янв 15, 2012 00:30:03
помогите с индикацией
Привет Усатым.. Помогите в чем я напортачила?
2 семисигментных индикатора
аттини2313
пб 0 пб 7 выходы
ПА0 и ПА1 сток но они не фурычат... в конце самом..
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
// LED 7 SEG Definitions and data
#define A_SEG (4) // 14 PB2
#define B_SEG (128) // 19 PB7
#define C_SEG (64) // 18 PB6
#define D_SEG (16) // 16 PB4
#define E_SEG (32) // 17 PB5
#define F_SEG (8) // 15 PB3
#define G_SEG (1) // 12 PB0
#define H_SEG (-2) // 13 PB1 - это не важно, и она работает норм
#define DIG_1 (char) ~(B_SEG+C_SEG)
#define DIG_2 (char) ~(A_SEG+B_SEG+G_SEG+E_SEG+D_SEG)
#define DIG_3 (char) ~(A_SEG+B_SEG+C_SEG+D_SEG+G_SEG)
#define DIG_4 (char) ~(B_SEG+C_SEG+G_SEG+F_SEG)
#define DIG_5 (char) ~(A_SEG+F_SEG+G_SEG+C_SEG+D_SEG)
#define DIG_6 (char) ~(A_SEG+C_SEG+D_SEG+E_SEG+F_SEG+G_SEG)
#define DIG_7 (char) ~(A_SEG+B_SEG+C_SEG)
#define DIG_8 (char) ~(A_SEG+B_SEG+C_SEG+D_SEG+E_SEG+F_SEG+G_SEG)
#define DIG_9 (char) ~(A_SEG+B_SEG+C_SEG+D_SEG+F_SEG+G_SEG)
#define DIG_0 (char) ~(A_SEG+B_SEG+C_SEG+D_SEG+E_SEG+F_SEG)
#define DIG_OFF (char) 255
char digits[] = {DIG_0, DIG_1, DIG_2, DIG_3, DIG_4,
DIG_5, DIG_6, DIG_7, DIG_8, DIG_9 };
char DISPLAY_value = 9; //значение которое будет отобр. всего от 00 до 99
char DIG_ONOFF = 0;
char DOTS_ONOFF = 0;
#define MAX_DIGITS 2 //Коллич цифр на дисплее 2
char IND_number = 0; //текущие цифры для отображения выводит с памяти норм.
#define DISPLAY_PORT PORTB
#define DISPLAY_DDR DDRB
#define DIGIT_PORT PORTA
#define DIGIT_DDR DDRA
Тему переместил в МК и ПЛИС.
ploop
2 семисигментных индикатора
аттини2313
пб 0 пб 7 выходы
ПА0 и ПА1 сток но они не фурычат... в конце самом..
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
// LED 7 SEG Definitions and data
#define A_SEG (4) // 14 PB2
#define B_SEG (128) // 19 PB7
#define C_SEG (64) // 18 PB6
#define D_SEG (16) // 16 PB4
#define E_SEG (32) // 17 PB5
#define F_SEG (8) // 15 PB3
#define G_SEG (1) // 12 PB0
#define H_SEG (-2) // 13 PB1 - это не важно, и она работает норм
#define DIG_1 (char) ~(B_SEG+C_SEG)
#define DIG_2 (char) ~(A_SEG+B_SEG+G_SEG+E_SEG+D_SEG)
#define DIG_3 (char) ~(A_SEG+B_SEG+C_SEG+D_SEG+G_SEG)
#define DIG_4 (char) ~(B_SEG+C_SEG+G_SEG+F_SEG)
#define DIG_5 (char) ~(A_SEG+F_SEG+G_SEG+C_SEG+D_SEG)
#define DIG_6 (char) ~(A_SEG+C_SEG+D_SEG+E_SEG+F_SEG+G_SEG)
#define DIG_7 (char) ~(A_SEG+B_SEG+C_SEG)
#define DIG_8 (char) ~(A_SEG+B_SEG+C_SEG+D_SEG+E_SEG+F_SEG+G_SEG)
#define DIG_9 (char) ~(A_SEG+B_SEG+C_SEG+D_SEG+F_SEG+G_SEG)
#define DIG_0 (char) ~(A_SEG+B_SEG+C_SEG+D_SEG+E_SEG+F_SEG)
#define DIG_OFF (char) 255
char digits[] = {DIG_0, DIG_1, DIG_2, DIG_3, DIG_4,
DIG_5, DIG_6, DIG_7, DIG_8, DIG_9 };
char DISPLAY_value = 9; //значение которое будет отобр. всего от 00 до 99
char DIG_ONOFF = 0;
char DOTS_ONOFF = 0;
#define MAX_DIGITS 2 //Коллич цифр на дисплее 2
char IND_number = 0; //текущие цифры для отображения выводит с памяти норм.
#define DISPLAY_PORT PORTB
#define DISPLAY_DDR DDRB
#define DIGIT_PORT PORTA
#define DIGIT_DDR DDRA
Тему переместил в МК и ПЛИС.
ploop
- Реклама
- coredumped
- Опытный кот
- Сообщения: 838
- Зарегистрирован: Вт апр 12, 2011 18:38:19
- Откуда: с Земли
Re: помогите с индикацией
Я ничего не понял с подключением индикатора. Опишите что к чему подключено и какого типа индикатор. В идеале нарисуйте схемку и разберемся.
Все будет только лучше, в крайнем случае - хуже.
-
Demon123456789
- Первый раз сказал Мяу!
- Сообщения: 23
- Зарегистрирован: Вс янв 15, 2012 00:30:03
Re: помогите с индикацией
Так схемку врятли в голове, могу дать в протосе но как все пишут Мы таки не пользуемся....coredumped писал(а):Я ничего не понял с подключением индикатора. Опишите что к чему подключено и какого типа индикатор. В идеале нарисуйте схемку и разберемся.
1 так Аттини 2313
2 обычная светодиодная индикация то есть 2 сегмента по 7 светод. в каждом.. с общим анодом
к портам PB1 - PB7 подключаются катоды запоралеленные с A_SEG по H_SEG
3 А общий анод 1 сигмента подкл с порту PA0 (5 контакт мк), соответственно PA1(4 контакт мк)
4 динамическая идикация.
В исходнике запуталась с портами по переключению анодов
Вот эти строчки
#define MAX_DIGITS 2 //Коллич цифр на дисплее 2
char IND_number = 0; //текущие цифры для отображения выводит с памяти норм.
#define DISPLAY_PORT PORTB
#define DISPLAY_DDR DDRB
#define DIGIT_PORT PORTA
#define DIGIT_DDR DDRA
Вод полный код таймера для авр студии
Может у кого то со смекалкой в порядке всё:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
// LED 7 SEG Definitions and data
#define A_SEG (4) // 14 PB2
#define B_SEG (128) // 19 PB7
#define C_SEG (64) // 18 PB6
#define D_SEG (16) // 16 PB4
#define E_SEG (32) // 17 PB5
#define F_SEG (8) // 15 PB3
#define G_SEG (1) // 12 PB0
#define H_SEG (-2) // 13 PB1 Для отображения DP нужно написать DIG_x+H_SEG
#define DIG_1 (char) ~(B_SEG+C_SEG)
#define DIG_2 (char) ~(A_SEG+B_SEG+G_SEG+E_SEG+D_SEG)
#define DIG_3 (char) ~(A_SEG+B_SEG+C_SEG+D_SEG+G_SEG)
#define DIG_4 (char) ~(B_SEG+C_SEG+G_SEG+F_SEG)
#define DIG_5 (char) ~(A_SEG+F_SEG+G_SEG+C_SEG+D_SEG)
#define DIG_6 (char) ~(A_SEG+C_SEG+D_SEG+E_SEG+F_SEG+G_SEG)
#define DIG_7 (char) ~(A_SEG+B_SEG+C_SEG)
#define DIG_8 (char) ~(A_SEG+B_SEG+C_SEG+D_SEG+E_SEG+F_SEG+G_SEG)
#define DIG_9 (char) ~(A_SEG+B_SEG+C_SEG+D_SEG+F_SEG+G_SEG)
#define DIG_0 (char) ~(A_SEG+B_SEG+C_SEG+D_SEG+E_SEG+F_SEG)
#define DIG_OFF (char) 255
char digits[] = {DIG_0, DIG_1, DIG_2, DIG_3, DIG_4,
DIG_5, DIG_6, DIG_7, DIG_8, DIG_9 };
char DISPLAY_value = 9; //Значение, которое будет отображаться - всего от 00 до 99
char DIG_ONOFF = 0;
char DOTS_ONOFF = 0;
#define MAX_DIGITS 2 // Количество цифр на дисплее
char IND_number = 0; //Текущие цифры для отображения
#define DISPLAY_PORT PORTB
#define DISPLAY_DDR DDRB
#define DIGIT_PORT PORTA
#define DIGIT_DDR DDRA
// Ключи определений и данных 4 клавиши на землю
#define KEY_DDR DDRD
#define KEY_PIN PIND
#define KEY_PORT PORTD
#define KEY_MASK (4+8+16+32) // PD2 - PD5
#define MAX_SCANS 15
#define KEY_PLUS 8 //увеличевать значение порт PD5
#define KEY_MINUS 16 // уменьшать значение порт PD4
#define KEY_START 4 // вкл таймер значение порт PD2
#define KEY_STOP 32 // остоновить таймер порт PD3
unsigned char temp_key = 0;
unsigned char key_ready = 0;
unsigned char key_scanned = 0;
//
// Таймер переменные
#define SET 0
#define RUN 1
unsigned char ticks_T0 =0;
unsigned char Mode = SET;
//
// EEPROM
unsigned char EEMEM saved_time = 30;
//
// питание порта
#define POWER_PORT PORTD
#define POWER_DDR DDRD
#define POWER_LINE 6
//
void power_ON()
{
DOTS_ONOFF = 2;
POWER_PORT |= (1<<POWER_LINE);
}
void power_OFF()
{
DOTS_ONOFF = 0;
POWER_PORT &= ~(1<<POWER_LINE);
}
void display_digit(void)
{
char d;
if (IND_number == 0) {
d = DISPLAY_value%10;
DIGIT_DDR = 2;
IND_number++;
}
else {
d = (DISPLAY_value/10);
DIGIT_DDR = 1;
IND_number = 0;
}
if (DIG_ONOFF & DIGIT_DDR)
d = DIG_OFF;
else
d = digits[(int) d];
if (DOTS_ONOFF & DIGIT_DDR)
d += H_SEG;
DISPLAY_PORT = d;
}
void init_display()
{
DISPLAY_DDR = 255;
DIGIT_PORT = 32; // 1 и 2 линии -тут вроде надо ставить 2 а не 32 но при знач 2 не работает
}
void init_keys()
{
KEY_DDR |= ~KEY_MASK;
KEY_PORT |= KEY_MASK; // притянуть Ups ON
}
void init_power()
{
POWER_DDR |= (1<<POWER_LINE);
POWER_PORT &= ~(1<<POWER_LINE);
}
char get_key()
{
return (~KEY_PIN&KEY_MASK);
}
unsigned char read_key()
{
unsigned char c;
c = get_key();
if (c) {
if (temp_key == c) {
key_scanned++;
if (key_scanned == MAX_SCANS) {
key_ready = c;
key_scanned = 0;
return c;
}
}
else {
key_scanned = 0;
temp_key = c;
}
}
return 0;
}
void init_T0(void)
{
cli();
TIMSK = (1<<TOIE0);
TCCR0A = (0<<WGM01)|(0<<WGM00)|(0<<COM0A1)|(0<<COM0A0);
TCCR0B = (1<<CS02)|(0<<CS01)|(1<<CS00);
TCNT0 = 0xb2;
//разрешаем прерывания
sei();
}
//обработчик прерывания таймера Т0
ISR(TIMER0_OVF_vect)
{
unsigned char c;
cli();
TCNT0=0xb2;
ticks_T0++;
if (ticks_T0 == 100) {
ticks_T0 = 0;
if (Mode == RUN)
DISPLAY_value--;
if (DISPLAY_value <= 0) {
DISPLAY_value = 0;
Mode = SET;
power_OFF();
DISPLAY_value = eeprom_read_byte(&saved_time);
}
}
display_digit();
switch (c=read_key()) {
case KEY_PLUS:
DISPLAY_value +=1;
if (DISPLAY_value > 99)
DISPLAY_value = 99;
Mode = SET;
power_OFF();
break;
case KEY_MINUS:
DISPLAY_value -=1;
if (DISPLAY_value == 0)
DISPLAY_value = 0;
Mode = SET;
power_OFF();
break;
case KEY_START:
eeprom_write_byte (&saved_time,DISPLAY_value);
Mode = RUN;
power_ON();
break;
case KEY_STOP:
Mode = SET;
power_OFF();
DISPLAY_value = eeprom_read_byte(&saved_time);
break;
default:
;
}
sei();
}
int main()
{
DISPLAY_value = eeprom_read_byte(&saved_time);
init_display();
init_keys();
init_power();
init_T0();
while (1)
;
}
Re: помогите с индикацией
зачем же такой длинный код писать чтобы отрисовать 2 циферки?
его можно в 10 раз укоротить
его можно в 10 раз укоротить
Re: помогите с индикацией
Код: Выделить всё
#include <tiny2313.h>
#include <delay.h>
unsigned char diod[]={192,249,164,176,153,146,130,248,128,144};
void main(void)
{
//сдесь настройка портов
PORTA=0x00;
DDRA=0xFF; //все линии на выход;
PORTB=0x00;
DDRB=0xFF; //все линии на выход;
PORTD=0x00;
DDRD=0xFF; //все линии на выход;
ACSR=0x80; //отключаем компаратор
while (1)
{
//рисуем на экране 30
PORTD.0=1; PORTB = diod[3]; delay_ms(10); PORTD.0=0;//рисуем первую цифру
PORTD.1=1; PORTB = diod[0]; delay_ms(10); PORTD.1=0;//рисуем вторую цифру
};
}
- Реклама
-
Demon123456789
- Первый раз сказал Мяу!
- Сообщения: 23
- Зарегистрирован: Вс янв 15, 2012 00:30:03
Re: помогите с индикацией
unsigned char diod[]={192,249,164,176,153,146,130,248,128,144};
void main(void)
{
//сдесь настройка портов - Ага только вот тут с пояснением мне только одна нужна
PORTA=0x00;
DDRA=0xFF; //все линии на выход;
PORTB=0x00;
DDRB=0xFF; //все линии на выход;
PORTD=0x00;
DDRD=0xFF; //все линии на выход;
ACSR=0x80; //отключаем компаратор
while (1)
{
//рисуем на экране 30
PORTD.0=1; PORTB = diod[3]; delay_ms(10); PORTD.0=0;//рисуем первую цифру
PORTD.1=1; PORTB = diod[0]; delay_ms(10); PORTD.1=0;//рисуем вторую цифру
};
}
[/code][/quote]
Очень красиво... только ее все линии на выход.. там вообщето ещё 4 кнопки. И не число 30 а 85 и в мамяти изночально а потом его меняем и оно сохраняеться.. Это таймер обратного отсчёта на от 00-99 сек.. с памятью... блин Ты что написал???
Но
void main(void)
{
//сдесь настройка портов - Ага только вот тут с пояснением мне только одна нужна
PORTA=0x00;
DDRA=0xFF; //все линии на выход;
PORTB=0x00;
DDRB=0xFF; //все линии на выход;
PORTD=0x00;
DDRD=0xFF; //все линии на выход;
ACSR=0x80; //отключаем компаратор
while (1)
{
//рисуем на экране 30
PORTD.0=1; PORTB = diod[3]; delay_ms(10); PORTD.0=0;//рисуем первую цифру
PORTD.1=1; PORTB = diod[0]; delay_ms(10); PORTD.1=0;//рисуем вторую цифру
};
}
[/code][/quote]
Очень красиво... только ее все линии на выход.. там вообщето ещё 4 кнопки. И не число 30 а 85 и в мамяти изночально а потом его меняем и оно сохраняеться.. Это таймер обратного отсчёта на от 00-99 сек.. с памятью... блин Ты что написал???
Но
Re: помогите с индикацией
задачу надо ставить конкретно! что нужен таймер с обратным отсчетом
я показал как должнеа работать индикация
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: помогите с индикацией
Demon123456789, схему нарисуй, выложи и расскажи чего надо. В таких листингах никто разбираться не будет.
Docendo discimus
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: помогите с индикацией
я уже четвертый раз порываюсь вам помочь, но сил, разобрать ваш код, все еще не хватает... оформите его как положено, с отступами - может, что и прояснится. но пока мне кажется, что вы упихнули всю работу в обработчик прерывания? это принципиально неправильно. ну, скажем мягче: это дурной стиль программирования, моветон. вариант "каркаса" программы для вашей задачи дожен быть таким:Demon123456789 писал(а):В исходнике запуталась с портами по переключению анодов
Вот эти строчки
Код: Выделить всё
ISR(........){
// здесь делается динамическая индикация
// из какого-то массива СИМВОЛОВ на дисплей
}
void output_number(int num); // эта функция изменяет содержимое массива, выводимого на дисплей
void delay_one_sec(void); // это задержка на 1 секунду
int main(void){
static int second = 99;
// инициализация всей периферии
while(1){
output_number(second--); // выводим остаток секунд, уменьшая его
delay_one_sec(); // ждем 1 секунду
}
}P.S. для критиков: это самый тривиальный набросок, для начинающего, а то сейчас накинитесь "время таймером надо считать, по прерываниям"
битва с дураками проиграна, победители торжествуют. слава победителям!


