Главная › Форумы › Программирование микроконтроллеров › Программирование МК AVR
Помечено: AVR
- В этой теме 55 ответов, 42 участника, последнее обновление 3 месяца, 4 недели назад сделано Alexmaks.
-
АвторСообщения
-
Август 13, 2017 в 4:19 дп #10143Narod StreamХранитель
Здесь можно обсудить проблемы, связанные с программированием микроконтроллеров AVR.
Сентябрь 25, 2017 в 9:22 дп #11040DimanLMУчастникВсем привет. Повторил урок №20 там где вывод температуры на LCD 1602 температура отображается все отлично. После этого решил собрать градусник, но для индикации взял 7-ми сегментный индикатор, из урока №20 взял файлы: DS18B20.c, DS18B20.h, main.h имена могут отличаться от оригиналов, но содержимое тоже. Индикаторы запустил по уроку №11 — динамическая индикация. Микроконтроллер взял ATTiny2313A.
Так вот это месево уже три месяца не могу запустить. Помогите пожалуйста.Вот ссылка на архив с проектом в папке файл для протеуса (.DSN)
https://cloud.mail.ru/public/9dT8/aVYhRyidzОктябрь 3, 2017 в 1:16 пп #11250DmitriyУчастникДобрый день!
Подскажите, правильно ли я использую команды по ассемблерным вставкам в коде, написанном в Atmel Studio 7:
__asm__(«cli»);
__asm__(«sei»);
__asm__(«nop»);
В CodeVisionAVR 4, в котором я начал изучать Си и программирование микроконтроллеров, синтаксис несколько другой.
Судя по отсутствию ошибок в Atmel Studio 7 при компиляции кода, вроде всё работает. Но хотелось бы уверенности. Также обратил внимание, что в одном из хед-файлов есть макроподстановки в виде sei(); и cli(); Но для команды nop макроподстановки в виде nop(); нет.Ноябрь 8, 2017 в 10:31 дп #12497PavelУчастникДоброго времени суток! Хотелось бы увидеть урок по теме DHT11 и DHT22 (что наиболее актуально). Спасибо!
Ноябрь 9, 2017 в 4:44 дп #12504Narod StreamХранительDimanLM.
К сожалению, я не располагаю временем тестить проекты, своих чересчур много. Возможно, кто занимается плотно с такими МК, посмотрят.Ноябрь 9, 2017 в 4:47 дп #12505Narod StreamХранительPavel,
Я давно хотел освоить подобные датчики. Посмотрел документацию на первый — точность слабовата, а вот второй меня заинтересовал.Ноябрь 30, 2017 в 1:52 пп #13478daswindowsУчастникPavel и Narod Stream, заказал себе датчики DHT22, как придут, оттестирую и отпишусь.
По поводу датчиков DHT11, у них большая очень погрешность. На макетной плате собрал 4 датчика. все 4 показывали разную температуру. погрешность +-2 градуса по цельсиюДекабрь 7, 2017 в 10:53 дп #13567gogazeУчастникПодскажите: можно ли в Atmel Studio сделать переменную из _delay_ms (50); 50=переменная типа так
unsigned int e;
e=50
Я пробовал — компилятор выдает __builtin_avr_delay_cycles expects a compile time integer constant и ссылается на delay.h строку __builtin_avr_delay_cycles(__ticks_dc);
Декабрь 11, 2017 в 8:31 пп #13596daswindowsУчастник[URL=http://vfl.ru/fotos/ebfdeeb119773657.html][IMG]http://images.vfl.ru/ii/1513024229/ebfdeeb1/19773657_m.jpg[/IMG][/URL]
Фото с датчиков 6 шт подключены паралельно
Декабрь 12, 2017 в 6:08 пп #13628PavelУчастникБратцы!Проблема! ATTiny13 не выходит из спящего режима по прерыванию о переполнении таймера. Help me! Контроллеры из Китая.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143#define F_CPU 16000UL#define fwd PORTB |=(1<<PB2); PORTB &=~(1<<PB0); // fwd - вперед#define bwd PORTB |=(1<<PB0); PORTB &=~(1<<PB2); // bwd - назад#define stp PORTB &=~(1<<PB0); PORTB &=~(1<<PB2); // stp - стоп#define pause1 4 // 6ч - 1350#define pause2 3 // 3ч - 675#define pause3 2 // 90мин - 330#define pause4 1 // 45 мин - 165#include <avr/io.h>#include <avr/interrupt.h>#include <util/delay.h>#include <avr/sleep.h>// - Varriable -//unsigned int timer=0; // счетчик таймера (увеличивается в прерывании каждые 16 сек)void movie (){fwd // включаем двигатель вперед_delay_ms(600); // пауза 0,5 секундыstp_delay_ms(100);bwd_delay_ms(300);stptimer = 0;}unsigned int pause () // время между пшиками (pause*16.25)секунд{ADMUX = (0<<REFS0)| // Bit 6 – Источник опорного напряжения (0 - VCC, как источник опорного напряжения, 1 - Встроенный источник опорного напряжения)(1<<ADLAR)|(1<<MUX1)| // Bit 1 – Analog Channel and Gain Selection Bits (Выбор канала ADC (см. datasheet)) в данном случае выбираем ADC2(0<<MUX0); // Bit 0 – Analog Channel and Gain Selection Bits (Выбор канала ADC (см. datasheet))ADCSRA |= (1 << ADSC); // Начинаем преобразованиеwhile ((ADCSRA & (1 << ADIF)) == 0); // Ждем флага окончания преобразованияADCSRA|=(1<<ADIF);if (ADCH <= 53) // в зависимости от АЦП изменяем величину переменной pause{return (pause4);}if ((ADCH <= 89) && (ADCH >= 54)){return (pause3);}if ((ADCH <= 125) && (ADCH >= 90)){return (pause2);}return (pause1);}bool light (){ADMUX = (0<<REFS0)| // Bit 6 – Источник опорного напряжения (0 - VCC, как источник опорного напряжения, 1 - Встроенный источник опорного напряжения)(1<<ADLAR)|(1<<MUX1)| // Bit 1 – Analog Channel and Gain Selection Bits (Выбор канала ADC (см. datasheet)) в данном случае выбираем ADC2(1<<MUX0); // Bit 0 – Analog Channel and Gain Selection Bits (Выбор канала ADC (см. datasheet))ADCSRA |= (1 << ADSC); // Начинаем преобразованиеwhile ((ADCSRA&(1 << ADIF))== 0); // Ждем флага окончания преобразованияADCSRA|=(1<<ADIF);if ((ADCH <= 176)) // в зависимости от АЦП изменяем light{return false;}else{return true;}}ISR (TIM0_OVF_vect){timer++; //Увеличение timer на 1 каждые 16 секундif (timer >= pause()) // если timer больше полученного значения pause{if (light()) // и "светло"{movie(); // пшикаемtimer = 0; // обнуляем timer}else // а если timer больше полученного значения pause и "темно"{timer = 0; // обнуляем таймер}}}ISR (INT0_vect){movie();timer = 0;}int main(void){DDRB = 0b00101; //0 - Назад (выход), 1 - Кнопка (вход), 2 - вперед (выход), 3 - датчик света (вход), 4 - датчик режима(вход)PORTB = 0b00010;TCCR0A |=(0<<COM0A0) //Инициализация таймера|(0<<COM0A1)|(0<<COM0B0)|(0<<COM0B1)|(0<<WGM01)|(0<<WGM00);TCCR0B |=(0<<FOC0A)|(0<<FOC0B)|(0<<WGM02)|(1<<CS02)|(0<<CS01)|(1<<CS00);TCNT0 =0;ADMUX = (0<<REFS0)| // Bit 6 – Источник опорного напряжения (0 - VCC, как источник опорного напряжения, 1 - Встроенный источник опорного напряжения)(1<<ADLAR); // Bit 5 – ADC Left Adjust Result (1 - левое выравнивание результата; 0 - правое выравнивание результата измерения)ADCSRA = (1<<ADEN)| // Bit 7 – ADC включатель (1- включен, 0 - выключен)(0<<ADATE)| // Bit 5 – ADC постоянное преобразование (1 - включено, 0 - выключено)(1<<ADPS2)| // Bit 2 – ADC Prescaler Select Bits Выбор частоты преобразования (см. datasheet)(1<<ADPS1)| // Bit 1 – ADC Prescaler Select Bits Выбор частоты преобразования (см. datasheet)(1<<ADPS0); // Bit 0 – ADC Prescaler Select Bits Выбор частоты преобразования (см. datasheet)TIMSK0 |=(1<<TOIE0); // Разрешение прерывания по переполнению таймера 0GIMSK |=(1<<INT0); // включение внешних прерыванийsei(); // Общее разрешение прерыванийwhile (1){set_sleep_mode(SLEEP_MODE_IDLE);sleep_enable();sleep_cpu();if (timer >= 5000){cli(); // общий запрет прерыванийTIMSK0 &=~(1<<TOIE0); // отключение прерываний по таймеру (1 раз в 16 секунд)sei(); // общее разрешение прерыванийset_sleep_mode(SLEEP_MODE_PWR_DOWN); // установка "летаргического сна"sleep_enable(); // разрешение спящего режимаsleep_cpu(); // сонsleep_disable(); // запрет снаcli(); // общий запрет прерыванийTIMSK0 |=(1<<TOIE0); // включение прерываний по переполнению таймера (1 раз в 16 секунд)sei(); // общее разрешение прерыванийTCNT0 =0; // сброс счетчикаtimer = 0;}}}Декабрь 15, 2017 в 12:12 пп #13653volwУчастникДобрый день! Narod Stream, хотелось бы увидеть уроки про ПИД регулятор на AVR в вашем исполнении.
Декабрь 15, 2017 в 1:54 пп #13654BergУчастникТак получилось, что у меня появилась макетная плата
под микроконтроллер ATmega16. На что надо обращать внимание
при написание (переписывания программ из уроков под ATmega8)
под микроконтроллер ATmega16.Декабрь 16, 2017 в 11:03 дп #13657gogazeУчастникПо-моему надо начать с даташита, найти соответствующие выводы на МК и под них переделать программу.
Декабрь 18, 2017 в 8:54 дп #13661DJPashAУчастникиз урока 8
Затеял сделать мигающую точку:#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>int main(void)
{
//unsigned char i;
//unsigned char button=0;
DDRD = 0xFF;
DDRB = 0x00;
PORTD = 0b00000000;
PORTB = 0b00000001;
while(1)
{PORTD = ~0b10000110;
_delay_ms(500);
PORTD = ~0b01011011;
_delay_ms(500);
PORTD = ~0b11001111;
_delay_ms(500);
PORTD = ~0b01100110;
_delay_ms(500);
PORTD = ~0b11101101;
_delay_ms(500);
PORTD = ~0b01111101;
_delay_ms(500);
PORTD = ~0b10000111;
_delay_ms(500);
PORTD = ~0b01111111;
_delay_ms(500);
PORTD = ~0b11101111;
_delay_ms(500);
PORTD = ~0b00111111;
_delay_ms(500);}
}и тут ворнинги:
Warning 2 large integer implicitly truncated to unsigned type [-Woverflow] D:\Atmel\7segm\7segm\7segm.c 20 2 7segmбез точек не было.
в протеусе всё работает, но само по себе… Что это и чем страшно?Декабрь 30, 2017 в 7:11 дп #13881YerУчастникздравствуйте всем как можно реализовать опрос по rs485 протоколу использовав usart
-
АвторСообщения
-
АвторСообщения
-
Здесь можно обсудить проблемы, связанные с программированием микроконтроллеров AVR.
Всем привет. Повторил урок №20 там где вывод температуры на LCD 1602 температура отображается все отлично. После этого решил собрать градусник, но для индикации взял 7-ми сегментный индикатор, из урока №20 взял файлы: DS18B20.c, DS18B20.h, main.h имена могут отличаться от оригиналов, но содержимое тоже. Индикаторы запустил по уроку №11 — динамическая индикация. Микроконтроллер взял ATTiny2313A.
Так вот это месево уже три месяца не могу запустить. Помогите пожалуйста.Вот ссылка на архив с проектом в папке файл для протеуса (.DSN)
https://cloud.mail.ru/public/9dT8/aVYhRyidzДобрый день!
Подскажите, правильно ли я использую команды по ассемблерным вставкам в коде, написанном в Atmel Studio 7:
__asm__(«cli»);
__asm__(«sei»);
__asm__(«nop»);
В CodeVisionAVR 4, в котором я начал изучать Си и программирование микроконтроллеров, синтаксис несколько другой.
Судя по отсутствию ошибок в Atmel Studio 7 при компиляции кода, вроде всё работает. Но хотелось бы уверенности. Также обратил внимание, что в одном из хед-файлов есть макроподстановки в виде sei(); и cli(); Но для команды nop макроподстановки в виде nop(); нет.Доброго времени суток! Хотелось бы увидеть урок по теме DHT11 и DHT22 (что наиболее актуально). Спасибо!
DimanLM.
К сожалению, я не располагаю временем тестить проекты, своих чересчур много. Возможно, кто занимается плотно с такими МК, посмотрят.Pavel,
Я давно хотел освоить подобные датчики. Посмотрел документацию на первый — точность слабовата, а вот второй меня заинтересовал.Pavel и Narod Stream, заказал себе датчики DHT22, как придут, оттестирую и отпишусь.
По поводу датчиков DHT11, у них большая очень погрешность. На макетной плате собрал 4 датчика. все 4 показывали разную температуру. погрешность +-2 градуса по цельсиюПодскажите: можно ли в Atmel Studio сделать переменную из _delay_ms (50); 50=переменная типа так
unsigned int e;
e=50
Я пробовал — компилятор выдает __builtin_avr_delay_cycles expects a compile time integer constant и ссылается на delay.h строку __builtin_avr_delay_cycles(__ticks_dc);
[URL=http://vfl.ru/fotos/ebfdeeb119773657.html][IMG]http://images.vfl.ru/ii/1513024229/ebfdeeb1/19773657_m.jpg[/IMG][/URL]
Фото с датчиков 6 шт подключены паралельно
Братцы!Проблема! ATTiny13 не выходит из спящего режима по прерыванию о переполнении таймера. Help me! Контроллеры из Китая.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143#define F_CPU 16000UL#define fwd PORTB |=(1<<PB2); PORTB &=~(1<<PB0); // fwd - вперед#define bwd PORTB |=(1<<PB0); PORTB &=~(1<<PB2); // bwd - назад#define stp PORTB &=~(1<<PB0); PORTB &=~(1<<PB2); // stp - стоп#define pause1 4 // 6ч - 1350#define pause2 3 // 3ч - 675#define pause3 2 // 90мин - 330#define pause4 1 // 45 мин - 165#include <avr/io.h>#include <avr/interrupt.h>#include <util/delay.h>#include <avr/sleep.h>// - Varriable -//unsigned int timer=0; // счетчик таймера (увеличивается в прерывании каждые 16 сек)void movie (){fwd // включаем двигатель вперед_delay_ms(600); // пауза 0,5 секундыstp_delay_ms(100);bwd_delay_ms(300);stptimer = 0;}unsigned int pause () // время между пшиками (pause*16.25)секунд{ADMUX = (0<<REFS0)| // Bit 6 – Источник опорного напряжения (0 - VCC, как источник опорного напряжения, 1 - Встроенный источник опорного напряжения)(1<<ADLAR)|(1<<MUX1)| // Bit 1 – Analog Channel and Gain Selection Bits (Выбор канала ADC (см. datasheet)) в данном случае выбираем ADC2(0<<MUX0); // Bit 0 – Analog Channel and Gain Selection Bits (Выбор канала ADC (см. datasheet))ADCSRA |= (1 << ADSC); // Начинаем преобразованиеwhile ((ADCSRA & (1 << ADIF)) == 0); // Ждем флага окончания преобразованияADCSRA|=(1<<ADIF);if (ADCH <= 53) // в зависимости от АЦП изменяем величину переменной pause{return (pause4);}if ((ADCH <= 89) && (ADCH >= 54)){return (pause3);}if ((ADCH <= 125) && (ADCH >= 90)){return (pause2);}return (pause1);}bool light (){ADMUX = (0<<REFS0)| // Bit 6 – Источник опорного напряжения (0 - VCC, как источник опорного напряжения, 1 - Встроенный источник опорного напряжения)(1<<ADLAR)|(1<<MUX1)| // Bit 1 – Analog Channel and Gain Selection Bits (Выбор канала ADC (см. datasheet)) в данном случае выбираем ADC2(1<<MUX0); // Bit 0 – Analog Channel and Gain Selection Bits (Выбор канала ADC (см. datasheet))ADCSRA |= (1 << ADSC); // Начинаем преобразованиеwhile ((ADCSRA&(1 << ADIF))== 0); // Ждем флага окончания преобразованияADCSRA|=(1<<ADIF);if ((ADCH <= 176)) // в зависимости от АЦП изменяем light{return false;}else{return true;}}ISR (TIM0_OVF_vect){timer++; //Увеличение timer на 1 каждые 16 секундif (timer >= pause()) // если timer больше полученного значения pause{if (light()) // и "светло"{movie(); // пшикаемtimer = 0; // обнуляем timer}else // а если timer больше полученного значения pause и "темно"{timer = 0; // обнуляем таймер}}}ISR (INT0_vect){movie();timer = 0;}int main(void){DDRB = 0b00101; //0 - Назад (выход), 1 - Кнопка (вход), 2 - вперед (выход), 3 - датчик света (вход), 4 - датчик режима(вход)PORTB = 0b00010;TCCR0A |=(0<<COM0A0) //Инициализация таймера|(0<<COM0A1)|(0<<COM0B0)|(0<<COM0B1)|(0<<WGM01)|(0<<WGM00);TCCR0B |=(0<<FOC0A)|(0<<FOC0B)|(0<<WGM02)|(1<<CS02)|(0<<CS01)|(1<<CS00);TCNT0 =0;ADMUX = (0<<REFS0)| // Bit 6 – Источник опорного напряжения (0 - VCC, как источник опорного напряжения, 1 - Встроенный источник опорного напряжения)(1<<ADLAR); // Bit 5 – ADC Left Adjust Result (1 - левое выравнивание результата; 0 - правое выравнивание результата измерения)ADCSRA = (1<<ADEN)| // Bit 7 – ADC включатель (1- включен, 0 - выключен)(0<<ADATE)| // Bit 5 – ADC постоянное преобразование (1 - включено, 0 - выключено)(1<<ADPS2)| // Bit 2 – ADC Prescaler Select Bits Выбор частоты преобразования (см. datasheet)(1<<ADPS1)| // Bit 1 – ADC Prescaler Select Bits Выбор частоты преобразования (см. datasheet)(1<<ADPS0); // Bit 0 – ADC Prescaler Select Bits Выбор частоты преобразования (см. datasheet)TIMSK0 |=(1<<TOIE0); // Разрешение прерывания по переполнению таймера 0GIMSK |=(1<<INT0); // включение внешних прерыванийsei(); // Общее разрешение прерыванийwhile (1){set_sleep_mode(SLEEP_MODE_IDLE);sleep_enable();sleep_cpu();if (timer >= 5000){cli(); // общий запрет прерыванийTIMSK0 &=~(1<<TOIE0); // отключение прерываний по таймеру (1 раз в 16 секунд)sei(); // общее разрешение прерыванийset_sleep_mode(SLEEP_MODE_PWR_DOWN); // установка "летаргического сна"sleep_enable(); // разрешение спящего режимаsleep_cpu(); // сонsleep_disable(); // запрет снаcli(); // общий запрет прерыванийTIMSK0 |=(1<<TOIE0); // включение прерываний по переполнению таймера (1 раз в 16 секунд)sei(); // общее разрешение прерыванийTCNT0 =0; // сброс счетчикаtimer = 0;}}}Добрый день! Narod Stream, хотелось бы увидеть уроки про ПИД регулятор на AVR в вашем исполнении.
Так получилось, что у меня появилась макетная плата
под микроконтроллер ATmega16. На что надо обращать внимание
при написание (переписывания программ из уроков под ATmega8)
под микроконтроллер ATmega16.По-моему надо начать с даташита, найти соответствующие выводы на МК и под них переделать программу.
из урока 8
Затеял сделать мигающую точку:#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>int main(void)
{
//unsigned char i;
//unsigned char button=0;
DDRD = 0xFF;
DDRB = 0x00;
PORTD = 0b00000000;
PORTB = 0b00000001;
while(1)
{PORTD = ~0b10000110;
_delay_ms(500);
PORTD = ~0b01011011;
_delay_ms(500);
PORTD = ~0b11001111;
_delay_ms(500);
PORTD = ~0b01100110;
_delay_ms(500);
PORTD = ~0b11101101;
_delay_ms(500);
PORTD = ~0b01111101;
_delay_ms(500);
PORTD = ~0b10000111;
_delay_ms(500);
PORTD = ~0b01111111;
_delay_ms(500);
PORTD = ~0b11101111;
_delay_ms(500);
PORTD = ~0b00111111;
_delay_ms(500);}
}и тут ворнинги:
Warning 2 large integer implicitly truncated to unsigned type [-Woverflow] D:\Atmel\7segm\7segm\7segm.c 20 2 7segmбез точек не было.
в протеусе всё работает, но само по себе… Что это и чем страшно? -
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.