Поиск по сайту

Результаты поиска по тегам 'atmega16'.

  • Поиск по тегам

    Введите теги через запятую.
  • Поиск по автору

Тип публикаций


Категории и разделы

  • Вопрос-Ответ. Для начинающих
    • Песочница (Q&A)
    • Дайте схему!
    • Школьникам и студентам
    • Начинающим
    • Паяльник TV
    • Обсуждение материалов с сайта
  • Радиоэлектроника для профессионалов
    • Световые эффекты и LED
    • Роботы и модели на ДУ-управлении
    • Автоматика
    • Самодельные устройства к компьютеру
    • Программное обеспечение
    • Автомобильная электроника
    • Системы охраны и наблюдения. Личная безопасность
    • Питание
    • Электрика
    • Промышленная электроника
    • Ремонт
    • Металлоискатели
    • Измерительная техника
    • Мастерская радиолюбителя
    • Сотовая связь
    • Спутниковое ТВ
    • КВ и УКВ радиосвязь
    • Жучки
    • Телефония и фрикинг
    • Высокое напряжение
    • Идеи и технологии будущего
    • Справочная радиоэлементов
    • Литература
    • Разное
  • Аудио
    • FAQ, Технологии и компоненты
    • Для начинающих
    • Источники звука
    • Предусилители, темброблоки, фильтры
    • Питание аудио аппаратуры
    • Усилители мощности
    • Акустические системы
    • Авто-аудио
    • Ламповая техника
    • Гитарное оборудование
    • Прочее
  • Микроконтроллеры
    • МК для начинающих
    • AVR
    • PIC
    • STM32
    • Arduino и Raspberry Pi
    • ПЛИС
    • Другие микроконтроллеры и семейства
    • Алгоритмы
    • Программаторы и отладочные модули
    • Периферия и внешние устройства
    • Разное
  • Товары и услуги
    • Коммерческие предложения
    • Продам-Отдам, Услуги
    • Куплю
    • Уголок потребителя
    • Вакансии и разовая работа
    • Наши обзоры и тесты
  • Разное
    • Конкурсы сайта с призами
    • Сайт Паяльник и форум
    • Курилка
    • Технический английский (English)
    • Наши проекты для Android и Web
    • FAQ (Архив)
    • Личные блоги
    • Корзина
    • Вопросы с VK
  • ATX->ЛБП Переделки
  • Юмор в youtube Киловольты юмора
  • Надежность и группы продавцов Радиолюбительская доска объявлений exDIY
  • разные темы Переделки

Блоги

Нет результатов для отображения.

Нет результатов для отображения.

Местоположения

  • Пользователи форума

Группа


ICQ


Skype


Интересы


Город


Сфера радиоэлектроники


Оборудование

