Jump to content

Вопросы от начинающих по МК


Recommended Posts

03.07.2021 в 12:44, Дмитрий Вас сказал:

выключаю оптимизацию получаю мильон ошибок, и гугл не может с ними помочь.

Чтота эта... гугл и правда не мог помочь? Даже гугл-переводчик? Ну, он же прямым текстом написал: секция .text переполнена на 2 с лишним килобайта... все остальные ошибки - связанные с этим событием. Без оптимизации у вас прошива в память не лезет... в какую, правда, непонятно. может, констант слишком много накидали?

Учение - изучение правил. Опыт - изучение исключений.

Link to comment
Share on other sites

Доброго времени суток уважаемые форумчане. Возникла маленькая проблемка (для профи скорее всего даже смешная)...

Суть вопроса, как сделать на ардуинке вот такое: При нажатии на кнопку загорается поочереди 8 светодиодов с интервалом в 0.75 секунды и продолжают гореть 2 минуты и потом так же гаснут поочереди с интервалом в 0.75 секунды. Причем самое главное кнопку кратковременно нажал и отпустил (Везде практически есть нажал горит отпустил потух....) а мне именно нужно нажал-отпустил и запустил протокол зажигания и горения в течении 2 минут всех. После выключения всех светодиодов  чтоб с начала стартовала программа ожидания нажатия кнопки...

Набросал скетч так он мне при нажатии запускает сразу все светодиоды и поочереди их выключает с интервалом в 2 секунды... причем если нажать и отпустить то все загорятся и сразу потухнут... если снова нажать продолжат выключатся с последнего потухшего в прошлый раз светодиода и когда все потухнуть больше уже не реагирует ничего на эти кнопки.... причем у меня вместо кнопки датчик пересечения линии, но смысл посути как у тактовой кнопки... этот датчик выдаёт все время 5 вольт информационных, а при пересечении 0 вольт. Но в скетче в условии считывания ставлю LOW или HIGH но срабатывает одинаково почемуто...

Скетч (100% неправильный скорее всего):

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

 

void setup()
{
  pinMode (2, OUTPUT); //Выходы
  pinMode (3, OUTPUT);
  pinMode (4, OUTPUT);
  pinMode (5, OUTPUT);
  pinMode (6, OUTPUT);
  pinMode (7, OUTPUT);
  pinMode (8, OUTPUT);
  pinMode (9, OUTPUT);

  pinMode (11, INPUT); //Вход 11 пин
  pinMode (12, INPUT);  //Вход 12 пин
//digitalWrite (11, HIGH); //Подтяжка
//digitalWrite (12, HIGH); //Подтяжка
}

void loop() {
 
  if (digitalRead(11) == LOW  || digitalRead(12) == LOW) // если любая кнопка нажата
  {
    digitalWrite (2, HIGH); //Зажигаем огни
    delay (2000);
    digitalWrite (3, HIGH);
    delay (2000);
    digitalWrite (4, HIGH);
    delay (2000);
    digitalWrite (5, HIGH);
    delay (2000);
    digitalWrite (6, HIGH);
    delay (2000);
    digitalWrite (7, HIGH);
    delay (2000);
    digitalWrite (8, HIGH);
    delay (2000);
    digitalWrite (9, HIGH);
    delay (2000);
  }
}

 

 

Link to comment
Share on other sites

Транзисторы OptiMOS с ориентацией кристалла истоком вниз могут стать новым стандартом в изготовлении MOSFET

Традиционно производители дискретных силовых полупроводниковых приборов добиваются улучшения ключевых характеристик за счет усовершенствования кристалла. Однако специалисты компании Infineon добились впечатляющих результатов, сориентировав кристалл в корпусе истоком вниз. Такая ориентация кристалла применена, например, в серии MOSFET OptiMOS.

Подробнее

1 час назад, IMXO сказал:

////////////////

А вы знаете, оказалось все банально просто. Благодарю конечно и за вашу ссылочку почерпну немного и оттуда нового. 

Но как я и говорил код проще не придумаешь, и не нужно наворотов. Работает как часики))) правда думаю автоматизировать еще добавив фоторезистор, типа режим день/ночь, чтобы подсветка сама включалась при освещенности на улице ниже определенного порога...

