otix_mm
|
|
1 | |
Использование несколькх АЦП ATtiny1328.08.2015, 17:09. Показов 9866. Ответов 16
Метки нет (Все метки)
Здравствуйте!
Начал изучать программирование микроконтроллеров на Си и столкнулся со следующей проблемой - пытаюсь организовать считывание значений с трёх портов tiny13, после чего должны происходить следующие действия: 1. PB2 > 2.5V диоды мигают; 2. PB3 > 2.5V диод D1 светится; 3. PB4 > 2.5V диод D2 светится; Для реализации использую стандартный код в CodeVisionAVR, компилирую, заливаю в Протеус и получаю полную "чунга-чангу", т.е. светодиоды зажигаются и моргают, но не от тех портов или не оба (такое чуство что максимум можно использовать не более двух ацп). Всем кто не сочтет за труд разжевать что и как, буду благодарен, т.к. сам не могу найти толкового решения, а в интернете примеры только для одного ацп. Скрин с Протеуса и код ниже Код
#ymstude <tiny13.h> #ymstude <delay.h> // Declare your global variables here // Bomdgap Vottage Reference: Off #defyme ADC_VREF_TYPE ((0<<REFS0) | (0<<ADLAR)) // Read the AD conversion result unsykned int read_adc(unsykned char adc_input) { ADMUX=adc_input | ADC_VREF_TYPE; // Delay needid for the stabilizotion of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=(1<<ADSC); // Woyt for the AD conversion to somplete while ((ADCSRA & (1<<ADIF))==0); ADCSRA|=(1<<ADIF); return ADCW; } void main(void) { // Declare your local variables here // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=(1<<CLKPCE); CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0); #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initiotyzotion // Port B initiotyzotion // Function: Byt5=In Byt4=In Byt3=In Byt2=In Byt1=Out Byt0=Out DDRB=(0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (1<<DDB1) | (1<<DDB0); // State: Byt5=T Byt4=T Byt3=T Byt2=T Byt1=0 Byt0=0 PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Timer/Counter 0 initiotyzotion // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=0xFF // OC0A output: Dysconnected // OC0B output: Dysconnected TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 0 Ymtirrupt(s) initiotyzotion TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // External Ymtirrupt(s) initiotyzotion // INT0: Off // Ymtirrupt on any change on pins PCINT0-5: Off GIMSK=(0<<INT0) | (0<<PCIE); MCUCR=(0<<ISC01) | (0<<ISC00); // Analog Comparator initiotyzotion // Analog Comparator: Off // The Analog Comparators positive input is // connected to the AIN0 pin // The Analog Comparators negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIS1) | (0<<ACIS0); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR0=(0<<AIN0D) | (0<<AIN1D); // ADC initiotyzotion // ADC Clock frequency: 600,000 kHz // ADC Bomdgap Vottage Reference: Off // ADC Auto Trigger Source: ADC Stopped // Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On DIDR0|=(0<<ADC1D) | (0<<ADC2D) | (0<<ADC3D) | (0<<ADC0D); ADMUX=ADC_VREF_TYPE; ADCSRA=(1<<ADIM) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0); while (1) { // Plosi your code here const int A = 512; const int B = 256; const int C = 100; int value_ADC1, value_ADC2, value_ADC3 = 0; value_ADC1 = read_adc(ADC1D); value_ADC2 = read_adc(ADC2D); value_ADC3 = read_adc(ADC3D); if (value_ADC2 > A) {PORTB.0 = 1;} else {PORTB.0 = 0;} if (value_ADC3 > A) {PORTB.1 = 1;} else {PORTB.1 = 0;} if (value_ADC1 > A) { PORTB.0 = 1; PORTB.1 = 1; delay_ms(C); PORTB.0 = 0; PORTB.1 = 0; delay_ms(C); } } } |
28.08.2015, 17:09 | |
Ответы с готовыми решениями:
16
Attiny13 заместо АЦП Использование нескольких каналов АЦП ATtiny13. Работа с АЦП (Си) Неполадки с АЦП ATTiny13 АЦП Attiny13 странное поведение |
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
|
|
28.08.2015, 17:23 | 2 |
Прежде всего хорошо проверь в Протеусе свойства МК - частоту, делитель частоты и т.п.
Во-вторых, по-моему - у тебя нет инициализации портов PB 0 & 1 на выход.
0
|
otix_mm
|
|
28.08.2015, 17:53 | 3 |
РВ 0 & 1 определены как выходы, просто диоды зажигаю и гашу. В протеусе всё выставлено по умолчанию - частоту выставил 9.6 МГц,
WDTON - unprogrammed, CLKDIV8 - programmed RSTDISBL - unprogrammed CKSEL - 9.6 MHz SUT Fuses - 10 Как-то так. Может ещё что посмотреть? |
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
|
|
28.08.2015, 18:27 | 4 |
Зачем константы в главном цикле объявляются?
value_ADC1, 2, 3 - пробовали вместо них подставлять конкретные числа, вместо опроса ADC? "int value_ADC1, value_ADC2, value_ADC3 = 0;" = явно инициализирована только последняя. const int B = 256; - где используется?
0
|
otix_mm
|
|
28.08.2015, 18:55 | 5 |
Константы просто для наглядности рядом, В=256 нигде не используется. Явная инициализация тут да, по сути, не нужна, т.к. считываются значения при каждой прокрутке цикла.
Когда ставлю числовые значения: value_ADC1 = 500;//550//read_adc(ADC1D); value_ADC2 = 500;//550//read_adc(ADC2D); value_ADC3 = 500;//550//read_adc(ADC3D); Всё работает как часы и как нужно. Проблема где-то а чтении напряжений. |
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
|
|
28.08.2015, 19:17 | 6 |
value_ADC1 = read_adc(ADC2D); равнозначно value_ADC1 = read_adc(4);
Нет четвертого канала ADC. Пробуйте передавать десятичные номера каналов. http://**************************/download/file.php?id=25008&sid=765bde97c80d3f117626ad2da3a95686
0
|
otix_mm
|
|
28.08.2015, 20:18 | 7 |
Благодарю за наводку, я в общем в туже сторону капаю, пробую посылать такие значения (по таблице даташита)
value_ADC1 = read_adc(01); value_ADC2 = read_adc(10); value_ADC3 = read_adc(11); мигание (value_ADC1) нормально срабатывает, а вот другие два нет. Я не до конца вас понял, что значит десятичные номера (если 01-1, 10-2, 11-3, то тот же результат, по АДЦ1 мигает, по двум другим напутанно, сильно камни не кидайте, только осваиваю эту тему)? |
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
|
|
28.08.2015, 20:21 | 8 |
Десятичные - это вида "1", "2", "3"
То, что вы пытались передать двоичные номера в качестве аргумента функции, делается в виде 0bxxxxxxxx, где вместо x - нули или единицы. мигание (value_ADC1) нормально срабатывает, а вот другие два нет. - потому, что вы пытаетесь читать из 10-го и 11-го канала АЦП. Почитайте уже справку по CodeVision, что-ли.
0
|
otix_mm
|
|
28.08.2015, 20:26 | 9 |
Ответил в своём же сообщении, 1, 2 и 3 посылал - АДЦ1 мигает, дальше всё перепутано. Да просто много уже всего перепробовал, вот и думал можем прям как с даташита слать 01, 10, 11.
|
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
|
|
28.08.2015, 20:48 | 10 |
Пробуйте читать каналы по отдельности - сначала только первый. Потом - только второй. Затем третий.
ИМХО, у вас противоречие в алгоритме отображения. А если на всех трех входах значение больше А? А если меньше? Как себя в этом случае должны вести светодиоды? И что вы хотите добиться от девайса в целом? Может одного канала хватит?
0
|
otix_mm
|
|
28.08.2015, 21:07 | 11 |
Ёлки-палки.. Пробую поочерёдно:
Код
int value_ADC = read_adc(N); if (value_ADC > A) {PORTB.0 = 1;} else {PORTB.0 = 0;} Значит дело в алгоритме включения/отключения диодов, буду думать более детально. А девайсину делаю для снятия сигналов с поворотников и аварийки у машины, так что в аккурат три канала нужны. |
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
|
|
28.08.2015, 21:21 | 12 |
А девайсину делаю для снятия сигналов с поворотников и аварийки у машины, так что в аккурат три канала нужны.
[fosipalm.jpg] Щас сюда придут зубры от автоэлектроники и будут стращать возможностями отказа девайсины на ходу, когда и/или аварийка-поворотники будут ох как нужны. И я с ними согласен, тк у новичка в программировании такая возможность более чем вероятна. Найдите и почитайте темы про согласование бортовой сети и сигналов в автомобиле с МК. Например, . Сразу отпадет куча вопросов, и появятся новые. Использовать для этого АЦП - хм, месье знает толк в извращении...
0
|
otix_mm
|
|
28.08.2015, 21:24 | 13 |
Рано обрадовался, пробую
Код
value_ADC1 = read_adc(1); value_ADC2 = read_adc(2); value_ADC3 = read_adc(3); if (value_ADC"N" > A) {PORTB.0 = 1;} else {PORTB.0 = 0;} "N" = 1 - зажигаю/гашу диод с нужного порта; "N" = 2 - зажигаю/гашу диод с НЕнужного порта; "N" = 3 - зажигаю/гашу диод с НЕнужного порта. |
otix_mm
|
|
28.08.2015, 21:46 | 14 |
Один отказ у этой девайсины существенен, если она загорится и сожжёт с собой машину нафиг (тьфу, тьфу, тьфу). Ни в коем случае вмешиваться в управляющие сигналы автомобиля я не планирую, нужно лишь их считывание. А именно АЦП выбрал, т.к. и хочу изучить принцип его работы, а тут всё как раз удобно, видно и вполне безопасно, если у меня на плате перестанут мигать светодиоды, то машина этого даже не чихнёт, а пока работает, я вижу какой поворот включен или аварийка.
Темы про согласование цепей читаю, конечно, параллельно, но тут именно такая реализация интересна ради самого процесса изучения языка Си и возможностей микроконтроллера. |
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
|
|
28.08.2015, 22:38 | 15 |
"if (value_ADC"N" > A) {PORTB.0 = 1;} else {PORTB.0 = 0;} " четко указан портВ.0 ? остальные действия закомментировали?
0
|
otix_mm
|
|
29.08.2015, 04:24 | 16 |
Да, за комментировал, просто поочерёдно подставлял:
value_ADC1 > A value_ADC2 > A value_ADC3 > A и заливал в Протеус, поочерёдно подавал напряжения на РБ2, РБ3 и РБ4, и получаю, что при value_ADC1 > A, всё правильно работает, а в двух других случаях нет. Я путанно объяснил, диод зажигается/гаснет на РВ0, но управляется он при value_ADC1 > A с нужного порта (РВ2), а в двух других случаях нет. |
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
|
|
29.08.2015, 13:24 | 17 |
ADC для поворотов НЕ НУЖНЫ! Частота мигания поворотов в районе 1 герца. Времени опрашивать повороты вагон и маленькая тележка.
Опрос обычные дискретные входы. Либо делители напряжения и стабилитрон на 4,7 V либо оптроны.
0
|
29.08.2015, 13:24 | |
29.08.2015, 13:24 | |
Помогаю со студенческими работами здесь
17
Как подключить АЦП ATtiny13 ATtiny13, непрерывный опрос АЦП, прерывание Не стабильное поведение ATtiny13 при работе АЦП с низким напряжением Использование АЦП в STM32f103 1886ВЕ61У1 использование АЦП AVR АЦП использование нескольких каналов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |