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)
;
}