Собственно скетч:

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

 

#define Rel1  2 // назначаем порт для реле1
#define Rel2  3 // назначаем порт для реле2
#define Rel3  4 // назначаем порт для реле3
#define Rel4  5 // назначаем порт для реле4
#define Rel5  6 // назначаем порт для реле5
#define Rel6  7 // назначаем порт для реле6
#define Rel7  8 // назначаем порт для реле7
#define Rel8  9 // назначаем порт для реле8

#define Dat1  11 // назначаем порт для Датчик линии 1
#define Dat2  12 // назначаем порт для Датчик линии 1


void setup() {
   pinMode(Rel1, OUTPUT);
   pinMode(Rel2, OUTPUT);
   pinMode(Rel3, OUTPUT);
   pinMode(Rel4, OUTPUT);
   pinMode(Rel5, OUTPUT);
   pinMode(Rel6, OUTPUT);
   pinMode(Rel7, OUTPUT);
   pinMode(Rel8, OUTPUT);
   pinMode(Dat1, INPUT);
   pinMode(Dat2, INPUT);
}

void loop() {
   // если есть движение на датчике 1 включаем релешки
   if (digitalRead(Dat1) == LOW) {
      digitalWrite(Rel1, LOW);
      delay (500);
      digitalWrite(Rel2, LOW);
      delay (500);
      digitalWrite(Rel3, LOW);
      delay (500);
      digitalWrite(Rel4, LOW);
      delay (500);
      digitalWrite(Rel5, LOW);
      delay (500);
      digitalWrite(Rel6, LOW);
      delay (500);
      digitalWrite(Rel7, LOW);
      delay (500);
      digitalWrite(Rel8, LOW);
      delay (60000);
   }

 // если есть движение на датчике 1 включаем релешки

   if (digitalRead(Dat2) == LOW) {
      digitalWrite(Rel8, LOW);
      delay (500);
      digitalWrite(Rel7, LOW);
      delay (500);
      digitalWrite(Rel6, LOW);
      delay (500);
      digitalWrite(Rel5, LOW);
      delay (500);
      digitalWrite(Rel4, LOW);
      delay (500);
      digitalWrite(Rel3, LOW);
      delay (500);
      digitalWrite(Rel2, LOW);
      delay (500);
      digitalWrite(Rel1, LOW);
      delay (60000);
   }
  
   digitalWrite(Rel1, HIGH);
   digitalWrite(Rel2, HIGH);
   digitalWrite(Rel3, HIGH);
   digitalWrite(Rel4, HIGH);
   digitalWrite(Rel5, HIGH);
   digitalWrite(Rel6, HIGH);
   digitalWrite(Rel7, HIGH);
   digitalWrite(Rel8, HIGH);
   }

 

 

Edited by Falconist
Оверквотинг
Link to comment
Share on other sites

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

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

Подробнее

Всех приветствую. Установил недавно Microchip Studio она же Atmel Studio 7 осваиваю Си. Столкнулся с такой проблемой: использую макрос PROGMEM с инициализированным массивом, чтобы расположить этот массив во FLASH памяти. В итоге при компиляции в выходном *.hex файле никаких данных из массива не появляется. В чём может быть дело?

Link to comment
Share on other sites

Как улучшить параметры преобразователей с помощью карбид-кремниевых модулей WolfPACK

Необходим быстродействующий преобразователь питания средней мощности с высоким КПД? Он должен быть компактным и недорогим? Решение – карбид-кремниевые модули средней мощности WolfPACK производства Wolfspeed. В статье рассмотрены основные особенности модулей WolfPACK и показано, что переход на эту универсальную и масштабируемую платформу позволяет не только быстро разработать новые устройства, но и без значительных затрат времени и средств модернизировать уже существующие схемы на традиционной элементной базе.

Подробнее

LI/PR2 – надежные и недорогие ИП от MORNSUN на DIN-рейку

Компания Mornsun выпустила три серии источников питания с креплением на DIN-рейку в форм-факторе Home Automation на популярные значения выходной мощности 30, 60 и 100 Вт (серии LI30-20/PR2, LI60-20/PR2, LI100-20/PR2). Эти источники питания относятся ко второму поколению продукции (R2) и характеризуются высокой надежностью и хорошей стоимостью.

