TriS 0 28 декабря, 2010 Опубликовано 28 декабря, 2010 · Жалоба Пишу код под attiny2313, на CAVR. Сталкнулся с такой вот проблемой. порт В4 настроен на выход, дефолтом на нем 0. код: ..... PORTB |= 1<<4; delay_ms(500); PORTB |= 1<<4; ..... повторная запись единички в регистр переводит его состояние в ноль, как от этого избавиться? мне все рано что было на выводе до исполнения команды, но когда я хочу туда записать 1, я хочу быть уверен что порт не упадет в 0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zhevak 0 28 декабря, 2010 Опубликовано 28 декабря, 2010 · Жалоба Забавно. А прерывания у Вас задействованы? Может где-то в прерываниях есть код, который обнуляет B4 ? Как определили, что именно повторное обращение к порту обнуляет B4 ? Ассемблерный листинг показать можете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 35 28 декабря, 2010 Опубликовано 28 декабря, 2010 · Жалоба А может быть у него за 500 мс WatchDog срабатывает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TriS 0 28 декабря, 2010 Опубликовано 28 декабря, 2010 (изменено) · Жалоба прерывания не использую, компилирую и тут же эмулирую в протеусе /***************************************************** This program was produced by the CodeWizardAVR V2.04.4a Advanced Automatic Program Generator © Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 26.12.2010 Author : NeVaDa Company : Comments: Chip type : ATtiny13A AVR Core Clock frequency: 3,686400 MHz Memory model : Tiny External RAM size : 0 Data Stack size : 16 *****************************************************/ #include <tiny2313.h> // 1 Wire Bus functions #asm .equ __w1_port=0x18 ;PORTB .equ __w1_bit=7 #endasm #include <1wire.h> #include <delay.h> #include <stdio.h> #define DS1990_FAMILY_CODE 1 #define SEARCH_ROM 0xF0 #define MAX_DEVICES 1 #define MAX_SERIAL 9 /* DS1990 devices ROM code storage area, 9 bytes are used for each device (see the w1_search function description), but only the first 8 bytes contain the ROM code and CRC */ unsigned char rom_code[MAX_DEVICES][MAX_SERIAL]; eeprom unsigned char key[MAX_DEVICES][MAX_SERIAL]; // Declare your global variables here void main(void) { unsigned char i,j,devices; // Declare your local variables here // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Declare your local variables here // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initialization // Port A initialization // Func2=In Func1=In Func0=In // State2=T State1=T State0=T PORTA=0x00; DDRA=0x00; // Port B initialization PORTB=0xE0; //PORTB=0b11100000; DDRB=0b00011000; // Port D initialization // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=0x00; TCCR0B=0x00; TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // 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=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: Off GIMSK=0x00; MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // Universal Serial Interface initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; // 1 Wire Bus initialization w1_init(); //devices=w1_search(SEARCH_ROM,&rom_code[0][0]); // PORTB |= 1<<3; //// PORTB |= 1<<4; // delay_ms(1000); // PORTB &= ~(1<<4); //PINB.4=1; // PINB.3=1; delay_ms(600); // PINB.3=0; // PINB.4=0; while (1) { devices=w1_search(SEARCH_ROM,&rom_code[0][0]); // detect how many 1 Wire devices are present on the bus delay_ms(470); if(PINB.6==0) { PORTB &= ~(1<<4); delay_ms(250); PORTB &= ~(1<<4); } if(PINB.5==0) { PORTB |= 1<<3; delay_ms(250); PORTB |= 1<<3; } } } Изменено 28 декабря, 2010 пользователем TriS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zhevak 0 28 декабря, 2010 Опубликовано 28 декабря, 2010 · Жалоба Какой кошмар! Я не нашел в Вашем тескте указанную в первом сообщении последовательность PORTB |= 1<<4; delay_ms(500); PORTB |= 1<<4; Зато увидел другие, похожие последовательности команд. И даже дважды повторяющийся код // Declare your local variables here // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif Но это так, попридираться. Но что более существенно, я увидел подключенную библиотеку 1w-интерфейса и использование ее функций. В целях разобраться с проблемой, я бы отрубил все это. Оставил бы голый код. Тот, который вы привели в первом сообщении. Ну и я никогда не доверял Протеусам. Только железо! И я еще раз повторю свой вопрос по ассемблерному листнигу. Вы привели Си-шный, это не то! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TriS 0 28 декабря, 2010 Опубликовано 28 декабря, 2010 · Жалоба Прилагаю весь проект с кодом. Только недавно где-то читал что некоторые типы микросхем именно так работают :-( ___.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 28 декабря, 2010 Опубликовано 28 декабря, 2010 · Жалоба Только недавно где-то читал что некоторые типы микросхем именно так работают :-( Так да не так. Если бы вы использовали PINB, то тогда да. А приведенный вами кусок не должен ничего менять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 35 28 декабря, 2010 Опубликовано 28 декабря, 2010 · Жалоба У вас вот чего написано: PORTB |= 1<3; а надо, видимо: PORTB |= 1<<3; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Goodefine 0 28 декабря, 2010 Опубликовано 28 декабря, 2010 · Жалоба Непонятно из-за чего сделано заключение, что повторная запись 1-цы устанавливает пин в ноль. Может иллюзия возникла из-за этого присутствующего куска кода: if(PINB.6==0) { PORTB |= 1<<3; delay_ms(500); PORTB &= ~(1<<3); } if(PINB.5==0) { PORTB |= 1<<4; delay_ms(500); PORTB &= ~(1<<4); } Тогда все логично. Если нет, оставьте минимальный код с проблемой. Сейчас выложенный код работает как и должен. Разумеется, надо исправить ошибку, на которую указала Xenia... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
follow_me 0 28 декабря, 2010 Опубликовано 28 декабря, 2010 · Жалоба Автор бы в принципе разобрался как это работает PORTB - это адрес порта в памяти запись PORTB |= это сокращенная версия для PORTB = PORTB | начение запись 1 << 4 это операция смещения значения на 4 позиции влево т.е. было 00000001 стало 00001000 теперь обобщим POORTB = 00001000 | 00001000 та как операция | или bitwise или обращается в ноль только если оба операнда равны нулю и при этом вы хоть раз успешно записали оно не может не работать , и как следствие вы ошибаетесь в коде довольно простые правила работы Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
codenamehawk 0 30 декабря, 2010 Опубликовано 30 декабря, 2010 · Жалоба PORTB |= 1<<4; delay_ms(500); PORTB |= 1<<4; Раз на CVAVR ваш код равен PORTB.4=1; delay_ms(500); PORTB.4=1; И тот и другой код должен работать, но компилятор после оптимизации, скорее всего, вторую установку порта выкинет и в протеусе вы ее не увидите. ( У вас в проге такого куска то и не найти) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 30 декабря, 2010 Опубликовано 30 декабря, 2010 · Жалоба но компилятор после оптимизации, скорее всего, вторую установку порта выкинетС чего бы это ему вдруг выкинуть обращение к volatile-переменной? Если все же выкинет - в топку такой компилятор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
codenamehawk 0 3 января, 2011 Опубликовано 3 января, 2011 · Жалоба С чего бы это ему вдруг выкинуть обращение к volatile-переменной? Если все же выкинет - в топку такой компилятор. Вы правы, обращение к порту компилятор не выкинет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться