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

S1mpleX

Members
  • Постов

    15
  • Зарегистрирован

  • Посещение

Информация

  • Город
    Винница

Электроника

  • Стаж в электронике
    Менее года
  • Сфера радиоэлектроники
    Микроконтроллеры

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

Достижения S1mpleX

Новичок

Новичок (1/14)

  • 10 постов на форуме
  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

0

Репутация

  1. Спасибо вам! Огромное спасибо! попробую поменять таймеры, а можете так же показать пример как корректно организовать индикацию? И вот еще вопрос, разве тогда не будет все равно ждать обработки прерывания таймера2, после обработки прерывания индикации?
  2. Совпадает, первая секунда идет четко, а потом все равно что замедленно в 2 раза, как будто прерывания индикации отодвигают прерывание счетчика секунд, хотя приоритет его выше
  3. Уже лучше, кнопки заработали, осталась проблема с частотой, проходит явно больше секунды перед декрементом секунд, хотя таймер настроен правильно
  4. Не знаю, я еще не очень разбираюсь, поэтому и пишу сюда Сейчас у меня просто сразу же после включения стартует отсчет, при чем с частотой явно меньшей секунды, на кнопки не реагирует
  5. Таймеры у меня заняты, поэтому так и хочу записать
  6. Почему? И как тогда правильно опрашивать пин? Спасибо
  7. Atmel Studio понимает это, на сколько я знаю, она сама предложила такую запись
  8. я понимаю ка он должен работать, но не понимаю, почему так не происходит
  9. Спасибо, а где по коду это?
  10. При старте сразу же начинается отсчет, при чем секунд длится дольше (с частотой все ок), либо просто вычитается по 10 секунд, не останавливается в нуле и т.п. в протеусе видно
  11. Здравствуйте! Помогите мне пожалуйста, я начинающий в МК и вот пишу свой первый, немножечко "серьезный" проект и никак не могу добиться работоспособности(( Суть в следующем: Таймер после нажатия на кнопку "старт/стоп"запускает обратный отсчет (по умолчанию от 300 секунд), кнопками +10 и -10, изменяется время по 10 сек. Во время работы я хочу считывать регистр АЦП и писать его в регистр таймера (ШИМ, который управляет двигателем), оставшееся или установленное время отображается на 3х разрядном индикаторе, после достижения ноля хочу в регистр ШИМа писать ноли и останавливать двигатель. Но сколько уже не играюсь - оно не работает в протеусе(( Очень очень сильно прошу помощи, а то уже и охота пропадает заниматься((( Заранее спасибо! Проект протеуса и код в Atmel Studio прилагаю. MK - ATMega8 #define F_CPU 8000000 #define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (0<<ADLAR)) #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> unsigned char codes[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xD8, 0x80, 0x90}; volatile int dig = 1; //Номер разряда volatile int seconds = 300; //Выводимые данные char Timeout; char Start; int adc_result; void IO_init(void){ //_IO_Init // Port B initialization // Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=In Bit1=In Bit0=In DDRB=(1<<DDB7) | (1<<DDB6) | (1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit7=0 Bit6=0 Bit5=0 Bit4=0 Bit3=0 Bit2=P Bit1=P Bit0=P PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (1<<PORTB2) | (1<<PORTB1) | (1<<PORTB0); // Port C initialization // Function: Bit6=Reset Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=In DDRC=(0<<DDC6) | (1<<DDC5) | (1<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (0<<DDC0); // State: Bit6=0 Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=T PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0); // Port D initialization // Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out DDRD=(1<<DDD7) | (1<<DDD6) | (1<<DDD5) | (1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0); // State: Bit7=0 Bit6=1 Bit5=1 Bit4=1 Bit3=1 Bit2=1 Bit1=1 Bit0=1 PORTD=(0<<PORTD7) | (1<<PORTD6) | (1<<PORTD5) | (1<<PORTD4) | (1<<PORTD3) | (1<<PORTD2) | (1<<PORTD1) | (1<<PORTD0); } unsigned int read_adc(void) { unsigned int adc_result; ADMUX &= (~(1<<MUX0)) | (~(1<<MUX1)) | (~(1<<MUX2)) | (~(1<<MUX3)) | ADC_VREF_TYPE; _delay_us(10); ADCSRA|=(1<<ADSC); while ((ADCSRA & (1<<ADIF))==0); ADCSRA|=(1<<ADIF); adc_result=(ADCL|ADCH<<8); return adc_result; } void ind_timer_init(void) { TIMSK = (1 << TOIE0); //Разрешить прерывание таймера по переполнению TCCR0 = (1 << CS01); //Предделитель - 8 } void PWM_timer_init(void){ // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: 31,250 kHz // Mode: Fast PWM top=0xFF // OC2 output: Non-Inverted PWM // Timer Period: 8,192 ms // Output Pulse(s): // OC2 Period: 8,192 ms Width: 0 us ASSR=0<<AS2; TCCR2=(1<<WGM20) | (1<<COM21) | (0<<COM20) | (1<<WGM21) | (1<<CS22) | (1<<CS21) | (0<<CS20); TCNT2=0x00; OCR2=0x00; } void RTC_timer_init(void){ TCCR1A = 0; // настройка таймера 1, канала А TCCR1B |= (1<<CS12); // предделитель CLK/256; OCR1A = 0x7A11; // прерывание раз в секунду TIMSK &= (~(1<<OCIE1A)); // прерывание таймера откл } /************************************************************************/ /* INTERRUPT'S PART */ /************************************************************************/ ISR (TIMER0_OVF_vect) { PORTD = 0xFF; //Выключаем все сегменты PORTC = (1 << dig); switch(dig) { case 1: PORTD = (codes[seconds % 1000 / 100]); break; //Раскладываем число на разряды case 2: PORTD = (codes[seconds % 100 / 10]); break; case 3: PORTD = (codes[seconds % 10]); break; } if ((dig++) > 2) dig = 1; } ISR(TIMER1_COMPA_vect) { Timeout = 1; seconds--; if (seconds < 1) { Start=0; TIMSK &= (~(1<<OCIE1A)); } } int main() { IO_init(); ind_timer_init(); RTC_timer_init(); read_adc; sei(); while(1) { if (!PINB2) { _delay_ms(50); if (!PINB2) { Start ^= 1; TCNT1 = 0; TIMSK |= (1<<OCIE1A); } } if (!PINB1) { _delay_ms(50); if (!PINB1) { seconds+=10; } } if (!PINB0) { _delay_ms(50); if (!PINB0) { seconds-=10; } } while(Start) { Timeout = 0; OCR2 = adc_result; while(!Timeout); } } } 321.pdsprj
  12. Всем здравствуйте! Прошу помощи, так как это только первое мое устройство и еще не знаю всех тонкостей этого искусства. В общем проблема такова: собрал устройство автоматической подачи школьных звонков (схема прилагается) запрограммировал контроллер, запустил, на индикаторах нули и ничего не происходит. Через некоторое время вместо нулей - непонятные символы разной яркости (из-за динамической индикации, полагаю), и два светодиода, которые должны показывать секунды не работают. С помощью осциллографа выяснил, что кварц не работал, сменил кварц, частота на ds1307 появилась, светодиоды несколько раз моргнули, и плавно потухли, при этом на индикаторах все по старому, решил перепрограммировать контроллер, но в процессе, наверное, убил его(( так как не определяется что он подключен, хотя контакты разъема ISP с МК в норме, программатор хороший Atmel ICE Basic, тем более, сначала же запрограммировал норм. Короче, теперь не знаю, с чего начинать, решил спросить, пока покупаю новый МК на всякий случай. Помогите, пожалуйста разобраться, очень прошу. Заранее спасибо! П.С. в архиве проект, печатка в дип трейс, проект протеус (в котором все работает) 1.2.rar
  13. Немного не понял пока сложно со всеми этими понятиями. Схемотехнику понимаю неплохо, а вот по программной части как раз и нужна помощь, с самим кодом, т. е. с реализацией алгоритма. Алгоритм тоже понятен, все элементы есть, поэтому на них хочу и делать.
  14. Всем доброго времени суток! Нужна помощь специалистов (за небольшое денежное вознаграждение), так как сам только начинаю учить AVR. Нужно написать код для такой схемы (схему тоже сам придумал, так что буду благодарен за исправления, если таковые нужны). Это автоматический школьный звонок. Работать должен он как-то так: каждую секунду опрашивает часы, если время равно записаному времени звонков в ЕЕЕПРОМ, то реле срабатывает на 5 секунд и отключается. Параллельно время выводиться на индикаторы. есть кнопочки для настройки времени (меню/назад, больше, меньше, задать) и кнопка ТЕСТ, чтобы включать реле не зависимо от времени. расписание звонков простое - с понедельника по пятницу в таком порядке: 8:45, 9:30, 9:35, 10:20, 10:25, 11:10, 11:30,12:15, 12:20, 13:05, 13:10, 13:55, 14:00, 14:45. Буду благодарен за код с комментариями (чтобы я сам разобрался). Огромное спасибо за ваше время и внимание! AutoRinger.BMP
×
×
  • Создать...