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

Различается Работа В Симуляторе И В Реальной Схеме. Attiny2313A


Tokes

Рекомендуемые сообщения

Здравствуйте всем.

#include <avr/io.h>	 //Описание периферии		
int main (void){
MCUCR=(0<<PUD);	 //Включаем подтяжку
DDRB=0b00001100;	 //Два пина порта B на выход
while (1){	 //Бесконечный цикл
if (PINB&=0b00010000) //Если в PB4 порта B единица, то
 PORTB=0b11101011; //Зелёный, иначе
else PORTB=0b11100111; //Красный
}}

В симуляторе работает, в железе - нет. Что не так? Winavr, AVR GCC.

Элементарную кнопку не получается опросить :(

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

Дизассемблер:

[/size][/font][/color]
--- UNKNOWN_FILE ---------------------------------------------------------------------------------
0: File not found
+00000000: C014 RJMP PC+0x0015 Relative jump
+00000001: C019 RJMP PC+0x001A Relative jump
+00000002: C018 RJMP PC+0x0019 Relative jump
+00000003: C017 RJMP PC+0x0018 Relative jump
+00000004: C016 RJMP PC+0x0017 Relative jump
+00000005: C015 RJMP PC+0x0016 Relative jump
+00000006: C014 RJMP PC+0x0015 Relative jump
+00000007: C013 RJMP PC+0x0014 Relative jump
+00000008: C012 RJMP PC+0x0013 Relative jump
+00000009: C011 RJMP PC+0x0012 Relative jump
+0000000A: C010 RJMP PC+0x0011 Relative jump
+0000000B: C00F RJMP PC+0x0010 Relative jump
+0000000C: C00E RJMP PC+0x000F Relative jump
+0000000D: C00D RJMP PC+0x000E Relative jump
+0000000E: C00C RJMP PC+0x000D Relative jump
+0000000F: C00B RJMP PC+0x000C Relative jump
+00000010: C00A RJMP PC+0x000B Relative jump
+00000011: C009 RJMP PC+0x000A Relative jump
+00000012: C008 RJMP PC+0x0009 Relative jump
+00000013: C007 RJMP PC+0x0008 Relative jump
+00000014: C006 RJMP PC+0x0007 Relative jump
+00000015: 2411 CLR R1 Clear Register
+00000016: BE1F OUT 0x3F,R1 Out to I/O location
+00000017: EDCF LDI R28,0xDF Load immediate
+00000018: BFCD OUT 0x3D,R28 Out to I/O location
+00000019: D002 RCALL PC+0x0003 Relative call subroutine
+0000001A: C010 RJMP PC+0x0011 Relative jump
+0000001B: CFE4 RJMP PC-0x001B Relative jump
@0000001C: main
---- button.c -------------------------------------------------------------------------------------
3: int main (void){
+0000001C: BE15 OUT 0x35,R1 Out to I/O location
5: DDRB=0b00001100; //Три пина порта B на выход
+0000001D: E08C LDI R24,0x0C Load immediate
+0000001E: BB87 OUT 0x17,R24 Out to I/O location
8: PORTB=0b11101011; //Зелёный, иначе
+0000001F: EE2B LDI R18,0xEB Load immediate
9: else PORTB=0b11100111; //Красный
+00000020: EE97 LDI R25,0xE7 Load immediate
7: if (PINB&=0b00010000) //Если в PIN0 порта B единица, то
+00000021: B386 IN R24,0x16 In from I/O location
+00000022: 7180 ANDI R24,0x10 Logical AND with immediate
+00000023: BB86 OUT 0x16,R24 Out to I/O location
+00000024: B386 IN R24,0x16 In from I/O location
+00000025: 2388 TST R24 Test for Zero or Minus
+00000026: F011 BREQ PC+0x03 Branch if equal
8: PORTB=0b11101011; //Зелёный, иначе
+00000027: BB28 OUT 0x18,R18 Out to I/O location
+00000028: CFF8 RJMP PC-0x0007 Relative jump
9: else PORTB=0b11100111; //Красный
+00000029: BB98 OUT 0x18,R25 Out to I/O location
+0000002A: CFF6 RJMP PC-0x0009 Relative jump
9: else PORTB=0b11100111; //Красный
+0000002B: 94F8 CLI Global Interrupt Disable
+0000002C: CFFF RJMP PC-0x0000 Relative jump
+0000002D: FFFF ??? Data or unknown opcode
[color=#282828][font=helvetica, arial, sans-serif][size=4]

Железо 100% рабочее, лью другую прошивку, где используется трёхцветный светодиод, работает на ура. Камень - tiny2313A.

Да, при прошивке горит зелёный постоянно. На 16 ноге (PB4) присутствует 5 В, при замыкании на землю ничего не происходит.

Изменено пользователем Tokes
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

коплю на мечту - Днепр К750

Ссылка на комментарий
Поделиться на другие сайты


#include <avr/io.h> //Описание периферии

int main (void){
MCUCR=(0<<PUD); //Включаем подтяжку
DDRB= 0b00011100; //Три пина порта B на выход
while (1){ //Бесконечный цикл
if ((1<<0)&PINB) //Если в PIN0 порта B единица, то
PORTB=0b11101011; //Зелёный, иначе
else PORTB=0b11100111; //Красный
}}

Так работает.

И так тоже работает:

#include <avr/io.h>	  //Описание периферии		  
int main (void){
MCUCR=(0<<PUD);	    //Включаем подтяжку
DDRB= 0b00011100;	   //Три пина порта B на выход
while (1){	    //Бесконечный цикл
if   (PINB==(PINB|(1<<0)))	 //Если в PIN0 порта B единица, то
 PORTB=0b11101011;    //Зелёный, иначе 
else PORTB=0b11100111;    //Красный
}}

Изменено пользователем Tokes
Ссылка на комментарий
Поделиться на другие сайты

))) а подтяжка то где?