Найдено 23 результата

  1. Програмный UART atmega16

    Добрый день. Мне требуется реализовать программный юарт на атмеге16. Он нужен для того, чтобы принятые по нему данные отправить на аппаратный юарт. В интернете нашел примеры кода, но понять его мне трудно. Прошу вас словами в общих чертах объяснить принцип реализации программного юарта. Буду рад примерам, которые, на ваш взгляд, являются наиболее простыми и понятными. Заранее спасибо.
  2. Приветствую всех! Прошу помощи у вас, форумчане в программировании системы из 2х контроллеров atmega16, суть системы заключается в: Есть мастер и слэйв, это два отдельных омк всего 1 мастер и 2 слэйва Что входит в мастер: 1)настойка времени путем набора из 8 4 2 и 1 минуты(кнопки), выбор адреса, те кому будет послан сигнал, 1 или 2 слэйву, индикация ответа( красный диод если не ответил, зеленый если ответил в течении заданного времени), если ответ есть - зеленый, если ответа нет красный и кнопка полного сброса всех указаний, те возврат к исходной точке где никто не опрашивается Что входит в слэйв, это кнопка подтверждения, визуализация таймера ( те 4 диода, когда 1/4 времени прошла 1 тухнет итд) и если кнопка не нажата отправка информации о аларме собственно все те 1 ввод адреса и времени 2 отправка сигнала 3 сигнал есть? 3.1 (нет) аларм 3.2 (зелень) Заранее благодарю! (popovkostya96@icloud.com)
  3. Реверс двигателя (ATMega16) - AVR

    Код с помощью которого двигатель вращается в одном направлений по часовой стрелке. А нужно "составить программу на языке ассемблера для реверсивного управления электродвигателем постоянного тока". так написано в заданий Но я думаю можно новую не писать, а можно изменить эту так что бы двигатель вращался в одну сторону и потом в другую, наверно так. Помогите, а то я вообще не понимаю этот ассемблер(( ;* На выходе OC1A МК АТmega16 получаем выходные импульсы ;* с частотой 50 Гц и коэффициентом заполнения g=0,025. ;* Тактовая частота MK AVR: 4 МГц .nolist .include"m16def.inc" .list .def STAT = r15 ;Регистр для хранения состояния главной программы .def WorkH = r16 ;Рабочий регистр для главной программы .def WorkI = r17 ;Рабочий регистр для прерывания от таймера .def AddLo = r18 ;Вспомогательный регистр для прибавления константы .equ Impuls = 9000 ;Число тактовых сигналов, соответствующее импултсу .equ Pause = 1000 ;Число тактовых сигналов, соответствующее паузе Reset: rjmp Initial ;Переход к части инициализации reti ;Внешнее прерывание 0 (не используется) reti ;Внешнее прерывание 1 (не используется) reti ;Прерывание по захвату (не используется) Timer1CompA: ;Прерывание CompareA для ATmega16 in STAT,SREG ;Сохраняем флаги главной программы in WorkI,TCCR1A ;Регистр управления А счетчика Т/С1 sbrs WorkI,COM1A0 ;Пропускаем следующую команду, если COM1A0 = 1 rjmp TC1 ;Пропускаем следующую команду, если COM1A0 = 0 cbr WorkI,1<<COM1A0 ;При следующем прерывании OC1A -> 1 out TCCR1A,WorkI ;Сохраняем новое значение in AddLo,OCR1AL ;Младший байт OCR1A subi AddLo,Low(-Impuls) ;Прибавляем младший байт значения импульса in WorkI,OCR1AH ;Старший байт OCR1A sbci WorkI,High(-Impuls) ;Прибавляем старший байт значения импульса rjmp IntEnde TC1: sbr WorkI,1<<COM1A0 ;При следующем прерывании OC1A -> 1 out TCCR1A,WorkI ;Сохраняем новое значение in AddLo,OCR1AL ;Младший байт OCR1A subi AddLo,Low(-Pause) ;Прибавляем младший байт значения длительности импульса in WorkI,OCR1AH ;Старший байт OCR1A sbci WorkI,High(-Impuls) ;Прибавляем старший байт значения длительности импульса IntEnde: out OCR1AH,WorkI ;Назад - старший байт нового значения out OCR1AL,AddLo ;Назад - младший байт нового значения out SREG,STAT ;Восстанавливаем старые флаги reti ;Выход из обработки прерывания CompareA Initial: ;Инициализация регистра ввода/вывода ldi WorkH,High(RamEnd) out sph,WorkH ldi WorkH,Low(RamEnd) out spl,WorkH ;Инициализируем стек clr WorkH ;Все разряды = 0 out PortD,WorkH ;Вывод в порт D ldi WorkH,$20 ;Разряд 5 - в 1, остальные - в 0 out DDRD,WorkH ;OC1A (PD5) - выход, остальные входы ldi WorkH,High(Pause) ;Старший байт значения паузы out OCR1AH,WorkH ;в старший байт регистра сравнения А ldi WorkH,Low(Pause) ;Младший байт значения паузы out OCR1AL,WorkH ;в младший байт регистра сравнения А ldi WorkH,$C0 ;OC1A -> 1 out TCCR1A,WorkH ;Сохраняем новое значение ldi WorkH,$02 ;Входной такт Т/С1 = такт сист. синхр./8 out TCCR1B,WorkH ;Запускаем Т/С1 ldi WorkH,$40 out TIMSK,WorkH ;Разрешаем прерывание CompareA sei ;Общее разряшение прерываний (разряд I) Haupt: rjmp Haupt ;Главная часть программы: ожидаем возникновения прерывания Программа работает двигатель крутиться по часовой стрелке, Препод сказал что на один вход мы сигнал подали теперь нужно его сохранить и подать на другой, на фотках схема подключения и установка В методичке это 4 лаба, там программа не та но теория та что и вновой методичке lab_rab_MK_AVR.pdf
  4. Добрый день. Начал осваивать Atmega16. МК перезагружается, в регистре MCUCSR нули. Пробовал менять код не помогает. В чем может быть причина?
  5. Atmega16 + Ftdi Ft232 Проблема

    Здравствуйте. Недавно решил перейти с моделек в Протеус на реальный МК. Купил "Ready for AVR Board" ( http://www.mikroe.com/ready/avr/ ) с Atmega16. На плате есть уже встроенный FTDI FT232 и выход на USB для прошивки с помощью mikroBootLoader с сайта разработчиков. Установил драйвера с сайта FTDI. Плата, подключенная через USB, успешно отображается как подключение к COM порту. Всё по инструкции: http://www.mikroe.co...manual_v101.pdf . Запускаю mikroBootLoader, выбираю COM-порт. Жму RESET на схеме, жму Conntct в бутлоадере. Ответ: "Disconnected". Перебирал разные BaudRate. Ничего не помогает. Ноут ASUS X550 с Windows 8.1 x64. Подскажите, что может быть не так? Может какие другие загрузчики попробовать?
  6. Всем доброго времени суток!!! Решили с другом построить полноразмерную реплику Bugatti Veyron, и сделать фишку с выдвигающимся антикрылом. Смысл вот в чём при скорости 100 км/ч (на оригинале 220 км/ч) на вход микроконтроллера должна поступить 1 и выдвигается антикрыло, при этом если скорость по прежнему выше 100 при нажатии на педаль тормоза на другой вход поступает так же 1 и он наклоняется на угол 70 градусов и помогает тормозить. То есть грубо говоря есть 2 датчика: скорости и нажатия на педаль тормоза. Я написал программу на Atmega 16, в Proteus всё работает как надо. Подскажите пожалуйста, как сформировать 1 при скорости более 100 км/ч. Либо можно с помощью таймеров сделать? :help:
  7. Делаю следующее подключаю lcd wh1602b winstar к atmega16 Заливаю простенькую программу в мегу #include <mega16.h> #include <delay.h> // инициализация порта В под ЖКИ #asm .equ __lcd_port=0x15 ;PORTC #endasm #include <lcd.h> void main(void) { PORTA=0x00; DDRA=0x00; PORTB=0x00; DDRB=0x00; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0x00; TCCR0=0x00; TCNT0=0x00; OCR0=0x00; TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; MCUCR=0x00; MCUCSR=0x00; TIMSK=0x00; UCSRB=0x00; ACSR=0x80; SFIOR=0x00; ADCSRA=0x00; SPCR=0x00; TWCR=0x00; lcd_init(16); lcd_gotoxy(0,0); lcd_putsf("Hello"); lcd_gotoxy(0,1); lcd_putsf("radioaktiv.ru"); while (1) { } } И о чюдо на второй строчке рисуется буква О это все чего я смог добится подскажите новичку что делать
  8. Доброго времени суток! Помогите начинающему чайнику собрать элементарную схему на ATmega16. После самостоятельных попыток спалил МК, покупать новый пока нет желания. Задача такая: от подсветки телефона должен пойти сигнал через фотодиод к контроллеру, после чего он должен замкнуть реле на 2 секунды и уйти в ожидание на 1м, после чего продолжать этот цикл бесконечно. Написал цикл через Flowcode, запустил HEX файл в симулятор ISIS 7 Professional, в нём же собрал элементарную схему с одним реле и кнопкой (аналог фотодиода я не нашёл), всё работает как часы. Начал шить МК через покупной программатор USBasp+ AVR Minimum System Board, шил через Khazama, фьюзы выставил по умолчанию, выдал 3-4 ошибки, и вроде бы всё норм, начинаю собирать схему, 1 цикл прошёл, реле щёлкнуло и на этом всё, МК греется и ПК его уж не определяет, помогите чем сможете, очень благодарен! HEX C.rar
  9. Доброго времени суток. С дисплеями ранее я не работал, в связи с этим буду крайне благодарен за любую помощь. Программирую в AVR Studio 4 У меня в распоряжении есть платка с Atmega16, и дисплей PG 24064 с контроллером LC7981, эквивалентный контроллеру HD61830. Дисплей 240х64, графический, при этом имеет символьный режим PB0-PB7 меги подсоединены к DB0-DB7 дисплея PC0-PC4 подсоединены к RS, E, RW, RST и CS соответственно. Контрастность настраивает подстроечный резистор на 50кОм. Код прикладываю в текстовом документе, т.к. мне "не разрешено загружать файлы" типа .c LCD_LC7981.txt. И в архиве всё (вроде), что было в проекте AVR-студии.LC7981.7z DS на дисплей:http://pdf.datasheet.../DSA-504713.pdf DS на LC7981: http://www.lcd-modul...hoer/lc7981.pdf Сразу прошу прощения у тех, кому мой код покажется нечитабельным. С такой прошивкой дисплей не работает совсем, и я не могу разобраться, почему, и как это исправить.
  10. Добрый день всем! Возникла необходимость запрограммировать МК для собственного устройства. МК выбрал atmega16, в качестве программатора использую плату um232h, построенную на чипе ft232h, прошить пытаюсь avrdude в среде linux через usb порт. Информация из чипа читается, но при попытке записать программу в flash, avrdude зависает на этапе writing с нулевым прогрессом. Пробовал сперва очистить чип потом записать, пробовал одной командой очистить записать, пробовал указывать разные форматы записываемого файла, оставлял на полчаса. Пробовал поменять чип на другой такой же - результат не поменялся. Кто сталкивался с подобным - помогите пожалуйста!
  11. Atmega16

    Реализовать частотомер на базе МК atmega16. Частоту измерять с помощью таймера счетчика, отображение результатов на экране LCD. Управление с помощью кнопок клавиатуры.Реализовать это в программе codevisionAVR. Сам я туп как пробка в этом вопросе, но от этого задания зависит мой вылет из университета. Кто знает, помогите, пожалуйста!!
  12. Usart

    Доброго времени суток. Начнем! Есть ПК , есть atmega16 , есть переходник USB UART из аппаратуры это все. Написана программа дла работы с ком портом , которая отлично работает. ДАННЫЕ------->ПК------->переходник------->atmega16 в идеале загорается светодиод если данные пришли без потерь Но в том то и дело что данные приходят иногда не приходят иногда приходят с пятого, седьмого, пятнадцатого раза настройки соединения USART в atmega16 // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; UCSRB=0xD8; UCSRC=0x86; UBRRH=0x00; UBRRL=0x33; Настройки в программе такиеже 8 дата 1 стоп NO PARity режим асинхронный есть предположение что нужно соединить общий провод на переходнике и atmega16 код приема данных // USART Receiver interrupt service routine interrupt [uSART_RXC] void usart_rx_isr(void) { char status,data; status=UCSRA; data=UDR; nomer_bita++; x[nomer_bita]=data; if(nomer_bita==5) { nomer_bita=0; } if((x[1]=='1') && (x[2]=='2') && (x[3]=='3') && (x[4]=='4') && (x[5]=='5')) { PORTA.7=1; } else { PORTA.7=0; } if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index++]=data; #if RX_BUFFER_SIZE == 256 // special case for receiver buffer size=256 if (++rx_counter == 0) { #else if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; #endif rx_buffer_overflow=1; } } } внимание вопрос как избежать данного бага потери данных?
  13. Настройка Atmel Studio + Isr()

    Вот и добрался я до богов контроллера код программы /* * Timer0_At16.c * * Created: 06.09.2014 11:34:33 * Author: Home_on-mars */ #include <avr/io.h> //#include <avr/iom16.h> #include <avr/interrupt.h> typedef unsigned char byte ; byte a,b; ISR(TIMER0_OVF_vect){ b++; } ISR(TIMER0_COMP_vect){ b++; } int main(void) { a=0;b=0; TCCR0|=(1<<0); TCCR0 &=~(0<<WGM00); TCCR0 &=~(0<<WGM01); TIMSK |=(1<<0); asm("sei"); while(1) { a++; } } Но в студии в пошаговом режиме не переходит на прерывание прерывание а висит на а++ хотя b растет по переполнению как настроить студию чтобы показывало (оптимизация стоит 0) Даже в окне disassembly не переходит по прерыванию Помогите настроить или скиньте файл настройки ATMEL STUDIO
  14. C Atmega8 На Atmega16 (Wg12864A)

    Всем здрасте! Ребят подскажите, я в Си не очень хорош, но так уж вышло что пришлось. Есть программа для графического ЖК, написана под atmega8. При компиляции на amega16 ошибок не выдает но и ничего не показывает. Нужно для правильного перевода на atmega16? Танцы с бубном не помогают...я пробывал =) Есть вариант что напутаны порты в\в даже глядя по схемам они разные, при исправлении портов в коде компилятор начинает ругатся на неизвестную функцию(((( Вот код. #include <avr/io.h> #include "symbol.h" #define DI 0 #define RW 1 #define E 2 #define CS1 3 #define CS2 4 #define RST 5 void pause (unsigned int a) { unsigned int i; for (i=a;i>0;i--) ; } void lcd_dat (unsigned char data) { PORTD=data; //Выводим данные PORTB|=_BV(DI); //Говорим дисплею что передаются данные asm("nop"); PORTB|= _BV(E); //Импульс записи asm("nop"); PORTB&=~_BV(E); PORTB&=~_BV(DI); } void lcd_com (unsigned char comm) { PORTD=comm; //Выводим команду asm("nop"); PORTB|= _BV(E); // Импульс записи asm("nop"); PORTB&=~ _BV(E); } void gotoxy (unsigned char x, unsigned char y) { if (x<64) PORTB|=_BV(CS1); //Если x<64 включаем CS1 else { PORTB|=_BV(CS2); //else включаем CS2 x=x-64; } lcd_com(0x40+x); //Выставляем X координату lcd_com(0xb8+y/8); //Выставляем Y координату } void clear_screen (void) { unsigned char i,j; PORTB|=_BV(CS1)|_BV(CS2); //Включаем оба чипа for (j=0;j<8;j++) { lcd_com(0xb8+j); for (i=0;i<64;i++) lcd_dat(0x00); //Очищаем } } void wg12864_init(void) { DDRD=0xff; //PD0-7 как выхода PORTD=0x00; PORTB=_BV(RST)|_BV(CS1)|_BV(CS2); //Включаем оба чипа DDRB=_BV(DI)|_BV(RW)|_BV(E)|_BV(CS1)|_BV(CS2)|_BV(RST); //PB0-5 как выхода asm("nop"); lcd_com(0x3f); //Разрешаем отображение lcd_com(0xc0); //Устанавливаем начало отображения lcd_com(0x40); //Ставим X=0 lcd_com(0xb8); //Ставим Y=0 clear_screen(); PORTB&=~(_BV(CS1)|_BV(CS2)); } void put_pixel (const unsigned char x, const unsigned char y, const unsigned char color) { unsigned char temp=0; PORTB=_BV(RST); if ( (x>128)||(y>64) ) return; gotoxy (x,y); PORTD=0xff; DDRD=0x00; //PD0-7 как входа PORTB|=(_BV(RW)|_BV(DI)); //Считываем данные pause(1); PORTB|= _BV(E); asm("nop"); PORTB&=~_BV(E); asm("nop"); PORTB|= _BV(E); asm("nop"); temp=PIND; PORTB&=~_BV(E); if (color==1) temp|= _BV(y%8); //Выставляем/снимаем нужный нам бит else temp&=~_BV(y%8); PORTB&=~(_BV(RW)|_BV(DI)); DDRD=0xff; //PD0-7 как выхода asm("nop"); gotoxy(x,y); //Переходим к X,Y lcd_dat(temp); //Записываем данные PORTB=_BV(RST); } int sign (int x) { if (x<0) return -1; if (x>0) return 1; return 0; } int abs (int x) { if (x<0) return -x; else return x; } void line (unsigned char x1,unsigned char y1,unsigned char x2, unsigned char y2,unsigned char color) { int dx,dy,i,sx,sy,check,e,x,y; dx=abs(x1-x2); dy=abs(y1-y2); sx=sign(x2-x1); sy=sign(y2-y1); x=x1; y=y1; check=0; if (dy>dx) { dx=dx+dy; dy=dx-dy; dx=dx-dy; check=1; } e=2*dy - dx; for (i=0;i<=dx;i++) { put_pixel(x,y,color); if (e>=0) { if (check==1) x=x+sx; else y=y+sy; e=e-2*dx; } if (check==1) y=y+sy; else x=x+sx; e=e+2*dy; } } void rectangle (unsigned char x1,unsigned char y1,unsigned char x2, unsigned char y2,unsigned char color) { line (x1,y1,x2,y1,color); line (x2,y1,x2,y2,color); line (x2,y2,x1,y2,color); line (x1,y2,x1,y1,color); } void put_char (unsigned char x0, unsigned char y0, unsigned char code, unsigned char mode) { unsigned char i,x,y; x=x0; y=y0; PORTB=_BV(RST)|_BV(CS1); if ( (x>128)||(y>64) ) return; for (i=0;i<6;i++) { if (x>=64) { //Включить CS2 x=x-64; PORTB|=_BV(CS2); PORTB&=~_BV(CS1); } lcd_com(0x40+x); //Перейти X,Y lcd_com(0xb8+y); if (i<=4) { if (mode==1) lcd_dat(~sym[code][i]); //Пишем колонку else lcd_dat (sym[code][i]); //Пишем инвертированную колонку } if (i==5) { if (mode==1) lcd_dat(0xff); //Рисуем разделитель else lcd_dat(0x00); //Рисуем инвертированный разделитель } x=x+1; } } int main(void) unsigned char data2[8]={0x20,0x10,0x01,0x02,0x08,0x06,0x04,0x0a}; //"WG12864A" unsigned char i; pause(5000); //Задержка для включения ЖКИ wg12864_init(); //Инициализация ЖКИ rectangle(0,0,127,63,1); //Рисуем контур line (127,0,0,63,1); //Рисуем линии line (127,5,5,63,1); line (127,10,10,63,1); line (127,15,15,63,1); line (127,20,20,63,1); line (127,25,25,63,1); line (127,30,30,63,1); line (127,35,35,63,1); line (127,40,40,63,1); line (127,45,45,63,1); line (127,50,50,63,1); line (127,55,55,63,1); line (127,60,60,63,1); for (i=0;i<8;i++) put_char (10+6*i,3,data2[i],0); //Пишем "WG12864A" while (1) ; return 1; } И схема на atmega8 к которой он написан. ============================================== А вот схема atmega16 к которой надо запилить этот код..
  15. Доброго времени суток уважаемые форумчане! Делаю кодовый замок на atmega16, впринципе все понятно, но есть один момент.. Хочется сделать этот замок программируемым, что бы по мастер-паролю добавлять и удалять ключи, отсюда вытекает вопрос - есть ли в atmega16 НЕ ЭНЕРГОЗАВИСИМАЯ память, в которую можно из программы записать несколько шестизначных чисел, а так же прочитать их от туда ? Всем спасибо за внимание.
  16. Здравствуйте форумчане ! Делаю расширитель входящих данных для LPT порта, наваял такую схему и код. Данные передает по своему собственно-выдуманному протоколу, так как на данном этапе мне легче придумать, чем использовать уже готовое =)) Это мой первый опыт работы с ATMEGA16, да и вообще с AVR, поэтому хотелось бы услышать адекватную критику по коду и схеме.. #include <mega16.h> #include <delay.h> #define pause delay_ms(10) int pins; void avr_init(void) { PORTA=0xFF; DDRA=0xFF; PORTB=0x01; DDRB=0x01; PORTC=0x00; DDRC=0x07; PORTD=0x00; DDRD=0x00; TCCR0=0x00; TCNT0=0x00; OCR0=0x00; TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; MCUCR=0x00; MCUCSR=0x00; TIMSK=0x00; ACSR=0x80; SFIOR=0x00; } void peredacha(void) { PORTC.1 = 1; pause; if (PINA.0 == 1){ PORTC.2 = 1; pause; PORTC.2 = 0; } else{ PORTC.2 = 1; pause; PORTC.2 = 0; pause; PORTC.2 = 1; pause; PORTC.2 = 0; } pause; PORTC.1 = 0; pause; PORTC.1 = 1; pause; if (PINA.1 == 1){ PORTC.2 = 1; pause; PORTC.2 = 0; } else{ PORTC.2 = 1; pause; PORTC.2 = 0; pause; PORTC.2 = 1; pause; PORTC.2 = 0; } pause; PORTC.1 = 0; pause; PORTC.1 = 1; pause; if (PINA.2 == 1){ PORTC.2 = 1; pause; PORTC.2 = 0; } else{ PORTC.2 = 1; pause; PORTC.2 = 0; pause; PORTC.2 = 1; pause; PORTC.2 = 0; } pause; PORTC.1 = 0; pause; PORTC.1 = 1; pause; if (PINA.3 == 1){ PORTC.2 = 1; pause; PORTC.2 = 0; } else{ PORTC.2 = 1; pause; PORTC.2 = 0; pause; PORTC.2 = 1; pause; PORTC.2 = 0; } pause; PORTC.1 = 0; pause; PORTC.1 = 1; pause; if (PINA.4 == 1){ PORTC.2 = 1; pause; PORTC.2 = 0; } else{ PORTC.2 = 1; pause; PORTC.2 = 0; pause; PORTC.2 = 1; pause; PORTC.2 = 0; } pause; PORTC.1 = 0; pause; PORTC.1 = 1; pause; if (PINA.5 == 1){ PORTC.2 = 1; pause; PORTC.2 = 0; } else{ PORTC.2 = 1; pause; PORTC.2 = 0; pause; PORTC.2 = 1; pause; PORTC.2 = 0; } pause; PORTC.1 = 0; pause; PORTC.1 = 1; pause; if (PINA.6 == 1){ PORTC.2 = 1; pause; PORTC.2 = 0; } else{ PORTC.2 = 1; pause; PORTC.2 = 0; pause; PORTC.2 = 1; pause; PORTC.2 = 0; } pause; PORTC.1 = 0; pause; PORTC.1 = 1; pause; if (PINA.7 == 1){ PORTC.2 = 1; pause; PORTC.2 = 0; } else{ PORTC.2 = 1; pause; PORTC.2 = 0; pause; PORTC.2 = 1; pause; PORTC.2 = 0; } pause; PORTC.1 = 0; pause; } void main(void) { avr_init(); // считываем состояние пинов A pins = PINA.0+PINA.1+PINA.2+PINA.3+PINA.4+PINA.5+PINA.6+PINA.7; while (1) { // если состояние пинов изменилось if(pins != PINA.0+PINA.1+PINA.2+PINA.3+PINA.4+PINA.5+PINA.6+PINA.7) { pins = PINA.0+PINA.1+PINA.2+PINA.3+PINA.4+PINA.5+PINA.6+PINA.7; while (PINB.0 == 0){ // если lpt занят другим контроллером pause; } PORTC.0 = 1; // говорим другим контроллерам что lpt занят peredacha(); PORTC.0 = 0; } } }
  17. Проблемы С Памятью

    Здравствуйте. не могли бы Вы подсказать, как посмотреть,где именно он пишет в некорректную облать памяти. #include <stdio.h> #include <stdlib.h> #include <avr/io.h> #include <avr/pgmspace.h> #include <avr/eeprom.h> #include <avr/interrupt.h> #include <util/delay.h> #include <inttypes.h> #include "lcd_lib.h" //define R2R port #define R2RPORT PORTA #define R2RDDR DDRA //define button port and dedicated pins #define BPORT PORTD #define BPIN PIND #define BDDR DDRD #define DOWN 0//PORTD #define LEFT 1//PORTD #define START 2//PORTD #define RIGHT 3//PORTD #define UP 4//PORTD //Define Highs Speed (HS) signal output #define HSDDR DDRD #define HSPORT PORTD #define HS 5//PD5 //define eeprom addresses #define EEMODE 0 #define EEFREQ1 1 #define EEFREQ2 2 #define EEFREQ3 3 #define EEDUTY 4 #define EEINIT E2END #define RESOLUTION 0.095367431640625 #define MINFREQ 0//minimum frequency #define MAXFREQ 65534//maximum DDS frequency #define MN_No 5// number of menu items //function prototypes void delay1s(void); void Timer2_Init(void); void Timer2_Start(void); void Timer2_Stop(void); void Main_Init(void); void Menu_Update(uint8_t); void Freq_Update(void); void Timer1_Start(uint8_t); void Timer1_Stop(void); void static inline Signal_OUT(const uint8_t *, uint8_t, uint8_t, uint8_t); //adjust LCDsendChar() function for strema static int LCDsendstream(char c, FILE *stream); //----set output stream to LCD------- static FILE lcd_str = FDEV_SETUP_STREAM(LCDsendstream, NULL, _FDEV_SETUP_WRITE); //Menu Strings in flash //menu 1 const uint8_t MN100[] PROGMEM=" exp \0"; //Array of pointers to menu strings stored in flash const uint8_t *MENU[]={ MN100 //menu 1 string }; //various LCD strings const uint8_t MNON[] PROGMEM="ON \0";//ON const uint8_t MNOFF[] PROGMEM="OFF\0";//OFF const uint8_t NA[] PROGMEM=" NA \0";//Clear freq value const uint8_t CLR[] PROGMEM=" \0";//Clear freq value const uint8_t MNClrfreq[] PROGMEM=" \0";//Clear freq value const uint8_t TOEEPROM[] PROGMEM="Saving Settings\0";//saving to eeprom const uint8_t ONEMHZ[] PROGMEM=" 1MHz \0";//saving to eeprom const uint8_t welcomeln1[] PROGMEM="AVR SIGNAL\0"; const uint8_t RND[] PROGMEM=" Random\0"; //variables to control TDA7313 struct signal{ volatile uint8_t mode; //signal volatile uint8_t fr1; //Frequency [0..7] volatile uint8_t fr2; //Frequency [8..15] volatile int8_t fr3; //Frequency [16..31] volatile uint32_t freq; //frequency value volatile uint8_t flag; //if "0"generator is OFF, "1" - ON volatile uint32_t acc; //accumulator volatile uint8_t ON; volatile uint8_t HSfreq; //high speed frequency [1...4Mhz] volatile uint32_t deltafreq; //frequency step value }SG; //define signals const uint8_t expwave[] __attribute__ ((section (".MySection1")))= //exp wave { 0x00,0x09,0x12,0x1B,0x23,0x2c,0x34,0x3c,0x43,0x4B,0x52,0x59,0x60,0x67,0x6E,0x74, 0x7A,0x80,0x86,0x8C,0x91,0x97,0x9C,0xA1,0xA6,0xAA,0xAF,0xB3,0xB8,0xBC,0xC0,0xC3, 0xC7,0xCB,0xCE,0xD1,0xD4,0xD7,0xDA,0xDD,0xE0,0xE2,0xE4,0xE7,0xE9,0xEB,0xED,0xEF, 0xF0,0xF2,0xF3,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFE,0xFE,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xfd,0xfd,0xfc,0xfc,0xfb,0xfa,0xfa, 0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0,0xee,0xed,0xec,0xea,0xe9,0xe8, 0xe6,0xe5,0xe3,0xe2,0xe0,0xdf,0xdd,0xdb,0xda,0xd8,0xd6,0xd5,0xd3,0xd1,0xd0,0xce, 0xcc,0xca,0xc8,0xc7,0xc5,0xc3,0xc1,0xbf,0xbd,0xbb,0xba,0xb8,0xb6,0xb4,0xb2,0xb0, 0xae,0xac,0xaa,0xa8,0xa6,0xa4,0xa2,0xa1,0x9f,0x9d,0x9b,0x99,0x97,0x95,0x93,0x91, 0x8f,0x8e,0x8c,0x8a,0x88,0x86,0x84,0x82,0x80,0x7e,0x7d,0x7b,0x79,0x77,0x76,0x74, 0x72,0x70,0x6e,0x6d,0x6b,0x69,0x68,0x66,0x64,0x62,0x61,0x5f,0x5d,0x5c,0x5a,0x59, 0x57,0x55,0x54,0x52,0x51,0x4f,0x4e,0x4c,0x4b,0x49,0x48,0x46,0x45,0x44,0x42,0x41, 0x3f,0x3e,0x3d,0x3b,0x3a,0x39,0x37,0x36,0x35,0x34,0x31,0x30,0x2f,0x2e,0x2d,0x2b, 0x2a,0x29,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c, 0x1b,0x1a,0x1a,0x19,0x18,0x17,0x16,0x15,0x15,0x14,0x13,0x12,0x11,0x11,0x10,0x0f, 0x0f,0x0e,0x0d,0x0d,0x0c,0x0b,0x0b,0x0a,0x09,0x09,0x08,0x08,0x07,0x07,0x06,0x06, }; //array of pointers to signal tables const uint8_t *SIGNALS[] ={ expwave }; //adjust LCD stream fuinction to use with printf() static int LCDsendstream(char c , FILE *stream) { LCDsendChar(c); return 0; } //delay 1s void delay1s(void) { uint8_t i; for(i=0;i<100;i++) { _delay_ms(10); } } //initialize Timer2 (used for button reading) void Timer2_Init(void) { TCNT2=0x00; sei(); } //start timer2 void Timer2_Start(void) { TCCR2|=(1<<CS22)|(1<<CS21); //prescaller 256 ~122 interrupts/s TIMSK|=(1<<TOV2);//Enable Timer0 Overflow interrupts } //stop timer 2 void Timer2_Stop(void) { TCCR0&=~((1<<CS22)|(1<<CS21)); //Stop timer0 TIMSK&=~(1<<TOV2);//Disable Timer0 Overflow interrupts } //Initial menu //show initial signal and frequency //generator is off void Menu_Update(uint8_t on) { LCDclr(); CopyStringtoLCD(MENU[(SG.mode)], 0, 0 ); LCDGotoXY(0, 1); if (SG.mode==6) { CopyStringtoLCD(CLR, 0, 1 ); LCDGotoXY(0, 1); printf(" %5uHz", (uint16_t)SG.deltafreq); } if (SG.mode==7) { CopyStringtoLCD(CLR, 0, 1 ); CopyStringtoLCD(RND, 0, 1 ); } if (SG.mode==8) { CopyStringtoLCD(CLR, 0, 1 ); LCDGotoXY(0, 1); printf(" %5uMHz", SG.HSfreq); } if((SG.mode==0)||(SG.mode==1)||(SG.mode==2)||(SG.mode==3)||(SG.mode==4)||(SG.mode==5)) { CopyStringtoLCD(CLR, 0, 1 ); LCDGotoXY(0, 1); printf(" %5uHz", (uint16_t)SG.freq); } if (SG.mode!=6) { if(on==1) CopyStringtoLCD(MNON, 13, 1 ); else CopyStringtoLCD(MNOFF, 13, 1 ); } } //update frequency value on LCD menu - more smooth display void Freq_Update(void) { if (SG.mode==6) { LCDGotoXY(0, 1); printf(" %5uHz", (uint16_t)SG.deltafreq); } if (SG.mode==8) { //if HS signal LCDGotoXY(0, 1); printf(" %5uMHz", SG.HSfreq); } if((SG.mode==0)||(SG.mode==1)||(SG.mode==2)||(SG.mode==3)||(SG.mode==4)||(SG.mode==5)) { LCDGotoXY(0, 1); printf(" %5uHz", (uint16_t)SG.freq); } } //External interrupt0 service routine //used to stop DDS depending on active menu //any generator is stopped by setting flag value to 0 //DDs generator which is inline ASM is stopped by setting //CPHA bit in SPCR register ISR(INT0_vect) { SG.flag=0;//set flag to stop generator SPCR|=(1<<CPHA);//using CPHA bit as stop mark //CopyStringtoLCD(MNOFF, 13, 1 ); SG.ON=0;//set off in LCD menu loop_until_bit_is_set(BPIN, START);//wait for button release } //timer overflow interrupt service tourine //checks all button status and if button is pressed //value is updated ISR(TIMER2_OVF_vect) { if (bit_is_clear(BPIN, UP)) //Button UP increments value which selects previous signal mode //if first mode is reached - jumps to last { if (SG.mode==0) { SG.mode=MN_No-1; } else { SG.mode--; } //Display menu item Menu_Update(SG.ON); loop_until_bit_is_set(BPIN, UP); } if (bit_is_clear(BPIN, DOWN)) //Button Down decrements value which selects next signal mode //if last mode is reached - jumps to first { if (SG.mode<(MN_No-1)) { SG.mode++; } else { SG.mode=0; } //Display menu item Menu_Update(SG.ON); loop_until_bit_is_set(BPIN, DOWN); } if (bit_is_clear(BPIN, RIGHT)) //frequency increment { if(SG.mode==6) { if(SG.deltafreq==10000) SG.deltafreq=1; else SG.deltafreq=(SG.deltafreq*10); Freq_Update(); loop_until_bit_is_set(BPIN, RIGHT); } if (SG.mode==8) { //ifhigh speed signal if(SG.HSfreq==8) SG.HSfreq=1; else SG.HSfreq=(SG.HSfreq<<1); Freq_Update(); loop_until_bit_is_set(BPIN, RIGHT); } if((SG.mode==0)||(SG.mode==1)||(SG.mode==2)||(SG.mode==3)||(SG.mode==4)||(SG.mode==5)) { if ((0xFFFF-SG.freq)>=SG.deltafreq) SG.freq+=SG.deltafreq; Freq_Update(); uint8_t ii=0; //press button and wait for long press (~0.5s) do{ _delay_ms(2); ii++; }while((bit_is_clear(BPIN, RIGHT))&&(ii<=250));//wait for button release if(ii>=250) { do{ if ((0xFFFF-SG.freq)>=SG.deltafreq) SG.freq+=SG.deltafreq; Freq_Update(); }while(bit_is_clear(BPIN, RIGHT));//wait for button release } } } if (bit_is_clear(BPIN, LEFT)) //frequency decrement { if(SG.mode==6) { if(SG.deltafreq==1) SG.deltafreq=10000; else SG.deltafreq=(SG.deltafreq/10); Freq_Update(); loop_until_bit_is_set(BPIN, LEFT); } if (SG.mode==8) { //ifhigh speed signal if(SG.HSfreq==1) SG.HSfreq=8; else SG.HSfreq=(SG.HSfreq>>1); Freq_Update(); loop_until_bit_is_set(BPIN, LEFT); } if ((SG.mode==0)||(SG.mode==1)||(SG.mode==2)||(SG.mode==3)||(SG.mode==4)||(SG.mode==5)) { if (SG.freq>=SG.deltafreq) SG.freq-=SG.deltafreq; Freq_Update(); uint8_t ii=0; //press button and wait for long press (~0.5s) do{ _delay_ms(2); ii++; }while((bit_is_clear(BPIN, LEFT))&&(ii<=250));//wait for button release if(ii>=250) { do{ if (SG.freq>=SG.deltafreq) SG.freq-=SG.deltafreq; Freq_Update(); }while(bit_is_clear(BPIN, LEFT));//wait for button release } } } if (bit_is_clear(BPIN, START)) { if(SG.mode!=6) { //saving last configuration SG.fr1=(uint8_t)(SG.freq); SG.fr2=(uint8_t)(SG.freq>>8); SG.fr3=(uint8_t)(SG.freq>>16); if (eeprom_read_byte((uint8_t*)EEMODE)!=SG.mode) eeprom_write_byte((uint8_t*)EEMODE,SG.mode); if (eeprom_read_byte((uint8_t*)EEFREQ1)!=SG.fr1) eeprom_write_byte((uint8_t*)EEFREQ1,SG.fr1); if (eeprom_read_byte((uint8_t*)EEFREQ2)!=SG.fr2) eeprom_write_byte((uint8_t*)EEFREQ2,SG.fr2); if (eeprom_read_byte((uint8_t*)EEFREQ3)!=SG.fr3) eeprom_write_byte((uint8_t*)EEFREQ3,SG.fr3); //Calculate frequency value from restored EEPROM values SG.freq=(((uint32_t)(SG.fr3)<<16)|((uint32_t)(SG.fr2)<<8)|((uint32_t)(SG.fr1))); //calculate accumulator value SG.acc=SG.freq/RESOLUTION; SG.flag=1;//set flag to start generator SG.ON=1;//set ON on LCD menu SPCR&=~(1<<CPHA);//clear CPHA bit in SPCR register to allow DDS //Stop timer2 - menu inactive Timer2_Stop(); //display ON on LCD Menu_Update(SG.ON); } loop_until_bit_is_set(BPIN, START);//wait for button release } } /*DDS signal generation function Original idea is taken from http://www.myplace.nu/avr/minidds/index.htm small modification is made - added additional command which checks if CPHA bit is set in SPCR register if yes - exit function */ void static inline Signal_OUT(const uint8_t *signal, uint8_t ad2, uint8_t ad1, uint8_t ad0) { asm volatile( "eor r18, r18 ;r18<-0" "\n\t" "eor r19, r19 ;r19<-0" "\n\t" "1:" "\n\t" "add r18, %0 ;1 cycle" "\n\t" "adc r19, %1 ;1 cycle" "\n\t" "adc %A3, %2 ;1 cycle" "\n\t" "lpm ;3 cycles" "\n\t" "out %4, __tmp_reg__ ;1 cycle" "\n\t" "sbis %5, 2 ;1 cycle if no skip" "\n\t" "rjmp 1b ;2 cycles. Total 10 cycles" "\n\t" : :"r" (ad0),"r" (ad1),"r" (ad2),"e" (signal),"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(SPCR)) :"r18", "r19" ); } void Timer1_Start(uint8_t FMHz) { switch(FMHz){ case 1: //start high speed (1MHz) signal OCR1A=7; break; case 2: OCR1A=3;//2MHz break; case 4: OCR1A=1;//4MHz break; case 8: OCR1A=0;//8MHz break; default: OCR1A=7;//defauls 1MHz break;} //Output compare toggles OC1A pin TCCR1A=0x40; //start timer without prescaler TCCR1B=0b00001001; } void Timer1_Stop(void) { TCCR1B=0x00;//timer off } //main init function void Main_Init(void) { //stderr = &lcd_str; stdout = &lcd_str; //--------init LCD---------- LCDinit(); LCDclr(); LCDcursorOFF(); //-------EEPROM initial values---------- if (eeprom_read_byte((uint8_t*)EEINIT)!='T') { eeprom_write_byte((uint8_t*)EEMODE,0x00);//initial mode 0 – OUT~~~~; eeprom_write_byte((uint8_t*)EEFREQ1,0xE8);//initial frequency 1kHz eeprom_write_byte((uint8_t*)EEFREQ2,0x03); eeprom_write_byte((uint8_t*)EEFREQ3,0x00); eeprom_write_byte((uint8_t*)EEINIT,'T');//marks once that eeprom init is done //once this procedure is held, no more initialization is performed } //------restore last saved values from EEPROM------ SG.mode=eeprom_read_byte((uint8_t*)EEMODE); SG.fr1=eeprom_read_byte((uint8_t*)EEFREQ1); SG.fr2=eeprom_read_byte((uint8_t*)EEFREQ2); SG.fr3=eeprom_read_byte((uint8_t*)EEFREQ3); SG.freq=(((uint32_t)(SG.fr3)<<16)|((uint32_t)(SG.fr2)<<8)|((uint32_t)(SG.fr1))); SG.acc=SG.freq/RESOLUTION; SG.flag=0; //default 1MHz HS signal freq SG.HSfreq=1; SG.deltafreq=100; //------------init DDS output----------- R2RPORT=0x00;//set initial zero values R2RDDR=0xFF;//set A port as output //-------------set ports pins for buttons---------- BDDR&=~(_BV(START)|_BV(UP)|_BV(DOWN)|_BV(RIGHT)|_BV(LEFT)); BPORT|=(_BV(START)|_BV(UP)|_BV(DOWN)|_BV(RIGHT)|_BV(LEFT)); //---------set ports pins for HS output--------- HSDDR|=_BV(HS);//configure as output //-----------Menu init-------------- SG.ON=0;//default signal is off Menu_Update(SG.ON); //-----------Timer Init------------- Timer2_Init(); //Start Timer with overflow interrupts Timer2_Start(); } int main(void) { //Initialize Main_Init(); while(1)//infinite loop { if (SG.flag==1) { GICR|=(1<<INT0);//set external interrupt to enable stop if (SG.mode==7) { //Noise do { R2RPORT=rand(); }while(SG.flag==1); //set signal level to 0 R2RPORT=0x00; //display generator OFF Menu_Update(SG.ON); //stop external interrupt GICR&=~(1<<INT0); //start timer menu active Timer2_Start(); } /* else if (SG.mode==6) { //freq step while((SG.flag==1)) { //not implemented CopyStringtoLCD(NA, 0, 1 ); } //set signal level to 0 R2RPORT=0x00; //display generator OFF Menu_Update(SG.ON); GICR&=~(1<<INT0);//|(1<<INT1);//stop external interrupt //start timer menu active Timer2_Start(); }*/ else if (SG.mode==8) { //High speed signal Timer1_Start(SG.HSfreq); while((SG.flag==1)) { //not implemented CopyStringtoLCD(MNON, 13, 1 ); } Timer1_Stop();//timer off //set HS pin to LOW HSPORT&=~(1<<HS); //display generator OFF Menu_Update(SG.ON); GICR&=~(1<<INT0);//|(1<<INT1);//stop external interrupt //start timer menu active Timer2_Start(); } else { //start DDS Signal_OUT(SIGNALS[sG.mode], (uint8_t)((uint32_t)SG.acc>>16), (uint8_t)((uint32_t)SG.acc>>8), (uint8_t)SG.acc); //set signal level to 0 R2RPORT=0x00; //display generator OFF Menu_Update(SG.ON); GICR&=~(1<<INT0);//|(1<<INT1);//stop external interrupt //start timer menu active Timer2_Start(); } } } return 0; } ошибка section .MySection1 loaded at [000016ce,000017cd] overlaps section .data loaded at [000016ce,000016f5] Подскажите пожалуйста,где посмотреть, по какой причине он так записывает в память. Гуглила, ничего толкого не нашла. Заранее спасибо.
  18. Lcd Часы На Atmega16

    lcdcloc v1.txt Всем привет.Вообщем я часы делаю на мк mega16. С микроконтроллером и языком си знаком около 3-4 недель. Проект делаю на avr studio короче вот какой расклад: PORTA.0 beep // На этой ножке конденсатор и динамик для будильника PORTA.1 //кнопка menu в будущем PORTA.2 //кнопка mode тоже в будущем PORTA.3 //кнопка light подсветка lcd в будущем PORTA.4 // все остальные ножки PORTA на светодиодах реализуют light PORTA.5 PORTA.6 PORTA.7 примерно это выглядит вот так вначале бегущая строка потом menu 24:11:35 mode 25.11.2012 вообщем вопрос мой такой я настроил таймер 1 секунду на 61 такт а так получилось 61.03515625 тактов и это наверно хреново для часов ) там для таймеров какой то режим есть СТС в котором я толком никак не могу разобраться допишите плз в прерывании с этим режимом. кварц на 4МГЦ да и еще вопрос. если я создам прерывание в прерывании ну в моем случае там где инкримент секунды идет туда же запилить прерывание на оброботку нажатий кнопок как это отразиться в целом?
  19. Ну в общем, начал я изучать микроконтроллеры(недавно, неделю всего) на примере ATmega16. И вот у меня такой вопрос возник - У меня схема питания на стабилизаторе LM7805, вроде все работало. А потом воткнул на плату(а я на макетке все собираю) MAX232 и что-то вдруг светодиод "наличие +5В" гореть почти перестал... Померил напряжение, а там 2,2В вообще! Более того, оказывается если подключен только МК, то напряжение падает на 2 вольта! Ну так вот, собсно вопрос - по-моему это ненормально, что делать?) P.S.Стабилизатор менял на другой такой же и на 78M05C, та же петрушка. Вот схема узла - Ну и все остальное(P-Cad установил только что, не судите строго ) (только сервы подключены к PD4 и 5, я передумал программный ШИМ делать, даешь аппаратный!=) И да, питание у них тоже свое, +6В)
  20. Доброго времени суток. Задался целью сделать генератор прямоугольных импульсов на atmega16 с регулируемой частотой и длительностью импульса, поэтому возникло несколько вопросов: - нужно ли использовать ЦАП или достаточно будет на прерывание от таймера повесить что то вроде PORTA^=(1<<1); - каким образом задаётся время импуьлса? прокатит ли вариант с использованием delay в прерывании от таймера, например PORTA|=(1<<1); _delay_ms(100); // время импульса 100 мсек PORTA&=~(1<<1); какие вообще подводные камни есть при создании генератора на контроллере? Заранее спасибо.
  21. Глюк С Таймером Atmega16

    на вход ICP1 подаю импульсы с периодом 5000мкс и пытаюсь измерить периоды каждого импульса но таймер меряет 17 раз правильно потом 1 раз меньше на 255 мкс и 1 раз больше на 255 мкс потом опять 13 раз правильно и цикл повторяется. подскажите пожалуйста в чем прикол? /***************************************************** Chip type : ATmega16 Program type : Application AVR Core Clock frequency: 8,000000 MHz *****************************************************/ #include <mega16.h> char ch[10]; unsigned int val=0; unsigned int last_val=0; unsigned int buf=0; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 1000,000 kHz // Mode: Normal top=0xFFFF // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: On // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x02; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer1 input capture interrupt service routine interrupt [TIM1_CAPT] void timer1_capt_isr(void) { val=ICR1H<<8|ICR1L; buf=val-last_val; ltoa(buf,ch); puts(ch); putsf("\r\n"); last_val=val; } вот что выводиться на терминал 5133 5133 5133 5133 5134 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 4877 5389 5133 5133 5133 5132 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5132 5133 5133 4877 5389 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5134 5133 5133 5133 5133 4876 5389 5134 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5134 4877 5389 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5134 5133 5133 5133 5133 5133 4877 5389 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 4877 5389 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 4877 5389 5133 5133 5134 5133 5133 5132 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 4877 5389 5133 5133 5133 5133 5133 5133 5133 5134 5133 5133 5133 5133 5134 5133 5133 5133 5133 5133 4877 5389 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 4877 5389 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 4877 5389 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 5133 а ведь все цифры должны быть почти одинаковы 5133 (ну плюс минус 1 погрешгость)
  22. Прерывания

    Приветствую всех! Я только-только начал иметь иметь дело как с контроллерами, так и с ассемблером. Пишу сейчас в Atmel Studio 6 для ATMega16. Чтобы получше разобраться, вбил я такой код: .include "m16def.inc" //------------------------------- .CSEG .ORG $000 ; (RESET) RJMP Reset .ORG $002 RETI ; (INT0) External Interrupt Request 0 .ORG $004 RETI ; (INT1) External Interrupt Request 1 .ORG $006 RETI ; (TIMER2 COMP) Timer/Counter2 Compare Match .ORG $008 RETI ; (TIMER2 OVF) Timer/Counter2 Overflow .ORG $00A RETI ; (TIMER1 CAPT) Timer/Counter1 Capture Event .ORG $00C RETI ; (TIMER1 COMPA) Timer/Counter1 Compare Match A .ORG $00E RETI ; (TIMER1 COMPB) Timer/Counter1 Compare Match B .ORG $010 RETI ; (TIMER1 OVF) Timer/Counter1 Overflow .ORG $012 RETI ; (TIMER0 OVF) Timer/Counter0 Overflow .ORG $014 RETI ; (SPI,STC) Serial Transfer Complete .ORG $016 RJMP RX_OK ; (USART,RXC) USART, Rx Complete .ORG $018 RETI ; (USART,UDRE) USART Data Register Empty .ORG $01A RETI ; (USART,TXC) USART, Tx Complete .ORG $01C RETI ; (ADC) ADC Conversion Complete .ORG $01E RETI ; (EE_RDY) EEPROM Ready .ORG $020 RETI ; (ANA_COMP) Analog Comparator .ORG $022 RETI ; (TWI) 2-wire Serial Interface .ORG $024 RETI ; (INT2) External Interrupt Request 2 .ORG $026 RETI ; (TIMER0 COMP) Timer/Counter0 Compare Match .ORG $028 RETI ; (SPM_RDY) Store Program Memory Ready .ORG INT_VECTORS_SIZE ; Конец таблицы прерываний RX_OK: IN R16,UDR RETI Reset: LDI R16,Low(RAMEND) OUT SPL,R16 LDI R16,High(RAMEND) OUT SPH,R16 SEI LDI R17,(1<<RXCIE) OUT UCSRB,R17 M1: NOP NOP NOP NOP RJMP M1 Начну с того, что команда SEI не меняет значение флага I регистра SREG. Но это еще не все. Если забить и установить этот флаг вручную, то при установки флага прерывания RXC в регистре UCSRA ничего не происходит - на следующий же такт он сам возвращается в исходное состояние, а контроллер продолжает бегать циклом по NOP. Что я забыл, что не так?
  23. Здравствуйте. возник такой вопрос. совсем недавно начал заниматься avr-ми, для своих целей написал прогу, но что то пошла она не так как в протеусе. вот небольшой ее код void main(void){ DDRC = 0b00000000; DDRA = 0b11111111; PORTC= 0b11111111; //подтягивающий резистор PORTA.0 = 1; //зажигаем светодиод while(1){ if (PINC.3 ==0){ //кнопка на порту 3 PORTA.0 = 0; //тушим первый светодиод PORTA.1 = 1; //зажигаем второй светодиод break; }; }; }; почему то получается так, что начиная с 3 и до 5 порта включ. контроллер игнорит условие if и сразу подает сигнал на PORTA.1 пропуская при этом PORTA.0. все остальные порты С работают как надо. ставил вместо С порты B все тоже заработало нормально. пробовал новый контроллер подключить, все сложилось точно таким же образом, хотя он абсолютно новый, ни разу не прошитый. кто нибудь сталкивался с таким? частота 1 Мгц, внутренний генератор