Перейти к содержанию

    

mozg12342

Участник
  • Публикаций

    14
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Всем отзывчивым большое спасибо!!!
  2. Цитата(adnega @ Apr 1 2018, 15:53) Это называется "или". Упс. исправил.
  3. Цитата(aiwa @ Mar 31 2018, 23:32) Причина не в переменной. По стандарту языка компилятор перед выполнением операции расширяет байт до целого нулями. Которые после инвертирования превращаются в "непредвиденные" единицы. Я понял, но этот ноль должен был операцией или установиться в единицу и затем инвертироваться
  4. Цитата(dimka76 @ Mar 31 2018, 20:54) Кодif( (PINC & (1 << 0)) == 0 )      //если bit 0 порта С равен нулю, то выполнить условие Прекрасно!!! эта комбинация работает!, ровно как и комбинация if(~PINC&(1<<0)). А я видимо немного на мудрил. Хотя по логике и на бумаге вроде все верно Спасибо!
  5. Цитата(Harvester @ Mar 31 2018, 18:20) Для проверки бита нужно использовать оператор "логическое И" (&). А для логического отрицания - оператор "!". В вашем исполнении условие всегда истинно, поэтому компилятор его выкидывает. Моя логика такая: если бит 0 порта С равен еденице, то 0b00000001 поразрядное или 0b11111110 __________ 0b11111111 поразрядное отрицание __________ 0b00000000 если бит 0 порта С равен нулю то 0b00000000 поразрядное или 0b11111110 __________ 0b11111110 поразрядное отрицание __________ 0b00000001
  6. Добрый день!!! Решил вот опробовать Atmel studio 7. Столкнулся со следующими странностями: Если в поле условия оператора if вставить любую логическую операцию, то компилятор отказывается выполнять её и просто пропускает. Если к примеру выполню необходимую операцию, запишу в переменную и переменную вставлю в поле условия, то работает как надо. Раньше писал код в Code Vision? там так делать можно было. Можно ли в студии так делать или прийдется каждый раз использовать промежуточную переменную? Написал простой код для примера: Код#define F_CPU 8000000 #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> unsigned char r; int main(void) {     DDRB=0b11111111;     PORTB=0b00000000;     DDRC=0b00000000;     PORTC=0b00000001;     DDRD=0b00000000;     PORTD=0b00000000;     ACSR=0x80;     //------------------------------------------------     while (1)     {         if(~(PINC|0b11111110))      //если bit 0 порта С равен нулю, то выполнить условие         {          PORTB=0xFF;          }          r=(~(PINC|0b11111110));               } } Дизасемблер показывает:Код00000013  CLR R1        Clear Register 00000014  OUT 0x3F,R1        Out to I/O location 00000015  LDI R28,0x5F        Load immediate 00000016  LDI R29,0x04        Load immediate 00000017  OUT 0x3E,R29        Out to I/O location 00000018  OUT 0x3D,R28        Out to I/O location --- No source file ------------------------------------------------------------- 00000019  LDI R18,0x00        Load immediate 0000001A  LDI R26,0x60        Load immediate 0000001B  LDI R27,0x00        Load immediate 0000001C  RJMP PC+0x0002        Relative jump 0000001D  ST X+,R1        Store indirect and postincrement 0000001E  CPI R26,0x61        Compare with immediate 0000001F  CPC R27,R18        Compare with carry 00000020  BRNE PC-0x03        Branch if not equal 00000021  RCALL PC+0x0003        Relative call subroutine 00000022  RJMP PC+0x0015        Relative jump 00000023  RJMP PC-0x0023        Relative jump --- C:\STUDIOmk\transmitter\transmitter\Debug/.././main.c ---------------------- {     DDRB=0b11111111; 00000024  SER R24        Set Register 00000025  OUT 0x17,R24        Out to I/O location     PORTB=0b00000000; 00000026  OUT 0x18,R1        Out to I/O location     DDRC=0b00000000; 00000027  OUT 0x14,R1        Out to I/O location     PORTC=0b00000001; 00000028  LDI R24,0x01        Load immediate 00000029  OUT 0x15,R24        Out to I/O location     DDRD=0b00000000; 0000002A  OUT 0x11,R1        Out to I/O location     PORTD=0b00000000; 0000002B  OUT 0x12,R1        Out to I/O location     ACSR=0x80; 0000002C  LDI R24,0x80        Load immediate 0000002D  OUT 0x08,R24        Out to I/O location          PORTB=0xFF; 0000002E  SER R25        Set Register         if(~(PINC|0b11111110))      //если bit 0 порта С равен нулю, то выполнить условие 0000002F  IN R24,0x13        In from I/O location а          PORTB=0xFF; 00000030  OUT 0x18,R25        Out to I/O location         r=(~(PINC|0b11111110));          00000031  IN R24,0x13        In from I/O location 00000032  ORI R24,0xFE        Logical OR with immediate 00000033  COM R24        One's complement 00000034  STS 0x0060,R24        Store direct to data space 00000036  RJMP PC-0x0007        Relative jump --- No source file ------------------------------------------------------------- 00000037  CLI         Global Interrupt Disable 00000038  RJMP PC-0x0000        Relative jump
  7. Цитата(Baser @ Mar 8 2018, 14:15) Ну, а чтобы посмотреть, как компилятор с этими битами работает, смотрите ассемблерный код, все увидите. смотрел, вроде работает с битами правильно, прилагаю картинку. Цитата(Baser @ Mar 8 2018, 14:15) Отладчик AVR Studio скорее всего не умеет корректно работать с таким битовым регистром возможно, а может просто настроить надо как то. Цитата(Baser @ Mar 8 2018, 14:15) при отладке изменяйте биты в регистре R2 в ручную. При изменении любой из переменных вручную, все переменные изменяются синхронно. В результате экспериментов получил следующие результаты: когда программа устанавливает к примеру второй бит регистра (0b00000100) - все цифры в симуляторе отображают цифру 4, если установить также нулевой бит (0b00000101) - отображают 5. Логично предположить, что симулятор отображает мне переменные не побитно, а все вместе да ещё в десятиричном виде. Через контекстное меню могу установить только в шеснадцатиричном виде. Возможно ли исправить? а то неудобно так. И объясните пожалуйста почему некоторые переменные заносятся в адрес R-2, а некоторые в адрес к примеру 0181. В чем разница и логика?
  8. Всем привет! Народ подскажите как исправить ситуацию: Для компиляции использую Code Vision, для отладки AVR Studio 4.19. В коде программы использовал 4 битовые переменные, через disassembler посмотрел, что переменные записываются по адресу R2.0;R2.1;R2.2;R2.3, то есть в один регистр, но разные биты. В студии, адрес хранения в каждой из переменных отображается просто R2. При отладке в студии при изменении любой из переменных - изменяются все разом, сбрасываются так же, как будто нет разделения на биты и все четыре переменные находятся по одному адресу. Думал что создаётся только видимость ошибки, но программа работает соответственно не правильно.
  9. Добрый день! Подскажите как исправить. Компилятор - Code Vision AVR v.3.12 Симулятор - Proteus 7.7 Суть: после начертания схемы и запуска симуляции в Proteus, картина следующая: В окне Variables - большинство переменных не отображаются, вместо значения пишет "Item (1 bytes at 0xFFFFFF02) not withing memory block (0x00000460 bytes).", при этом адрес - R-254 или подобный. Переменные, которые отображаются заносятся в адрес 182,184,185 и т.д. После объявления всех переменных как Volatile, что на мой взгляд не очень хорошо, большинство переменных заносятся в адрес второго примера и начинают отображаться, кроме переменных типа bit. При перетаскивание переменных в окно watch window - переменные обнуляются и не изменяются при выполнении кода.
  10. Какие МК вы имеете ввиду? XMega? Всем спасибо! за полученные знания. Решил остановиться на установке дополнительного MK Attiny13
  11. Цитата(Den64 @ Feb 22 2018, 10:32) На сколько я знаю менять, источник тактового сигнала из программы, нельзя. Можно только программируемым делителем уменьшить её. Возможно какие то новые меги и умеют, но мега8 точно не умеет. Могу посоветовать использовать например тини13 которая будет программировать синтезатор. На цене особо не скажется, и на потреблении. Программируемый делитель - это fuse бит SCKDIV8 или предделитель таймера? На счет тини13 приму во внимание, но хотелось реализовать на одном МК. Тут роль играет спортивный интерес. Цитата(Den64 @ Feb 22 2018, 10:32) На сколько я знаю менять, источник тактового сигнала из программы, нельзя. Можно только программируемым делителем уменьшить её. Возможно какие то новые меги и умеют, но мега8 точно не умеет. Могу посоветовать использовать например тини13 которая будет программировать синтезатор. На цене особо не скажется, и на потреблении. Вопрос ещё что за изврат тактировать от синтезатора? В чём идея если не секрет? синтезатор может точно настроить частоту, но не может настроить скважность. МК поможет Цитата(Smoky @ Feb 22 2018, 10:01) В Си есть библиотека для работы с fuse битами, посмотрите её возможности. Прочитал, я так понял, что в документе показано как заставить avrdude программировать fuse биты при прошивке МК. А можно заставить МК не выполнять никаких действий пару десятков тактов, для предотвращения сбоя при изменении тактовой частоты МК
  12. Цитата(megajohn @ Feb 22 2018, 09:52) When applying an external clock, it is required to avoid sudden changes in the applied clock fre- quency to ensure stable operation of the MCU. A variation in frequency of more than 2% from one clock cycle to the next can lead to unpredictable behavior. It is required to ensure that the MCU is kept in Reset during such changes in the clock frequency. Доходчиво, ну может попробовать синхронизировать фазу синтезатора и внешнего пускового генератора, подключить их одновременно, а потом отключить внешний генератор. Цитата(mozg12342 @ Feb 22 2018, 10:04) Доходчиво, ну может попробовать синхронизировать фазу синтезатора и внешнего пускового генератора, подключить их одновременно, а потом отключить внешний генератор. Придумал! можно все сделать за два запуска МК: при первом запуске МК будет запускаться от пускового генератора такта и прошивать синтезатор, затем реализовать схемотехнически сброс МК и одновременное переключение на другой источник такта. Вопрос остался за fuse битами - возможно их изменить самим МК или нет. Мне для общего развития.
  13. Добрый день! Цель: заставить работать МК Atmega 8 на частоте генерируемой цифровым синтезатором частоты(AD9833). Микросхема после запуска не выдает сигнала на выходе, её нужно запрограммировать. Предполагаемый алгоритм: 1. подключить к МК генератору тактового сигнала (в идеале - это внутренняя RC цепочка) 2. Инициализировать МК и залить код управления в микросхему-синтезатор 3. Переключить МК на другой источник тактового сигнала - микросхему синтезатор. Вопрос: Возможно ли изменить FUSE биты, отвечающие за источник тактового сигнала в процессе выполнения кода.