Вы пишите что спросить хотите, а то из предыдущего поста ничего не понять.

Складывается ощущение что вы просто похвастались знаниями аврстудио...

только что это значит PINB|(1<<0)? Опишите, а мы тут посмотрим как далеко заблудился ваш мозг.

Ссылка на комментарий
Поделиться на другие сайты

Ну ненужно сразу обижать человека - он же учиться !

Да копипастит недумая и не разбираясь в том что ему подсказывают! Но учится!

Ошибка у него банальная до безобразия

Он хочет сделать обычную проверку по нажатой кнопке

if (PINB&=0b00010000) //Если в PB4 порта B единица, то

Но данная запись говорит нам о том, что мы проверяем есть ли лог 1 на нужном выводе "И" на всех остальных ЛОГ 0.

в свою очередь условие PINB|(1<<0) - проверяет есть ли лог 1 на заданной лапе в независимости состояния остальных!

Именно по этой причине я и рекомендую новичкам конфигурировать регистровыми сдвигами а не двоичной системой.

коплю на мечту - Днепр К750

Ссылка на комментарий
Поделиться на другие сайты

if (PINB&=0b00010000) //Если в PB4 порта B единица, то

Но данная запись говорит нам о том, что мы проверяем есть ли лог 1 на нужном выводе "И" на всех остальных ЛОГ 0.

в свою очередь условие PINB|(1<<0) - проверяет есть ли лог 1 на заданной лапе в независимости состояния остальных!

Вы похоже тоже только учитесь, потому что все не так..

Во вложение проект в протеусе и аврстудио такой как должен быть, светодиоды подключены к РВ0 и РВ1, кнопка к РВ4.

Код программы:

#include <avr/io.h>                       //Описание регистров

