Технический форум по робототехнике.
Romikgy » 18 июл 2011, 15:02
- Код: Выделить всё • Развернуть
PORTA.6 = 1;
PORTC = segment[x1];
PORTD.7 = PORTC.6;
delay_ms(5);
PORTA.6 = 0;
PORTC = segment[x10];
PORTD.7 = PORTC.6;
delay_ms(5);
- Код: Выделить всё • Развернуть
unsigned char x=segment[x1];
PORTA.6 = 1;
PORTC = x;
PORTD.7 = x>>6;
delay_ms(5);
PORTA.6 = 0;
x=segment[x10]
PORTC = x;
PORTD.7 = x>>6;
delay_ms(5);
d3xr » 18 июл 2011, 16:33
Ничего не изменило
Romikgy » 18 июл 2011, 17:01
тогда схему приведи ... а лучше проект в протеусе....
d3xr » 18 июл 2011, 18:04
Ваш код кстати вообще не скомпилился. Пишет что строчка unsigned char x=segment[x1];
must declared first in block. Перенес в начало void main, ничего не отображает индикатор.
Схема верна, просто число показывает же. А если необходимо вывести 2 числа подряд, то тут проблемы возникают
Romikgy » 18 июл 2011, 18:09
дык и хочется посмотреть на схему , да бы понять в чем косяк программы
d3xr » 18 июл 2011, 19:29
Переписал код, вытащив все из главного тела. Работает, но фиксированную задержку не могу поставить, все цифры невозможно разглядеть становится.
Косяк тут выявляется
- Код: Выделить всё • Развернуть
void print()
{
for (i=1; i<10000; i++)
{
print_n(i);
delay_ms(50); //ВОТ ТУТ! ЕСЛИ УБРАТЬ ЗАДЕРЖКУ ВСЕ НОРМ!
}
}
Схемы нет, все на макетке.. Если поможет.
Индикаторы с общим анодом, сегменты подключены так:
C0 b
C1 a
C2 f
C3 c
C4 d
C5 e
D7 g
Аноды соответственно:
A4
A5
A6
A7
- Код: Выделить всё • Развернуть
#include <mega16.h> //Âêëþ÷àåì áèáëèîòåêó äëÿ ðàáîòû ñ ìèêðîêîíòðîëëåðîì ATMega16
#include <delay.h> //Âêëþ÷àåì áèáëèîòåêó äëÿ îðãàíèçàöèè çàäåðæåê
int i,a, x1,x10, disp;
unsigned char segment[10]= {
// gedcfab gedcfab
0b1000000, 0b1110110, //0,1
0b0001100, 0b0100100, //2,3
0b0110010, 0b0100001, //4,5
0b0000001, 0b1110100, //6,7
0b0000000, 0b0100000 //8,9
};
void cifra(int z)
{
PORTC=0xFF; // Ïîäòÿíóòü ïîðò C ê 1
PORTD=0xFF; // Ïîäòÿíóòü ïîðò D ê 1
PORTC = segment[z];
PORTD.7 = PORTC.6;
delay_ms(1);
}
void print_n(int n)
{
PORTA.4 = 1;PORTA.5 = 0;PORTA.6 = 0;PORTA.7 = 0; cifra(n%10); n = n/10;
PORTA.4 = 0;PORTA.5 = 1;PORTA.6 = 0;PORTA.7 = 0; cifra(n%10); n = n/10;
PORTA.4 = 0;PORTA.5 = 0;PORTA.6 = 1;PORTA.7 = 0; cifra(n%10); n = n/10;
PORTA.4 = 0;PORTA.5 = 0;PORTA.6 = 0;PORTA.7 = 1; cifra(n%10);
}
void initialization()
{
DDRD=0xFF; // Âñå ïîðòû D - âûõîäû
DDRC=0xFF; // Âñå ïîðòû C - âûõîäû
DDRA=0xFF; // Âñå ïîðòû A - âûõîäû
PORTA=0x00; // Ïîäòÿíóòü ïîðò A ê 0
PORTC=0xFF; // Ïîäòÿíóòü ïîðò C ê 1
PORTD=0xFF; // Ïîäòÿíóòü ïîðò D ê 1
}
void print()
{
for (i=1; i<10000; i++)
{
print_n(i);
delay_ms(50); //ВОТ ТУТ! ЕСЛИ УБРАТЬ ЗАДЕРЖКУ ВСЕ НОРМ!
}
}
void main(void)
{
initialization();
while(1)
{
print();
}
}
Romikgy » 18 июл 2011, 23:41
тогда зачем те эта задержка ?
rig » 20 июл 2011, 19:03
в прерывание надо вывод засунуть тогда голова не будет болеть когда и что выводить. и мерцать не будет. частоту любую можно выставить.
Добавлено спустя 1 минуту 6 секунд:
я вроде уже когдато тут выкладывал примеры с работы индикатором.