Текущий архив: 2006.06.25;
Скачать: CL | DM;
Вниз
программирование микроконтроллеров Atmel серии Mega Найти похожие ветки
← →
NeyroSpace © (2006-05-17 10:55) [0]Кто-нибудь занимался сабжем? Я недавно начал изучать и появилось несколько вопросов. Никак не могу запустить АЦП на модели mega8535 . Все время, во всех режимах получаю странный результат 11 11111110. Нашел в инете похожие случаи с 8535. Говорят, что в части новых процов брак АЦП. Никто не сталкивался? И еще мучает следующий вопрос: Есть ли какое-нить ограничение по току подаваемому на АЦП?
← →
tesseract © (2006-05-17 10:59) [1]
> ограничение по току подаваемому на АЦП?
конечно и по току и по напряжению. см маны.
http://www.atmel.ru
http://www.avrfreaks.com
← →
Cashmare © (2006-05-17 11:01) [2]Я, собственно, только этими мк и занимаюсь, с 8535 не сталкивался, но в остальных никаких проблем с АЦП не было.
← →
NeyroSpace © (2006-05-17 11:36) [3]>tesseract © (17.05.06 10:59) [1]
именно в даташите и смотрел, в сводной таблице. Там только про вольтаж. :(
← →
*Pavel © (2006-05-17 13:38) [4]Там только про вольтаж. :(
И правильно, причем здесь ток ? Неужели величиной тока ты можешь оперировать не меняя входного напряжения (при условии, что внутреннее сопротивление АЦП неизменно) ?
Опорное напряжение используешь внутреннее или внешнее ?
Внутреннее опорное, по-моему, равно 2,56 V. Если тебе по какм-либо причинам оно не подходит - используй внешнее, там должен быть AREF pin.
Да, кстати, чему равно текущее входное напряжение на АЦП ?
← →
NeyroSpace © (2006-05-18 12:28) [5]>*Pavel © (17.05.06 13:38) [4]
питание АЦП AVcc = Vcc
Предел напряжения AREF = Vcc
аналоговая земля не подключена
>Неужели величиной тока ты можешь оперировать
Я боюсь сжечь
пробовал уже и примеры прошивать, и сам на асме написал прошил, все время один и тот же результат. Прогу могу показать.
Я уже attiny26 купил, попробую еще с ним.
← →
dr Tr0jan © (2006-05-18 15:45) [6]Тут на форуме где-то ссылка пару месйцев назад пробегала: Atmel с нуля - может помнит кто? Там уроки были всякие, примеры. Очень хочется почитать.
← →
NeyroSpace © (2006-05-18 17:29) [7]>dr Tr0jan © (18.05.06 15:45) [6]
Если уже был опыт общения с асмом, то лучше всего просто прочесть вот эту книгу:
http://lord-n.narod.ru/download/books/walla/mcu/atmelbook.djvu
очень быстро въезжаешь во внутреннюю организацию, а дальше только программить.
Кстати, чем понравились именно Atmel"овские контроллеры - программатор это 5 проводков к LPT порту! Можно прошивать не отключая питания. Есть много компиляторов на C, видел даже на паскале, но он платный ((.
← →
Pa5ha (2006-05-18 22:49) [8]Топ не читал, но ссылку http://radiokot.ru не нашел. Там очень качественная обучалка. По ней учился, даж несколько статей про самоделки на контроллерах написал. В конце концов там на форуме народ трется умный :)
← →
tesseract © (2006-05-19 10:45) [9]
> Кстати, чем понравились именно Atmel"овские контроллеры
> - программатор это 5 проводков к LPT порту! Можно прошивать
> не отключая питания. Есть много компиляторов на C, видел
> даже на паскале, но он платный ((.
не на всех 5. У меня рембригада через два провода (SPI) программирует :-)
← →
tesseract © (2006-05-19 10:52) [10]
> видел даже на паскале, но он платный ((.
стандартный не платный, майский релиз :
http://www.e-lab.de/AVRco/index_en.html
← →
Cashmare © (2006-05-19 10:54) [11]tesseract © (19.05.06 10:45) [9]
не на всех 5. У меня рембригада через два провода (SPI) программирует :-)
%) А можно поподробнее? %)
← →
tesseract © (2006-05-19 10:58) [12]
> %) А можно поподробнее? %)
Новые Atmel могут программироваться 1-5 способами.
Выцырапал где-то в "Чип и дип" тройку книг с лит-ой по atmel.
Чего та там Эльдар наваял. Теперь обновляет прошивку в процах не выпаивая :-)
← →
tesseract © (2006-05-19 10:59) [13]автор pascal для atmel : http://www.e-lab.de/img/comics15d.gif :-)))
Натуральный кодер :-)
← →
Cashmare © (2006-05-19 11:03) [14]tesseract © (19.05.06 10:58) [12]
Да хоть тысячей способов, но не через два провода (SPI)! Питание и земля? :)))
← →
Cashmare © (2006-05-19 11:05) [15]tesseract © (19.05.06 10:58) [12]
Теперь обновляет прошивку в процах не выпаивая :-)
Это-то понятно, это и называется InSystem Programming...
← →
вразлет © (2006-05-19 11:21) [16]Я вообще по RS-232 перешиваю :)
← →
tesseract © (2006-05-19 11:47) [17]
> Да хоть тысячей способов, но не через два провода (SPI)!
> Питание и земля? :)))
Почему ?? 1-wire спокойненько так питание по сигнальной шине передаёт.
← →
Cashmare © (2006-05-19 11:52) [18]Но SPI же не 1-wire...
← →
NeyroSpace © (2006-05-22 10:46) [19]Разобрался я с сабжем. Оказалось АЦП измеряет "-" напряжение, а я подавал "+".
>вразлет © (19.05.06 11:21) [16]
имеется ввиду прямое подключение к COM порту компьютера без дополнительной развязки? Или есть что-то вроде MAX232...?
А то напрямую я уже один микроконтроллер по невнимательности угробил. Я знал, что нельзя, чтобы при прошивке напрямую через LPT, напряжение питания на микроконтроллере было меньше 4.5 - 5В, но не уследил. Больше проц из PonyProg не виден ((. Хотя в целом Atmel"овские тараканы очень живучие и прощают многие издевательства)).
А кто-нибудь делал что-нибудь связанное с подключением микроконтроллера непосредственно к Ethernet или WiFi?
← →
вразлет © (2006-05-22 11:21) [20][19] NeyroSpace © (22.05.06 10:46)
Не, конечно же через MAX232.
← →
Cashmare © (2006-05-22 11:34) [21]NeyroSpace © (22.05.06 10:46) [19]
Я знал, что нельзя, чтобы при прошивке напрямую через LPT, напряжение питания на микроконтроллере было меньше 4.5 - 5В
Я тоже это знаю уже лет 6, но ни разу еще ничего не сгорело при подключении напрямую :) Так что, даже это они прощают, причем и tiny, и классики, и меги...
← →
tesseract © (2006-05-22 11:39) [22]
> А кто-нибудь делал что-нибудь связанное с подключением микроконтроллера
> непосредственно к Ethernet или WiFi?
Существуют преобразователи интерфейса.
Пользуемся tibbo-котроллерами. так же проходили LANtrinix, Cas Ethernet, neteye.
Wi-fi только у lantronix.
← →
NeyroSpace © (2006-05-22 17:57) [23]>Cashmare © (22.05.06 11:34) [21]
Мне tiny26 этого не простил. Было 2.5-2.7В, а я начал прошивать. Теперь он в ponyprog больше не виден. Хотя сам контроллер жив, залить в него через "5 проводков" больше ничего не получается.
← →
Cashmare © (2006-05-22 18:05) [24]NeyroSpace © (22.05.06 17:57) [23]
Я не пользуюсь никакими понипрогами, у меня собственноручно_на_дельфи_написанные программаторы с собственной распиновкой на LPT-порте. Может поэтому меня микроконтроллерный бог и милует :)
← →
Defunct © (2006-05-22 18:24) [25]
> Разобрался я с сабжем. Оказалось АЦП измеряет "-" напряжение,
> а я подавал "+".
С какого перепугу?
АЦП меряет как раз +.
"-" вообще-то опасно подавать на вход...
← →
NeyroSpace © (2006-05-23 09:56) [26]>Defunct © (22.05.06 18:24) [25]
в том-то и дело! я только что с бубном не плясал вокруг него!
Подаю на вход АЦП +1.5В, а он выдает 11 11111110 - т.е. превышение уровня, подаю -1.5В выдает правильный результат. Не знаю почему так.
← →
Defunct © (2006-05-23 12:33) [27]> Подаю на вход АЦП +1.5В, а он выдает 11 11111110 - т.е. превышение уровня
Не может быть!
Если вход АЦП соединить с землей будет вам 0, если соединить с Vcc будет вам $3FF.
проверьте лучше входную цепь, есть высокая вероятность того, что вход АЦП подтянут у вас к Vcc, от того и проблема.
Проверьте также чтобы внутренний Pull-up резистор был отключен:
DDRA = 0;
PORTA = 0;
← →
antonn © (2006-05-23 13:13) [28]у меня, кстати, в схеме от 0 до 5В подается, положительных 8)
это так, к слову:)
← →
NeyroSpace © (2006-05-25 09:58) [29]Входами АЦП у ATmega8535 являются порты А. Я их никак не инициализирую, стало быть
DDRA = 0;
PORTA = 0;
>что вход АЦП подтянут у вас к Vcc
Что имеется ввиду? На схеме у меня выводы "питание АЦП AVcc" = Vcc = ARef = +5В.
Вроде в примерах так тоже показано.
← →
Defunct © (2006-05-26 01:04) [30]> Я их никак не инициализирую, стало быть
> DDRA = 0;
> PORTA = 0;
Стало быть так, если в программе нет ошибок.
> Что имеется ввиду?
Имеется в виду, что именно вход PAX, который у вас дает неправильное значение преобразования подтянут к Vcc резистором, поэтому когда вы подаете отрицательное напряжение на входную цепь, то этот резистор дает вам смещение в результате чего вы видите результат преобразования отличный от 0.
> На схеме у меня выводы "питание АЦП AVcc" = Vcc = ARef = +5В.
Ну так подумайте логически. VRef у вас +5В, с какого перепугу АЦП будет работать с "-"? АЦП может мерять только в диапазоне - 0..VRef.
Ощите ошибку в схеме либо в программе. Что именно искать - подсказал.
← →
Defunct © (2006-05-26 01:07) [31]> Ощите
Ищите*
← →
NeyroSpace © (2006-05-26 09:25) [32];С Х Е М А:
;AREF = +5v
;AGRND = GRND = -5v
;AVcc = +5v
;на порт А подаем "-"
;
;к портам D подключить светодиоды
;на них выводиться состояния битов АЦП
;
;П Р О Г Р А М М А:
;при срабатывании таймера отображается результат АЦП
;
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8535def.inc"
.def tmp = r16
.def tmpADCH = r17
.def tmpADCL = r18
.def tmp16AH = r19
.def tmp16AL = r20
;начинаем инициализировать таблицу векторов прерывания
;первый адрес - ссылка на адрес запуска
rjmp INIT_PROG
;далее идет таблица векторов прерывания для mega8535
;=================================================================
nop; 01 int0
nop; 02 int1
nop; 03 timer2 comp
nop; 04 timer2 ovf
nop; 05 timer1 capt
nop; 06 timer1 compa
nop; 07 timer1 compb
nop; 08 timer1 ovf
rjmp I_Timer0; 09 timer0 ovf
nop; 10 SPI, STC
nop; 11 UART, RX
nop; 12 UART, UDRE
nop; 13 UART, TX
rjmp I_ADC1; 14 ADC - nop; 15 EE_RDY
nop; 16 ANA_COMP
nop; 17 TWI
nop; 18 INT2
nop; rjmp I_Timer0_Comp; 19 TIMER0
nop; 20 SPM_RDY
;=================================================================
INIT_PROG: clr tmp
ldi tmp,high(RAMEND) ; устанавливаем указ. стека на последнюю ячейку RAM
out SPH,tmp ; Set Stack Pointer to top of RAM
ldi tmp,low(RAMEND)
out SPL,tmp
ldi tmp, 0b11111111 ;$01 0 - вход, 1 - выход
out ddrd,tmp ;конфигурируем первую линию порта D как выход
;+-------------------+
;| настраиваем Timer0|
;+-------------------+
ldi tmp, $f0 ;загружаем стартовое значение счетчика
out TCNT0, tmp ;в таймер T0
clr tmp
sbr tmp, 1<<CS00 ;устанавливаем режим работы Т0 как счетчик
out TCCR0, tmp ;1:1 с частотой работы проца
sbr tmp, 1<<CS02 ;устанавливаем режим работы Т0
out TCCR0, tmp ;как 1 на 1024 тактов проца
sbr tmp, 1<<TOIE0 ;сдвигаем число 00000001 влево TOIE0 раз
;разрешение прерывания от Т0 осуществляется
;установкой в 1 разряда TOIE0
out TIMSK, tmp ;его регистра TIMSK
;+-------------------+
;| настраиваем АЦП |
;+-------------------+
;настраиваем номер канала с которого
;берем аналоговый сигнал
;берем с порта А канал 0 (PA0)
clr tmp
;опорное напряжение от AVcc + вход PA0
ldi tmp, (0<<REFS1) + (1<<REFS0) + (0<<ADLAR) + (0<<MUX4) + (0<<MUX3) + (0<<MUX2) + (0<<MUX1) + (0<<MUX0);
out ADMUX, tmp
sei ;разрешаем все прерывания
;вкл пересчетные коэф АЦП + начать преобразование + непрерывный АЦП + прерывание + прерыв по оконч АЦП + коэф. предделителя частоты
ldi tmp, (1<<ADEN) + (0<<ADSC) + (0<<ADATE) + (0<<ADIF) + (1<<ADIE) + (0<<ADPS2) + (1<<ADPS1) + (1<<ADPS0)
out ADCSRA, tmp
;+-------------------+
sleep
ldi tmp, 15
out WDTCR, tmp
clt
MainLoop: wdr ;сброс сторожа
ldi r17, $00
rjmp MainLoop
I_ADC1:
in tmpADCL, ADCL
in tmpADCH, ADCH
reti
I_Timer0:
sbrs tmpADCL, 0
cbi portd, 0
sbrc tmpADCL, 0
sbi portd, 0
sbrs tmpADCL, 1
cbi portd, 1
sbrc tmpADCL, 1
sbi portd, 1
sbrs tmpADCL, 2
cbi portd, 2
sbrc tmpADCL, 2
sbi portd, 2
sbrs tmpADCL, 3
cbi portd, 3
sbrc tmpADCL, 3
sbi portd, 3
sbrs tmpADCL, 4
cbi portd, 4
sbrc tmpADCL, 4
sbi portd, 4
sbrs tmpADCL, 5
cbi portd, 5
sbrc tmpADCL, 5
sbi portd, 5
sbrs tmpADCL, 6
cbi portd, 6
sbrc tmpADCL, 6
sbi portd, 6
sbrs tmpADCL, 7
cbi portd, 7
sbrc tmpADCL, 7
sbi portd, 7
sbi ADCSRA, ADSC
sleep
reti
;=====end============
Проще уже не куда. По таймеру в порту D устанавливаем те биты кот установлены в регистре-результате АЦП. АЦП происходит непрерывно. Результат сохраняется в tmpADCL, tmpADCH.
А отображаем результат только по таймеру, где-то 2 раза в сек.
← →
вразлет © (2006-05-26 09:56) [33]> Я их никак не инициализирую, стало быть
> DDRA = 0;
> PORTA = 0;
Стало быть так, если в программе нет ошибок.
Не стало быть, надо всегда инициализировать.
← →
Defunct © (2006-05-26 14:49) [34]вразлет © (26.05.06 09:56) [33]
> Не стало быть, надо всегда инициализировать.
Надо конечно, только по сигналу Reset все регистры в AVR обнуляются, в т.ч. и регистры I/O space.
Ошибка номер раз:
ldi tmp, (0<<REFS1) + (1<<REFS0) + (0<<ADLAR) + (0<<MUX4) + (0<<MUX3) + (0<<MUX2) + (0<<MUX1) + (0<<MUX0);
out ADMUX, tmp
По вашим словам к ARef подано +5. Вы используете режим AVCC with external capacitor at AREF pin, что соответсвенно не годится в вашем случае.
Поставьте
REFS1..0 = 0 (ARef)
← →
NeyroSpace © (2006-05-30 19:37) [35]>Defunct © (26.05.06 14:49) [34]
Спасибо, кажется ошибка действительно в схеме была. Сделал более аккуратными связки проводов и все заработало с "+".
Работает и так (0<<REFS1) + (1<<REFS0) и так (0<<REFS1) + (0<REFS0).
А в программе есть небольшая неточность, нужно везде поменять местами
строки, а то светодиоды горели, когда 0 и не светились когда 1. Так правильно:
sbrs tmpADCL, 0
sbi portd, 0
sbrc tmpADCL, 0
cbi portd, 0
Страницы: 1 вся ветка
Текущий архив: 2006.06.25;
Скачать: CL | DM;
Память: 0.56 MB
Время: 0.011 c