int main (void){
   MCUCR=(0<<PUD);                   //Разрешаем подтяжку
   DDRB=0b1111101111;             //Два пина порта B на выход
   PORTB=~0b1111101111;         //Включаем подтяжку пина 4 порта B

   while (1){                                   //Бесконечный цикл
       if (PINB & 0b00010000)        //Если в PB4 порта B единица, то
           PORTB = 0b00010001;    //Зелёный, иначе
       else PORTB = 0b00010010; //Красный
   }
}

Test2313.zip

Изменено пользователем korsaj
Ссылка на комментарий
Поделиться на другие сайты

Да ну? И что же означает в данном конкретном случае такое условие?

if (PINB&=0b00010000)

Ну расшифруйте уж - сделайте милость!

з/ы/ в предыдущем посте не заметил что в выражении PINB|(1<<0) вместо "&" записанно "|"

Изменено пользователем kobraz

коплю на мечту - Днепр К750

Ссылка на комментарий
Поделиться на другие сайты

Легко if (PINB&=0b00010000) - расшифровывается строками

1 - PINB = PINB & 0b00010000 - операция изменения регистра порта!!! А зачем это нужно?

2 - If (PINB != 0) ..

C "PINB|(1<<0) вместо "&" записанно "|" " - правильно

Сравните это

7: if (PINB&=0b00010000) //Если в PIN0 порта B единица, то
+00000021: B386 IN R24,0x16 In from I/O location
+00000022: 7180 ANDI R24,0x10 Logical AND with immediate
+00000023: BB86 OUT 0x16,R24 Out to I/O location
+00000024: B386 IN R24,0x16 In from I/O location
+00000025: 2388 TST R24 Test for Zero or Minus
+00000026: F011 BREQ PC+0x03 Branch if equal

и это

10: if (PINB & 0b00010000) //Если в PB4 порта B единица, то
+00000021: 9BB4 SBIS 0x16,4 Skip if bit in I/O register set
+00000022: C002 RJMP PC+0x0003 Relative jump

Конечно более наглядно так if (PINB & (1<<PB4))

Изменено пользователем korsaj
Ссылка на комментарий
Поделиться на другие сайты

Корсаж

Я предлагаю вам внимательно и вдумчиво посмотреть на это условие

if (PINB&=0b00010000)

еще раз перед тем как делать умозаключения о моей компетентности в данном вопросе

Ибо

if (PINB & (1<<PB4)) - Таки да! "Если 1 на PB4"

НО

if (PINB&=0b00010000) - в корне неверная если требуется сделать проверку на 4 ножке. А если у меня при етом другие выводы порта задействованны на вход/выход?

коплю на мечту - Днепр К750

Ссылка на комментарий
Поделиться на другие сайты

НО

if (PINB&=0b00010000) - в корне неверная если требуется сделать проверку на 4 ножке. А если у меня при етом другие выводы порта задействованны на вход/выход?

Вы что там курите? if (PINB&=0b00010000) - НЕ МОЯ КОНСТРУКЦИЯ, ЭТО ТО ЧТО ВЫ ПРОСИЛИ ОБЪЯСНИТЬ!!!

И именно так никто и никогда пин не проверяет.

Вы вообще разницу видите между (PINB &= 0b00010000) и (PINB & 0b00010000)?

Изменено пользователем korsaj
Ссылка на комментарий
Поделиться на другие сайты

korsaj

Я не курю - это вы не закусываете!

Почитайте топик с начала.

ТопикСтартер написал именно вот так (PINB &= 0b00010000) на что я и выразил свое негодование и предложил ему учить матчасть и использовать на данном етапе знаний регистровые сдвиги для конфигурации дабы запись была такого вида if (PINB & (1<<PB4))

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

В своем репосте я копировал куски его кода - а я так понял что вы пришли к выводу что это я ему такую рекомендацию дал. Ну ей богу !

коплю на мечту - Днепр К750

Ссылка на комментарий
Поделиться на другие сайты

Ваши слова

if (PINB&=0b00010000) //Если в PB4 порта B единица, то

