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

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

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

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

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


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

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

Блоги

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

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

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

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

Группа


ICQ


Skype


Интересы


Город


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


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

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

  1. Не могу запустить асинхронный режим. Ниже будет представлен код которым пытаюсь отладить. Там в 1 коде идёт работа от внутреннего источника таков (стоит 1МГц). После 5 миганий таймер должен перейти в асинхронный режим и мигать с частотой в 1 Гц. У меня происходит 5 миганий потом ничего. Фьюзы менять пробовал, ничего не дало, сейчас дефолт. Корпус кварца к земле тянуть пробовал - безрезультатно. Возможно что-то в подключении накосячил, если не видно на фото ниже, спрашиваете, нужно будет - нарисую схему. Компилятор Atmel Studio 7 Шью через Sind Prog 2.1.1 + USBasp 2.0 Вот код: .macro outi ldi r16, @1 out @0, r16 .endm .org $000 rjmp reset .org $001 reti .org $002 reti .org $003 reti .org $004 rjmp timer2_ovf .org $005 reti .org $006 reti .org $007 reti .org $008 reti .org $009 reti .org $00A reti .org $00B reti .org $00C reti .org $00D reti .org $00E reti .org $00F reti .org $011 reti .org $012 reti .ORG INT_VECTORS_SIZE reset: .equ portout=portd .equ ddrout=ddrd .def led=r17 .def mask=r18 .def counter=r19 outi spl,low(ramend) outi sph,high(ramend) outi ddrout, 0xff outi tccr2, 0b00000111 outi timsk, 1«toie2 ldi led,1«5 ldi mask,1«5 sei cycle: cpi counter, 10 breq offtim rjmp cycle timer2_ovf: inc counter out portout, led eor led, mask reti offtim: outi timsk, 0«toie2 rjmp asinxron asinxron: outi assr, 0b00001000 back: in r16, assr cpi r16, 0b00001000 brne back outi tccr2, 0b00000101 outi tcnt2, 0 outi ocr2, 0 outi timsk, 1«toie2 m1: rjmp m1 Верх меги на фото слева.
  2. Доброго дня всем! Не так давно решил опробовать использовать в схемах ATmega в корпусе TQFP и возник такой вопрос. На ней имеется аж три ноги на "-" и две под "VCC". Подсоединять нужно все или можно только по одной любой? Заранее благодарен за помощь.
  3. Здравствуйте! Стоит задача использовать atmega8 в качестве повторителя/блокиратора сигнала. Т.е. атмега должна просто повторить сигналы полученные на i2c, выводя их на любые другие две ножи. Можно просто написать программу, которая будет, в бесконечном цикле, снимать сигнал с пина и ставить такой-же на дублирующую ножку, но я не уверен, что такое решение оптимальное. Есть ли возможность как-то настроить атмегу, чтобы две ножки были соединены в одну цепь ? REPEATER должен либо пропускать сигнал от i2c к RECEIVER, либо нет.
  4. Как подружить две ATMega8?

    Всем доброго времени суток! В AVR-ках я новичёк и очень нуждаюсь в вашей помощи. Задача у меня следующая. Есть драйвер управления серводвигателем на ATmega88. Помимо основной задачи ATmega88 через 74HC164D выводит на сдвоенный 7-ми сегментный индикатор направление вращения мотора в виде анимации (вращает сегмент по или против часовой стрелки). Рядом есть некая поделка на ATmega8, одной из задач которой является определение направления вращения мотора и, в зависимости от направления, выполнение различных действий. Как мне это сделать? Как подружить две меги? Всем заранее спасибо.
  5. Цеплял радиомодули RF 433 МГц на Ардуино Уно и ""Ардуино" на Атмеге 8 (и наоборот) согласно видео и инфы с нета. Скечи заливал следующие. Но никак ни заработало. Какие могут быть причины? Ардуины исправные. Спс.
  6. Arduino & EM5807M

    Нарыл код в нете для FM радио на Ардуино на базе EM5807M. Залил это дело в Atmega8, все заработало, сделал простой выбор стаций. А кто знает как управлять програмно громкостью, басами, стерео/моно и др. Используемая часть кода ниже.
  7. Atmega8 + 2 HC-SR04

    Всем привет. Застрял на подключении 2 датчиков HC-SR04 к Atmega8 (CVAVR 3.12). 1 настроен на прерывание 0, работает на таймере 0. (работает нормально) 2 настроен на прерывание 1, работает на таймере 1. (показывает ерунду если рассчитанное расстояние 1 датчика меньше чем расстояние 2 датчика). Фото прилагаю, видна часть кода. Прошу направить на путь истинный.
  8. Компиляция для ATtiny4313 и ATmega8

    Добрый день, уважаемые форумчане. Подскажите по такому вопросу. Есть девайс, управляет автоматикой гелиосистемы (4 датчика DS1820, два насоса, индикация на семисегментном индикаторе). В первой реализации был установлен микроконтроллерATtiny2313, но памяти уже не хватало. чтобы не переделывать плату, было принято решение заменить микроконтроллер на ATtiny4313. Но возникла одна проблема. Так как девайс уже установлен на объекте, все изменения нужно как-то проверить, а уже потом на месте прошивать. Но для проверки прошивки в Proteus модели ATtiny4313 нет, поэтому есть мысль сделать директивы условной компиляции, допустим в начале выбор целевого микроконтроллера и дефайны по используемым регистрам. Чтобы изменением одной строчки можно было компилировать либо под ATmega8 либо под ATtiny4313. Как добавить в Proteus больше памяти на основе ATtiny2313 не знаю. Если можно какой-то простой пример, чтобы на его основе сделать условную компиляцию.
  9. Компаратор atmega8

    Добрые люди. Собрал данную схему. В протеусе все нормально работает. А вот когда прошиваю мк не работает. Принцип такой : если на первом входе компаратора сигнал больше второго то загорается первый если наоборот то второй. Где ошибка? Заранее благодарю
  10. Прошу Вашей помощи уважаемые форумчане! Автором В. Нефёдовым, г. Брянск была предложена интересная схема "Универсального микроконтроллерного зарядного устройства", http://www.radioradar.net/radiofan/power_supply/microcontroller_universal_charger.html#comment, которая была мной повторена. Схема рабочая, но по причине моей неграмотности в программировании - работает у меня не корректно! А именно не могу правильно записать при программировании через eXtreme Burner в EEPROM приведенные им коды: по адресу 00H - 2СН, по адресу 01H - 03H, по адресу 02H - 0BEH, по адресу 03H -64H. Не понимаю что, как и куда писать. Не судите строго! Прошу либо скиньте фотку как это должно выглядеть в программе, либо файл .eep
  11. Могу ли я попросить о помощи

    Я хочу создать терморегулятор, который будет охлаждаться и должен работать с двумя двухскоростными вентиляторами. Целью терморегулятора является регулирование температуры T1 от 80 до 95 градусов, а T2 - от 95 до 110 градусов. Если температура превышает установленное значение T1, реле RL1 включается. Когда температура поднимается выше T1 до заданного значения T2, реле RL1 остается включенным и включается RL2. На дисплее отображается температура реальный Tr и степень, в которой вентиляторы Sp. Я пытался что-то сделать, но я начинаю программировать, и я не могу справиться с написанием этой логики. Если кто-то может помочь, я буду очень благодарен. Это то, что я сделал сейчас. Termo2ch.zip
  12. Приветствую всех. Как на атмега8 подать единицу на конкретную ногу, а не на весь порт? То есть if (PINB&(1<<PB0)) { k=1; PORTC=0b0001001; } как теперь подать 1 на второй пин, не таким образом PORTC=0b0001011, а как-то по другому
  13. Проблема с состовлением прошивки для энкодера (фирмы PEPPERL+FUCHS по данной программе выдает примерно 330-340 импульсов на оборот) линии данных подключил на int0 и int1 atmega8 прошивку пишe в codevision avr Включил прерывания int0 и int1 по любому изменению состояния и повешал на оба прерывания функцию обработки void enkoder(){ if((PIND.2==0)&&(PIND.3==0)){input = 0; }else if((PIND.2==1)&&(PIND.3==0)){input = 1; }else if((PIND.2==1)&&(PIND.3==1)){input = 2; }else if((PIND.2==0)&&(PIND.3==1)){input = 3; }; if(input!=buf){ switch(buf) { case 0:{ if(input == 1) impuls++; if(input == 3) impuls--; break; }case 1:{ if(input == 2) impuls++; if(input == 0) impuls--; break; }case 2:{ if(input == 3) impuls++; if(input == 1) impuls--; break; }case 3:{ if(input == 0) impuls++; if(input == 2) impuls--; break; }; buf = input; }; }; ugol=impuls; }; после того как вращаю энкодер и возвращаю его в обратное положение значение переменной impuls неправельное оно всегда больше 0 и с каждым вращением погрешность все больше подскажите что я делаю нетак.
  14. таймер на Atmega8

    помогите, делаю этот таймер http://sxem.org/2-vse-stati/22-tajmery/38-tajmer-na-atmega8 и он идет очень медленно, одна секунда равняется 3,5 минутам, как это исправить
  15. Всем доброго времени суток. Я реальный нуб в ATMEGA. Могу более-менее понять чужой код и из кусков сделать целое. Вопрос такой: реально ли на ATMEGA8 сделать 2 ШИМ (таймер 1 и2) и внутреннее прерывание (по таймеру 0) для чтения данных с DS18B20 на 8Мгц чтобы еще осталось на опрос кнопок и небольшую логику? Я выложу пример кода. По отдельность: ШИМ, прерывания, логика, запись в ЕПРОМ работает. Собираю все вместе - не работает. Пробовал в Протеусе, тоже глючит, да и протеус тормозит. Может кто чего подскажет. //#define F_CPU 8000000UL // устанавливаем рабочую частоту контроллера #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <avr/eeprom.h> #include "ds18x20.h" #include "onewire.h" #define MAXSENSORS 1 unsigned int tempint = 0; // переменная для целого значения температуры unsigned int subzero = 0; // переменная отрицательных значений температуры unsigned int clock = 0; //задержка для опроса датчика температуры unsigned int termo_error = 0; //флаг ошибки термодатчика unsigned char regim, R1_SHIBER, R1_VENT, R2_SHIBER, R2_VENT, R3_SHIBER, R3_VENT; //переменные режимов работы volatile char press = 0, pr = 0, pr1 = 0, set = 0; //дополнительные переменные для кнопок #define SHIBER_PB 1 //шибер подачи топлива #define SHIBER_PWM OCR1A #define VENT_PB 2 //вентилятор подачи воздуха #define VENT_PWM OCR1B #define LED1_ON PORTD |= _BV(PD3) // светодиод режим 1 #define LED1_OFF PORTD &= ~_BV(PD3) #define LED2_ON PORTD |= _BV(PD4) // светодиод режим 2 #define LED2_OFF PORTD &= ~_BV(PD4) #define LED3_ON PORTD |= _BV(PD6) // светодиод режим 3 #define LED3_OFF PORTD &= ~_BV(PD6) #define LED4_ON PORTD |= _BV(PD7) // светодиод 4 программирование #define LED4_OFF PORTD &= ~_BV(PD7) #define BUT_M PIND & (1 << PD1) // кнопка MENU #define BUT_U PIND & (1 << PD2) // кнопка UP #define BUT_D PIND & (1 << PD0) // кнопка DOWN unsigned char eep1 EEMEM; // режим работы unsigned char eep2 EEMEM; // режим 1 ШИМ вентилятор unsigned char eep3 EEMEM; //режим 1 ШИМ шибер unsigned char eep4 EEMEM; // режим 2 ШИМ вентилятор unsigned char eep5 EEMEM; // режим 2 ШИМ шибер unsigned char eep6 EEMEM; // режим 3 ШИМ вентилятор unsigned char eep7 EEMEM; // режим 3 ШИМ шибер unsigned char eep8 EEMEM; // флаг первого запуска uint8_t Temperature, szero; //-255 uint8_t nSensors, j; uint8_t cel_frac_bits; uint8_t gSensorIDs[MAXSENSORS][OW_ROMCODE_SIZE]; uint8_t search_sensors(void) // поиск DS18B20 { uint8_t i; uint8_t id[OW_ROMCODE_SIZE]; uint8_t diff, nSensors; nSensors = 0; for( diff = OW_SEARCH_FIRST; diff != OW_LAST_DEVICE && nSensors < MAXSENSORS ; ) { DS18X20_find_sensor( &diff, &id[0] ); if( diff == OW_PRESENCE_ERR ) { Temperature = 255; szero = 1; break; } if( diff == OW_DATA_ERR ) { Temperature = 255; szero = 1; break; } for (i=0; i<OW_ROMCODE_SIZE; i++) gSensorIDs[nSensors][i]=id[i]; nSensors++; } return nSensors; } void get_temp(int sensor){ // получаем температуру с датчиков DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL); DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL); j = gSensorIDs[0][sensor]; // family-code for conversion-routine if (DS18X20_read_meas_single(j, &szero, &Temperature, &cel_frac_bits) != DS18X20_OK) { //если не прочиталось то -255 Temperature = 255; szero = 1; } if (DS18X20_read_meas_single(j, &szero, &Temperature, &cel_frac_bits) != DS18X20_OK) { //если не прочиталось то -255 Temperature = 255; szero = 1; } tempint=(int)Temperature; subzero=(int)szero; } void pin_init(void) { //инициализация портов ШИМ DDRB |= (1<<SHIBER_PB) | (1<<VENT_PB); PORTB &= ~((1<<SHIBER_PB) | (1<<VENT_PB)); } void timer0_init(void) { //инициализация таймера для термодатчика TCCR0 |= (1<<CS00); TIMSK |= ( 1 << TOIE0); TCNT0 = 0xFF; } void timer1_init(void) { //инициализация таймера ШИМ шибера TCCR1A |= (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11); TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS10); TCNT1 = 0x00; ICR1 = 0xFF; OCR1A = 0x00; OCR1B = 0x00; } void timer2_init(void) { //инициализация таймера ШИМ вентилятора TCCR2 |= (1 << COM21) | (1 << WGM21) | (1 << WGM20) | (1 << CS20); TCNT2 = 0x00; OCR2 = 0x00; } ISR(TIMER0_OVF_vect){ //прерывание таймера 0 для термодатчика if (clock != 4294967295){_delay_us(50);clock++;}else{get_temp(0);clock=0;} } //***************** обработка нажатия кнопок ********************** void buttons(){ if(~BUT_U){if(set == 0)pr++; // кнопка UP if(pr == 10){ // долгое нажатие } _delay_ms(100); }else{ if(pr >= 1 && pr < 10){ // короткое нажатие regim++; if (regim>3){regim=0;} eeprom_write_byte(&eep1, regim); // сохранение настройки в eeprom set = 0; pr = 0; } pr = 0; } if(~BUT_D){if(set == 0)pr1++; // кнопка DOWN if(pr1 == 10){ // длинное нажатие } _delay_ms(100); }else{ if(pr1 >= 1 && pr1 < 10){ // короткое нажатие. //set = 20; regim--; if (regim<0){regim=3;} eeprom_write_byte(&eep1, regim); // сохранение настройки в eeprom _delay_ms(100); set = 0; pr1 = 0; } pr1 = 0; } if(~BUT_M){ // кнопка MENU press++; if(press == 1 && set != 0){set++;} // переход по настройкам if(press >= 100 && set == 0){set = 1; _delay_ms(200);} // ход в настройки if(set == 1) eeprom_write_byte(&eep2, R1_VENT); if(set == 2) eeprom_write_byte(&eep3, R1_SHIBER); if(set == 3) eeprom_write_byte(&eep4, R2_VENT); if(set == 4) eeprom_write_byte(&eep5, R2_SHIBER); if(set == 5) eeprom_write_byte(&eep6, R3_VENT); if(set == 6) eeprom_write_byte(&eep7, R3_SHIBER); if(set > 6){ _delay_ms(100); set = 0; press = 0;} // если включена настройка даты, }else{ if(set == 0 && press >= 1){ // если не вошли в настройки regim++; if (regim>3){regim=0;} eeprom_write_byte(&eep1, regim); // сохранение настройки в eeprom } press = 0; } } //*****************режим настроек******************** void settings(){ //визуальное подтверждение настроек if(press >= 1 && set == 1) { LED1_ON; LED2_OFF; LED3_OFF; LED4_ON; SHIBER_PWM = R1_VENT;} //ШИМ шибер 0-255 if(press >= 1 && set == 2) { LED1_ON; LED2_OFF; LED3_OFF; LED4_ON; VENT_PWM = R1_SHIBER;} //ШИМ вентилятор 0-255 if(press >= 1 && set == 3) { LED1_OFF; LED2_ON; LED3_OFF; LED4_ON; SHIBER_PWM = R2_VENT;} //ШИМ шибер 0-255 if(press >= 1 && set == 4) { LED1_OFF; LED2_ON; LED3_OFF; LED4_ON; VENT_PWM = R2_SHIBER;} //ШИМ вентилятор 0-255 if(press >= 1 && set == 5) { LED1_OFF; LED2_OFF; LED3_ON; LED4_ON; SHIBER_PWM = R3_VENT;} //ШИМ шибер 0-255 if(press >= 1 && set == 6) { LED1_OFF; LED2_OFF; LED3_ON; LED4_ON; VENT_PWM = R3_SHIBER;} //ШИМ вентилятор 0-255 switch(set) // включена настройка { case 1: // настройка R1_VENT if(~BUT_U){R1_VENT++; if(R1_VENT > 254) R1_VENT = 0; _delay_ms(100);} if(~BUT_D){R1_VENT--; if((~BUT_D) && R1_VENT == 0) R1_VENT = 254; _delay_ms(100);} break; case 2: // настройка R1_SHIBER if(~BUT_U){R1_SHIBER++; if(R1_SHIBER > 254) R1_SHIBER = 0; _delay_ms(100);} if(~BUT_D){R1_SHIBER--; if((~BUT_D) && R1_SHIBER == 0) R1_SHIBER = 254; _delay_ms(100);} break; case 3: // настройка R2_VENT if(~BUT_U){R2_VENT++; if(R2_VENT > 254) R2_VENT = 0; _delay_ms(100);} if(~BUT_D){R2_VENT--; if((~BUT_D) && R2_VENT == 0) R2_VENT = 254; _delay_ms(100);} break; case 4: // настройка R2_SHIBER if(~BUT_U){R2_SHIBER++; if(R2_SHIBER > 254) R2_SHIBER = 0; _delay_ms(100);} if(~BUT_D){R2_SHIBER--; if((~BUT_D) && R2_SHIBER == 0) R2_SHIBER = 254; _delay_ms(100);} break; case 5: // настройка R3_VENT if(~BUT_U){R3_VENT++; if(R3_VENT > 254) R3_VENT = 0; _delay_ms(100);} if(~BUT_D){R3_VENT--; if((~BUT_D) && R3_VENT == 0) R3_VENT = 254; _delay_ms(100);} break; case 6: // настройка R3_SHIBER if(~BUT_U){R3_SHIBER++; if(R3_SHIBER > 254) R3_SHIBER = 0; _delay_ms(100);} if(~BUT_D){R3_SHIBER--; if((~BUT_D) && R3_SHIBER == 0) R3_SHIBER = 254; _delay_ms(100);} break; } } int main(){ /*******************************настройка переферии******************************/ cli(); ow_set_bus(&PIND, &PORTD, &DDRD, PD5); // иництализация протокола 1-wire nSensors = search_sensors(); // поиск датчиков DS18B20 DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL); //включаем преобразование температуры pin_init(); //timer0_init(); timer1_init(); timer2_init(); _delay_ms(5); if(eeprom_read_byte(&eep8) != 1){ // читаем eeprom, если там мусор (первый запуск), пишем свои данные eeprom_write_byte(&eep1, 0); // режим работы eeprom_write_byte(&eep2, 150); // режим 1 ШИМ вентилятор eeprom_write_byte(&eep3, 100); //режим 1 ШИМ шибер eeprom_write_byte(&eep4, 200); //режим 2 ШИМ вентилятор eeprom_write_byte(&eep5, 150); //режим 2 ШИМ шибер eeprom_write_byte(&eep6, 230); //режим 3 ШИМ вентилятор eeprom_write_byte(&eep7, 200); //режим 3 ШИМ шибер eeprom_write_byte(&eep8, 1); // флаг первого запуска } //читаем настройки из памяти regim = eeprom_read_byte(&eep1); // читаем режим работы из eeprom R1_VENT = eeprom_read_byte(&eep2); // читаем режим 1 ШИМ вентилятор из eeprom R1_SHIBER = eeprom_read_byte(&eep3); //читаем режим 1 ШИМ шибер R2_VENT = eeprom_read_byte(&eep4); //читаем режим 2 ШИМ вентилятор R1_SHIBER = eeprom_read_byte(&eep5); //читаем режим 2 ШИМ шибер R3_VENT = eeprom_read_byte(&eep6); //читаем режим 3 ШИМ вентилятор R1_SHIBER = eeprom_read_byte(&eep7); //читаем режим 3 ШИМ шибер sei(); _delay_ms(5); /**********************************инициализация ШИМ*************************************/ while(1){ //if (tempint=255) {LED1_ON;LED2_OFF;LED3_ON;termo_error=1;} else {termo_error=0;}//выводим код ошибки датчика темппературы buttons();//обработик нажатия кнопок if (termo_error == 0){//блокировка по термодатчику if(set == 0) { //нормальный режим работы if (regim == 0){ //режим работы 0 LED1_OFF; LED2_OFF; LED3_OFF; LED4_OFF; SHIBER_PWM = 0; //ШИМ шибер 0-255 VENT_PWM = 0; //ШИМ вентилятор 0-255 } if (regim == 1){ //режим работы 1 LED1_ON; LED2_OFF; LED3_OFF; LED4_OFF; VENT_PWM = R1_VENT; //ШИМ вентилятор 0-255 if (tempint >=40) { //блокировка по температуре SHIBER_PWM = 0; //ШИМ шибер 0-255 }else{ SHIBER_PWM = R1_SHIBER; //ШИМ шибер 0-255 } } if (regim == 2){ //режим работы 2 LED1_OFF; LED2_ON; LED3_OFF; LED4_OFF; VENT_PWM = R2_VENT; //ШИМ вентилятор 0-255 if (tempint >=60) { //блокировка по температуре SHIBER_PWM = 0; //ШИМ шибер 0-255 }else{ SHIBER_PWM = R2_SHIBER; //ШИМ шибер 0-255 } } if (regim == 3){ //режим работы 3 LED1_OFF; LED2_OFF; LED3_ON; LED4_OFF; VENT_PWM = R3_VENT; //ШИМ вентилятор 0-255 if (tempint >=80) { //блокировка по температуре SHIBER_PWM = 0; //ШИМ шибер 0-255 }else{ SHIBER_PWM = R3_SHIBER; //ШИМ шибер 0-255 } } } }else{ SHIBER_PWM=0; VENT_PWM=0; } if(set != 0) settings();//вход в настройки } //return 0; }
  16. Всех приветствую! Вообщем ситуация такая - (сейчас будет предыстория) стал понемногу интересоваться МК и набрел на статью о подключении экрана нокии 3310 к атмеге8. Вот она http://cxem.net/mc/mc201.php Сказать что заинтриговало - ничего не сказать... к тому же автор в комментариях написал, что можно поочередно выводить изображения, и таким образом создать анимацию. Так вот, к чему я, была у меня монохромная моторолла и на ней был прикольный "скринсейвер" с рыбками, теперь который я хочу воссоздать. Надписей "Hello, world!" я не планирую, а только чистый вывод изображений. Теперь сама суть моего обращения на форум. 1) Так как в Bascom я начинающий, решил идти по пути наименьшего сопротивления, то есть немного подправив код в проэкте, предоставленный автором статьи. Подправить то я его подправил, но вот правильно ли... Вообщем мне бы хотелось чтобы знающие люди проверили бы мой код. Хотя Bascom компилирует код без проблем. Вот исходный код: Вот мой код: (на одинаковость стека изображений не обращайте внимания, мои в процессе воссоздания, а мне нужна проверка самого принципа вывода изображений, который я написал) Таким образом я хочу выводить изображения поочередно с интервалом в 1 секунду. 2)Еще более интересующий меня вопрос - если открыть даташит на атмега8, то там написано, что флеш памяти для программ 8 кб. Но вот что интересно и вводит меня в ступор. Если просто взять проэкт автора статьи и скомпилировать его в .hex, то получаем: Bascom пишет при компиляции "Flash used - 55%", то есть как бы половина атмеги пустая, но вот выходной файл .hex имеет размер 13кб. Вот я и не могу понять как даже авторский проэкт в 13кб прошивается в атмегу с 8кб? Магия наверное. Скомпилировав "свой" проэкт, я получаю "Flash used - 66%" и файл на 15кб. Вот и возник такой вопрос - это нормально и так и должно быть? А если нет - то как правильно скомпилировать? Так как пока проверить код в железе нет возможности (еще едет), вот к Вам, знающим людям, за помощью и обращаюсь. Ниже прикрепляю видеофайл с компиляцией проэкта автора статьи в Bascom. clip0002.avi
  17. 1602 и 12864

    Вопрос знатокам: можно ли без особых танцев с бубнами для выведения строчного текста вместо дисплея 1602 подключить 12864? В идеале используя то же количество проводов между контроллером и дисплеем. Контроллер Atmega8. И если можно, то как?
  18. Сделал девайс для своей машины, думаю, многим понравится. Прибор устанавливается на любом автомобиле с напряжением бортовой сети 12В. Основные функции: 1.остаток топлива в баке в литрах. 2.напряжение бортовой сети. 3.рабочую температуру двигателя. 4.температуру воздуха снаружи машины. 5.изменение яркости дисплея в зависимости от включенного габаритного освещения (день/ночь). Дополнительно, компьютер обладает следующими сервисными возможностями: 1.калибровка штатного датчика уровня топлива. 2.установка уровня подсветки дисплея для режимов день/ночь. 3.изменение поправочного коэффициента инерционности показаний уровня топлива. Все калибровки прибора производятся программно. Для измерения температуры необходима установка собственных датчиков dallas ds18b20. В основе устройства лежит микроконтроллер AVR ATMega8 производства фирмы ATMEL. Для измерения напряжения бортовой сети предусмотрен отдельный контакт, который можно подключить непосредственно к аккумулятору или замку зажигания. В качестве индикатора был выбран алфавитно-цифровой ЖК индикатор фирмы МЭЛТ МТ-16S2H, который с успехом можно заменить на любой другой, совместимый с HD44780. Статья на сайте: Бортовой миникомпьютер В архиве схема, фьюзы для прошивания, файлы lcd.hex и lcd.epp, описание работы с менюшками. avr_lcd.rar
  19. Собираю устройство, которое на основании измеренного напряжения на резисторе своим АЦП на одном из своих портов выдает импульсы широтой, зависящей от измеренного напряжения. Широтой этого импульса задается ток, который, протекая через вышеупомянуты резистор, формирует вновь измеряемое напряжение. Пока результат такой. Зеленым цветом - сигнал на выходе контроллера, красным - напряжение на резисторе в цепи истока полевого транзистора, оно пропорционально току, протекающему через этот транзистор.Результат такой: Вопрос знатокам: почему это измеренное напряжение всегда застывает на одной и той же величине (0,8В)? Код: #include <mega8.h> #include <delay.h> #include <stdio.h> long result; long n=1; // Voltage Reference: AVCC pin #define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (1<<ADLAR)) unsigned char read_adc(unsigned char adc_input) { ADMUX=adc_input | ADC_VREF_TYPE; // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=(1<<ADSC); // Wait for the AD conversion to complete while ((ADCSRA & (1<<ADIF))==0); ADCSRA|=(1<<ADIF); return ADCH; } void main(void) { // Input/Output Ports initialization // Port B initialization // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Port C initialization // Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0); // State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0); // Port D initialization // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0); // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); // ADC initialization // ADC Clock frequency: 125,000 kHz // ADC Voltage Reference: AVCC pin // Only the 8 most significant bits of // the AD conversion result are used ADMUX=ADC_VREF_TYPE; ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0); SFIOR=(0<<ACME); PORTB=0x00; DDRB=0x01; #asm("sei") while (1) { result=((read_adc(0)*5)/256.00); // Тут мы измерили напряжение на резисторе if (result>2) // и сравниваем, например, с 2В. В случае отклонения // измеренной величины от 2В меняем длительнось импульса n. { n=n-1; PORTB.0=1; delay_ms(n); PORTB.0=0; delay_ms(20); } if (result<2) { n=n+1; PORTB.0=1; delay_ms(n); PORTB.0=0; delay_ms(20); } }; }
  20. Пишу программу для датчика освещенности, который должен по нажатию кнопки измерять напряжение на одном из портов своего АЦП и записывать измеренное значение (в вольтах) на SD-карту. При повторном нжатии на кнопку результат измерения должен записываться на карту в тот же файл, но на новую строку. Сопротивление фоторезистора в зависимости от освещенности изменяется пимерно от 0,5 до 25 кОм, поэтому в качестве второго резистора делителя напряжения, результат деления которого и замеряем, выбран 27 кОм, чтобы не перегружать вход АЦП. Собственно, а куда по схеме эту кнопку лучше ставить? На питание или на какой-нибудь порт? В коде отталкиваюсь от такого: #include <mega8.h> #include <stdio.h> #include <stdlib.h> #define ADC_VREF_TYPE 0x00 unsigned int result; unsigned int read_adc(unsigned char adc_input); // volatile unsigned int count; //счетчик скопированных данных { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } #asm("sei") ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x81; while (1) { result=read_adc(0); result=(result*500L)/1024; // Тут мы измерили напряжение на резисторе if(disk_initialize()==0) //инициализируем флешку { FILE *file; //Открываем текстовый файл с правами на запись file = fopen("light.txt", "w+t"); //Пишем в файл fprintf(file, result); //Закрываем файл fclose(file); getch(); pf_mount(0x00); //демонтируем фат } }
  21. ATmega8 умер генератор?

    Добрый день! Возникла такая проблема: собираю устройство на этом МК. Используется кварцевый резонатор на 16МГц. Но несколько запас по быстродействию стремится к нулю, по этому решил поставить кварц на 20МГц. Уст-во запустилось, но через ~1 мин резко выключилось. Последующие вкл/выкл результата не дали. Поставил назад 16МГц кварц, включаю и оп, не работает... Конденсаторы обвязки кварца заменил, на сопли проверил, активный флюс не использую. Кварц менял и на более низкие частоты... Возможно ли что умер генератор в мк? Просто перепаивать МК сложно - корпус TQFP32.
  22. Всем Привет. Прошу не кидаться тапками за название темы, понимаю, что уже много опубликовано материалов по этому вопросу, однако все кроется в нюансах. Итак, к проблеме. Выполняю курсовую работу. Опыта в программировании минимум. Имеется схема с МК ATmega8 и дисплеем LM044 на контроллере HD44780. При попытке вывести инфу на дисплей столкнулся с этими двумя рядами прямоугольников (к слову, дисплей 20х4). Поначалу думал, что оторвались провода, которые соединяют дисплей с МК. Нет, все прозваниваются. Кстати, схема вся была спаяна преподавателем и раньше дисплей уже выводил инфу, но когда начал я ее прошил своей прогой, появилось, то что на фотке. Потом пошли мысли, что неправильно настроил выводы в CodeVision AVR, в котором работаю. Исходя из даташита МК и того, куда припаяны провода в схеме, настроил порты таким образом: Думал, что теперь будет все норм, прошил снова - ничего. Начал уже бесится, изучил десятки страниц (уже не первый день работаю над схемой, думал все-таки смогу сделать сам, ан нет) Решил начать с простого. Нашел в инете самый простой код по выводу инфы Сделал стандартный проект в CodeVision AVR, вставил туда этот код, настроил настроил выводы на свои. Прошил в Протеусе МК и вуаля - в Протеусе инфа выводится! На радостях решил, что теперь-то все получится - опять нет! Прошивал МК через AVRDUDE PROG 3.0 через USBasp Ребят, у меня к вам такие вопросы: 1. Что может быть не так с дисплеем? 2. Нужно ли как-то настраивать порты МК? Потому что я нигде не видел, чтобы хоть где-то пытались настроить порты МК при выводе инфы на экран. Даже в том коде, что я выложил. Прошу вас, высказывайте любые идеи и мысли, ибо я реально хочу понять программирование и выяснить в чем же проблема. Спасибо!
  23. В поисках схемы управления малогабаритным двигателем типа ДПМ, пришел к выводу о необходимости создания своей модификации. Принцип такого устройства везде один - при превышении потребляемого тока под нагрузкой на двигатель подается полное напряжение, при снятии нагрузки - напряжение уменьшается до минимально необходимого. Найденные в инете схемы были аналоговые и не позволяли достаточно дискретно установить необходимый ток срабатывания. Ниже предлагается простая схема и программа для микроконтроллера ATMega8, позволяющая подключить любой двигатель и настроить его, исходя непосредственно из его электрических параметров. А также настроить чувствительность к степени нажатия сверлом на плату. При включении двигатель (Д) находится в режиме холостого хода - iR<i1. Микроконтроллер (МК) отслеживает превышение рабочего тока iR над заданным i1, что будет означать подачу нагрузки на вал Д. При превышении iR>i1 МК переходит в режим отслеживания тока iR<i2, который задает порог возвращения в режим холостого хода, а также подает почти полное напряжение питания на Д. Также активируется режим отслеживания заклинивания вала Д - iR>i3. В этом случае подача напряжения на Д прекращается. Сброс осуществляется аппаратным сбросом МК. Настройка i1,i2,i3 осуществляется энкодером поочередно. Выбранные значения запоминаются в ппзу. Индикация производится с помощью трехразрядного семисегментного индикатора. Принципиальная схема устройства. За основу был взят классический блок питания. В цепь задающего стабилитрона включен транзистор VT1. В режиме холостого хода он открыт, благодаря чему напряжение на Д определяется напряжением стабилизации стабилитрона VD3. При увеличении нагрузки выход МК OUT1 переводится в логический ноль. Транзистор VT1 закрывается, на Д подается почти полное напряжение питания. При заклинивании вала на выходе OUT2 появляется логическая единица, транзистор VT2 открывается и замыкает базу VT3 на корпус. Регулирующий транзистор VT4 закрывается. Программирование необходимых значений i1, i2, i3 осуществляется поочередно в режиме настройки, для перехода в который надо нажать кнопку КN2. Подсказкой для индикации выбранного тока служит количество светящихся точек. Запоминание в ппзу происходит при выходе из режима настройки. Индикация текущего тока и программируемых значений происходит с помощью светодиодного индикатора. При заклинивании вала индикатор показывает три тире. Для сброса надо нажать кнопку КN1. Съем значения потребляемого тока происходит с резистора 1 Ом, включенного последовательно с Д. В этом и заключается особенность схемы. Приведенный узел управления Д не является обязательным и может быть заменен любым другим. Обязательно лишь наличие токоизмерительного резистора 1 Ом, включенного в минусовую цепь питания Д. Питание МК производится через стабилизатор 7805 и ограничивающие резисторы. Сам стабилизатор 7805 и выходной транзистор КТ805 необходимо установить на небольшие радиаторы. Программа написана на ассемблере. Обработка дребезга контактов кнопок и энкодера программная, не требующая дополнительных конденсаторов в схеме. Поскольку задача достичь абсолютной точности устанавливаемых значений токов не ставилась, то для упрощения программы математическая обработка была также упрощена и дробная часть не учитывалась. Вследствие чего из-за двойной обработки записываемое в ппзу значение иногда будет меньше индицируемого на единицу. По большому счету, это не доставляет никаких проблем, просто надо иметь в виду этот момент. На случай сбоя в ппзу при включении МК проверяет контрольный байт. Если он совпадает, то считываются записанные ранее значения. Если нет - записываются исходные значения (что происходит при первом включении) - 200мА, 100мА, 800мА. Энкодер на плату не устанавливается и подключается отдельно. Ограничительный резистор перед стабилизатором 7805 составлен из четырех резисторов МЛТ-0.5 75 Ом. В программе используются значения токоизмерительного резистора 1 Ом и напряжение на AREF 2 В. Если они будут отличны - фактическое значение устанавливаемого тока будет также другим. Но опять-таки, по большому счету в данной схеме бОльшую важность имеют не абсолютные значения тока, а относительные. Всё равно придется подбирать токи при настройке под конкретный двигатель. Максимальный измеряемый ток через Ri равен 2 А. Это значение может быть установлено для каждого из i1, i2, i3. Таким образом, возможности регулирования достаточно широкие под практически любой малогабаритный двигатель. В процессе испытаний резисторы на сегменты индикатора (8 шт) были увеличены с 510 Ом до 1к. Яркость осталась достаточная, ток потребления МК и индикатора уменьшился с 70 до 50 мА. Транзисторы VT1...VT3 были использованы из имеющихся в наличии, можно заменить на любые с напряжением коллектор-эмиттер не менее 50 В. Кварцевый резонатор - 16.000 МГц. Индикатор - E30561-L-O-0-W с общим катодом. Фьюзы для МК - запрограммированы SPIEN и CKOPT. К примеру, для моего ДПМ-30-Н1-04 i1=120mA, i2=95mA, i3=700mA. Возможный вариант печатной платы в формате lay6 и прошивка в архиве. dpm.RAR
  24. Доброго здоровья всем форумчанам. В общем сделал я часы как в этой теме http://cxem.net/mc/mc316.php, всё хорошо, они работают, но захотелось внести в программу некоторые изменения. Когда пытаюсь компилировать в Аtmel Studio то сразу вылетает 88 ероров (скрин экрана прилагается). А когда пытаюсь то же скомпилировать в CVAVR то вылазит всего два ерора: Error: C: declaration 'unsigned char' is incompatible with the previous one: 'int' from file: 'D:\...\math.h', line: 22 Error: D:\...\(67): missing ';' Проверял, тчк. с запятой стоят правильно. Библиотеки есть все и подключены.
  25. Собрал устройство включаю и работает не правильно потом выключаю и включаю по новой через несколько секунд и уже работает нормально в чем может быть причина?