Jump to content

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


Recommended Posts

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

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

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

9 часов назад, ruhi сказал:

А программу которая загрузчик в КОМ порт вы не можете менять? Вообще бы там это делать!

Могу, я же ее и написал

9 часов назад, ruhi сказал:

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

Я и так передаю длину, просто сразу делю ее на 256  на C#, чтобы контрольную сумму посылок рассчитать и чтобы МК знал сколько раз ему принять посылку размером 256 байт, и МК и рассчитывает контрольную сумму у себя, потом сравниваем. Тут по ходу нужна функция расчета в зависимости от размера бинарника, на сколько посылок чтобы она его делила и выходили равномерные по длине посылки.

Link to comment
Share on other sites

int main(void)
{
	extern short speed;//скорость
	port_ini();
	lcd_init();
	AMP_init();
	Enc_init();
	PSC_init(0,MAX_PWM);
	sei();	
	while (1)
	{	
		if (Flag_IT_timer1)
		{
			Flag_IT_timer1 = 0;	
			//----------------обработка энкодера-------------------------------
			volatile unsigned int next_state, prev_state;
			next_state = PIND & 0xC0; // Считываем текущее значение битов
			if (next_state != prev_state)
			{
				switch (prev_state)
				{
					case 128:
					{
						if (next_state == 192) (speed)++;
						if (next_state == 0) (speed)--;
						break;
					}
					case 0:
					{
						if (next_state == 128) (speed)++;
						if (next_state == 64) (speed)--;
						break;
					}
					case 64:
					{
						if (next_state == 0) (speed)++;
						if (next_state == 192) (speed)--;
						break;
					}
					case 192:
					{
						if (next_state == 64) (speed)++;
						if (next_state == 128) (speed)--;
						break;
					}
					default:
					{
						break;
					}
				}
				prev_state = next_state;    // Текущее состояние становится предыдущим
			}		       
			
			lcd_gotoxy(0,0);
			lcd_chisla(speed);
	}

не пойму почему переменная speed не меняется

Link to comment
Share on other sites

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

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

           Enc_state <<= 2;                         //Помещаем новое в старое
           Enc_state |= PORTB&(0x03);                      //Проверяем входные линии
                                     
           switch (Enc_state & 0x0F)
             {
               case 0b00000000 : break;             //не изменилось
               case 0b00000001 : Count--;
                                 break;
               case 0b00000011 : Err_c = Err_c + 1; //запрещенное состояние
                                 break;
               case 0b00000010 : Count++;
                                 break;
               case 0b00000110 : Err_c = Err_c + 1; //запрещенное состояние
                                 break;
               case 0b00000111 : Count--;
                                 break;
               case 0b00000101 : break;             //не изменилось
               case 0b00000100 : Count++;
                                 break; 
               case 0b00001100 : Err_c = Err_c + 1; //запрещенное состояние
                                 break;
               case 0b00001101 : Count++; 
               case 0b00001111 : break;             //не изменилось
               case 0b00001110 : Count--;
                                 break;
               case 0b00001010 : break;             //не изменилось
               case 0b00001011 : Count++;
                                 break; 
               case 0b00001001 : Err_c = Err_c + 1; //запрещенное состояние
                                 break;
               case 0b00001000 : Count--;
                                 break;
             } 

          if (Count == 8)              // Если был шаг энкодера влево
             {
                ..............         // то действие А 
                Count = 4;
             }

          else if (Count == 0)         // Если был шаг энкодера вправо
             {
                ..............         // то действие Б
                Count = 4;
             }

 

упрощенный вариант без проверки ошибок

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

           Enc_state <<= 2;                         //Помещаем новое в старое
           Enc_state |= PORTB&(0x03);                      //Проверяем входные линии
                                     
           switch (Enc_state & 0x0F)
             {

               case 0b0001 : 
               case 0b0111 : 
               case 0b1110 : 
               case 0b1000 : Count--;
                           break;

               case 0b0010 : 
               case 0b0100 : 
               case 0b1101 : 
               case 0b1011 : Count++;
                           break;
               default:
                           break;
             } 

          if (Count == 8)              // Если был шаг энкодера влево
             {
                ..............         // то действие А 
                Count = 4;
             }

          else if (Count == 0)         // Если был шаг энкодера вправо
             {
                ..............         // то действие Б
                Count = 4;
             }

 

 

Link to comment
Share on other sites

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

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

Подробнее

Новейшая архитектура Σ-Δ-АЦП предотвращает нарушение потока данных во время синхронизации распределенных систем

Критически важные распределенные системы требуют синхронного преобразования во всех подсистемах и непрерывного потока данных. Распределенные системы сбора данных могут быть синхронизированы как на основе АЦП последовательного приближения, так и на основе сигма-дельта (∑-Δ)-АЦП. Новый подход, основанный на преобразователе частоты дискретизации (SRC), содержащемся в микросхемах линейки AD7770 производства Analog Devices, позволяет достигать синхронизации в системах на основе сигма-дельта-АЦП без прерывания потока данных.

Подробнее

Как улучшить параметры преобразователей с помощью карбид-кремниевых модулей 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) и характеризуются высокой надежностью и хорошей стоимостью.

Подробнее

 

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

не пойму почему переменная speed не меняется

попробуйте переменную speed назначить как volatile short speed; , скорее всего в этом проблема

Edited by Электронщик
Link to comment
Share on other sites

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

фигурные скобки не ставить

Можно, а вдруг вам завтра понадобится еще что то добавить в тело!

А на кой там круглые скобки нужны?

Сергей.

Link to comment
Share on other sites

25.03.2021 в 20:57, Дмитрий Вас сказал:

volatile unsigned int next_state, prev_state;

это должно быть перед while!

25.03.2021 в 19:45, Электронщик сказал:

МК и рассчитывает контрольную сумму у себя, потом сравниваем

А в МК вы тоже можете менять загрузчик? тогда не понятно в чем проблема, две программы должны соответствовать друг другу только одна передает данные, а вторая принимает, соответствие должно быть по анализу этих передаваемых/принимаемых данных. Передавайте длину в байтах и читайте это кол-во байтов из принятых данных не зависимо от того сколько пришло "лишних" байтов в блоке если надо передавать блоками.

Edited by ruhi
очепятка

Можно сделать все! Но чем больше можно, тем больше нельзя!

Link to comment
Share on other sites

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

А в МК вы тоже можете менять загрузчик? тогда не понятно в чем проблема, две программы должны соответствовать друг другу только одна передает данные, а вторая принимает, соответствие должно быть по анализу этих передаваемых/принимаемых данных.

Уже все сделал, открываю бинарник в проге на компе, получаю количество байт, считаем сколько раз отправить посылку по 256 байт(передаем это количество на МК), отправляем по 256 байт, и высчитываем количество последней посылки, и для нее отдельно все считаем. Все четко работает

Link to comment
Share on other sites

  • 2 months later...

unsigned char button_long,button_shot;
int speed;
if (button_shot && speed==0)//первое короткое
{
    start(speed );
}
if (button_shot)//любое другое короткое
{
    revers(speed );
}
if (button_long)//длинное
{
    stop(speed );
}
int stop (int s)
{
    for(;s >=0;s --)
    for(;s <=0;s ++)
    return s ;
}
int start (int s)
{
    for(;s <=400;s ++)
    return s ;
}
int revers (int s)
{
    int s_new;
    if(s>0)
    {
        s_new = ~s + 1;
        for(;s >= s_new ; s--)
    }
    if(s<0)
    {
        s_new = ~s + 1;
        for (;s<=s_new; s++)
    }
    return s;
}

Есть такой набросок. Вопрос, все ли здесь на ваш профессиональный взгляд работоспособно. И второй вопрос. Цикл for будет выполнен мгновенно, а нужно его замедлить и с задаваемой скоростью. Все что на ум приходит это через таймер. Что то типа этого:

for(;s<=s_nem;)

{

    if(flag_timer2) 

    {flag_timer=0;

    s++;}

}

 

Link to comment
Share on other sites

Думаю, для начала Вам стоит проверить работоспособность кода, на задуманный алгоритм. Если пойдёт что-то не так, то уже подключите отладку. Ну а потом уже можно и вопросы задавать, если они появятся :)
Иначе каков смысл в написании кода, не проверяя его работоспособности ? :huh:

