| Вс, 12.04.2015, 21:14 | Сообщение # 1
|
Тёмыч
Постов: 759
Друзья |
Всем привет! Давно хотел начать изучать микроконтролёры, но всё не было возможности (читай-программатора). Но вот пришла посылка с Китая, начал по тихонечку пробовать... сначала спаял простую моргалку светодиодом, пробовал делать управление кнопками, использовать ШИМ, таймеры, внешние прерывания, статическую и динамическую индикацию на семи сегментных индикаторах. И вот решил полученные знания объединить в одну схему: Микроконтроллёр Atmega8a в dip-корпусе, трёх разрядный семи сегментный индикатор, да пару кнопок. Схему пока не рисовал, паял навесом. Суть в том, что надо сделать счётчик для намоточного станка, чтобы считал вперёд и назад от 0 до 999. Настрочил вот такую программку в CodeVisionAVR:
/***************************************************** This program was produced by the CodeWizardAVR V2.05.0 Evaluation Automatic Program Generator © Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com
Project : Version : Date : 12.04.2015 Author : Freeware, for evaluation and non-commercial use only Company : Comments:
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> int x = 0; int i = 0; int number0 = 0; int number1 = 0; int number2 = 0;
// External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { x++; }
// External Interrupt 1 service routine interrupt [EXT_INT1] void ext_int1_isr(void) { x--; }
// Timer1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) { switch(i) { case 0:{x=number0; PORTB.5=0; i++; break;} case 1:{x=number1; PORTB.6=0; i++; break;} case 2:{x=number2; PORTB.7=0; i=0; break;} } switch(x) { case 0:{PORTB=0x3F; break;} case 1:{PORTB=0x06; break;} case 2:{PORTB=0x5B; break;} case 3:{PORTB=0x4F; break;} case 4:{PORTB=0x66; break;} case 5:{PORTB=0x6D; break;} case 6:{PORTB=0x7D; break;} case 7:{PORTB=0x07; break;} case 8:{PORTB=0x7F; break;} case 9:{PORTB=0x6F; break;} } }
// Declare your global variables here
void main(void) { // Declare your local variables here
// Input/Output Ports initialization // Port B 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 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=0x00;
// Port D initialization // Func7=Out Func6=Out Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In // State7=0 State6=0 State5=0 State4=T State3=P State2=P State1=T State0=T PORTD=0x0C; DDRD=0xE0;
// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 1000,000 kHz // Mode: CTC top=OCR1A // 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: On // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x0A; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x10; OCR1AL=0x46; OCR1BH=0x00; OCR1BL=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=0x10;
// Global enable interrupts #asm("sei")
while (1) { if (number0==10) {number0=0; number1++;} if (number1==10) {number1=0; number2++;} if (number2==10) {number2=0; number1=0; number0=0;} } } Что самое интересное что вроде как по логике должно работать, но не работает... Если например убрать внешние прерывания, и поставить внутрь цикла добавление номера (что бы сам прибавлял) или убрать таймер с динамической индикацией (сделать статическую но правда счёт только до десяти) то работает, а вот подружить динамику с внешними прерываниями не получается. Подскажите в чём мой косяк?, мне в моей деревне, даже спросить не у кого, никто такими вещами не занимается...
|
|
| Вс, 12.04.2015, 22:34 | Сообщение # 2
|
HAWES
Постов: 315
Друзья |
Тёмыч, Покопайся во вложенном архиве - автор STALKER
|
|
| Вс, 12.04.2015, 22:38 | Сообщение # 3
|
HAWES
Постов: 315
Друзья |
Часть 3-5
|
|
| Пн, 13.04.2015, 14:22 | Сообщение # 4
|
Тёмыч
Постов: 759
Друзья |
HAWES, спасибо большое, буду изучать. Но всё таки, хотелось бы услышать мнение на счёт моей программы, кто что скажет?
|
|