Jump to content

Видеокурс по AVR-микроконтроллерам для начинающих


 Share

Recommended Posts

23 часа назад, gogaze сказал:

А поподрорбней  весь код можно посмотреть?

 

В 07.04.2014 в 17:03, kobzar сказал:

Браво!

Вот ето подход!

Доброго дня!

я конечно понимаю что максимальное кол-во ошибок при написании кода это ошибки того кто пишит...

вот код..

#include <avr/io.h>
#define F_CPU 10000000ul
//#define F_CPU 1000000ul

//*****************

//************
#include <util/delay.h>


void preset()
{
DDRB=0xFF;
PORTB=0x00;
}
void led_on()
{
 PORTB=0xFF;
_delay_ms(100);


}

void led_off()
{
 PORTB=0x00;
_delay_ms (100);
}

int main(void)
{
    /* основной цикл */
    preset();
    while (1) 
    {
    led_on();
    led_off();
    }
}
 

при симуляции  открывается файл библиотеки   delay.h  и курсор указывает на строку 187   в ней значение  __builtin_avr_delay_cycles(__ticks_dc);

от Вашего урока отличается тем что я использую 7 студию  в 6 студии не смог включить симуляцию.

Спасибо!

Link to comment
Share on other sites

А зачем Вы заходите внутрь функций задержек ?
Я не знаю, как в Atmel Studio, но в нормальных IDE должно быть несколько вариантов шагания по коду, включая перешагивание функций.

Link to comment
Share on other sites

Разработка преобразователей на основе карбид-кремниевых приборов с помощью симулятора SpeedFit 2.0

Компания Wolfspeed разработала бесплатный онлайн симулятор SpeedFit 2.0, позволяющий разработчикам быстро и всесторонне оценить параметры основных процессов, происходящих в силовой части импульсных преобразователей электрической энергии, и сравнить между собой различные варианты реализации поставленного технического задания.

Подробнее

Похоже в 7-й версии плохо симулируется эта функция. Попробуйте в самое начало файла записать такую строку.

#define __DELAY_BACKWARD_COMPATIBLE__

это описано в файле delay.h перед функцией

void _delay_ms(double __ms)

Link to comment
Share on other sites

Приглашаем на вебинар «Необычное в обычном. Сравнительный анализ современных решений Recom» (27.01.2022)

Приглашаем 27/01/2022 всех желающих посетить вебинар, посвященный двум наиболее растущим сегментам интегрированных источников питания – AC/DC малой мощности (1-20Вт) и сегменту решений PoL без изоляции. На вебинаре рассмотрим проблему выбора AC/DC в бюджетном сегменте и концепцию тестирования ускоренного старения, проведем сравнительный анализ подходов к интеграции AC/DC модулей. Сделаем обзор решений концепции POL с доисторических времен до современных технологий и средств для разработки и тестирования.

Подробнее

Доброго дня!

не помогло   и как итог всех действий  буду переставлять винду   и на голый win7  поставлю студию и посмотрю что получится

что касается вопроса  % А зачем Вы заходите внутрь функций задержек ?%   то я туда и не захожу туда студия закидывает и останавливается

как вариант что-то в системе есть лишнее или не хватает.Потому как до студии чего-то ставилось и удалялось  вероятнее всего что не всего что не все удаляется и хвосты могут влиять на работу проги  поэтому формат /С:/   и не должно быть последствий...

 

 

Link to comment
Share on other sites

Способы повышения КПД и удельной мощности инверторов для солнечных электростанций

Какую элементную базу выбрать для проектирования инверторов для солнечных батарей – новую карбид-кремниевую или традиционную кремниевую? Специалисты Infineon приходят к неожиданному выводу: традиционная кремниевая может помочь достичь КПД 99%. Но для этого следует применить сравнительно новую схему многоуровневого преобразования, которая может оказаться непростой для начинающего разработчика.

Подробнее

1 hour ago, aleksandr_m328 said:

на голый win7  поставлю студию и посмотрю что получится

Думаю получится то, что уже получилось. Если хотите не попадать в функцию задержки, то ставьте точку останава на команду следующую за _delay_ms() и запускайте на выполнение ( не в пошаговом режиме ).

Link to comment
Share on other sites

Разработка преобразователей на основе карбид-кремниевых приборов с помощью симулятора SpeedFit 2.0

