помогите с индикацией

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Demon123456789
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Вс янв 15, 2012 00:30:03

помогите с индикацией

Сообщение Demon123456789 »

Привет Усатым.. Помогите в чем я напортачила?
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: помогите с индикацией

Сообщение coredumped »

Я ничего не понял с подключением индикатора. Опишите что к чему подключено и какого типа индикатор. В идеале нарисуйте схемку и разберемся.
Все будет только лучше, в крайнем случае - хуже.
Реклама
Demon123456789
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Вс янв 15, 2012 00:30:03

Re: помогите с индикацией

Сообщение Demon123456789 »

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)
;
}
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: помогите с индикацией

Сообщение vovik15 »

зачем же такой длинный код писать чтобы отрисовать 2 циферки? :o
его можно в 10 раз укоротить
Реклама
Эиком - электронные компоненты и радиодетали
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: помогите с индикацией

Сообщение vovik15 »

Код: Выделить всё

#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: помогите с индикацией

Сообщение Demon123456789 »

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 сек.. с памятью... блин Ты что написал???
Но
Реклама
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: помогите с индикацией

Сообщение vovik15 »

задачу надо ставить конкретно! что нужен таймер с обратным отсчетом :kill: я показал как должнеа работать индикация
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: помогите с индикацией

Сообщение pyzhman »

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. для критиков: это самый тривиальный набросок, для начинающего, а то сейчас накинитесь "время таймером надо считать, по прерываниям" :))) человек должен понять логику подхода
битва с дураками проиграна, победители торжествуют. слава победителям!
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»