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

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

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

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

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


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

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

Блоги

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

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

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

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

Группа


ICQ


Skype


Интересы


Город


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


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

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

  1. ATmega128, таймер

    Приветствую. Возникла следующая проблема: использовал ATmega2560 с библиотекой TimerOne - проблем не было. После перехода на ATmega128 появилась ошибка: "'TIMSK1' was not declared in this scope". Покопавшись в интернете выяснил - дело в том, что названия некоторых регистров таймера ATmega128 отличается от ATmega2560. Вообщем это и надо поправить. Может есть тут кто разбирается в таймерах ATmega? Готов финансово отблагодарить за помощь. Код из TimerOne.h, требующий исправления. #ifndef TimerOne_h_ #define TimerOne_h_ #if defined(ARDUINO) && ARDUINO >= 100 #include "Arduino.h" #else #include "WProgram.h" #endif #include "config/known_16bit_timers.h" #define TIMER1_RESOLUTION 65536UL // Timer1 is 16 bit class TimerOne { #if defined(__AVR__) public: //**************************** // Configuration //**************************** void initialize(unsigned long microseconds=1000000) __attribute__((always_inline)) { TCCR1B = _BV(WGM13); // set mode as phase and frequency correct pwm, stop the timer TCCR1A = 0; // clear control register A setPeriod(microseconds); } void setPeriod(unsigned long microseconds) __attribute__((always_inline)) { const unsigned long cycles = (F_CPU / 2000000) * microseconds; if (cycles < TIMER1_RESOLUTION) { clockSelectBits = _BV(CS10); pwmPeriod = cycles; } else if (cycles < TIMER1_RESOLUTION * 8) { clockSelectBits = _BV(CS11); pwmPeriod = cycles / 8; } else if (cycles < TIMER1_RESOLUTION * 64) { clockSelectBits = _BV(CS11) | _BV(CS10); pwmPeriod = cycles / 64; } else if (cycles < TIMER1_RESOLUTION * 256) { clockSelectBits = _BV(CS12); pwmPeriod = cycles / 256; } else if (cycles < TIMER1_RESOLUTION * 1024) { clockSelectBits = _BV(CS12) | _BV(CS10); pwmPeriod = cycles / 1024; } else { clockSelectBits = _BV(CS12) | _BV(CS10); pwmPeriod = TIMER1_RESOLUTION - 1; } ICR1 = pwmPeriod; TCCR1B = _BV(WGM13) | clockSelectBits; } //**************************** // Run Control //**************************** void start() __attribute__((always_inline)) { TCCR1B = 0; TCNT1 = 0; // TODO: does this cause an undesired interrupt? resume(); } void stop() __attribute__((always_inline)) { TCCR1B = _BV(WGM13); } void restart() __attribute__((always_inline)) { start(); } void resume() __attribute__((always_inline)) { TCCR1B = _BV(WGM13) | clockSelectBits; } //**************************** // PWM outputs //**************************** void setPwmDuty(char pin, unsigned int duty) __attribute__((always_inline)) { unsigned long dutyCycle = pwmPeriod; dutyCycle *= duty; dutyCycle >>= 10; if (pin == TIMER1_A_PIN) OCR1A = dutyCycle; #ifdef TIMER1_B_PIN else if (pin == TIMER1_B_PIN) OCR1B = dutyCycle; #endif #ifdef TIMER1_C_PIN else if (pin == TIMER1_C_PIN) OCR1C = dutyCycle; #endif } void pwm(char pin, unsigned int duty) __attribute__((always_inline)) { if (pin == TIMER1_A_PIN) { pinMode(TIMER1_A_PIN, OUTPUT); TCCR1A |= _BV(COM1A1); } #ifdef TIMER1_B_PIN else if (pin == TIMER1_B_PIN) { pinMode(TIMER1_B_PIN, OUTPUT); TCCR1A |= _BV(COM1B1); } #endif #ifdef TIMER1_C_PIN else if (pin == TIMER1_C_PIN) { pinMode(TIMER1_C_PIN, OUTPUT); TCCR1A |= _BV(COM1C1); } #endif setPwmDuty(pin, duty); TCCR1B = _BV(WGM13) | clockSelectBits; } void pwm(char pin, unsigned int duty, unsigned long microseconds) __attribute__((always_inline)) { if (microseconds > 0) setPeriod(microseconds); pwm(pin, duty); } void disablePwm(char pin) __attribute__((always_inline)) { if (pin == TIMER1_A_PIN) TCCR1A &= ~_BV(COM1A1); #ifdef TIMER1_B_PIN else if (pin == TIMER1_B_PIN) TCCR1A &= ~_BV(COM1B1); #endif #ifdef TIMER1_C_PIN else if (pin == TIMER1_C_PIN) TCCR1A &= ~_BV(COM1C1); #endif } //**************************** // Interrupt Function //**************************** void attachInterrupt(void (*isr)()) __attribute__((always_inline)) { isrCallback = isr; TIMSK1 = _BV(TOIE1); } void attachInterrupt(void (*isr)(), unsigned long microseconds) __attribute__((always_inline)) { if(microseconds > 0) setPeriod(microseconds); attachInterrupt(isr); } void detachInterrupt() __attribute__((always_inline)) { TIMSK1 = 0; } static void (*isrCallback)(); static void isrDefaultUnused(); private: // properties static unsigned short pwmPeriod; static unsigned char clockSelectBits; #endif }; extern TimerOne Timer1; #endif
  2. Доброго времени суток! Кто разбирается с Atmega128, ассемблером и кому не жалко времени, пожалуйста помогите. Как можно корректировать скорость падения маятника (он должен постеменно набирать скорость падения и плавно замедляться к верхней точке)... Какие данные нужно менять?! Спасибо! логин маятник 2.zip
  3. Требуется помощь в реализации некого микроконтроллера+ написания кода прошивки на с++. Контроллер будет работать на ATMEGA128A Требуется принципиальная схема некоторой части функционала, а именно: 1. Управление LED лентой суммарный ток потребление ленты 7А, напряжение питания -12в. Нужно подобрать mosfet(N-канал) и обвзяку, привести пример кода для управление ШИМ. Находил тут примеры контроллеров для управление лентой, но у меня почему-то шим больше 5В не получился. 2. Управление 16 двигателями 12В(0.15А каждый ), управление через ШИМ. Но не отдельно для каждого двигателя, а по 8. Т.е. 1 шим-канал на 8 двигателей. Я так понимаю что для этого можно будет использовать 1 шим контроллера+ сдвиговый регистр на 8 портов. Двигатели одновременно не будут работать. Будут подключаться по-очереди. Тоже нужен подбор компонентов, схема подключения, пример кода на си++ 3. Аналоговое чтение, 16 каналов принципиальная схема подключения(я так понимаю что там только токоорграничивающий резистр и конденсатор к земле)+ пример кода для чтения из канала(аналог функции analogRead() в ардуино) 4. Схема обвязки микроконтроллера не нужна- она типовая, есть у меня. отвечу на вопросы. Напишите кто готов сделать, сроки и цену.
  4. Всем привет.Есть такая проблема.Делаю терморегулятор.Есть программа написанная на СИ и есть схема в протеусе. Все вроде компилируется и ошибок нигде не выдает.Но не работает приборчик.И походу нет данных с датчика температуры.Помогите найти ошибку.!!!!Очень надо.В архиве есть все исходники. /* * Application1.c * Author: Александр */ #define F_CPU 4000000UL #include<avr/io.h> #include<avr/interrupt.h> #include<util/delay.h> #define PORTB_MASK 0x01 // zdes ispolzuem PB0 kak liniju dannih dlja datcika #define GISTERESIS 30 void port_ini(void) { PORTB=0x00; DDRB=0xFF; } //---Функци посылки RESET PULSE - датчику----------------- unsigned char present_ds18b20(void) { unsigned char res; DDRB|= PORTB_MASK; // Далее такого рода конструкция означает // DDRB = DDRB | PORTB_MASK, т.е. DDRB = (xxxxxxxx | 00000001) = xxxxxxx1 _delay_ms(485); //Pause 480mks DDRB&=~PORTB_MASK; // Далее такого рода конструкция означает // DDRB = DDRB & ~PORTB_MASK, т.е. DDRB = (xxxxxxxx & 11111110) = xxxxxxx0 _delay_us(65); //Pause 70mks if ((PINB&PORTB_MASK) == 0x00) // Если в PB0 0 , т.е. получен ответ от датчика present и возвращаем 1 res=1; //if present, res=1 else res=0; // else возвращаем 0 _delay_ms(420); //pause 410mks return res; } //----------Функция шлет датчику побитно комманду command------ void send_ds18b20(unsigned char command) { unsigned char i, data; data=command; for(i=0;i<8;i++) { if ((data&0x01)==0x01) { // Если бит 1 - Шлем бит = 1 DDRB|=PORTB_MASK; // liniju v 0 (старт посылки) _delay_us(2); //pause 6mks DDRB&=~PORTB_MASK; // liniju v 1 - na vhod (шлем бит=1 и стоп посылки) _delay_us(65); //pause 64mks } else { //Если бит 0 - Шлем бит 0 DDRB|=PORTB_MASK; // liniju v 0 (старт посылки и шлем бит 0) _delay_us(60); //pause 60mks DDRB&=~PORTB_MASK; // liniju v 1 - na vhod (стоп посылки) _delay_us(10); //pause 10mks } data=data>>1; // сдвигаем посылаемый байт на бит вправо для посылки следующего бита и так все 8 бит шлем. } } //---------Функция приема 2-х байт температуры от датчика // температура хранится в 2-х байтной temperature unsigned int receive_ds18b20(void) { unsigned char i; unsigned int temperature=0; for(i=0;i<16;i++) { DDRB|=PORTB_MASK; // liniju v 0 (старт приема) _delay_us(6); //Pause 6mks DDRB&=~PORTB_MASK; // liniju v 1 - na vhod _delay_us(9); //Pause 9mks , т.е. на 15 мкс считываем полученный бит if ((PINB & PORTB_MASK)==0x00) temperature&=~_BV(i); //If recived 0 // если бит 0 записываем в i-ую позицию temperature бит 0, ~_BV(i) тоже самое что ~(1<<i) else { temperature|=_BV(i); //If recived 1 // если бит 1 записываем в i-ую позицию temperature бит 1, _BV(i) тоже самое что (1<<i) } _delay_us(55); //Pause 55mks } return temperature; // возвращаем 2 байта температуры } char ASCII_high; // переменная для старшей цифры температуры для вывода на дисплей char ASCII_low; // переменная для младшей цифры температуры для вывода на дисплей char * decTab = "0123456789"; // массив где номеру его элемента соответсвует цифра в ASCII (это для вывода на дисплей) // функция принимает значение value и адресса high и high записывает в // в эти адресса код в Ascii . // например у нас в детятичной системе 15 , для вывода на дисплей // мы должны послать байт '1' и байт '5' во т15 - это value // 1 - хранится по адрессу high, 5 по адрессу low void decByte2asciiPair(char value, char * high, char * low) { *high = decTab[ value/10 ]; *low = decTab[ value%10 ]; } //--------------------LCD------------------------------------------ // задержки #define WAIT_1ms _delay_ms(1); #define WAIT_10ms _delay_ms(10); // Макроопределения E - PC0 , RS - PC1 , RW - PC2 #define E PC0 #define RS PC1 #define RW PC2 // - шлем комманду на дисплей void SEND_COM(int sys_com) { PORTC &= ~(1<<E) & ~(1<<RW) & ~(1<<RS); //E=0,RW=0 (peredaem),RS=0(komanda) WAIT_1ms PORTC = (PORTC |(1<<E)) & ~(1<<RW) & ~(1<<RS); //E=1,RW=0 (peredaem),RS=0(komanda) WAIT_1ms PORTD = sys_com; WAIT_1ms PORTC &= ~(1<<E) & ~(1<<RW) & ~(1<<RS); //E=0,RW=0 (peredaem),RS=0(komanda) WAIT_10ms // posle posilki komandi nuzno podozdat vremja i ne slat }// шлем данные на дисплей void SEND_DATA(int sym_com) { PORTC = (PORTC |(1<<RS)) & ~(1<<E) & ~(1<<RW); //E=0,RW=0 (peredaem),RS=1(dannie) WAIT_1ms PORTC = ( PORTC |(1<<RS)|(1<<E) ) & ~(1<<RW); //E=1,RW=0 (peredaem),RS=1(dannie) WAIT_1ms PORTD = sym_com; WAIT_1ms PORTC = (PORTC |(1<<RS)) & ~(1<<E) & ~(1<<RW); //E=0,RW=0 (peredaem),RS=1(dannie) WAIT_10ms // posle posilki komandi nuzno podozdat vremja i ne slat }// инициализация дисплея void LCD_init(void) { SEND_COM(0b00110000);// 8 bit 1 srtroka razmer simvola 5x8 SEND_COM(0b00000001);// ustanovka 0-adres i ocistka ekrana SEND_COM(0b00000110);//increment adressa , t.e. kazdi sled simvol v sled znakomesto zapisetsa SEND_COM(0b00001100);// vklucit ekran SEND_DATA('1'); // risuem nacalnie ustanovki SEND_DATA('5'); SEND_DATA('.'); SEND_DATA('0'); SEND_COM(0b00010100);// sdvig kursora vpravo SEND_DATA('O'); SEND_DATA('F'); SEND_DATA('F'); SEND_COM(0b00010100);// sdvig kursora vpravo SEND_DATA('X'); SEND_DATA('X'); SEND_DATA('.'); SEND_DATA('X'); } //--------Обработчик прерывания по таймеру T0 ---------------- volatile char button0_state=0; // переменная-флаг нажантия кнопки 0 volatile char button1_state=0; // переменная-флаг нажантия кнопки 1 ISR(TIMER0_OVF_vect) { static int count_buttons_reading=0; // переменная для отсчета 40-ka интревалов по 4 мс static int count_button0_yea=0; // переменная для подсчета количесва нажатий кнопки 0 в интервале 4*40 ms static int count_button0_no=0; // переменная для подсчета количесва отжатий кнопки 0 в интервале 4*40 ms static int count_button1_yea=0; // переменная для подсчета количесва нажатий кнопки 1 в интервале 4*40 ms static int count_button1_no=0; // переменная для подсчета количесва отжатий кнопки 0 в интервале 4*40 ms count_buttons_reading++; // прошло 4 мс , подсчитываем if ( !((PINC>>PC3)&0x01) ) // если нажата кнопка 0 count_button0_yea++; // подсчитываем нажатие else // если отжата кнопка 0 count_button0_no++; // подсчитываем отжатие if ( !((PINC>>PC4)&0x01) ) // тоже самое для кнопки 1 count_button1_yea++; else count_button1_no++; if ( count_buttons_reading==40 ) // resenie o sostoinii prinimaetsa cerez 40*4=160ms { if(count_button0_yea>count_button0_no) // если по прошествию 40-ka 4-ех милисекундных интервало нажатий больше отжатий button0_state=1; // считаем что кнопка нажата else button0_state=0; // в проивном случае считаем что кнопка отжата if(count_button1_yea>count_button1_no) // аналогично для кнопки 1 button1_state=1; else button1_state=0; count_buttons_reading=0; // сброс всех счетчиков для следующего цикла из 40-ка 4 мс интервалов count_button0_yea=0; count_button0_no=0; count_button1_yea=0; count_button1_no=0; } } // функция настройки таймере T0 на прерывание по переполнению void Timer0Init(unsigned char prescaller,unsigned char int_mode) { TCCR0=prescaller; // taimer zapuskaetsa kak tolko v TCCR0 zadadut predddelitel(CS00-CS02) TIMSK=int_mode;// razr-zapr prerivanija zdes tolko po perepolneniju } //---------------Функция чтения температуры от дачтчика-------- unsigned int read_temp(void) { unsigned int temp; SREG&=~(1<<7); // globalno zaprescaem prerivanija // код который пойдет ниже нельзя прерывать так как шина 1 Wire очень чувсвительна к временным интервалам //------------------START preobrazovanija while(!present_ds18b20()); // zdem пока нет otveta present от датчика send_ds18b20(0xcc); // если дождались послыаем команду тгнорирования адресса (если 1 датчик на шине то так проще просо работать) send_ds18b20(0x44); // шлем команду на старт преоращования _delay_ms(750); // zdem preobrazovanije не менее 750 мс //---------CITAEM DANNIE--------- while(!present_ds18b20()); // zdem пока нет otveta present от датчика send_ds18b20(0xcc); // если дождались послыаем команду игнорирования адресса (если 1 датчик на шине то так проще просо работать) send_ds18b20(0xbe); // посылаем команду чтения температуры temp = receive_ds18b20(); // читаем 2 байта SREG|=(1<<7); // globalno opjat razrecaem prerivanija return temp; // возвращаем 2 прочитанных байта температуры } #define HIGH_TEMP 300 // верхний предел температуры здесь и далее имеется ввиду формат 30.0 #define LOW_TEMP 150 // нижний предел температуры здесь и далее имеется ввиду формат 15.0 // намприер 15.5 будет 155 signed int temperatura_tek=LOW_TEMP; // по умолчанию нижний предел температуры signed int temperatura_tek_pred=LOW_TEMP; // по умолчанию нижний предел предыдущей текущей температуры unsigned int temperatura_ust=LOW_TEMP; // по умолчанию нижний предел температуры int main(void) { char i; unsigned int receive_temp;// temperaura ot dancika PORTB&=~PORTB_MASK; // otklucaem vnutrennjuu podtjazku ot vhoda PB0 DDRB&=~PORTB_MASK; // poka nastraivaem na vhod liniju dannih, s ucetom vnesney podtazki tam 1 DDRC |= (1<<E) | (1<<RS) | (1<<RW); // na vihod linii upr ekranom PORTC &= ~(1<<E) & ~(1<<RS) & ~(1<<RW); // obnuljaem DDRC &= ~(1<<PC3) & ~(1<<PC4); // PC3 i PC4 na vhod dla knopok PORTC |= (1<<PC3) | (1<<PC4); // na PC3 i PC4 vklucaem vnutrennie podtjazki DDRC |= (1<<PC5) ; // PC5 na vihod dlja upravlenija optoparoy (u nas diod) PORTC |= (1<<PC5) ; // PC5 =1 ; po sheme ten viklucen/svetodiod ne gorit Timer0Init( (1<<CS00) | (1<<CS01),1<<TOIE0);// preriv po taymeru0 po perepolmeniju na 4 ms nastraivaem // делитель 64, (64/4000000)*256=0.004с SREG|=(1<<7); // globalno razrecaem prerivanija LCD_init(); // начальная инициализация LCD while (1) // beskonecniy cikl { //********************Проверяем и обрабатываем кнопку + с выводом на экран ************************* if (button0_state==1) // если нажата кнопка увеличения температуры { button0_state=0; // sbrasivaem , t.e. obrabotali nazatie knopki temperatura_ust = temperatura_ust + 5; if (temperatura_ust > HIGH_TEMP) // проверка за выход из диапазона temperatura_ust=LOW_TEMP; SEND_COM(0b00000010);// ustanovka v 0-j address LCD (с 0-ой позиции дисплея у нас находится эта температура) decByte2asciiPair((char)(temperatura_ust/10),&ASCII_high,&ASCII_low); // perevodim v aski celiju cast temperaturi // (например 15.5 , у нас 155. / это целочисленное деление, значит 155/5=15, то что надо! Значит переводим 15 в '1' и '5') SEND_DATA(ASCII_high); // vivodim celluji cast temperatiri SEND_DATA(ASCII_low); decByte2asciiPair((char)(temperatura_ust%10),&ASCII_high,&ASCII_low); // perevodim v aski celiju cast temperaturi (например 15.5 , у нас 155. / - целочисленное деление, значит 155/5=15, то что надо!) // (например 15.5 , у нас 155. % это остаток от деление, значит 155%5=5, то что надо! Значит переводим 05 в '0' и '5') SEND_COM(0b00010100);// sdvig kursora vpravo SEND_DATA(ASCII_low); // vivodim drobniju cast temperaturi } //********************Проверяем и обрабатываем кнопку - с выводом на экран ************************* if (button1_state==1) // если нажата кнопка уменшения температуры { button1_state=0; // sbrasivaem , t.e. obrabotali nazatie knopki temperatura_ust = temperatura_ust - 5; if (temperatura_ust < LOW_TEMP ) // проверка за выход из диапазона temperatura_ust=HIGH_TEMP; decByte2asciiPair((char)(temperatura_ust/10),&ASCII_high,&ASCII_low); // perevodim v aski celiju cast temperaturi // (например 15.5 , у нас 155. / это целочисленное деление, значит 155/5=15, то что надо! Значит переводим 15 в '1' и '5') SEND_COM(0b00000010);// ustanovka v 0-j address LCD (на -ой позиции дисплея у нас находится эта температура) SEND_DATA(ASCII_high); // vivodim celluji cast temperatiri SEND_DATA(ASCII_low); decByte2asciiPair((char)(temperatura_ust%10),&ASCII_high,&ASCII_low); // perevodim v aski celiju cast temperaturi (например 15.5 , у нас 155. / - целочисленное деление, значит 155/5=15, то что надо!) // (например 15.5 , у нас 155. % это остаток от деление, значит 155%5=5, то что надо! Значит переводим 05 в '0' и '5') SEND_COM(0b00010100);// sdvig kursora vpravo SEND_DATA(ASCII_low); // vivodim drobniju cast temperaturi } // запомнили предыдущую температуру temperatura_tek_pred = temperatura_tek; //*********** Получаем 2 байта температуры от датчика и переводим ее в нужный формат ************************* receive_temp=read_temp(); // получаем 2 байта температуры от датчика (0-ой бит =1 - 0.5, 0 - 0.0 десятая часть) temperatura_tek = ((receive_temp>>1)*10 ); // присваеваем температуре текущей целую часть температуры от датчика переведенную в нужный нам формат, // т.е. если например 15.5 станет 15*10 =150 if (receive_temp & 0x01) // если дробная часть 0.5 - то (т.е. 0-й бит равен 1) temperatura_tek = temperatura_tek+5; // то 15+5 = 155 (т.е. 15.5) //****** Выводим на экран температуру от датчика**************************** decByte2asciiPair((char)(temperatura_tek/10),&ASCII_high,&ASCII_low); // perevodim v aski celiju cast temperaturi SEND_COM(0b00000010);// ustanovka v 0-j address LCD for (i=0;i<9;i++) SEND_COM(0b00010100);// sdvig kursora vpravo на - 7 позиций (с 7-й позиции у нас находится на дисплее эта температура) SEND_DATA(ASCII_high); // vivodim celluji cast temperatiri na ekran SEND_DATA(ASCII_low); decByte2asciiPair((char)(temperatura_tek%10),&ASCII_high,&ASCII_low); SEND_COM(0b00010100);// sdvig kursora vpravo SEND_DATA(ASCII_low); // vivodim drobniju cast temperaturi //************* Сравниваем температуру текущую и требуемую c гистерезисом и принимаем решение а ключении тэна с выводдом ON - OFF на экран if ((temperatura_tek-temperatura_tek_pred)>0) { // если температура растет if ( temperatura_tek <= (temperatura_ust + GISTERESIS)) // esli neobhodimo povisat temperaturu? { PORTC &= ~(1<<PC5) ; // да PC5 =0 ; po sheme ten vklucen/svetodiod gorit SEND_COM(0b00000010);// ustanovka v 0-j address LCD for (i=0;i<5;i++) SEND_COM(0b00010100);// sdvig kursora vpravo на - 5 позиций (с 5-й позиции у нас находится слово ON) SEND_DATA('O'); SEND_DATA('N'); SEND_DATA(' '); } else { PORTC |= (1<<PC5) ; // нет PC5 =1 ; po sheme ten viklucen/svetodiod ne gorit SEND_COM(0b00000010);// ustanovka v 0-j address LCD for (i=0;i<5;i++) SEND_COM(0b00010100);// sdvig kursora vpravo на - 5 позиций (с 5-й позиции у нас находится слово OFF) SEND_DATA('O'); SEND_DATA('F'); SEND_DATA('F'); } } if ((temperatura_tek-temperatura_tek_pred)<0) { // если температура убывает if ( temperatura_tek > (temperatura_ust - GISTERESIS)) // esli neobhodimo ponizat temperaturu? { PORTC |= (1<<PC5) ; // нет PC5 =1 ; po sheme ten viklucen/svetodiod ne gorit SEND_COM(0b00000010);// ustanovka v 0-j address LCD for (i=0;i<5;i++) SEND_COM(0b00010100);// sdvig kursora vpravo на - 5 позиций (с 5-й позиции у нас находится слово OFF) SEND_DATA('O'); SEND_DATA('F'); SEND_DATA('F'); } else { PORTC &= ~(1<<PC5) ; // да PC5 =0 ; po sheme ten vklucen/svetodiod gorit SEND_COM(0b00000010);// ustanovka v 0-j address LCD for (i=0;i<5;i++) SEND_COM(0b00010100);// sdvig kursora vpravo на - 5 позиций (с 5-й позиции у нас находится слово ON) SEND_DATA('O'); SEND_DATA('N'); SEND_DATA(' '); } }} projectC.7z
  5. Разработать модель в среде симуляции Proteus на базе микроконтроллера AtMega128 и написать программу на языке ассемблера для решения следующей задачи: 1. Изменяя положение ручки регулятора напряжения переменным резистором высвечивать на одном разряде трехразрядного семисегментного индикатора цифру от 0 до 9. 2. При нажатии кнопки 1 на клавиатуре выдавать звуковой сигнал с пьъезодинамика с частотой 1 кГц. При нажатии на кнопку 2 – с частотой 2 кГц, при нажатии на кнопку 3 – с частотой 3 кГц.
  6. Avr Zx Spectrum 128 На Семи Корпусах

    Здравствуйте. Выкладываю результаты собственной разработки: персональный компьютер ZX Spectrum 128, разработанный с применением микроконтроллеров AVR Atmel. Конструктивно ПК представляет из себя плату, предназначенную для установки внутри стандартной клавиатуры, с которой поддерживается интерфейс PC/2. Фотографии устройства по ссылке: http://dl.dropbox.co... 128 Photos.zip Схемотехнически компьютер включает в себя центральный процессор-эмулятор (ATMega128-16AU), видеопроцессор (ATMega128-16AU), контроллер клавиатуры (ATTiny2313A-SU), блок памяти (микросхема CY7C1049 с регистром 74AC373MTC), страничного мультиплексора 74AC257 и мультиплексора, входящего в состав формирователя видеосигнгала (также 74AC257). Схему устройства можно найти по ссылке: http://zx.pk.ru/atta...83&d=1333384254 Демонстрационное программное обеспечение: http://dl.dropbox.co...ectrum SOFT.zip Сборочный чертёж: http://dl.dropbox.co...8899/Сборка.zip Пример работы: - игрушка R-TYPEhttp://dl.dropbox.co.../Vibrations.zip - демонстрашка Спасибо.
  7. Всем привет, нарисовал схемку отладочной для атмеги128, перевел-вытравил, запаял- не пашет. Посмотрите, пожалуйста, разводку, может, накосячил где? Перепроверял много раз, скорее всего взгляд "замылился" Плата не ахти, конечно, но буду стараться лучше=) atm128.lay
  8. Atmega128+Vs1011E=Mp3 Player

    Всем добрый вечер! Спустя многие годы сделал подобие плеера для прослушивания музыки, WAV формата. Устройство состоит из микроконтроллера ATMEGA128, флешки micro SD, дисплея от нокиа 6610. Системы фат нету, читаю всё подряд. Флешка висит на SPI интерфейсе, дисплей на портах, звук соответсвенно через шим. Вообщем вопрос дорогие мои таков: хочу читать MP3, даже без системы фат, тоесть подряд. Посадил на порты декодер VS1011e, подключил наушники, в них слышен шум усилителя, после дёрганий CS шум пропадает, значит декодер реагирует. НО! Я не могу разобратся с инициализацией, так как вменяемых примеров не нашёл. Пишу в IARе. SPI эмулирую. Я прошу, кто может, дайте мне лично проверенный пример кода. Хочу дойти хотя бы до теста декодера, когда подают звуковые значения. Заранее спасибо) Без Вас мне не справится.
  9. Доброго времени. Мне необходимо найти средство для прочтения в "правильном" виде дамп памяти EEPROM и записать туда требуемые значения. Подскажите, пожалуйста, как такое можно осуществить. Код: :10000000496E7465726E65742E4265656C696E65C5 :100010002E5275FFFFFFFFFFFFFFFFFFFFFF373788 :100020002E37342E35302E3738003700FFFFFFFFD4 :10003000FFFFFFFFFFFFFFFFFFFFFFFF3230313108 :100040003300FFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :100050004265656C696E6500FFFFFFFFFFFFFFFFF4 :10006000FFFFFFFF4265656C696E6500FFFFFFFFE4 :00000001FF
  10. Atmega 128 Ацп

    Хочу выдавать на порт А мк числа от 0 до ~255 С помощью АЦП. Но почему то когда CH1 доходит до 12%, изменения перестают происходить. .include "m128def.inc" LDI R16,0xFF OUT DDRA,R16 LDI R16,(1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) OUT ADCSRA,R16 LDI R16,(1<<ADLAR) | (0<<REFS0) OUT ADMUX,R16 LOOP: IN R16,ADCH OUT PORTA, R16 RJMP LOOP Заранее спасибо. ADC.rar
  11. Программирование Atmega128

    Возможно, я уже не первый выдвигаю эту тему, но всё же. Есть воспросик по выставлению фьюзов при праграммировании. Я собираю довольно таки непростой девайс - mp3 плеер на ATMege128 и декодере vs1011E.На самом сайте (а вот, кстати, и он: http://service4u.narod.ru/html/mp3.html ) автор пишет фьюзы. Самое интересное, что после них он дописал: "Внимательно читаем даташит ATMega128, pp.286-288, там все в табличках, очень доступно описано."Я всё-таки скачал даташит (первый, который попался в гугле по запросу "ATMege128 datasheet"), перечитал страници 286-288 и вычитал там фьюзы, которые конкретно отличаються от тех, которые выставленые автором (я знаю, что бывают инверсные и неинверсные фьюзы, если что. Это не тот случай). Подскажите, что мне делать, ведь даже в самих программах пишется фраза: сверьтесь с даташитом.Но всё таки, автор же, наверняка пишет то, по чему он делал сам, а устройсто то работает!
  12. Здравствуйте. Хотел сделать чтобы один таймер тактировал другой на Atmega 128, но что-то не получается. В чем может быть проблема? 842x542(179.73 kB) Загрузить фото .include "m128def.inc" ; .def temp =r16 .def index_1 = R8 .def index_2 = R9 .def index_3 = R10 .def index = r7 RJMP VECT_END .org OVF3addr rjmp over_a over_a: ldi ZL,low(MAS1<<1) ldi ZH,high(MAS1<<1) ADD ZL,index_1 adc ZH,Index lpm sts OCR3AL,R0 inc index_1 cp index_1,r14 brne over_b clr index_1 over_b: ldi ZL,low(MAS1<<1) ldi ZH,high(MAS1<<1) ADD ZL,index_2 adc ZH,index lpm sts OCR3BL,R0 inc index_2 cp index_2,r14 brne over_c clr index_2 over_c: ldi ZL,low(MAS1<<1) ldi ZH,high(MAS1<<1) ADD ZL,index_3 adc ZH,Index lpm sts OCR3CL,R0 inc index_3 cp index_3,r14 brne quit_over clr index_3 quit_over: reti VECT_END: LDI r19,HIGH(RamEnd) OUT SPH,r19 LDI r19,LOW(RamEnd) OUT SPL,r19 LDI R16,0b11111111 OUT DDRE,R16 clr index CLR index_1 ldi r16,33 mov index_2,r16 ldi r16,66 mov index_3,r16 LDI R16,100 MOV R14,R16 CLR R11 LDI R18, 0b00000000 STS TIMSK,R18 ldi r25, (1<<TOIE3) STS ETIMSK,R25 LDI R16,(1<<COM3A1) | (1<<COM3B1) | (1<<COM3C1) | (1<<WGM30) STS TCCR3A,R16 LDI R17,(1<<CS31) | (1<<CS32) | (1<<WGM32) STS TCCR3B,R17 LDI R16,0b11111111 OUT DDRB,R16 LDI R16,3 out OCR2,R16 LDI R17,(1<<COM20) | (1<<WGM21) | (1<<CS20) out TCCR2,R17 SEI LOOP: RJMP LOOP MAS1: .db 135,143,151,159,167,174,182,189,196,202,208,214, ... (масив из 100 эл.) PWM CHASTOTA.zip
  13. Подскажите пожалуйста как организовать считывание PPM с приемника от радиоуправления, достаточно 2х каналов, на прерываниях или еще какие нибудь варианты, на Атмега168. PulseIn не предлагать, слишком медленно работает.