Link to comment
Share on other sites

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

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

Как это сделать? И как думаете таймер в цикле for будет работать?

Link to comment
Share on other sites

  

16 minutes ago, Дмитрий Мамедиев said:

таймер в цикле for будет работать?

Таймер будет работать, нет проблем.

 

Вам бы после изучения оператора цикла for(;;) неплохо бы прочитать про оператор while() :) 

Тут другая проблема в Вашем коде. Например, если в самом начале

speed = 0; // присвоили 0
start(speed);
speed = ? // по-прежнему speed равна 0

потому, что ваши функции не изменяют значения переменной speed.

Edited by Yurkin2015
Link to comment
Share on other sites

4 минуты назад, Yurkin2015 сказал:

 


speed = 0; // присвоили 0
start(speed);
speed = ? // по-прежнему speed равна 0

потому, что ваши функции не изменяют значения переменной speed.

Почему? Разве 

int start (int s)
{
    for(;s <=400;s ++)
    return s ;
}

Не увеличит? 

10 минут назад, Yurkin2015 сказал:

Вам бы после изучения оператора цикла for(;;) неплохо бы прочитать про оператор while() :) 

А чем плох for?

speed объявлена как глобальная переменная.

Link to comment
Share on other sites

10 minutes ago, Дмитрий Мамедиев said:

Почему? Разве

В функции start(int s) будет увеличиваться новая переменная s, но после окончания увеличения эта переменная s так и останется внутри функции неиспользованная.

Более того, при компиляции: оптимизатор увидит такое неиспользованное дело и просто выкинет этот кусок кода из программы.

Edited by Yurkin2015
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   1 member


  • Сообщения

    • С ЭДП тема хорошая, запаха нет, да, нужен объем и не слабый В части яхтеного лака, покрывал дерево, гляну может еще не высохли остатки, можно и им залить.  
    • Пришли полимерные конденсаторы 25х470 - попробую заменить в фильтре 25х1000,  проверить как пойдет Пока на тестах - выпрямитель в БП мостовой со средней точкой, дроссели 2х33 мкГн конденсаторы 2 по 25х1000, вторая ступень дроссели 2х1 мкГн конденсаторы 2 по  25х2200 переделывать без средней точки - конденсаторы тогда нужны на 50 В, хотя дросселей тогда 2 вместо 4 БП 330 Вт - 30 В 10 А греется только диодный мост 4 диода 20200 тут я перестраховался 20100 можно было поставить, но запаса по  обратному напряжению нет удачи
    • Мусора не должно быть. Посмотрите осциллографом если уровни меняются то анализатор должен так же принимать.
    • Чего-то не догоняю... база ВТ14 куда подключена? Хрень там написана. Объяснил? Перепелкин тоже не сразу всё знал и умел, понимать надо.
    • Прошу прощения, в спешке попутал полярность питания. Заработало. Осциллограф показал два сигнала под 90 градусов. Вопрос остался как подавить "мусор" на логическом анализаторе. Ведь оптический диск может быть поврежден а осциллографом этого не поймать. Установить подтягивающие резисторы к "0" на вход? У меня по умолчанию состояние входов "HI" то есть высокий логический уровень. Надо ставить какой то инвертор логических уровней?
    • Зря вы так сказали. Без этого - была хоть какая-то надежда, что вам действительно нужны ответы, и вы с уважением относитесь к тем, кто может вам помочь. Теперь не вижу в этом ничего удивительного. ильнур22 улетел в "Игнор". Больше я вас своими ответами не побеспокою.
    • Пермаллой лучше использовать, он бОльше для экранирования годится.
  • 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...