Компания Wolfspeed разработала бесплатный онлайн симулятор SpeedFit 2.0, позволяющий разработчикам быстро и всесторонне оценить параметры основных процессов, происходящих в силовой части импульсных преобразователей электрической энергии, и сравнить между собой различные варианты реализации поставленного технического задания.

Подробнее

Доброго дня!

Моя надежда не сбылась!!!   

Опять то-же самое.  С точкой остановки тоже вроде как не работает (как я думаю)

в архиве скрины (то сообщение после прогона по точке останова вдруг поможет определить где ошибка) код который пытаю.Я вероятно просто не вижу ошибку типа я пишу и потому это правильно..

Спасибо!

 

 

wrk.zip

Link to comment
Share on other sites

Брекпоинт нужно ставить на существующую инструкцию, а не на пустоту. Как по-вашему программа может остановиться на "пустоте" ?

Link to comment
Share on other sites

закомментируйте строки с _delay

или отключите оптимизацию и перешагивайте F10 (шаг с обходом)

Simulator - Toolchain - Optimization - Optimization Level: None (-o0)

Кстати если нажимать то Play то Pause вы постоянно оказываетесь в функции delay и думаете что что-то не работает, однако есть шанс один из несколько миллионов, что вы остановитесь в основной программе. Ваш код, изменение состояния портов выполняется за несколько тактов, все остальное время программа висит в delay.

Edited by Berg
Link to comment
Share on other sites

Доброго дня!

Потому как мои действия в итоге не дали положительного результата  т.е. как я понял у меня не правильно работает симуляция с библиотекой  "delay"  или банальнее  где - то стоит  галочка в настройках  или не в том месте

и поэтому чтобы не крутить гайки а потом думать что получилось  реши от смотреть   первые видио

ну поискать еще инфу     без дебагера (симулятора) можно работать есть железо   есть протеус...

Вопрос не тему   моно ли заменить каркас для кода (добавить свои ) 

**Анек ...   про ремонтеров  наверное слышали.

 

Спасибо!

Link to comment
Share on other sites

Доброго дня!

Все что пока выяснил это-то что нормально  не хочет работать {Debug_er}  (не нашел внятного описания)    в протеус_е  диоды мигают а значит можно работать

подключу  программатор к студии   и начну юзать.  

 

 

Link to comment
Share on other sites

В 24.08.2018 в 16:47, aleksandr_m328 сказал:

Все что пока выяснил это-то что нормально  не хочет работать {Debug_er}

Вот нашел для Вас. https://www.avrfreaks.net/forum/delayms-hangs-avr-simulator

А если коротко, то отлаживая программу в том виде, которая есть, мы просто не можем дождаться, когда симулятор досчитает до конца.

В качестве доказательства - замените задержку на 1ms (_delay_ms(1);)  и увидите результат. Это только для проверки в отладчике!

#define F_CPU 10000000ul

я бы установил правильную частоту 8000000 и в Протеусе в свойствах контроллера поставил ее же.

Попробуйте так

Скрытый текст

 

#include <avr/io.h>
#define F_CPU 8000000
#include <util/delay.h>

void preset()
{
    DDRB=0xFF;
    PORTB=0x00;
}
void led_on()
{
    PORTB=0xFF;
    //_delay_ms(1000);
    _delay_ms(1);


}

void led_off()
{
    PORTB=0x00;
    //_delay_ms (1000);
    _delay_ms(1);

}


int main(void)
{
    /* Replace with your application code */
    preset();
    while (1) 
    {
        led_on();
        led_off();
    }
}

 

 

Edited by gogaze
Добавление информации

Мир не без добрых людей!

Link to comment
Share on other sites

1 час назад, кое-кто сказал:

Что-то не работает библиотека для nokia3310 от  COKPOWEHEU.Перепробовал множество проектов в т.ч. примеры ,скачанные вместе с библиотекой.Всегда выдает одно

А поподробнее! Как объявлены библиотеки в заголовке? Где находятся сами файлы?2.jpg.d8462bb4c726826eed61d01c5aa3db0e.jpg1.jpg.f0cc903141db23e8ebf34e2dd1567e54.jpg

Edited by gogaze

Мир не без добрых людей!

Link to comment
Share on other sites

Что-то не работает библиотека для nokia3310 от  COKPOWEHEU.Перепробовал множество проектов в т.ч. 

Всё,разобрался уже.Оказывается надо было добавить файл lcd_chars.inc!!Об этом никто никогда не писал.И что это за файл?

Link to comment
Share on other sites

5 часов назад, кое-кто сказал:

