Страница 1 из 1

tiny44:при вкл АЦП пробл записи в PA6 из прерывания таймера1

Добавлено: Пн окт 26, 2009 18:38:08
gep
Здраствуйте!
Прошу помочь.
Пишу в CodeVision прогу для tiny44. Эмулирую в протеусе. При включенном АЦП на ножки с 0 по 4-ю порта А не могу управлять 6-й ножкой этого же порта из прерывания таймера 1. ножкой порта B при этом управлять не проблема.

Добавлено: Пт окт 30, 2009 23:28:41
gep
что? никто не сталкивался? У кого нибудь есть хоть какие-то мысли по этому поводу?

Добавлено: Сб окт 31, 2009 01:10:02
Saadov
Визуальновы не сможете отследить мигание светодиода, если его время горения или не горение равняется 0,066 сек. А не будет ли казаться для вашего глаза и протеуса, что светодиод на постоянке горит???Исправте прескаллер в Timer1
и исправте код, а то потом проблемы будут, забыли "_" в

Код: Выделить всё

interrupt [PC_INT0] void pin_change_isr0(void)
{
// Place your code here

}
А насчет того, что не работает выход, я перепробовал все, либо это новый глюк протеуса,либо мой на ночь глядя или есть какое то условие в datasheetе на Tiny, тут увы, я пас, с ними я не работал...а вчитываться лень...[/b]

Добавлено: Сб окт 31, 2009 01:31:53
Saadov
Звезды над вами выстроились в нужную позицию и я нашел это
http://www.avrfreaks.net/index.php?name ... c&p=337724
Потом пошевелив извилинами и всетаки вчитавшись в контекстные подсказки CVAVR нашел, что код должен выглядеть так

Код: Выделить всё

// ADC initialization
// ADC Clock frequency: 1000,000 kHz
// ADC Voltage Reference: AVCC pin
// ADC Bipolar Input Mode: Off
// ADC Auto Trigger Source: None
// Only the 8 most significant bits of
// the AD conversion result are used
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On
// ADC4: On, ADC5: Off, ADC6: On, ADC7: Off
DIDR0=0xA0;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x83;
ADCSRB&=0x6F;
ADCSRB|=0x10;
А именно на строчку

Код: Выделить всё

DIDR0=0xA0;
Строчка таймера для мигания светодиодом 0.5 сек вкл 0.5 сек будет выглядеть так

Код: Выделить всё

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz !!!!!!
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: On
// 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;
В обработчике прерываний таймера1 проще сделать так

Код: Выделить всё

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
PORTA.6=~PORTA.6 ;
}

Добавлено: Пн ноя 02, 2009 07:21:19
gep
Огромное спасибо за ответ. Сейчас попробую разобраться. Хотя указания на мои ошибки в коде не принимаю, т.к. почти весь код (кроме обработчника прерывания таймера) сгенерирован кодгенератором CodeVision :)
А насчет не эффективности кода инвертирования пина, это же тест :) а не конечная прога. Просто в целевой программе не смог понять в чем дело - начал урезать. Выделил кусок кода - сделал тест.
И кстати по поводу того, что я просто не вижу мельканий - нет, т.к. если рядом с кодом инвертирования A6 поставить код инвертирования любого бита порта Б - то все видно. Протеус же замедляет при симуляции.

Добавлено: Пн ноя 02, 2009 07:36:41
Meteor
gep писал(а):указания на мои ошибки в коде не принимаю, т.к. почти весь код ... сгенерирован кодгенератором CodeVision
Совершенно напрасно полностью доверяете программе. Были глюки и в нем, неправильно настраивал УАПП например. Успехов

Добавлено: Пн ноя 02, 2009 08:37:37
gep
Попробовал заменить

Код: Выделить всё

DIDR0=0xE0;
на

Код: Выделить всё

DIDR0=0xA0;
Помогло! Спасибо!!! Теперь осталось понять из-за чего так. Я думал наоборот нужно выключать цифровой буфер если на этом выводе не будет использоваться АЦП.

Добавлено: Вт ноя 03, 2009 01:24:22
Saadov
gep писал(а):Попробовал заменить

Код: Выделить всё

DIDR0=0xE0;
на

Код: Выделить всё

DIDR0=0xA0;
Помогло! Спасибо!!! Теперь осталось понять из-за чего так. Я думал наоборот нужно выключать цифровой буфер если на этом выводе не будет использоваться АЦП.
Код привел для новичков, которые рано или поздно нарвутся на те же грабли, и будет тут ответ))).
Я в ответе специально обратил ваше внимание на строчку.
А вот насчет отключения как раз таки наоборот, мы отключаем цифру для использования ADC, так сказать выбираем одно функциональное назначение порта из нескольких возможных.

Добавлено: Вт ноя 03, 2009 05:36:28
gep
Т.е. Если я хочу использовать пины с 0 по 4 для АЦП, то я должен сделать так:

Код: Выделить всё

DIDR0 = 0x0F
Я прав?

Добавлено: Вт ноя 03, 2009 14:46:06
Saadov
Скорее так

Код: Выделить всё

// Digital input buffers on ADC0: Off, ADC1: Off, ADC2: Off, ADC3: Off
// ADC4: Off, ADC5: On, ADC6: On, ADC7: On
DIDR0=0x1F;

Добавлено: Пн ноя 09, 2009 06:33:01
gep
Да, действительно. Тупанул. Спасибо, помогло.

Re: tiny44:при вкл АЦП пробл записи в PA6 из прерывания тайм

Добавлено: Чт май 13, 2010 14:15:51
alfons
привет! темка староватая, но очень надеюсь на помощь! в CV AVR я не сильно силён, поэтому прошу Вас помочь! проблема по-моему у меня похожая! программирую ATmega8, и мне надо, чтобы два порта С работали как АЦП, а остальные нет! подскажите, где это поменять в программе! все порты работают как АЦП! заранее благодарю за помощь!

Re: tiny44:при вкл АЦП пробл записи в PA6 из прерывания тайм

Добавлено: Чт май 13, 2010 19:17:41
Saadov
alfons писал(а): где это поменять в программе! все порты работают как АЦП! заранее благодарю за помощь!
Это надо в даташите на ваш микроконтроллер посмотреть как выставить нужные ножки для использования АЦП или в курсе AVR посмотреть www.123avr.com/z09.htm

Re: tiny44:при вкл АЦП пробл записи в PA6 из прерывания тайм

Добавлено: Пт май 14, 2010 11:59:58
gep
В CodeVision есть CodeGenerator. Создай проект новый и запусти CodeGenerator там в разделе АЦП все настрой и посмотри на инициализацию портов АЦП (будет в отдельном "абзаце" кода).

Re: tiny44:при вкл АЦП пробл записи в PA6 из прерывания тайм

Добавлено: Вт май 18, 2010 21:07:21
alfons
спасибо! попробовал на AT90CAN32, просто было в тот момент быстрее и удобнее! всё прекрасно получилось, выбрал нужные порты! но у меня МК на ATmega8 и проблема с ним! там в CVAVR для него нет таких функций! работать именно на нём - это не мой каприз, а руководителя :cry: ! может, можно как то в ручную в самом тексте программы поменять?

Re: tiny44:при вкл АЦП пробл записи в PA6 из прерывания тайм

Добавлено: Вт май 18, 2010 22:09:27
Saadov
Saadov писал(а):
alfons писал(а): где это поменять в программе! все порты работают как АЦП! заранее благодарю за помощь!
Это надо в даташите на ваш микроконтроллер посмотреть как выставить нужные ножки для использования АЦП или в курсе AVR посмотреть http://www.123avr.com/z09.htm
Перечитайте еще раз, а по ссылке разжевано проще простого...