Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Исходники программ и библиотек
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2, 3, 4
SasaVitebsk
Матричная клавиатура. Гашение дребезга. Ввод-вывод. Ввод символьной информации методом нескольких нажатий. Всё для IAR C.

Для того, чтобы не вносить дополнительных ошибок выкладываю процедуры и библиотеки "как есть" из своего проекта. Всё однозначно рабочее. Клавиатура применена 3х4 с маркировкой как для АОНа. (Использовались данные толкатели). Библиотеки будут вложены, а примеры применения и некоторые подпрограммы - здесь.

Для реализации символьного ввода используется п/п динамического ввода на клавишу из библиотеки клавиатуры. Всё реализовано для atmega8/88

Инициализация
Код
// Инициализировать таймер 0 и прерывания для опроса клавиш
#if __ATmega88__
  TCCR0A = 0x02;                                            // Режим СТС
  TCCR0B = 0x5;                                                // FCLK/1024 (14.4KHz/69.4mks)
  OCR0A = T_INT_TIM*1000000/1024/TCLK;                        // прерывание T_INT_TIM ms
  TIMSK0 = 2;                                                // Прерывания от CTC
#elif __ATmega8__
  TCCR0 = 0x05;                                                // Режим NORMAL, FCLK/1024 (14.4KHz/69.4mks)
  TIMSK |= 1;                                                // Прерывания от переполнения
#endif
// Инициализировать оборудование
  DelayInit();                                                // Инициализация таймера
  LCDInit();                                                // Инициализировать LCD дисплей
  spliter_init();                                            // Инициализировать сплитер
  KeyInit();                                                // Инициализация клавиатуры
  WakeInit();                                                // Инициализация интерфейса rs485 и протокола WakeUp
  __enable_interrupt();                                        // Разрешить прерывания


Символьный ввод
Код
const uint8_t __flash strkey[10][6] =
{
  {'0',' ','-','=','+',0},
  {'1',',','.',';',':',0},
  {'2','А','Б','В','Г',0},
  {'3','Д','Е','Ж','З',0},
  {'4','И','Й','К','Л',0},
  {'5','М','Н','О',0,0},
  {'6','П','Р','С',0,0},
  {'7','Т','У','Ф','Х',0},
  {'8','Ц','Ч','Ш','Щ',0},
  {'9','Ы','Э','Ю','Я',0}
};



uint8_t    getextchar(void)                                    // Ввести расширенную клавишу
{
  uint8_t    c, index, old, tekc, d;

  
  index=0;
  while(KeyPress()==0);                        // Если установлен бит Int_Key, то клавиша была нажата
  do
  {
    while(KeyPress()!=0);                    // ждём пока клавишу отпустят
    c = getchar();                            // прочитать код клавиши
    old=c;                                    // запомнить последнюю нажатую кнопку
    if(c < '0') return(c);                    // Если клавиши управления, то выйти
    else c -= '0';
    WaitLong = PAUZA;                        // Измерить паузу после нажатия
    tekc=strkey[c][index];                    // текущий символ
    putchar(tekc);                            // вывести
    do
      if(KeyPress()!=0)                        // Если клавиша была нажата снова
      {
        d=KeyPress();                        // прочитать код клавиши
        if(d!=old)return(tekc);                // если изменили клавишу, то выйти
        index++;                            // Следующий символ из ряда
        if(strkey[c][index]==0)index=0;        // если конец ряда, то выйти
        putchar(CR_BS);                        // Забить предыдущий символ
        break;
      }
    while(WaitLong!=0);
  }
  while(WaitLong!=0);
  return(tekc);
}


Само прерывание опроса клавиатуры и меток времени
Код
#ifdef __PORT88__
#pragma    vector=TIMER0_COMPA_vect                            // Метки времени 10 мс
#else
#pragma    vector=TIMER0_OVF_vect                                // Метки времени 10 мс
#endif
__interrupt    static void    MetkiTime10ms(void)
{

#if __ATmega8__
TCNT0 = -(T_INT_TIM*1000000/1024/TCLK);
#endif
  KeyScan();                                                // Опросить клавиши
  KeyStrSet();                                              // выставить строку
  if(WaitLong!=0)WaitLong--;                                // Высчитать задержку
}
Aesthete Animus
Вот ссылка на классную библиотеку 1-wire:
http://files.dalsemi.com/auto_id/public/owpd310.zip
( http://www.maxim-ic.com/products/ibutton/s...ire/wirekit.cfm )

А здесь, если порыться, можно найти много полезного по той же части:
ftp://ftp.dalsemi.com/pub/auto_id/softdev/
( ftp://ftp.dalsemi.com/pub/auto_id/softdev/softdev.html )
amaora
8бит ЦАП/АЦП, или звуко-проигрыватель PCM/ADPCM (11025Hz) с управлением по EIA-232, или тремя кнопками. писалось в целях ознакомления с AVR, надеюс будет кому то полезно. исходник на C и управляющая прожка под linux, http://www.paravozeg.narod.ru/avr_prog_md.tar.gz
Kybik
Исходник (CVAVR) для декодирования IR пульта старых телеков Goldstar.
После приема отправляет по USART. Котроллер Mega16 16МГц; выход TSOPа на INT0(PD2).

Communication Parameters: 8 Data, 1 Stop, No Parity
USART Mode: Asynchronous
USART Baud Rate: 38400

Исходник:
Нажмите для просмотра прикрепленного файла
Genadi Zawidowski
AvrStudio + WINAVR, чистый C

Програма управления премником с синтезатором.
С большой библиотекой подпрограмм для управления разнообразными микросхемами DDS и PLL.

Програмный SPI, в минимальном виде обслуживание RAMTRON FRAM, примитивная клавиатура и инкрементный валкодер. Еще одна версия обслуживания HD1602.
Аттачмент - TC1-....

----------------
На китайском форуме нашелся полный проект прерходника USB-RS232 - стандартное CDC устройство.
ATMEGA8 + Philips/NXP PDIUSBD12.
Исходники и схема в аттачменте. Проект минималистский, но похоже рабочий. Во всяком случае, мне помогло кое-в чем разобраться, как с USB бороться.
Оригинал лежит на
http://blog.chinaunix.net/u/3272/showart_245587.html

----------------
Еще один проект ATMEGA162 + Philips/NXP PDIUSBD12.
Внешняя USB звуковая плата для воспроизведения звуком.
С кучей ошибок в коде (кое-где перепутаны выдача кода и данных в Philips), но мне помог на самом начальном этапе. Ввести звук в компютер мне так и не удалось заставить эту программу.
http://www.circuitcellar.com/AVR2004/HA3553.html

A3553.ZIP
haker_fox
Цитата(hooky-mars @ Apr 20 2008, 22:36) *
А есть не по табличному способу?

Код
unsigned char crc_8;                                  //в этой переменной считаем CRC8

//Вычисляет и возвращает crc8
void do_crc_8(unsigned char byte)
{
unsigned char ret=crc_8;
unsigned char m=1;
unsigned char l;
for (char j=0;j<8;j++)
    {
    l=((byte&m)?0x8c:0)^((ret&0x1)?0x8c:0);
    ret>>=1;
    ret^=l;
    m<<=1;
    }
crc_8=ret;
}
haker_fox
Интересная ссылка. Глубоко не копал, но там содержится набор различных инструментов + библиотеки программ для AVR.
Буду рад, если окажется полезной!
artemm
Библиотека для IAR AVR для работы с 1-wire, мож кому пригодится
Ph. Anatoliy
Не совсем в тему, но может пригодится.

Библиотека AVR32LIb Altium (6,7)


Ссылки на поекты использующие USB и микроконтроллеры AVR (AVR-USB ).

http://microcpu-info.na.by/index.php?optio...9&Itemid=23
Ph. Anatoliy
Цитата(VDG @ Sep 10 2008, 17:30) *
Не работает ссылка. Пишет доступ закрыт.


Прошу прощения ... эти гады на na.by закрыли мой сайт ... (слов нет какие они какашки)

Вот ссылки

Проекты в сети реализованные на AVR-USB
http://www.obdev.at/products/avrusb/prjall.html

A Firmware-Only USB Driver for the AVR
http://avrusb.wikidot.com/

Если у вас так же плохо с английским, как и у меня, то могу предложить перевод нескольких страниц.

Собственно перевод.
ARV
2 ссылки (на этом же форуме): библиотека поддержки AT90CANxxx и пример ее использования. WinAVR. взято из комплекта отладочной платы DVK90CAN1.

http://electronix.ru/forum/index.php?act=A...st&id=26506
http://electronix.ru/forum/index.php?act=A...st&id=26516
Andrew Lekar
Вот дописал работу с 1-wire slave. Язык - Си.
Можете пользоваться.

Тайминги настроены на 11.059MHz, AtMega16, таймер с предделителем 32 и прерывание по фронту. Схема соединения с линией 1-wire через 2 транзистора (но это не критично).

В архиве кроме того неплохая библиотечка для работы с таймерами. Позволяет повесить несколько виртуальных таймеров на 1 реальный.

Да, у 1-wire много проверок для надёжности работы, поэтому протокол видно не очень явно. Есть код без проверок - более ясный, но он падает при отсутствии мастера.
pavel-pervomaysk
Вот мой код для 44780 , понимаю что тут на асме пишущих мало ...


CODE

long_code_here = ';


// Работа с ЖКИ

// LCD PORTA

// Двухстрочный ЖКИ 16 х 2 ( 20 х 4 ) контроллер 44780 режим 4 бита 5 х 7 точек

.equ rs = PA1 // Выбор регистра ЖКИ
.equ rw = PA2 // Чтение_запись данных в ЖКИ
.equ e = PA3 // Включение разрешения команд
.equ bf = PA7 // Флаг занятости ЖКИ



init_lcd: // Инициализация ЖКИ
cbi porta,rw // RW --> 0
cbi porta,e // E --> 0
cbi porta,rs // RS --> 0
call wait_20ms // ждем 20 милисекунд
ldi data,0x28 // 4 бита режим 5 х 7 точек 2 строки
call lcd_cmd_i // передаем команду в ЖКИ
call wait_20ms // ждем 20 милисекунд
ldi data,0x0C // 4 бита режим 5 х 7 точек 2 строки
call lcd_cmd_i // передаем команду в ЖКИ
call wait_20ms // ждем 20 милисекунд
ldi data,0x28 // 4 бита режим 5 х 7 точек 2 строки
call lcd_cmd_i // передаем команду в ЖКИ
call wait_20ms // ждем 20 милисекунд
ldi data,0x00 //
call lcd_cmd // передаем команду в ЖКИ
call lcd_line1 //
ret // выход

// Register r16 tmp
wait_lcd: // Готовность ЖКИ к приему
ldi tmp,0x0F // загружаем константу
andi tmp,0x0F // выделяем старшую тетраду
out ddra,tmp // выводы 4 5 6 7 порта А - входы
cbi porta,rs // RS --> 0
nop //
sbi porta,rw // RW --> 1
nop //
lcd_busy: // E --> 1
sbi porta,e // E --> 1
nop //
in tmp1,pina // Прочитать содержимое порта А
cbi porta,e // E --> 0
nop //
sbi porta,e // E --> 1
nop //
cbi porta,e // E --> 0
sbrc tmp1,7 // пропуск след команды если сброшен бит 7
jmp lcd_busy // перейти на метку lcd_busy
cbi porta,rw // RW --> 0
ldi tmp,0xFF // загружаем константу
out ddra,tmp // все выводы порта А - выходы
ret // выход

clr_string: // Очистка строки ЖКИ
ldi data,0x20 // загружаем данные пробела
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
call print_char // выводим на жки
ret // выход

clr_lcd: // Очистка ЖКИ
ldi data,0x01 // загружаем данные
call lcd_cmd // подаем команду
ret // выход

clr_line1: //
call lcd_line1 //
call clr_string //
call lcd_line1 //
ret //

print_char: // Вывод символа / данных на ЖКИ
call wait_lcd //
sbi porta,rs // RS --> 1
jmp send_byte // передаем байт в ЖКИ

send_nibble: // Передача полубайта в ЖКИ
sbi porta,e // E --> 1
in tmp,porta // прочитать содержимое порта
andi tmp,0x0F // и выделить старшую тетраду
andi data,0xF0 // выделить младшую тетраду в регистре
or data,tmp // смешать регистр с данными
out porta,data // выдать в порт А результат
cbi porta,e // E --> 0
ret // выход

lcd_line1:
ldi data,0x80 // Выбор адреса первой строки данных !
call lcd_cmd // передаем команду
ret // выход

lcd_line2:
ldi data,0xC0 // Выбор адреса второй строки данных !
call lcd_cmd // передаем команду
ret // выход

lcd_line3:
ldi data,0x94 // Выбор адреса третьей строки данных !
call lcd_cmd // передаем команду
ret // выход

lcd_line4:
ldi data,0xD4 // Выбор адреса четвертой строки данных !
call lcd_cmd // передаем команду
ret // выход

lcd_cmd: // передача команды в ЖКИ
call wait_lcd //
lcd_cmd_i: // передача команды в ЖКИ при ините
cbi porta,rs // RS --> 0
send_byte: // Передача байта в ЖКИ
sts data_ram,data // сохранить data в ram
call send_nibble // вызвать передачу полубайта
lds data,data_ram // извлечь data из ram
swap data // поменять нибблы местами
call send_nibble // вызвать передачу полубайта
lds data,data_ram //
ret // выход


out_text: // Вывод текста из флеш проца
lsl ZL // Умножаем на 2
rol ZH // регистровую пару
ot_1: // Метка перехода
lpm // загружаем ячейку памяти из флэш
mov data,r0 // копируем данные для вывода
call print_char // выводим данные на ЖКИ
adiw ZL,1 // вычитываем из пары регистров 1
dec loop // отнимаем 1 от счетчика
brne ot_1 // перейти если не равно
ret // выход



_Pasha
Цитата(Павлик @ Dec 15 2008, 15:59) *
Вот мой код для 44780 , понимаю что тут на асме пишущих мало ...

Ну, и кто так пишет ? smile.gif
Код
lcd_line1:
ldi   data,0x80       // Выбор адреса первой строки данных !
call  lcd_cmd         // передаем команду
ret                   // выход

lcd_line2:
ldi   data,0xC0       // Выбор адреса второй строки данных !
call  lcd_cmd         // передаем команду
ret                   // выход

lcdcmd:

Особенно понравилась clr_string smile.gif
Вместо call lcd_cmd поставить rjmp lcd_cmd, конечно же, низзя smile.gif
Процедура wait_ХЗ_сколько_мс намертво вешает проц, наверное smile.gif как и wait_lcd.
Так что не позорьтесь.
Лучше бы эти все wait_xxx делать под многопоточную среду типа
Код
lcd_busy:  
; далее по тексту  
cbi    porta,e     // E  --> 0
sbrc   tmp1,7      // пропуск след команды если сброшен бит 7
jmp system; и вот тут мы не вешаемся, а выходим,
                ;давая работать и другим компонентам программы
                ; а там -коррекция стека, сохранение контекста задачи
                ;(минимального - никто не просит все регистры сохранять) итд
Abrvalg
Классы для scmRTOS ATmega128
ЛеонидК
Пользуйтесь. Моя библиотека для IAR. Синтезаторы, АЦП и др. Делал для себя под конкретную задачу.
*conf.h в директорию проекта и можно корректировать. У меня библиотека в /avr/inc/my.
ARV
Нашел вот очень занятную ссылочку Software-implemented USB Low Speed Host Controller (atmega32 и т.п.), но никак не удается выкачать исходник... если покопаться, то он присутствует в виде html-страниц, а одним архивом - можно вроде скачать, но при помощи специальной утилиты... если кто выкачает - прошу выложить.
at90
Вот там нашел
ozzy
Замена HT1613 на ATTINY2313 c алс с общим катодом. Проэкт под CodeVisionAvr, cхемотехника скопирована с нета.
GedasL
Temperature alarm
Temperature alarm with ATMega8 and DS18S20/DS18B20. Set high and low limits with rotary switches
and device will alert you with buzzer and blinking LED's when temperature is out of limits.

Triac Power Regulator/Timer
Single-phase, zero crossing power regulator/timer. Can be used for switching on load for a defined time period, controlling power applied to load, or both functions combined. For example: heater control, soldering iron temperature regulation. 7-segment LED display for time/power indication.Bresenham's algorithm used for control signal distribution.

Countdown timer
Simple timer for switching on load for a defined time period.
Set time period, push the START button and timer will turn on for
a defined time period. After time elapses it will turn off automatically.

http://www.embtron.com/
artem79
Программа для AVR и LCD Nokia 6100.
_Pasha
Нажмите для просмотра прикрепленного файлаПреобразователь сигналов от трех квадратурных энкодеров в импульсы +/-1

Быстродействие 28 тактов. 

Начало обсуждения тут: http://electronix.ru/forum/index.php?showt...mp;#entry565043

Нажмите для просмотра прикрепленного файла
pavel-pervomaysk
Кусочек програмки для работы с ЖКИ Nokia 1112i . Потребление 3мА , удобный крепеж ,
с подсветкой белого цвета 7мА. Дальше все можно подавать как и на 3310.

Схемку забыл прикрепить
alex1979
Посмотрите и покритикуйте "мой" наборчик шаблонов для работы с входами/выходами микроконтроллеров AVR на C++(gcc, WinAvr).
Тестировалось на gcc 4.3.0 .
При создании обьектов входа/выхода не инициализируются.

Пример использования:
Код
...
__port<__port_A> port_A;
__port<__port_B> port_B;
__out<__port_A,__bit_1> out_1;
__out<__port_C,__bit_4> out_4;
__in<__port_C,__bit_5> in_0;

.....

    out_4.set();

    port_A.pin_2.as_output();
    port_A.pin_2.set();


    if(in_0.is_set())
    {
        // что то делаем
    }
Сергей Борщ
Цитата(alex1979 @ May 6 2009, 09:09) *
Посмотрите и покритикуйте "мой" наборчик шаблонов
Имена, начинающиеся с подчеркиваний, зарезервированы за компилятором и системными библиотеками. Использовать такие имена для своих сущностей крайне не рекомендуется, можно напороться на конфликт имен. Не сейчас, так в следующей версии компилятора. Было бы интересно посмотреть на результаты компиляции.
alex1979
Цитата(Сергей Борщ @ May 6 2009, 11:33) *
Имена, начинающиеся с подчеркиваний, зарезервированы за компилятором и системными библиотеками. Использовать такие имена для своих сущностей крайне не рекомендуется, можно напороться на конфликт имен. Не сейчас, так в следующей версии компилятора. Было бы интересно посмотреть на результаты компиляции.

Вот тестовый проект(вся папка).
Проект для Eclipse, WinAVR-20090313, ATmega128
Limit6715
Библиотека, написанная на С++ для AVR. Пока что позволяет работать с таймерами T1, T0, интерфейсами SPI, TWI. Скоро допишу библиотеку для работы с COM-портом. wassat.gif
http://gitorious.org/avrlib-cpp
Для тех, у кого есть git: git clone git://gitorious.org/avrlib-cpp/mainline.git
x736C
Генератор прошивки для AVR на Vbasic.

1. Формирование данных. Например подсчет коэффициентов. (В пример не входит).
2. Подстановка данных в заранее заготовленные поля программы.
3. Подсчет контрольных сумм.
4. Запись в файл.
Название файла прошивки в примере сформировано из конкретных коэффициентов.
Чтобы не было путаницы, каждая прошивка получается подписанной.

Технология очень удобная, программу можно очень быстро реализовать даже в Ворде. Доступ к программе можно закрыть.
Нажмите для просмотра прикрепленного файлаПример asm-исходника прилагается.
x736C
Может кому-нибудь пригодится.

Кодер, декодер Меггита циклического (7,4)-кода Хемминга со стираниями.
Исправляет до двух ошибок.
На ассемблере под AVR.
Нажмите для просмотра прикрепленного файла
Кодер при желании можно сильно облегчить, заменив на табличный.

Точнее гарантированно исправляет 1 ошибку + 1 стирание.
Goodefine
Мой вариант IR-декодера (Си), позволяющего распознавать коды пультов ДУ, для трех nec-оподобных протоколов.
Для наглядности, скрины посылок с автоповтором
nec:
Нажмите для просмотра прикрепленного файла
JVC:
Нажмите для просмотра прикрепленного файла
Samsung:
Нажмите для просмотра прикрепленного файла
Формат данных: "(trigger,device_high,device_low,command)"
Нажмите для просмотра прикрепленного файла
Разделение адресов устройств сделано для extended вариантов, когда части адресов не равны друг-другу.
Тестовый проект прикреплен. Легко переносится на любой контроллер...
Нажмите для просмотра прикрепленного файла
amaora
RTOS, кратко: вытесняющая многозадачность, простой API ядра, отдельный стек для прерываний, язык С, компилятор GCC. В архиве весь проект в котором ОС и используется.

http://paravozeg.narod.ru/avr_os-090825.tar.gz
designer
Статья и исходники для AT90USB162 USB-CDC
http://suz-avr.sblo.jp/category/780477-1.html
http://www.nmj.sumomo.ne.jp/suz-avr/USB162/
Dx!
CORDIC - быстросходящийся алгоритм, в аттаче реализован способ быстро восстановить угол по синусу и косинусу и пример применения в USB джойстике для получения угла вращения магнита с магниторезистивного двухосевого датчика 2SA-10. (библиотеки LUFA для USB AVR качайте отдельно - http://www.fourwalledcubicle.com/LUFA.php )

Cod360 - Код для 360 градусов, например значение 36000.
Step - количество итераций. Чем точнее АЦП тем больше итераций имеет смысл делать. Для 10 бит АЦП, встроенного в AVR разумно делать 6-10. Таблица арктангенсов вбита для 16.

WinAVR C
injen-d
Выкладываю первую версию своей библиотеки для работы с алфавитно-цифровыми ЖК-модулями на основе HD44780-совместимых контроллеров.
Библиотека написана на С++. Данная версия для микроконтроллеров AVR и компилятора GCC. Тестировалась с AVR-GCC 4.3.2 (WinAVR 20090313).

Цель библиотеки - максимально упростить испльзование ЖК-модулей данного типа, за счет:
- автоматической генерации кода низкоуровневых функций;
- предоставления пользователю максимальной свободы при выборе места и способа подключения ЖК-модуля;
- отсутствия ограничений на количество одновременно подключенных модулей;
- предоставления пользователю:

- набора базовых функций: get_status, wait_ready, send_cmd, wr_data_byte, rd_data_byte;
- набора типовых функций вывода: символов, чисел, строк, а так же вспомогательных функций;
- набора функций, реализующих некоторые визуальные эффекты.

Более подробное описание в файле SDL_info.txt.

Данная версия является пробной, поэтому жду вопросов, предложений и отзывов, на основе которых проэкт будет развиваться, либо уйдет в небытие, если это нафиг ни кому не надо.
Библиотека тестировалась на модуле DV16100 и на моделях Протеуса, поэтому просьба к тем, у кого есть возможность(и желание),
проверить библиотеку на реальных ЖК-модулях и написать, если возникнут проблемы.

Нажмите для просмотра прикрепленного файла
внутри два архива:
SDLibrary++v1.0_AVR_GCC_11.09.2009.7z - содержит библиотеку с примерами,
SDLibrary++_show.7z - содержит файл проэкта Протеуса, на который расчитаны примеры.

PS: Модели Протеуса не отображают самую нижнюю строку пикселей (предназначенную для отображения курсора) при использовании пользовательских символов,
из-за чего наблюдаются искажения при отображении эффектов типа level. В реальном модуле все должно выглядеть нормально.
zltigo
Цитата(injen-d @ Sep 13 2009, 14:48) *
либо уйдет в небытие...

Это будет правильным решением sad.gif
Посмотрел. На данный момент это графоманство чистой воды - желание писать несомненно есть, но со всем остальным, начиная с чисто ремесленных навыков, очень большой напряг sad.gif
injen-d
Цитата(zltigo @ Sep 13 2009, 17:04) *
Посмотрел. Это будет правильным решением sad.gif

Ну, именно от Вас я ожидал подобной фразы...
Аргументируйте, если не трудно.
Пусть будет мне наукой.

Я, конечно, не претендую на звание "образец стиля" в написании программ, если Вы это имели ввиду под чисто ремесленными навыками, это оттачивается с годами.
Нельзя ли конкретней? А то Вы только интригуете подобными фразами. Мне снизу не видно! laughing.gif
sansnotfor
для работы с инкрементным энкодером Нажмите для просмотра прикрепленного файла
для преобразования двоичных чисел в двоично десятичные и вывода на lcd Нажмите для просмотра прикрепленного файла
знакогенератор для LCD от Nokia3310 Нажмите для просмотра прикрепленного файла
библиотека для работы с LCD от Nokia3310 с видео буфером. нужно от 1 КБ ОЗУ. Нажмите для просмотра прикрепленного файла
demiurg_spb
Модуль доступа к 16-и битным регистрам AVR (для avr-gcc).
CODE
=======================================================================
=====
#define avr_read_word_atomic(addr) \
(__extension__({ \
uint16_t __addr16 = (uint16_t)(addr); \
uint16_t __result; \
__asm__ __volatile__ \
( \
"in __tmp_reg__,__SREG__" "\n\t" \
"cli" "\n\t" \
"ldd %A0,%a1+0" "\n\t" /*lo*/ \
"out __SREG__, __tmp_reg__" "\n\t" \
"ldd %B0,%a1+1" /*hi*/ \
: "=r" (__result) /* output operands */ \
: "e" (__addr16) /* input operands */ \
: "memory" /* list of clobbered registers */ \
); \
__result; \
}))

// ============================================================================
#define avr_write_word_atomic(addr,value) \
(__extension__({ \
uint16_t __addr16 = ((uint16_t)(addr)); \
uint16_t __value = (uint16_t)(value); \
__asm__ __volatile__ \
( \
"in __tmp_reg__,__SREG__" "\n\t" \
"cli" "\n\t" \
"std %a1+1,%B0" "\n\t" /*hi*/ \
"out __SREG__, __tmp_reg__" "\n\t" \
"std %a1+0,%A0" /*lo*/ \
: /* output operands */ \
: "r" (__value), /* input operands */ \
"e" (__addr16) \
: "memory" /* list of clobbered registers */ \
); \
}))
Genadi Zawidowski
Цитата(sansnotfor @ Oct 26 2009, 16:51) *
для работы с инкрементным энкодером Нажмите для просмотра прикрепленного файла
для преобразования двоичных чисел в двоично десятичные и вывода на lcd Нажмите для просмотра прикрепленного файла
знакогенератор для LCD от Nokia3310 Нажмите для просмотра прикрепленного файла
библиотека для работы с LCD от Nokia3310 с видео буфером. нужно от 1 КБ ОЗУ. Нажмите для просмотра прикрепленного файла


Добавлю-ка я вариант с учетверением количества импульсов валкодера. indent-ы в исходном тексте съела форма ответа на сообщение...

CODE
static uint_least8_t old_val;

void spool_encinterrupt(void)
{
uint_least8_t new_val = hardware_get_encoder_bits(); /* Состояние фазы A - в бите с весом 2, фазы B - в бите с весом 1 */

// dimensions are:
// old_bits new_bits
const static int_least8_t v [4][4] =
{
{
+0, /* 00 -> 00 stopped */
-1, /* 00 -> 01 rotate left */
+1, /* 00 -> 10 rotate right */
+0, /* 00 -> 11 invalid combination */
},
{
+1, /* 01 -> 00 rotate right */
+0, /* 01 -> 01 stopped */
+0, /* 01 -> 10 invalid combination */
-1, /* 01 -> 11 rotate left */
},
{
-1, /* 10 -> 00 rotate left */
+0, /* 10 -> 01 invalid combination */
+0, /* 10 -> 10 stopped */
+1, /* 10 -> 11 rotate right */
},
{
+0, /* 11 -> 00 invalid combination */
+1, /* 11 -> 01 rotate right */
-1, /* 11 -> 10 rotate left */
+0, /* 11 -> 11 stopped */
},
};


rotate += v [old_val][new_val];

old_val = new_val;
}

ISR(INT0_vect)
{
spool_encinterrupt();
}

ISR(INT1_vect)
{
spool_encinterrupt();
}

void encoder_clear(void)
{
rotate2 = 0;
disableIRQ();
rotate = 0;
tickcount = TICKCOUNT_MAX;
enableIRQ();
}
/* получение количества шагов и времени с последнего вызова. */
int
encoder_snapshot(
uint_least8_t * ticks,
uint_least8_t derate)
{
div_t h;
int hrotate;

disableIRQ();
if (tickcount != 0)
{
* ticks = tickcount;
tickcount = 0;
hrotate = rotate;
rotate = 0;
}
else
{
* ticks = 1;
hrotate = 0;
//hrotate = rotate;
//rotate = 0;
}
enableIRQ();

/* Ументшение разрешения валкодера в зависимости от установок в меню */
h = div(hrotate + rotate2, derate);

rotate2 = h.rem;

return h.quot;
}


/* получение "редуцированного" количества прерываний от валкодера.
* То что осталось после деления на scale, остается в накопителе
*/

int getRotateLoRes(void)
{
uint_least8_t ticks;
return encoder_snapshot(& ticks, ROTATE_LORES_DIV * hiresdiv);
}
AndryG
Простой программный UART-передатчик. STX - Simple TX Удобно в Proteus нацепить на reset-вывод.
Код работает под IAR и CodeVisionAVR. (добавите WinAVR - буду рад добавить в исходник)
В архиве (функция и проекты IAR, CV, Proteus)

STX Rev.71
sansnotfor
Простой драйвер символьного lcd на основе контроллеров ks0066. Проверка флага занятости. Поддержка 4-ех и 8-ми разрядной шины. В архиве 2 варианта - для IARa и для WINAVR.
Нажмите для просмотра прикрепленного файла
microsin
1. Библиотека V-USB (старое название AVR-USB) - программная реализация протокола USB на AVR. Есть примеры рабочих устройств USB и компутерных программ, работающих с этими устройствами. Библиотека бесплатная. Комментарии в библиотеке и примерах переведены на русский язык.
2. Макетные платы, на которых удобно применять библиотеку V-USB: AVR-USB-MEGA16, AVR-USB-TINY45.
3. Макетные платы с аппаратным интерфейсом USB: AVR-USB162, AT91SAM7X.
sansnotfor
Драйвер матричной клавиатуры 3х4. Подходит для любого компилятора, нужно только подключить соответствующих заголовочный файл мк. Позволяет подключать клавиатуру как к разным портам, так и к одному. Единственное условие - столбцы матрицы должны быть подключены к младшим разрядам порта, строки - к старшим.
Kir85
Работа с графическим дисплеем MT-12232 на ATmega8.

Нажмите для просмотра прикрепленного файла
demiurg_spb
Небольшая поправочка к моему сообщению №138 в этой ветке форума,
вот так будет вернее:
CODE

============================================================================
#define avr_read_word_atomic(addr) \
(__extension__({ \
uint16_t __addr16 = (uint16_t)(addr); \
uint16_t __result; \
__asm__ __volatile__ \
( \
"in __tmp_reg__,__SREG__" "\n\t" \
"cli" "\n\t" \
"ldd %A0,%a1+0" "\n\t" /*lo*/ \
"out __SREG__, __tmp_reg__" "\n\t" \
"ldd %B0,%a1+1" /*hi*/ \
: "=r" (__result) /* output operands */ \
: "b" (__addr16) /* input operands */ \
: "memory" /* list of clobbered registers */ \
); \
__result; \
}))

// ============================================================================
#define avr_write_word_atomic(addr,value) \
(__extension__({ \
uint16_t __addr16 = ((uint16_t)(addr)); \
uint16_t __value = (uint16_t)(value); \
__asm__ __volatile__ \
( \
"in __tmp_reg__,__SREG__" "\n\t" \
"cli" "\n\t" \
"std %a1+1,%B0" "\n\t" /*hi*/ \
"out __SREG__, __tmp_reg__" "\n\t" \
"std %a1+0,%A0" /*lo*/ \
: /* output operands */ \
: "r" (__value), /* input operands */ \
"b" (__addr16) \
: "memory" /* list of clobbered registers */ \
); \
}))
заменил
"e" (__addr16)
на
"b" (__addr16)

а то вдруг компилятор попытался сгенерить STD X+1,N (мой косяк)
а можно лишь
STD Y+1,N
STD Z+1,N
maxxx_x
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;ah:al/bl 86байт 46 тактов
;ah=]ah:al/bl[ остаток
;al=[ah:al/bl] частное
div16_8:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lsl al ;1
rol ah ;1
sbc ah,bl ;1
brsh koko7 ;2/1
add ah,bl ;1
koko7: rol al ;1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rol ah ;1
sbc ah,bl ;1
brsh koko6 ;2/1
add ah,bl ;1
koko6: rol al ;1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rol ah ;1
sbc ah,bl ;1
brsh koko5 ;2/1
add ah,bl ;1
koko5: rol al ;1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rol ah ;1
sbc ah,bl ;1
brsh koko4 ;2/1
add ah,bl ;1
koko4: rol al ;1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rol ah ;1
sbc ah,bl ;1
brsh koko3 ;2/1
add ah,bl ;1
koko3: rol al ;1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rol ah ;1
sbc ah,bl ;1
brsh koko2 ;2/1
add ah,bl ;1
koko2: rol al ;1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rol ah ;1
sbc ah,bl ;1
brsh koko1 ;2/1
add ah,bl ;1
koko1: rol al ;1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rol ah ;1
sbc ah,bl ;1
brsh koko0 ;2/1
add ah,bl ;1
koko0: rol al ;1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
com al ;1
ret ;4 6+7*5+5=46
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



;;;;;;;;;;;;СRC-CCITT_16 0x1021;;;;;;;;;
;CRC-XMODEM (0x1021) Initial value:0x0 ;
; 50 байт ;
; 18 тактов на байт
;Z-sumbol al=dlin ;
;bh:bl=crc-16 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
crc_home: clr bh ;1
clr bl ;1
crc_plus: push al ;2
push ah ;2
push r1 ;2
push r0 ;2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
crc_loop1: ld ah,Z+ ;2
eor bh,ah ;1
ldi ah,16 ;1
mul ah,bh ;2
eor bh,r1 ;1
mul ah,bh ;2
eor bl,r0 ;1
add r0,r0 ;1
adc r1,r1 ;1
eor r0,bh ;1
eor r1,bl ;1
movw bh:bl,r1:r0;1
dec al ;1
brne crc_loop1 ;2/1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18
pop r0 ;2
pop r1 ;2
pop ah ;2
pop al ;2
ret ;4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Nuts_
Небольшая утилита для Windows с исходниками
Позволяет осуществлять удобное кодирование таблички для 7ми сегментного (семисегментного) индикатора
Откомпилированный фал в папке realise
В программе можно визуально указать какой сегмент к какому выводу контроллера подсоединен
собственно PB и PD указанно для удобства можно читать что там и PA и PE короче PX и PY
в результирующем фале digs.inc будет табличка из .dw биты которого будут соответствовать PXn и PYn

то есть по адресу=адрестаблички+цифра*2 мы получим два байта которые можно сразу outить в PX и PY
ну моджет быть замаскировав неиспользуемые биты

это уже вторая версия, предыдущая была рассчитана только на один порт и генерировала готовый код с использованием
оперативной памяти
war4one
Энергосчетчик 220 В. Позволяет контролировать напряжение, ток и частоту сети. Гальваническая развязка от сети, интерфейс RS-485.
Исходники + схема
war4one
Watchdog таймер для GSM-модема, работающего под управлением внутренней прошивки (например, GE863-GPS, работающего под управлением внутренней Python-программы). Таймер ждет периодических подтверждающих импульсов от GPIO модема, в противном случае перезагружает модем.
Исходник + схема

Комбинированный сенсор для робота. Три акселерометра + три гироскопа + АЦП + контроллер + RS232.
Исходник + схема
war4one
GPS GSM трекер. Трекер отправляет хозяину SMS со своими координатами, определенными при помощи GPS приемника. SMS отправляются периодически, в соответствии с заранее определенным интервалом.
Схема + программа
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.