Всегда выдает одно

там написано "не могу найти lcd_chars.inc". Этот файл должен находиться рядом с остальными исходниками. Ну либо прописать путь к нему в makefile.

Ну и традиционный совет не использовать в путях к файлам и именах что-либо кроме латиницы.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Link to comment
Share on other sites

Доброго дня!

Спасибо за помощь!

Да я понял что это ошибка симулятора  камень то работает  и это т код ---_delay_ms(1);--  тоже выкинул студию  в ошибку

возможно  какие-то настройки надо  прописать в студии   ..да и симулятор для меня сейчас не актуален есть протеус  и  видел  онлайн отладчик или нечто подобное  просто внимание не обратил  когда видел   если что можно просто поискать..

пока  занимался  студией   прописал в ней программатор  (usbasp) стало чуток удобнее   есть кнопка  с наименованием камня  сейчас это мега 8

хуже  другое  придется делать кнопки под  каждый камень.плюс очевиден не нужно выходить из студии для вызова внешней проги для прошивки  камня.

так что пока пропишу  кнопки и проверю на те камни что у меня есть пусть пока это будут мигалки   но как задел будет не плохой.

 

 

Link to comment
Share on other sites

8 часов назад, aleksandr_m328 сказал:

Да я понял что это ошибка симулятора  камень то работает  и это т код ---_delay_ms(1);--  тоже выкинул студию  в ошибку

Вот не поленился сделать видео на 2 минуты, без комментариев, и так все понятно - сначала задержка 1ms потом 100us. Обратите внимание на разницу во времени обработки задержки. 

Я на 100% не уверен, но может быть время еще зависит от мощности компьютера. У меня i5 четырехядерный.

https://yadi.sk/i/jTJ9722G3agMYM

Edited by gogaze
Ссылка на видео

Мир не без добрых людей!

Link to comment
Share on other sites

значит это не  ошибка ...  у  Вас  симулятор ведет так-же как и меня  (это я решил) что это ошибка.

ну тогда у меня все нормально со студией(искал то чего в принципе нет)  за то  почитал .....по теме.(это не  PHP)

 

 

Link to comment
Share on other sites

  • 10 months later...
  • 6 months later...

Добрый день собрал! пример из урока (в уроке atmega8A)nokia5110 и atmega328p экран пуст ничего не выводит, загорается подсветка, иногда бывает на весь экран выводит темный квадрат, в протеусе все работает? почему так может быть порты SPI на atmega8A и на 328р одинаковы,  в хидере n5110.h порты совпадают. Реализован только один вольтметр. Добавил мигание светодиода что бы понимать что контроллер работает и зашит(мигает)

#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include "n5110.h"

#define HIGH 0xFF
#define LOW 0x00

void presets()
{
	DDRD = HIGH;
	PORTD = LOW;
	
	Lcd_init();
//	Lcd_clear();

//Config ADCSRA
ADCSRA|=(1<<ADEN) //задействовать АЦП
|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0);//делитель на 128=64кГц

//ADMUX
ADMUX|=(1<<REFS1)|(1<<REFS0); //Опорное напряжение 1.1 В внутренее

}

