пятница, 22 мая 2009 г.

Программатор avreal.

Пользуюсь редко, все время забываю коммандную строку.

Прочитать из микроконтроллера:
sudo avreal +mega8 -ab -p/dev/parport0 -r имя_программы.hex

Запрограммить микроконтроллер:
sudo avreal +mega8 -ab -p/dev/parport0 -ew имя_программы.hex

-ew = сначала стереть, а затем записать. можно сразу -w, но иногда из-за этого глюки в работе.
-ab = можно указать в файле конфига другие пины паралл. порта и включить этот конфиг

четверг, 14 мая 2009 г.

Cron и заполнение /var/spool/clientmqueu

Если вы настроили выполнение задач в cron, то надо обязательно позаботиться о выводе ваших команд.
Иначе весь вывод (stdout и stderr) будет валиться в /var/spool/clientmqueue, что может довольно скороо забрать на себя все дискрипторы файлов (огромное число (200000 не предел) маленьких файликов (50-600 байт). И в результате - место свободное есть (df -h), а записать ничего не получиться.

Как один из вариантов, написать после Вашей команды перенаправление
> /dev/null
однако сообщения об ошибках будут продолжать валиться в clientmqueue (что не так уж и плохо, для контроля)

1>/dev/null 2>&1
в этом варианте cron будет особенно молчалив - ни сообщение, ни ошибок

P.S. добавление в заголовок файла (crontab -e) строки вида MAILTO="" никакого положительного эфекта не дало.

вторник, 12 мая 2009 г.

Все для AVR-GCC и Atmega32

Если компилятор выбрасывает (съедает) нужный вам код, то в этом "виновата" оптимизация. Как один из примеров изменение переменных в прерывании и последующее сравнение с ними в main. Выброситься. Средство борьбы - объявить эти переменные volatile, для компилятора это табу, все что касается volatile не будет выкинуто.
==========================================================
Таймер 0


пример кода
TCCR0=(1 << CS02)|(1 << CS00); //prescaler 1024
TIMSK=(1 << TOIE0); //enable interrupt

ISR(TIMER0_OVF_vect) {};


регистр TCNT0 (Timer/Counter Register)
значение таймера

регистр OCR0 (Output Compare Register)
значение для сравнения

регистр TIMSK (Timer/Counter Interrupt Mask Register)
OCIE0 (1) -- разрешение прерывания по сравнению
TOIE0 (0) -- разрешение прерывания по переполнению

регистр TIFR (Timer/Counter Interrupt Flag Register)
OCF0 (1) -- флаг прерывания по сравнению
TOV0 (0) -- флаг прерывания по переполнению


регистр TCCR0 (Timer/Counter Control Register), биты:
FOC0 (7) -- ?? когда ШИМ в него надо писать 0, он всегда читается как 0
если в него записать 1, то на выходе поменяется значение
т.е. он форсирует изменение Waveform Generation и может
использоваться как строб (не вызывая прерываний)
WGM00 (6) -- режим Waveform Generation
WGM01 (3) --
0 0 - обычный режим счет
0 1 - ШИМ с корекцией фазы
1 0 - Clear Timer on Compare Match (CTC) - т.е. как только досчитал до
OCR0, так и обнулился.
1 1 - быстрый ШИМ
COM01 (5) -- в каком режиме на выход пина OC0 будет поступать инфо от таймера
COM00 (4) -- соответсвенный DDR должен быть настроен на вывод.
Для не-ШИМ или CTC
0 0 - обычный режим, пин отключен
0 1 - переключение пина
1 0 - сброс пина
1 1 - установка пина
Fast PWM
0 0 - пин отключен
0 1 - reserved
1 0 - сброс пина, когда OC0 = TOP
1 1 - установка пина, когда OC0 = TOP
CS02..0 (2..0) -- предделитель 000=stop 001=1 010=8 011=64 100=256 101=1024
110=внешний источник с пина T0 по спаду
111=внешний источник с пина T0 по росту

==========================================================
АЦП


Обязательно подключить AVCC к питанию!!!

регистр ADMUX (ADC Multiplexer Selection), биты:
REFS1 (7) -- куда подключен источник опорного напряжения
REFS0 (6) --
0 0 - AREF
0 1 - AVCC (с внешним кодером на AREF)
1 0 - reserved
1 1 - внутренние 2.56V (с внешним кодером на AREF)
ADLAR (5) -- если 1, то выравнивание результата измерения ВЛЕВО.
т.е. результат 8 бит в ADCH, а хвост в 2 бита в ADCL
при чтении ADCL, ADCH будет заблокирован от записи, и пока не
прочитаем ADCH, новый резултат не запишеться.
MUX4..0 -- при значениях n=0..7 - номер пина ADCn. В корпусах TQFP и MLF
(4..0) -- страшие значения определяют дифф.включение и усилитель. В DIP НЕТ!


регистр ADCSRA (ADC Control and Status Register A), биты:
ADEN (7) -- включение АЦП
ADSC (6) -- запуск конверсии, и будет "1", пока идет конверсия. по окончанию
станет "0", НО надо подождать еще ОДИН такт АЦП, что бы резултат
записался в ADCH и ADCL
ADATE (5) -- автозапуск конверсии по тригеру (условию) в регистре SFIOR
ADIF (4) -- флаг прерывания окончания конверсии.
ADIE (3) -- разрешение прерывания от АЦП
ADPS2..0 -- предделитель частоты 000=2 001=2 010=4 011=8 100=16 101=32
(2..0) 110=64 111=128

регистр SFIOR (Special FunctionIO Registe), биты:
ADTS2..0 (7..5) -- условия автозапуска коверсии. от какого прерывания
000 - свободный режим, запуск ни от чего не зависит?
001 - от компаратора
010 - внешнее INT0
011 - от таймера0 сравнения
100 - от таймера0 переполнения
101 - от таймера сравнения Match B (???)
110 - от таймера1 переполнения
111 - от таймера1 Capture Event
4 бит -- reserved -- для совместимости надо в него писать "0"