Подробнее

@Alex после компиляции открываю полученный  *.hex файл и не нахожу там 752 байта, которые должны были в нём сохраниться. Видимо надо как-то компилятор или toolchain настроить, вот только куда копать?

Link to comment
Share on other sites

@Alex спасибо за подсказку, теперь разобрался. Всё дело в том, что я обозначил массив как данные во FLASH памяти, а в самой программе я не обращался к этому массиву и не использовал его, поэтому компилятор сочёл это за мусор и просто не добавил эти данные в программу. Заодно понял, как работает оптимизация кода в компиляторе). В итоге просто добавил строчку

 for (int i=0; i<__RAW_SIZE; i++)
{
     table[i] = pgm_read_byte(&(rawData[i]));
}

И весь массив скомпилировался в *.hex

Link to comment
Share on other sites

  • 1 month later...

и снова здравствуйте. 

void revers_f(void)
{
	int s_new;
		s_new = ~speed + 2;
		for (;speed>=s_new;)
		{
			if (Flag_IT_timer0)
			{
				Flag_IT_timer0 = 0;
				speed--;
			}
		}
}

есть вот такой код. все бы ничего но, переменная speed хоть и объявлена глобально эта функция из-за цикла for выдает ее по результату так сказать. а мне нужно чтобы она менялась постепенно именно глобально во всем коде. как быть?

Link to comment
Share on other sites

19 минут назад, Дмитрий Вас сказал:

нужно чтобы она менялась постепенно именно глобально во всем коде. как быть?

Так и меняйте её там, где нужно, "во всём коде" и "постепенно".
Не понятно, в чём проблема ... :huh:

Link to comment
Share on other sites

вот выполняется основная программа

if (button_shot && speed > 0)
		{
			revers_f();
			button_shot = 0;
		}

внутри которой идет проверка. натыкается на функцию реверс, выполняет ее. но внутри функции переменная меняется и по завершении в lcd_chisla(speed); переменная speed получается сразу 400 а я хочу видеть как она с 0 прибавляется

Link to comment
Share on other sites

@Дмитрий Вас  Изменяйте переменную speed в обработчике таймера.

// ISR timer1
if(reverse_ON)
{
	if (speed>=s_new)
		speed--;
	else
		reverse_ON = 0
}

А сама функция будет такая

void revers_f(void)
{
	s_new = -speed;
	reverse_ON = 1;
}

Эта функция устанавливает флаг reverse_ON. Таймер видит флаг и начинает в прерывании уменьшать speed. Это становится видно во всей программе.

Edited by Yurkin2015
Link to comment
Share on other sites

Используйте её где хотите - она же глобальная.
Хотите изменять её по энкодеру - меняйте её в его обработчике. Хотите по кнопкам - меняйте в их обработчиках. А выводить куда-то (дисплей, ШИМ, ...) - это уже дело второстепенное. Выводите в любой удобный момент и в любом удобном месте программы. Причём тут её изменение и чтение ? Вы смешали всё в кучу и запутались.

Link to comment
Share on other sites

1 минуту назад, Alex сказал:

Причём тут её изменение и чтение ? Вы смешали всё в кучу и запутались.

как при чем? хочу видеть ее онлайн, а после обработчика цикла она сразу из крайности в крайность

Link to comment
Share on other sites

6 минут назад, Дмитрий Вас сказал:

хочу видеть ее онлайн, а после обработчика цикла она сразу из крайности в крайность

Я уже ответил по этому поводу :

Цитата

Запихнуть в цикл её вывод на дисплей. Не ?

 

Приведите ещё пример, что Вам нужно делать с ней. Отвечу и по другой ситуации.

Link to comment
Share on other sites

  • 3 weeks later...

Есть те кто перешел с STM32f[030|103] на Raspberry RP2040? Довольны ли?) А может ан оборот кто то перешел и доволен)

Я так понял флешка там нужна внешняя для программы, но тут и плюс есть, размер больше) По скорости я так понимаю сейчас стм дороже аналог выходит?)

DMA смотрю есть, еще и два ядра по 133 мГц :) Вроде норм.

