Перейти к содержанию

AtMega в несознанке


Рекомендуемые сообщения

Проблема в следующем

Пытаюсь подключить 7-ми сегментник к АТ8 - даже не моргнёт,падла такая.

Вроде по книжкам делал, мож подробность какую упустил?

 

Вордовский док не хАТИт глотать, по этому открытым текстом.....

 

 

Chip type : ATmega8

Program type : Application

AVR Core Clock frequency: 8,000000 MHz

Memory model : Small

External RAM size : 0

Data Stack size : 256

*****************************************************/

 

#include <mega8.h>

#include <delay.h>

#include <stdio.h>

 

char digit_out[2], cur_dig;

 

flash char buf[] = { //массив с цифрами

0b00000011, //0

0b10011111, //1

0b00100101, //2

0b00001101, //3

0b10011001, //4

0b01001001, //5

0b01000001, //6

0b00011111, //7

0b00000001, //8

0b00001001, //9

0b11111111

};

 

void hc164_wr(unsigned char dig){ //подпрограмма вывода данных в регистр

unsigned char a;

for(a=0; a<8; a++){ //цикл для вывода 8 бит данных из массива

PORTB.0 = buf[dig] & 1<<a; //выводим в линию DATA текущий бит

PORTB.1=0; //опускаем линию CLK в лог.0

PORTB.1=1; //поднимаем линию CLK в лог.1

}

}

 

// External Interrupt 0 service routine

interrupt [EXT_INT0] void ext_int0_isr(void)

{

 

switch (cur_dig){

case 0:{PORTC.0=0; PORTC.1=0; hc164_wr(digit_out[cur_dig]); PORTC.0=1; break;}; //первая цифра

case 1:{PORTC.1=0; PORTC.0=0; hc164_wr(digit_out[cur_dig]); PORTC.1=1; break;}; //вторая цифра

}

cur_dig++;

if (cur_dig==2) cur_dig=0;

 

 

}

 

// External Interrupt 1 service routine

interrupt [EXT_INT1] void ext_int1_isr(void)

{

// Place your code here

 

}

 

// Declare your global variables here

 

void main(void)

{

unsigned char f;

 

// Input/Output Ports initialization

// Port B initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTB=0x00;

DDRB=0xFF;

 

// Port C initialization

// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTC=0x00;

DDRC=0xFF;

 

// Port D initialization

// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out

// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0

PORTD=0xFF;

DDRD=0x00;

 

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: 125,000 kHz

TCCR0=0x03;

TCNT0=0x00;

 

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: Timer1 Stopped

// Mode: Normal top=0xFFFF

// OC1A output: Discon.

// OC1B output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer1 Overflow Interrupt: Off

// Input Capture Interrupt: Off

// Compare A Match Interrupt: Off

// Compare B Match Interrupt: Off

TCCR1A=0x00;

TCCR1B=0x03;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

 

// Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: Timer2 Stopped

// Mode: Normal top=0xFF

// OC2 output: Disconnected

ASSR=0x00;

TCCR2=0x03;

TCNT2=0x00;

OCR2=0x00;

 

// External Interrupt(s) initialization

// INT0: On

// INT0 Mode: Falling Edge

// INT1: On

// INT1 Mode: Falling Edge

GICR|=0xC0;

MCUCR=0x0A;

GIFR=0xC0;

 

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x02;

 

// USART initialization

// USART disabled

UCSRB=0x00;

 

// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

ACSR=0x80;

SFIOR=0x00;

 

// ADC initialization

// ADC disabled

ADCSRA=0x00;

 

// SPI initialization

// SPI disabled

SPCR=0x00;

 

// TWI initialization

// TWI disabled

TWCR=0x00;

 

// Global enable interrupts

#asm("sei")

 

while (1)

{

for(f=0; f<100; f++){

delay_ms(50);

digit_out[0]=f/10;

digit_out[1]=f%10;

 

}

};

}

 

Ошибка где?

подскажите, пожаЛЛста :unknown:

Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 32
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

... даже не моргнёт,падла такая. ...
Желательно видеть схему. Во-первых, в схеме могут быть ошибки. Во-вторых, используется вход внешних прерываний и без схемы непонятно, что за сигнал на него подаётся. В третьих, программа может не соответствовать схеме. В четвёртых, без схемы нельзя понять, как выводятся знаки. В функции hc164_wr выводится последовательный код с тактом. Куда выводится? У вас индикатор с последовательным входом? Изменено пользователем Lexter
Ссылка на комментарий
Поделиться на другие сайты

Понял.

Я сам сдурил - схему нарисовал 74С595 - балбес, что скажешь....

Николай, тогда вопрос шкурный - все мои извраты в данный момент связаны с следующим

Хочу на AVR-ке сделать управление оконечником.

Алгоритм следующий:

1 - Подали сетевое - усь в ожидании (stendbai)

2 - Нажали кнопку - включилось рэле подключающее питалово на силовой транс, появляется индикация (4-х разрядный 7-ми сегментник) -- уровень громкости на момент выключения.

так же проц управляет лестничным регулятором громкости через кнопки или валкодер.

Если есть возможность помочь в данном проекте - буду очень благодарен.

Ссылка на комментарий
Поделиться на другие сайты

Кстати в добавок к алгоритму - при подаче "стороннего" сигнала на один из входов контроллера, усил должен так же включиться ( при использовании отдельного преда).

Ссылка на комментарий
Поделиться на другие сайты

