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

mozg12342

Участник
  • Постов

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

  • Посещение

Репутация

0 Обычный
  1. Я понял, но этот ноль должен был операцией или установиться в единицу и затем инвертироваться
  2. Прекрасно!!! эта комбинация работает!, ровно как и комбинация if(~PINC&(1<<0)). А я видимо немного на мудрил. Хотя по логике и на бумаге вроде все верно Спасибо!
  3. Моя логика такая: если бит 0 порта С равен еденице, то 0b00000001 поразрядное или 0b11111110 __________ 0b11111111 поразрядное отрицание __________ 0b00000000 если бит 0 порта С равен нулю то 0b00000000 поразрядное или 0b11111110 __________ 0b11111110 поразрядное отрицание __________ 0b00000001
  4. Добрый день!!! Решил вот опробовать 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
  5. смотрел, вроде работает с битами правильно, прилагаю картинку. возможно, а может просто настроить надо как то. При изменении любой из переменных вручную, все переменные изменяются синхронно. В результате экспериментов получил следующие результаты: когда программа устанавливает к примеру второй бит регистра (0b00000100) - все цифры в симуляторе отображают цифру 4, если установить также нулевой бит (0b00000101) - отображают 5. Логично предположить, что симулятор отображает мне переменные не побитно, а все вместе да ещё в десятиричном виде. Через контекстное меню могу установить только в шеснадцатиричном виде. Возможно ли исправить? а то неудобно так. И объясните пожалуйста почему некоторые переменные заносятся в адрес R-2, а некоторые в адрес к примеру 0181. В чем разница и логика?
  6. Всем привет! Народ подскажите как исправить ситуацию: Для компиляции использую Code Vision, для отладки AVR Studio 4.19. В коде программы использовал 4 битовые переменные, через disassembler посмотрел, что переменные записываются по адресу R2.0;R2.1;R2.2;R2.3, то есть в один регистр, но разные биты. В студии, адрес хранения в каждой из переменных отображается просто R2. При отладке в студии при изменении любой из переменных - изменяются все разом, сбрасываются так же, как будто нет разделения на биты и все четыре переменные находятся по одному адресу. Думал что создаётся только видимость ошибки, но программа работает соответственно не правильно.
  7. Добрый день! Подскажите как исправить. Компилятор - 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 - переменные обнуляются и не изменяются при выполнении кода.
  8. Какие МК вы имеете ввиду? XMega? Всем спасибо! за полученные знания. Решил остановиться на установке дополнительного MK Attiny13
  9. Программируемый делитель - это fuse бит SCKDIV8 или предделитель таймера? На счет тини13 приму во внимание, но хотелось реализовать на одном МК. Тут роль играет спортивный интерес. синтезатор может точно настроить частоту, но не может настроить скважность. МК поможет Прочитал, я так понял, что в документе показано как заставить avrdude программировать fuse биты при прошивке МК. А можно заставить МК не выполнять никаких действий пару десятков тактов, для предотвращения сбоя при изменении тактовой частоты МК
  10. Доходчиво, ну может попробовать синхронизировать фазу синтезатора и внешнего пускового генератора, подключить их одновременно, а потом отключить внешний генератор. Придумал! можно все сделать за два запуска МК: при первом запуске МК будет запускаться от пускового генератора такта и прошивать синтезатор, затем реализовать схемотехнически сброс МК и одновременное переключение на другой источник такта. Вопрос остался за fuse битами - возможно их изменить самим МК или нет. Мне для общего развития.
  11. Добрый день! Цель: заставить работать МК Atmega 8 на частоте генерируемой цифровым синтезатором частоты(AD9833). Микросхема после запуска не выдает сигнала на выходе, её нужно запрограммировать. Предполагаемый алгоритм: 1. подключить к МК генератору тактового сигнала (в идеале - это внутренняя RC цепочка) 2. Инициализировать МК и залить код управления в микросхему-синтезатор 3. Переключить МК на другой источник тактового сигнала - микросхему синтезатор. Вопрос: Возможно ли изменить FUSE биты, отвечающие за источник тактового сигнала в процессе выполнения кода.
×
×
  • Создать...