Программирование МК AVR

 

 

 

Помечено: 

В этой теме 23 ответа, 15 участников, последнее обновление  Narod Stream 1 месяц назад.

Просмотр 15 сообщений - с 1 по 15 (из 24 всего)
  • Автор
    Сообщения
  • #10143

    Narod Stream
    Хранитель

    Здесь можно обсудить проблемы, связанные с программированием микроконтроллеров AVR.

    #11040

    DimanLM
    Участник

    Всем привет. Повторил урок №20 там где вывод температуры на LCD 1602 температура отображается все отлично. После этого решил собрать градусник, но для индикации взял 7-ми сегментный индикатор, из урока №20 взял файлы: DS18B20.c, DS18B20.h, main.h имена могут отличаться от оригиналов, но содержимое тоже. Индикаторы запустил по уроку №11 — динамическая индикация. Микроконтроллер взял ATTiny2313A.
    Так вот это месево уже три месяца не могу запустить. Помогите пожалуйста.

    Вот ссылка на архив с проектом в папке файл для протеуса (.DSN)
    https://cloud.mail.ru/public/9dT8/aVYhRyidz

    #11250

    Dmitriy
    Участник

    Добрый день!
    Подскажите, правильно ли я использую команды по ассемблерным вставкам в коде, написанном в Atmel Studio 7:
    __asm__(«cli»);
    __asm__(«sei»);
    __asm__(«nop»);
    В CodeVisionAVR 4, в котором я начал изучать Си и программирование микроконтроллеров, синтаксис несколько другой.
    Судя по отсутствию ошибок в Atmel Studio 7 при компиляции кода, вроде всё работает. Но хотелось бы уверенности. Также обратил внимание, что в одном из хед-файлов есть макроподстановки в виде sei(); и cli(); Но для команды nop макроподстановки в виде nop(); нет.

    #12497

    Pavel
    Участник

    Доброго времени суток! Хотелось бы увидеть урок по теме DHT11 и DHT22 (что наиболее актуально). Спасибо!

    #12504

    Narod Stream
    Хранитель

    DimanLM.
    К сожалению, я не располагаю временем тестить проекты, своих чересчур много. Возможно, кто занимается плотно с такими МК, посмотрят.

    #12505

    Narod Stream
    Хранитель

    Pavel,
    Я давно хотел освоить подобные датчики. Посмотрел документацию на первый — точность слабовата, а вот второй меня заинтересовал.

    #13478

    daswindows
    Участник

    Pavel и Narod Stream, заказал себе датчики DHT22, как придут, оттестирую и отпишусь.
    По поводу датчиков DHT11, у них большая очень погрешность. На макетной плате собрал 4 датчика. все 4 показывали разную температуру. погрешность +-2 градуса по цельсию

    #13567

    gogaze
    Участник

    Подскажите: можно ли в 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);

    #13596

    daswindows
    Участник

    [URL=http://vfl.ru/fotos/ebfdeeb119773657.html][IMG]http://images.vfl.ru/ii/1513024229/ebfdeeb1/19773657_m.jpg[/IMG][/URL]

    Фото с датчиков 6 шт подключены паралельно

    #13628

    Pavel
    Участник

    Братцы!Проблема! ATTiny13 не выходит из спящего режима по прерыванию о переполнении таймера. Help me! Контроллеры из Китая.

    #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);
    	stp
    	timer = 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);								// Разрешение прерывания по переполнению таймера 0
    	GIMSK	|=(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;
    		}
        }
    }
    #13653

    volw
    Участник

    Добрый день! Narod Stream, хотелось бы увидеть уроки про ПИД регулятор на AVR в вашем исполнении.

    #13654

    Berg
    Участник

    Так получилось, что у меня появилась макетная плата
    под микроконтроллер ATmega16. На что надо обращать внимание
    при написание (переписывания программ из уроков под ATmega8)
    под микроконтроллер ATmega16.

    #13657

    gogaze
    Участник

    По-моему надо начать с даташита, найти соответствующие выводы на МК и под них переделать программу.

    #13661

    DJPashA
    Участник

    из урока 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

    без точек не было.
    в протеусе всё работает, но само по себе… Что это и чем страшно?

    #13881

    Yer
    Участник

    здравствуйте всем как можно реализовать опрос по rs485 протоколу использовав usart

  • Автор
    Сообщения
  • #10143

    Narod Stream
    Хранитель
    • Оффлайн

    Здесь можно обсудить проблемы, связанные с программированием микроконтроллеров AVR.

    #11040

    DimanLM
    Участник
    • Оффлайн

    Всем привет. Повторил урок №20 там где вывод температуры на LCD 1602 температура отображается все отлично. После этого решил собрать градусник, но для индикации взял 7-ми сегментный индикатор, из урока №20 взял файлы: DS18B20.c, DS18B20.h, main.h имена могут отличаться от оригиналов, но содержимое тоже. Индикаторы запустил по уроку №11 — динамическая индикация. Микроконтроллер взял ATTiny2313A.
    Так вот это месево уже три месяца не могу запустить. Помогите пожалуйста.

    Вот ссылка на архив с проектом в папке файл для протеуса (.DSN)
    https://cloud.mail.ru/public/9dT8/aVYhRyidz

    #11250

    Dmitriy
    Участник
    • Оффлайн

    Добрый день!
    Подскажите, правильно ли я использую команды по ассемблерным вставкам в коде, написанном в Atmel Studio 7:
    __asm__(«cli»);
    __asm__(«sei»);
    __asm__(«nop»);
    В CodeVisionAVR 4, в котором я начал изучать Си и программирование микроконтроллеров, синтаксис несколько другой.
    Судя по отсутствию ошибок в Atmel Studio 7 при компиляции кода, вроде всё работает. Но хотелось бы уверенности. Также обратил внимание, что в одном из хед-файлов есть макроподстановки в виде sei(); и cli(); Но для команды nop макроподстановки в виде nop(); нет.

    #12497

    Pavel
    Участник
    • Оффлайн

    Доброго времени суток! Хотелось бы увидеть урок по теме DHT11 и DHT22 (что наиболее актуально). Спасибо!

    #12504

    Narod Stream
    Хранитель
    • Оффлайн

    DimanLM.
    К сожалению, я не располагаю временем тестить проекты, своих чересчур много. Возможно, кто занимается плотно с такими МК, посмотрят.

    #12505

    Narod Stream
    Хранитель
    • Оффлайн

    Pavel,
    Я давно хотел освоить подобные датчики. Посмотрел документацию на первый — точность слабовата, а вот второй меня заинтересовал.

    #13478

    daswindows
    Участник
    • Оффлайн

    Pavel и Narod Stream, заказал себе датчики DHT22, как придут, оттестирую и отпишусь.
    По поводу датчиков DHT11, у них большая очень погрешность. На макетной плате собрал 4 датчика. все 4 показывали разную температуру. погрешность +-2 градуса по цельсию

    #13567

    gogaze
    Участник
    • Оффлайн

    Подскажите: можно ли в 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);

    #13596

    daswindows
    Участник
    • Оффлайн

    [URL=http://vfl.ru/fotos/ebfdeeb119773657.html][IMG]http://images.vfl.ru/ii/1513024229/ebfdeeb1/19773657_m.jpg[/IMG][/URL]

    Фото с датчиков 6 шт подключены паралельно

    #13628

    Pavel
    Участник
    • Оффлайн

    Братцы!Проблема! ATTiny13 не выходит из спящего режима по прерыванию о переполнении таймера. Help me! Контроллеры из Китая.

    #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);
    	stp
    	timer = 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);								// Разрешение прерывания по переполнению таймера 0
    	GIMSK	|=(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;
    		}
        }
    }
    #13653

    volw
    Участник
    • Оффлайн

    Добрый день! Narod Stream, хотелось бы увидеть уроки про ПИД регулятор на AVR в вашем исполнении.

    #13654

    Berg
    Участник
    • Оффлайн

    Так получилось, что у меня появилась макетная плата
    под микроконтроллер ATmega16. На что надо обращать внимание
    при написание (переписывания программ из уроков под ATmega8)
    под микроконтроллер ATmega16.

    #13657

    gogaze
    Участник
    • Оффлайн

    По-моему надо начать с даташита, найти соответствующие выводы на МК и под них переделать программу.

    #13661

    DJPashA
    Участник
    • Оффлайн

    из урока 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

    без точек не было.
    в протеусе всё работает, но само по себе… Что это и чем страшно?

    #13881

    Yer
    Участник
    • Оффлайн

    здравствуйте всем как можно реализовать опрос по rs485 протоколу использовав usart

Просмотр 15 сообщений - с 1 по 15 (из 24 всего)

Для ответа в этой теме необходимо авторизоваться.