... проект в протеусе ...
К сожалению, в протеусе помочь не смогу. Я в нём не работаю и у меня его нет, так что даже открыть посмотреть нечем.

Так как после переделки, проект "задышал"?

Ссылка на комментарий
Поделиться на другие сайты

Вот и схема добытая непосильным трудом из протеуса.

 

 

Узнать бы ещё назначения кнопок.

 

 

post-32484-0-83872000-1518362882_thumb.jpg

Изменено пользователем goldmen8
Ссылка на комментарий
Поделиться на другие сайты

кнопки свеху 1,2,3,4,

1 - вкл

2 - +

3 - -

4 - нажал - есть + на PD0 , ещё раз - нету.

Переделал всё и всё равно тихо.

Ссылка на комментарий
Поделиться на другие сайты

Перенастроил порты - индикатор засветился....... весь......все сегменты.......

На нажатие не реагирует, сдвиг.рег. молчит.

Хреново когда недоучь.....

Ссылка на комментарий
Поделиться на другие сайты

... появляется индикация (4-х разрядный 7-ми сегментник) -- уровень громкости на момент выключения. ...
А не много будет уровень громкости в 4-е разряда?
Ссылка на комментарий
Поделиться на другие сайты

индикацию хочу сделать "dB" - 127, а с прибавлением или убавлением.....

Буквы с индикатора отдельно сделаю...

Пыжусь с чужих решений "свести" в кучу всё - ума, блин, не хватает, блин....

Может кто ссылочку скинет как правильно выводить цыфры через 595-ю в CodeVision-е?

Ссылка на комментарий
Поделиться на другие сайты

... как правильно выводить цыфры через 595-ю ...
Для этого полезнее один раз разобраться, чем каждый раз искать чьи-то кривые примеры. :smile:

Берётся даташит на нужную микросхему (ссылка на даташит 74HC595: _http://www.ti.com/lit/ds/symlink/sn74hc595.pdf ).

Микросхема состоит из двух регистров - входного регистра сдвига и выходного регистра-защёлки. Чтобы во время передачи кода на выходах микросхемы не проскакивали промежуточные значения (чтобы цифры на подключеном индикаторе не моргали), сначала последовательный код побитно записывается в сдвиговый регистр, потом одним тактом перезаписывается в регистр-защёлку, после чего новые данные появляются на выходах микросхемы.

Зная, к каким портам контроллера какие выводы микросхемы подключены, просто пишутся соответствующие действия в программе:

Исходно управляющие входы микросхемы надо установить в следующие состояния:

OE (13) = 0 (выходы микросхемы активны);

RCLK (12) = 0 (исходное состояние входа записи в регистр-защёлку);

SRCLK (11) = 0 (исходное состояние входа записи в сдвиговый регистр);

SRCLR (10) = 1 (сброса в 0 сдвигового регистра нет);

SER (14) - вход последовательных данных, любое состояние, так как нужное установится при первом выводе.

 

В подпрограмме вывода кода цифры выполняются следующие действия:

На SER (14) устанавливается первый бит выводимого кода.

На SRCLK (11) устанавливается 1, затем 0, т.е. формируется фронт такта, по которому бит со входа SER записывается в сдвиговый регистр.

Эти операции повторяются, пока в сдвиговый регистр не будут записаны все биты кода.

После записи в регистр сдвига всего кода (в данном случае - кода знака цифры на индикаторе), на его выходе получается параллельный код, который надо переписать в выходной регистр.

Для этого на RCLK (12) надо установить 1 (по этому фронту данные запишутся в выходной регистр и появятся на выходах), затем 0 (вернуть в исходное состояние). При динамической индикации эта операция делается в другом месте (см. ниже).

Всё. Новое число установлено на выходах микросхемы. Бит, выведенный последним, окажется на выходе QА (15), остальные биты - по порядку на остальных выходах.

 

Дальше надо разобраться с динамической индикацией. У вас 4 знака, в которые надо выводить число по-очереди циклически. В каком порядке - не имеет значения. Чтобы обеспечить наиболее быстрое переключение, последовательность такая:

 

1. В 595-й регистр выводится последовательный код следующего символа по алгоритму, написанному выше. В выходной регистр пока не пишется (состояние RCLK (12) не меняется). Во время длительной операции последовательного вывода на индикаторе всё ещё горит предыдущий символ.

 

2. Текущая линия выбора знака (на вашей схеме это PC0 - PC3 контроллера) выключается. Знак при этом гаснет.

Каким уровнем (0 или 1), зависит от того, какой у вас индикатор - с общим анодом или общим катодом.

 

3. На выводе RCLK (12) формируется фронт записи в выходной регистр. На выходах микросхемы при этом появляется код следующего знака.

 

4. Устанавливается активной следующая линия выбора знака. Знак при этом "зажигается".

 

Для четырёхразрядного светодиодного индикатора "перебирать" знаки надо с частотой 60 - 120 Гц, чтобы не было заметно мерцания. Делать частоту выше не стоит - будет уменьшаться яркость.

 

По поводу схемы подключения индикатора.

Так, как у вас нарисовано, действительно многие делают, но это некорректно. Ток через светодиодные сегменты надо ограничивать резисторами, а не загонять выходные каскады микросхем в режим ограничения тока. Это для них нештатный режим.

Выводы PC0 - PC3 контроллера перегружены по току. Может быть включено одновременно все 7 сегментов (цифра 8), соответственно посчитайте, какой ток требуется с вывода порта PC, и посмотрите в даташите, какой максимальный допустим.

Изменено пользователем Lexter
Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...