Но данная запись говорит нам о том, что мы проверяем есть ли лог 1 на нужном выводе "И" на всех остальных ЛОГ 0

И где тут написано про неправильность данного выражения, где тут совет не использовать данную конструкцию, где тут написано что идет модификация регистра PINB. А самое главное, то что значение PINB сново считывается и проверяется на неравенство 0, т.е любая лог 1 на пине порта приведет к тому что условие if (PINB&=0b00010000) выполнится!

Научитесь выражать свои мысли правильно.

и учите мат часть

Разберитесь с этим и сделайте вывод..

7: if (PINB&=0b00010000) //Если в PIN0 порта B единица, то
+00000021: B386 IN R24,0x16 In from I/O location
+00000022: 7180 ANDI R24,0x10 Logical AND with immediate
+00000023: BB86 OUT 0x16,R24 Out to I/O location
+00000024: B386 IN R24,0x16 In from I/O location
+00000025: 2388 TST R24 Test for Zero or Minus
+00000026: F011 BREQ PC+0x03 Branch if equal

Если вы конечно хоть чуточку разбираетесь в системе команд данного мк.

Изменено пользователем korsaj
Ссылка на комментарий
Поделиться на другие сайты

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

if (PINB&=0b00010000) //Если в PB4 порта B единица, то

Но данная запись говорит нам о том, что мы проверяем есть ли лог 1 на нужном выводе "И" на всех остальных ЛОГ 0.

Очевидно, что оба комментария неверны. Комментарию kobraz соответствует запись (!PINB ^ 0b00010000), то есть во-первых, разумеется, без присвоения (будем надеяться, он этого просто не заметил, а не незнание), а во-вторых не AND а NOT XOR. Про то, что сам кусок кода проверяет погоду на Марсе, а не лог. уровень на ножке, уже писали.

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

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

Ссылка на комментарий
Поделиться на другие сайты

неверно вы меня поняли я пытался обьяснить логику ошибки конструкции &= в данном случае

Изменено пользователем kobraz

коплю на мечту - Днепр К750

Ссылка на комментарий
Поделиться на другие сайты

Надеятся но то что кобза не заметил "=" не стоит, так как он не дал ответа на конкретно поставленный вопрос.

Вы вообще разницу видите между (PINB &= 0b00010000) и (PINB & 0b00010000)?

Мало логически мыслить, нужно еще знать архитектуру мк.

Ссылка на комментарий
Поделиться на другие сайты

Как это нет? Еще в 12 посте расписали, как определить состояние конкретного вывода.

Не лень впустую по клавишам стучать?
может народу скучно и развлекаются как могут :-)

неверно вы меня поняли я пытался обьяснить логику ошибки конструкции &= в данном случае

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

Я не про выводы контроллера, а про инструкции и архитектуру.

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

Ссылка на комментарий
Поделиться на другие сайты

А что про инструкции и архитектуру? korsaj привел ассемблерный код, в который разворачиваются оба варианта if'ов и уверен, что kobraz не способен его проанализировать. Тот просто не видит в этом смысла. Он считает, что и так доказал неработоспособность неправильной версии кода. Собственно говоря да, на неправильность той версии он указал, но сформулировать чем же именно она неправильна не смог: указал на какую-то мелкую ошибку, упустив основную. Теперь либо Кобраз докажет, что знает ассемблер и, соответственно, ту ошибку и правда не заметил (мало ли, не проснулся еще когда писал). Либо срач будет продолжаться до прихода админа, после чего полетит в мусорку. Либо кому-то из них надоест спорить и срач загнется естественным порядком. Лично мне самым достойным кажется первый вариант, а самым вероятным - последний.

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

Шутка, конечно, это вот второе предложение.

Тему могли бы почитать многие, но уверен, бОльшая часть из начинающих ничего не понимает и проходит мимо. Хотя дискуссия идет о нюансах применения инструкций. Было бы полезным многим. Если, конечно, они вернуться сюда.