int readADC(unsigned int ch)
{
	unsigned char set_admux= ADMUX;
	set_admux &= ~((1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (1<<MUX0));
	
	switch(ch)
	{
		case 1:set_admux |=((0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0));
		break;
		//case 2:set_admux |=((0<<MUX3) | (0<<MUX2) | (1<<MUX1) | (0<<MUX0));
		//break;
		default:break;
	}
	ADMUX=set_admux;
	_delay_us(10);
	
	unsigned int tmp=0;
	
	ADCSRA|=(1<<ADSC);
	while (ADCSRA&(1<<ADSC));
	
	tmp=(ADCL|ADCH<<8);
	return tmp;
}

int main(void)
{
	presets();
    /* Replace with your application code */
    while (1) 
    {

      Lcd_clear();
	  Lcd_print(0,4,FONT_1X, (unsigned char *)('a'));
	  Lcd_printf(0,0, FONT_1X, readADC(0),1);
	  Lcd_printf(0,1,FONT_1X,(readADC(0)*30)/1023,1);
	  Lcd_printf(0,2, FONT_1X, readADC(1),1);
	  Lcd_printf(0,3,FONT_1X,(readADC(1)*30)/1023,1);
	  Lcd_update();
	  _delay_ms(100);
	  PORTD=(1<<PIND7);
	  _delay_ms(200);
	  PORTD=(0<<PIND7);
    }
}
//_N5110_H_
// Порт к которому подключен LCD (здесь пример распиновки для ATmega8A)
// Библиотека использует аппаратный SPI, поэтому если хотите иной порт - придется реализовать SPI программно)
#define LCD_PORT                   PORTB
#define LCD_DDR                    DDRB

// Распиновка порта
#define LCD_DC_PIN                 PB1	// DC
#define LCD_CE_PIN                 PB2	// SCE
#define SPI_MOSI_PIN               PB3  // SDIN 
#define LCD_RST_PIN                PB4	// RESET
#define SPI_CLK_PIN                PB5  // SCLK 

 

Edited by Taras Molchanov
Link to comment
Share on other sites

20 часов назад, Taras Molchanov сказал:

Добрый день собрал!

поздравляю!

собрать добрый день - большое достижение...

Мудрость приходит вместе с импотенцией...

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

Link to comment
Share on other sites

  • 2 months later...

Прошу помочь с простенькой программкой для AVR Tiny13a (накидал в Code vision AVR 3.39b):

/*******************************************************
This program was created by the CodeWizardAVR V3.39b

Chip type               : ATtiny13A
AVR Core Clock frequency: 9,600000 MHz
Memory model            : Tiny
External RAM size       : 0
Data Stack size         : 16
*******************************************************/

#include <tiny13a.h>
#include <delay.h>

unsigned char v;

interrupt [EXT_INT0] void ext_int0_isr(void)
{
v++;
if(v==4)v=0;
delay_ms (100);
}

void main(void)
{
DDRB=(1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0);
 
PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (1<<PORTB1) | (1<<PORTB0);

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Low level
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=(1<<INT0) | (0<<PCIE);
MCUCR=(0<<ISC01) | (0<<ISC00);
GIFR=(1<<INTF0) | (0<<PCIF);

// Globally enable interrupts
#asm("sei")

while (1)
      {
         if(v==0) PORTB.2 = 0; PORTB.3 = 0; PORTB.4 = 0;
      
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
         if(v==1) PORTB.2 = 1; PORTB.3 = 0; PORTB.4 = 0;
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
         if(v==2) PORTB.2 = 0; PORTB.3 = 1; PORTB.4 = 0;
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
         if(v==3) PORTB.2 = 0; PORTB.3 = 0; PORTB.4 = 1;
      
    }

}

Проект в proteus 8 (в прикрепленном rar) представляет управление с помощью контроллера одной кнопкой тремя светодиодами по очереди. Т.е. в исходном состоянии порты со светодиодами PB2, PB3, PB4 - низкий уровень. К PB0 ничего не подключено. Кнопка на PB1, второй конец на землю. При 1 нажатии загорается и горит PB2, при втором нажатии PB2 тухнет, зажигается PB3, при третьем - тухнет PB3 и загорается PB4, при четвертом - все порты со светодиодами выключаются. И по кругу.

При запуске в Протеусе начинают подмаргивать PB3, PB4. При первом нажатии PB2 загорается, при втором моргают PB3, PB4.

test 2 one click.rar

Edited by Falconist
Link to comment
Share on other sites

Guest shindax

Вы про инструкцию if в языке С хоть что-то читали? Как оформляются блоки кода знаете??? Вряд-ли...

Возможно, Вам стОит переписать код так?

if(v==3) { PORTB.2 = 0; PORTB.3 = 0; PORTB.4 = 1; }

 

 

Link to comment
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.

  • Сообщения

  • Similar Content

    • By Super Akk
      Здравствуйте, я работаю в Proteus и у меня возникла ошибка Simulation is not running in real time due to excessive CPU load
      Подскажите пожалуйста как её исправить
      Код прошивки:
      #include <lm3s300.h> // Graphic Display functions #include <glcd.h> // Font used for displaying text // on the graphic display #include <font5x7.h> // Declare your global variables here void main(void) { unsigned char odin[] = { 0x08, 0x00, 0x08, 0x00, #ifndef _GLCD_DATA_BYTEY_ 0x00, 0x10, 0x18, 0x14, 0x10, 0x10, 0x7C, 0x00, #else 0x00, 0x00, 0x48, 0x44, 0x7E, 0x40, 0x40, 0x00, #endif }; // Declare your local variables here // Variable used to store graphic display // controller initialization data GLCDINIT_t glcd_init_data; // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=(1<<CLKPCE); CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0); #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // 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); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=0xFF // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped // Mode: Normal top=0xFFFF // OC1A output: Disconnected // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer2 Stopped // Mode: Normal top=0xFF // OC2A output: Disconnected // OC2B output: Disconnected ASSR=(0<<EXCLK) | (0<<AS2); TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0) | (0<<WGM21) | (0<<WGM20); TCCR2B=(0<<WGM22) | (0<<CS22) | (0<<CS21) | (0<<CS20); TCNT2=0x00; OCR2A=0x00; OCR2B=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // Timer/Counter 1 Interrupt(s) initialization TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1); // Timer/Counter 2 Interrupt(s) initialization TIMSK2=(0<<OCIE2B) | (0<<OCIE2A) | (0<<TOIE2); // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-14: Off // Interrupt on any change on pins PCINT16-23: Off EICRA=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00); EIMSK=(0<<INT1) | (0<<INT0); PCICR=(0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0); // USART initialization // USART disabled UCSR0B=(0<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (0<<RXEN0) | (0<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80); // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0); ADCSRB=(0<<ACME); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR1=(0<<AIN0D) | (0<<AIN1D); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); // SPI initialization // SPI disabled SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0); // TWI initialization // TWI disabled TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE); // Graphic Display Controller initialization // The KS0108 connections are specified in the // Project|Configure|C Compiler|Libraries|Graphic Display menu: // DB0 - PORTB Bit 0 // DB1 - PORTB Bit 1 // DB2 - PORTB Bit 2 // DB3 - PORTB Bit 3 // DB4 - PORTB Bit 4 // DB5 - PORTB Bit 5 // DB6 - PORTB Bit 6 // DB7 - PORTB Bit 7 // E - PORTC Bit 0 // RD /WR - PORTC Bit 1 // RS - PORTC Bit 2 // /RST - PORTC Bit 3 // /CS1 - PORTC Bit 4 // /CS2 - PORTC Bit 5 // Specify the current font for displaying text glcd_init_data.font=font5x7; // No function is used for reading // image data from external memory glcd_init_data.readxmem=NULL; // No function is used for writing // image data to external memory glcd_init_data.writexmem=NULL; glcd_init(&glcd_init_data); glcd_putimage(0,0, odin, GLCD_PUTCOPY); while (1) { // Place your code here } } Схема прикреплена ниже в архиве

      Схема.rar
    • By Н_Д_А
      Всем привет).
      Может, кому-то эта статья  сэкономит много времени и нервов. 
      Недавно  по работе встретился с интересной задачкой.
      Нужно было передать на железку по порту RS485 информацию для проверки работоспособности последней.
      Так как не всегда имеется в ремонте вся система, то для начала нужно было посмотреть, на заведомо исправной системе, что же там между ними (железками) передаётся.
      Логический анализатор показал что девайсы общаются по не совсем стандартному, а по  9ти битному протоколу (USART 9n1).
      А это усложняло задачу, так-так известные мне терминальные программы его не поддерживают.  И без бубна не обойтись))).
      Начались поиски решения.
      Через некоторое время стало понятно, что AVR позволяет это делать и даже в даташите подробно это описывает.
      Дело за малым. Реализация задуманного))). 
      Все регистры выставлены по документу………..Для Atmega8a.
      void USART_Init( unsigned int speed) //Инициализация модуля USART { UBRRH = (unsigned char)(speed>>8); UBRRL = (unsigned char)speed; UCSRB=(1<<RXEN)|( 1<<TXEN); //Включаем прием и передачу по USART UCSRB |= (1<<RXCIE); //Разрешаем прерывание при передаче UCSRA |= (1<<U2X); //удвоение скорости UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0); UCSRB |= (1<<UCSZ2); // Включаем 9bit режим // Обращаемся именно к регистру UCSRC (URSEL=1) // ассинхронный режим (UMSEL=0), без контроля четности (UPM1=0 и UPM0=0) // 1 стоп-бит (USBS=0), 8-бит посылка (UCSZ1=1 и UCSZ0=1) // если (UCSZ1=1 и UCSZ0=1 и UCSZ2=1) 9bit mode. // UCSRC |= (1<<UPM1);//четность } По даташиту передача 9го бита происходит установкой или сбросом TXB8. 
      То есть, установили бит, передаётся 1 в старшем 9ом разряде, сбросили – 0. 
      void USART_Transmit( unsigned int data ) // функция передачи 9ти бит из даташита. { /* Wait for empty transmit buffer */ while ( !( UCSRA & (1<<UDRE)) ) ; /* Copy ninth bit to TXB8 */ UCSRB &= ~(1<<TXB8); if ( data & 0x0100 ) //не понял, что они хотели этим сделать. UCSRB |= (1<<TXB8); /* Put data into buffer, sends the data */ UDR = data; } И вот незадача, числа размером до 1 байт передаются без проблем, а числа больше 0xFF (255) нет).
      А устройство передаёт числа до 510.
      Предлагаю решение.  Может и не самое лучшее, но вполне работоспособное.
      int main(void) { USART_Init (103);//9600 //------------------------------------------------------------------------------------ while(1) { for (i=0; i<22; i++) { code_simbol = simbol[i]; //символ из массива //-------------------------------------отправка в UART-------------------------------- if (code_simbol > 255) { pr=1; // флаг передачи символа больше 0xff (255 десятичное) } else { pr=0; // флаг передачи символа меньше 0xff } USART_Transmit(code_simbol,pr);//собственно сама функция отаравки } } } А теперь и сама функция передачи .
      void USART_Transmit( unsigned char data, uint8_t prisnak ) //Функция отправки по USART { while ( !(UCSRA & (1<<UDRE)) ); //Ожидание опустошения буфера приема if (prisnak==1) { UCSRB |= (1<<TXB8); //устанавливаем для передачи еденицы в старшем разряде } else { UCSRB &= ~(1<<TXB8); //сбрасываем старший разряд } /* Put data into buffer, sends the data */ UDR = data; //Начало передачи данных asm volatile ("nop"); Соответственно если число для предачи мньше 256 мы передаём его при нулевом 9ом бите.
      Ну а если больше то 9й бит выставляем в единицу.
      А вот и результат.

       
    • By France de Vague
      Здравствуйте.
      Я собрал схему для генерации звуков на AVR по материалам вот этой статьи на Хабре.
      Использовал ATMega328P. В этом проекте частота ШИМ 31250 Гц, так что я собрал фильтр - RC-цепь, где R = 510 Ом, а С = 0.1 мкФ приложил схему к посту (эти значения я рассчитал на предложенном в статье калькуляторе ШИМ-фильтров (приложил скриншот); нагрузкой поставил динамик с сопротивлением 8 Ом, на схему подал 5В питания с лабораторного БП.
      Я загрузил в микроконтроллер демо-код, который должен проигрывать последовательность звуков. Фьюзы, вроде бы, стандартные, но я на всякий случай приложил скриншот и с ними.
       
      В общем, проблема в том, что звук, который он должен воспроизводить звучит приглушенно, зато блин стоит какой-то монотонный писк, иногда почти скрип и вот он очень громкий. 
      Я подумал, что проблема в неправильно рассчитанном фильтре или какой-нибудь наводке. Собрал их сто тысяч разных, но писк только приглушался вместе со всем остальным, когда я большие сопротивления ставил, а по частоте на слух не менялся(не уверен, должен ли был), хотя емкости я пробовал тоже очень разные.
      Я немного почитал код, попробовал отключить функцию подавления щелчка при сменах нот (это ничего не изменило). Код довольно сложный, чтобы пытаться всерьез искать там какие-нибудь ошибки, да и я подозреваю, что там их нет.
      Не могу понять в чем проблема уже пару дней. Возможно, кто-то уже собирал этот проект или что-нибудь подобное и сталкивался с таким? Подскажите, если так. 
      Так же, я не уверен, может быть, проблема физическая и она в микроконтроллере, думаю стоит попробовать попробовать другой камень.
      Заранее спасибо.



    • By fander36
      Здравствуйте. Возник ниже стоящий вопрос.
      Cуществующие технологии отладочных плат для AVR.
      Хотелось бы узнать больше об этом, но в интернете не нашел ничего дельного.
    • By eyuw
      Б/у контролеры холодильной установки: 1) Eliwell 974LX  на atmega16A-PU , 3 реле - характеристики на фото.Цена 15 бел.руб. 2) Eliwell IDPlus974  на atmega32A-PU, 3 реле - характеристики на фото.Цена 18 бел.руб. Корпуса без передней панели закрывающей цифровой индикатор, без датчиков температуры! г.Толочин, Витебская обл. Отправка по Беларуси наложенным платежом. Покупатель также оплачивает почтовые расходы. 


×
×
  • Create New...