Программатор не нужен? Отладка работает? Софт бесплатный?) Как вообще ощущение?) Вот я с АВР на АРМ перешел был доволен) А сейчас ищу дальше что для своего хобби брать) я не для производства а так инкубатор сделать, чпу вот ща планирую) и тд поиграться.

Link to comment
Share on other sites

  • 1 month later...

Привет всем. Подскажите ответ. Проверяю кнопку на 0 в PD0:  If(~PIND&(1<<0) если на нём 0 выполняем то что в первых скобках. Но вроде бы если там 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.

  • Сообщения

    • В теме "усилитель от Василича" есть схема РР на 6п3с.
    • Вопрос не в мощности. Хоть 100500 Ватт - положение не изменится. Основная проблема использования силовых трансформаторов - очень низкие, со "звуковой" точки зрения допустимые напряжения обмоток. Там, где в силовом 6,3 Вольта, со "звукового" можно снять не более половины, при приемлемом качестве. Ещё меньше, при высоком. Вот и считайте. 3 Вольта на 4 Ома, это сколько? Чуть более 2х Ватт? Это по "схеме" Манакова. А сам трансформатор, хоть 10 Ватт, хоть килоВатт - всё едино. 127 Вольт, они у всех 127 Вольт.
    • Потому, что энергонезависимая - только EEPROM.
    • Всем привет ! После переезда в новую квартиру, с ПК началась непонятная дичь, во всех онлайн играх присутствует задержка по сравнению с другими игроками, как-будто изображение отстаёт от сервера( не путать с пингом, пинг почти всегда не более 40 мс, потерь пакетов тоже нет), грешил сначала на интернет провайдера, т.к очень на это похоже, поменял всех представленных в моём доме, везде задержка присутствует, пробовал через 4g, внешнюю сетевую карту, Pci-e сетевую карту, 3 роутера поменял, без роутера,  проблема остаётся везде. Полностью пересобрал весь пк, и на новом тоже самое, поставил стабилизатор 220в. Везу пк в другую квартиру, подключаю тот же самый 4G, что и у меня дома, проблемы нет. Помогает иногда переопределение оборудования через биос. Единственные мысли, что это из-за плохого электричества, намагничивания компонентов ПК, каких-либо помех, дом старый, заземления не предусмотрено. 
    • ОК. Чем мотивировано двуполярное питание, может кто прояснить? В случае композита или с предусилителем - может и есть смысл. А в датагоровской версии ничего этого нет. Почему не запитать однополярным? Всяко проще БП будет, и компактнее всё. Речь именно про аудиоприменение.      
    • Ну как раз эта статья меня и подтолкнула к использованию ТАНов на выходе, почему взял именно 69 - они мощнее ( я то планировал динамики 100 Вт НОЭМА) Манаков дал схему УНЧ и как 69 подключить и на этом наше общение закончилось, я понимаю, ему со мной не интересно было, он просто дал рекомендации какую литературу почитать, ну и как бы на этом все. Второй раз обращаться с вопросами к нему было стыдно, вот так эти ТАНы и лежали. Спасибо Ивану, поддержал, рассказал что и как называется на схемах, и что именно нужно покупать.  Надеюсь он (grach) и дальше будет меня "вести" до победного конца. А сейчас бы схему в новой редакции как самого УНЧ с авто смещением, так и БП с учетом всего выше сказанного.
    • Возьмите схему того, который понравится и сделайте по ней свой. Чего уж проще? Ну, например, по схеме этого KRK на фото.
  • 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 eyuw
      Б/у контролеры холодильной установки: 1) Eliwell 974LX  на atmega16A-PU , 3 реле - характеристики на фото.Цена 15 бел.руб. 2) Eliwell IDPlus974  на atmega32A-PU, 3 реле - характеристики на фото.Цена 18 бел.руб. Корпуса без передней панели закрывающей цифровой индикатор, без датчиков температуры! г.Толочин, Витебская обл. Отправка по Беларуси наложенным платежом. Покупатель также оплачивает почтовые расходы. 


    • By АртемК
      Уже весь интернет прошерстить, помогите найти, или где он приставует, чтоб его достать нужен очень срочно, или может у кого то есть куплю!

    • By Эдик Ибрагимов
      Использовать микроконтроллер семейства 8951
       
×
×
  • Create New...