Ссылка на комментарий
Поделиться на другие сайты

Да каких там нюансах, стандартнейшая конструкция языка Си, даже к контроллерам прямого отношения не имеет!

Алгоритм проверки установлен ли в переменной Х бит Y: if(X & (1<<Y)){}else{} Надо развернуть или все же почитаете литературу?)

Выражение X &= Y - побитовое И первого аргумента и второго: в 1 устанавливаются только те биты переменной Х, которые до того были в 1, и которые в переменной Y также были 1. Все остальные биты сбрасываются в 0.

Выражение if(X &= Y){} сначала выполняется логическое И (см выше), потом, если результат не ноль, выполняется какой-то код. Если ноль - не выполняется. Оказывается, компилятор Си для контроллеров между операциями И и сравнения с нулем повторно считывает значение переменной. Точно не знаю, зачем он это делает, впрочем, и смысла в таком действии обычно нет. Как и смысла разбирать этот конкретный код.

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

Алгебра логики мне "чуть-чуть" знакома :) Детское увлечение, высшее радиотехническое и последующая работа.

Очень давно начинал изучение с ВМ80 (курс в институте), потом писал прикладные программы для МК51. С тех пор многое перевернулось... И вот результат. :(

Не тратьте время на старого лентяя. Мне пока не до изучения языков. :(

Спасибо.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • Ну это-то да, просто в качестве первоисточника всегда указывались чехи. И что автор вообще грек. И что напряжение там не более 20В, что китайцы разогнали его по напряжению (и по току). А оказалось - только по току и то - незначительно. И изначально задуманный в этих пределах он, несмотря на много раз раскритикованную, но относительно простую схему выдает очень даже хорошие характеристики и по сей день.
    • Нет, не резонанс, а амплитуда колебаний уменьшается все ближе и ближе к гистерезису реле. Чтобы этого избежать сделайте генератор на реле независимым от цепей светодиодов.
    • картинка из даташита на АТмега32 сигналы - это то, что написано около стрелок. а PA6, PB0... и т.д. - это названия выводов (портов) МК. а если ты собрал и работает, то все сигналы ты подключил правильно.
    • https://rutube.ru/video/73956e720c1b321ee7434bcc71d6fb99/ ШИМ регулятора CCM5D (DC) 6-30 В 6А с дисплеем - это регулятор для 12В эл.двигателя, при чем здесь частотники. Для своих частотников поставьте сопротивление для регулировки оборотов, либо токовый задатчик (4-20 мА). Контроль оборотов можно контролировать по току двигателя. то есть амперметр где вам удобно.
    • идея использования, как регистры флагов, понятна. а GPIOR1 и GPIOR2 разве нельзя использовать, как регистры флагов? у меня, как раз, используется TWI для вывода на экран 1602 через модуль I2C. но идея понятна. а в АТмега8 можно использовать флаг Т в регистре SREG. но устанавливать его после восстановления SREG перед выходом из прерывания. или коротко, как у тебя: set reti но такое можно делать, если обработка события (прерывания) может подождать. но такая отложенная обработка прерывания бывает очень редко. поэтому у меня даже в мыслях не было, чтобы отложить обработку прерывания.
    • Плата не регулирует. Но параметры ламп регулируются. Займитесь этим, и всё получится. В своё время купил часы, так там все разряды светились. В подвале видать собирали - лихие 90 -е. И на рынке купил. Недавно сделал. Половину деталей не поставили, и номиналы не те. Часы валялись конечно, но теперь в строю.  И ещё. Мне лично не приходилось встречаться с часами на лампах. Надо посмотреть даташит режима работы  ваших ламп, а они все одинаковы.    Надо запереть немного ток. И да, проверить цепи накала. Там тоже "подлянка" бывает. У меня была. Не поставили токоограничивающие резисторы 9,1 Ом.
×
×
  • Создать...