|
Светодиоды и AVR не дружат. |
|
|
|
Mar 20 2006, 21:16
|
Местный
  
Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284

|
В общем дело вот в чем, сегодня доехал таки до чипа и дипа и закупился необходимыми деталями. Спаял простую схемку с одним диодом через резистор подключающимся к AVR MEGA8. Программу которая просто мигает этим диодом залил в МК. Все отлично зашилось через 5 проводков, диод замигал в опщем щастье! Захотелось большего, и припаял еще 3 диода все к порту C выводам 2,3,4,5. Записал в МК прошивку: Цитата #include <mega8.h>
// Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { if (PORTC.5==0) { PORTC.5=1; PORTC.4=0; } else { PORTC.5=0; PORTC.4=1; } // Place your code here
}
// Declare your global variables here
void main(void) { PORTC.5=0; PORTC.4=1; // Declare your local variables here
// Input/Output Ports initialization // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=0 PORTB=0x00; DDRB=0x01;
// Port C initialization // Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State6=T State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTC=0x00; DDRC=0x3F;
// Port D 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 PORTD=0x00; DDRD=0x00;
// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 3,906 kHz TCCR0=0x04; TCNT0=0x00;
// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge TCCR1A=0x00; TCCR1B=0x00; 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: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00;
// External Interrupt(s) initialization // INT0: Off // INT1: Off MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x01;
// Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00;
// Global enable interrupts #asm("sei")
while (1) { // Place your code here
}; } В результате все диоды мигают одновременно с частотой таймера, хотя должны мигать только PC.4 и PC.5 ПООЧЕРЕДНО! И еще момент такой, в ISIS все эмулируется нормально, т.е. помигивают только 2 диода поочередно, остальные не горят. Помогите плз разобраться )
Сообщение отредактировал ps1x - Mar 20 2006, 21:18
|
|
|
|
|
Mar 20 2006, 22:33
|
Местный
  
Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284

|
ДОБАВЛЕННО: И еще, попробовал прогнать програмку: PORTC++; delay_ms(500); if (PORTC==200) {PORTC=37;} результаты весьма странные, получается инвертированый порт, т.е. если в программе PC.5 = 1 то в реальности светодиод не горит!!! (кстати выражение вида PORTC.5=1 компилируется, но результата не дает, равно как и PORTC.5=0 т.е. светодиоды не горят все или горят все) Если заменить PORTC.5 на PORTC.4 то вообще ничего не мигает =( Конечно можно, извиняюсь за некоторую неразборчивость схемы:
Сообщение отредактировал ps1x - Mar 20 2006, 22:47
Эскизы прикрепленных изображений
|
|
|
|
|
Mar 21 2006, 00:14
|
Частый гость
 
Группа: Участник
Сообщений: 146
Регистрация: 16-05-05
Пользователь №: 5 069

|
Цитата Все отлично зашилось через 5 проводков, диод замигал в опщем щастье! ... // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 3,906 kHz То есть Вы утверждаете, что в состоянии различить мигание с частотой 3,906 kHz? Александр 2006 03 21
|
|
|
|
|
Mar 21 2006, 00:58
|
Местный
  
Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284

|
Как Вы думаете, что будет, если зашить в МК вот эту программу, и к выводам PORTD.0 и PORTD.1 подключить два светодиода на землю, через защитное сопротивление в 200 Ом??? Цитата #include <mega8.h> #include <delay.h>
interrupt [TIM0_OVF] void timer0_ovf_isr(void) {
}
void main(void) {
PORTD=0x00; DDRD=0xFF; TCCR0=0x04; TCNT0=0x00; TIMSK=0x01; ACSR=0x80; SFIOR=0x00;
#asm("sei")
while (1) { PORTD.0=1; PORTD.1=0; delay_ms(100); PORTD.1=1; PORTD.0=0; delay_ms(100); }; } А вот и не угадали, ничего не будет. (по крайней мере если компилировать в СV AVR и зашивать им же) в общем я офигевваю Кто нибудь скажите пожалуйста, что же за фигня происходит. Кстати, если PORTD.0=1; PORTD.1=0; delay_ms(100); PORTD.1=1; PORTD.0=0; delay_ms(100); заменить на PORTD++; то загораются все 4 светодиода, однако если заменить на PORTD=0xFF; то загорается светодиод PORTD.3 Вот схема подключения диодов:
Сообщение отредактировал ps1x - Mar 21 2006, 01:06
Эскизы прикрепленных изображений
|
|
|
|
|
Mar 21 2006, 04:39
|
Местный
  
Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284

|
Может быть дело в фьюзах? Всю ночь бился ап стену и не смог заставить схемку правильно мигать лампочками. Наверно пора убить себя  . УМНЫЕ ЛЮДИ УМОЛЯЮ ВАС, СКАЖИТЕ ЧТОЖЕ НУЖНО СДЕЛАТЬ ЧТОБЫ ОНО ЗАРАБОТАЛО!!!!! И почему не получается PORTD.0=1?
|
|
|
|
|
Mar 21 2006, 05:49
|
Местный
  
Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284

|
Мега тактируется от внутреннего осциллятора, а фьюзы все по нулям. Диоды подключены так: PORTD.0 ---> +диода ----> диод -----> 200 ом ----> Земля и так для каждого пина порта D. Разве это не правильно? ps Спасибо за отзывы.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|