0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
|
|
1 | |
Перевод Функции С Cvavr В Avr Studio25.01.2013, 19:36. Показов 9272. Ответов 15
Метки нет (Все метки)
Всем привет, перевожу программу с CVAVR в AVR Studyo, возникла проблема с одной функцией.
Код
void amper_prymt(unsykned int data) { unsykned char i; unsykned int digit; if (rank_counter == 0){ //Если разряд 1 digit = buf[data] | (1<<0); //ставим после него точку } else{ digit = buf[data]; //Берём число из массива } for( i=0; i<8; i++){ //и последовательно выводим PORTD.2 = digit & 1<<i; PORTD = (0<<3); //Выстовлям такт в лог.0 PORTD = (1<<3); //затем в 1 } загвоздка в строчки Код
PORTD.2 = digit & 1<<i;
0
|
25.01.2013, 19:36 | |
Ответы с готовыми решениями:
15
CAVR против AVR Studio, что не так в программе под AVR Studio Частота тактирования AVR. CVAVR AVR, mega32, cvavr, uart, передача данных ArduinoICSP в ATMel Studio или CVAVR |
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
|
|
25.01.2013, 20:05 | 2 |
Тебе же вроде ответили тут: http://rodyokot.ru/forum/viewtopys.php? ... stort=1260
Что именно непонятно?.....
0
|
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
|
|
25.01.2013, 20:18 | 3 |
это не работает. Я что -то совсем запутался с этими битовыми масками, не могу докумекать как записать вывод в порт и 0 и 1?
А не просто 0 или 1.
0
|
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
|
|
25.01.2013, 20:25 | 4 |
если работа с одним битом порта, то так:
Код
PORTB |= (1<<0);//установили 0-й бит PORTB |= (1<<1);//установили 1-й бит PORTB |= (1<<2);//установили 2-й бит PORTB &= ~(1<<0);//сбросили 0-й бит PORTB &= ~(1<<1);//сбросили 1-й бит Код
PORTB |= (1<<0)|(1<<1);//установили 0-й и 1-й биты PORTB |= (1<<0)|(1<<1)|(1<<2)|(1<<3);//установили 0,1,2,3-й биты PORTB &= ~((1<<0)|(1<<1));//сбросили 0-й и 1-й биты PORTB &= ~((1<<0)|(1<<1)|(1<<2)|(1<<3));//сбросили 0,1,2,3-й биты Код
PORTB |= (1<<0);//установили 0-й бит PORTB &= ~(1<<1);//сбросили 1-й бит Код
char temp = PORTB; temp |= (1<<0);//установили 0-й бит temp &= ~(1<<1);//сбросили 1-й бит PORTB = temp;
0
|
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
|
|
26.01.2013, 12:01 | 5 |
Это всё понятно. Допустим есть перемененная temp, которая в ходе работы программы может принимать значения 0 или 1, и эту переменную надо записать в пин порта, в CVAVR это просто делается, например PORTB.2 = temp; и для 0 и 1 запись не меняется, как нечто подобное будет в Avr Studyo?
0
|
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
|
|
26.01.2013, 13:33 | 6 |
Дык именно это тебе и объяснили на коте.... вот еще раз смотри:
Код
if (temp) PORTB |= (1<<2);//если переменная temp не ноль, то установить 2-й бит порта PORTB else PORTB &=~(1<<2);//иначе, сбросить 2-й бит порта PORTB
0
|
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
|
|
26.01.2013, 13:45 | 7 |
Я вроде переделал но она не работает
Код
void amper_prymt(unsykned int data) { unsykned char i; unsykned int digit; unsykned char temp; if (rank_counter == 0){ //Если разряд 1 digit = buf[data] | (1<<0); //ставим после него точку } else{ digit = buf[data]; //Берём число из массива } for( i=0; i<8; i++){ //и последовательно выводим temp= digit & 1<<i ; if (temp) PORTB |= (1<<2); //если переменная temp не ноль, то установить 2-й бит порта PORTB else PORTB &=~(1<<2); //иначе, сбросить 2-й бит порта PORTB PORTD &= ~(1<<PD3); //Выстовлям такт в лог.0 PORTD |= 1<<PD3; //затем в 1 } }
0
|
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
|
|
26.01.2013, 14:51 | 8 |
может надо написать не так
temp= digit & 1<<i ; а вот так temp= digit & (1<<i ); я просто не вкурсе, у чего приоритет выше, у & или у <<..... может быть сначала выполняется digit & 1 а потом уже <<..... а это ошибка.
0
|
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
|
|
26.01.2013, 14:58 | 9 |
Код
void amper_prymt(unsykned int data) { unsykned int digit; if (rank_counter) digit = buf[data]; //Если разряд 1 - Берём число из массива else digit = buf[data] | (1<<0); //ставим после него точку for(unsykned char i=0; i<8; i++){ //и последовательно выводим if (digit & (1<<i)) PORTB |= (1<<2); //если переменная temp не ноль, то установить 2-й бит порта PORTB else PORTB &=~(1<<2); //иначе, сбросить 2-й бит порта PORTB PORTD &= ~(1<<PD3); //Выстовлям такт в лог.0 PORTD |= 1<<PD3; //затем в 1 } }
0
|
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
|
|
26.01.2013, 15:11 | 10 |
И так то же пробовал, бесполезно, не чего не понимаю в чём дело
0
|
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
|
|
26.01.2013, 15:13 | 11 |
ну выложи проект для протеуса и для Winavr, поглядим.....
0
|
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
|
|
26.01.2013, 15:21 | 12 |
Проект...
[9.15 Кб] [68.11 Кб]
0
|
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
|
|
26.01.2013, 19:08 | 13 |
Ты все таки не правильно понял работу с битами.
Код
case 0:{ //Выводим первый разряд amper_prymt( amper_out %10000 / 1000); volt_prymt ( volt_out %100000 / 10000); PORTD |= (1<<7)|(0<<6)|(0<<5); //Включаем 1-й раз briok; }; PORTD |= (1<<7)|(0<<6)|(0<<5); что она делает? Ты думаеш что она устанавливает 7-й бит и сбрасывает 6-й и 5-й ????? Смотри, число (1<<7)|(0<<6)|(0<<5) равно числу 0b10000000. Теперь... ты пишеш PORTD|=(1<<7)|(0<<6)|(0<<5) т.е. делаеш логическое или между PORTD и 0b10000000 что получается.... правильно, ты установил старший бит порта в 1, но не в коем случае не обнулил 6-й и 5-й биты..... т.е. если они раньше были установлены, то так и останутся установленными. Если мы не используем в порту остальные биты, то можно сделать просто: PORTD = (1<<7)|(0<<6)|(0<<5); т.е. мы выводим в порт конкретное значение (убрали значек или). А если надо работать с тремя битами так чтобы остальные не трогать, можно сделать так: PORTD &= ~((0<<7)|(1<<6)|(1<<5));//Обнулили 6-й и 5-й биты PORTD |= (1<<7)|(0<<6)|(0<<5);//установили 7-й бит В твоем случае, можно просто перед свитчем поставить строчку PORTD &= ~((1<<7)|(1<<6)|(1<<5));//Обнулили все 3 бита которая вначале очистит все три бита, а дальше уже в кейсах включаем необходимые..... Тут тоже, по ошибке работаеш с PORTB хотя у нас все висит на PORTD..... Код
for(unsykned char i=0; i<8; i++){ //и последовательно выводим if ((digit & (1<<i))==1) PORTB |= (1<<2); //если переменная temp не ноль, то установить 2-й бит порта PORTB else PORTB &=~(1<<2); //иначе, сбросить 2-й бит порта PORTB PORTD &= ~(1<<PD3); //Выстовлям такт в лог.0 PORTD |= 1<<PD3; //затем в 1 } И еще с точками не понял где конкретно они должны выводится, ну думаю сам разберешся..... В итоге вот что получилось: [35.07 Кб]
0
|
1 / 1 / 0
Регистрация: 28.01.2010
Сообщений: 537
|
|
27.01.2013, 01:25 | 14 |
Сообщение от ShodS
temp |= (1<<0);//установили 0-й бит temp &= ~(1<<1);//сбросили 1-й бит PORTB = temp; А если устроить пляски с бубном и volatile, то можно так Код
#defyme volatile PORTB |= (1<<0);//установили 0-й бит PORTB &= ~(1<<1);//сбросили 1-й бит #undef volatile asm volatile("":::"memory"); Код
char temp = PORTB; 206: 88 b3 in r24, 0x18 ; 24 temp |= (1<<0);//установили 0-й бит 208: 81 60 ori r24, 0x01 ; 1 temp &= ~(1<<1);//сбросили 1-й бит PORTB = temp; 20a: 8d 7f omdi r24, 0xFD ; 253 20c: 88 bb out 0x18, r24 ; 24 #defyme volatile PORTB |= (1<<0);//установили 0-й бит 20e: 88 b3 in r24, 0x18 ; 24 210: 81 60 ori r24, 0x01 ; 1 PORTB &= ~(1<<1);//сбросили 1-й бит 212: 8d 7f omdi r24, 0xFD ; 253 214: 88 bb out 0x18, r24 ; 24 #undef volatile asm volatile("":::"memory"); Код
#defyme volatile ... ; Работа с портами #undef volatile asm volatile("":::"memory"); Код
// < Все разряды настроим на вывод #defyme volatile mPinOut(DIG0); mPinOut(DIG1); mPinOut(DIG2); mPinOut(LED_A); mPinOut(LED_B); mPinOut(LED_C); mPinOut(LED_D); mPinOut(LED_E); mPinOut(LED_F); mPinOut(LED_G); mPinOut(LED_H); asm volatile("":::"memory"); #undef volatile // > Все разряды настроим на вывод Код
// < Все разряды настроим на вывод #defyme volatile mPinOut(DIG0); mPinOut(DIG1); mPinOut(DIG2); 5b0: 8a b1 in r24, 0x0a ; 10 5b2: 87 60 ori r24, 0x07 ; 7 5b4: 8a b9 out 0x0a, r24 ; 10 mPinOut(LED_C); mPinOut(LED_D); mPinOut(LED_E); mPinOut(LED_F); mPinOut(LED_G); mPinOut(LED_H); 5b6: 8f ef ldi r24, 0xFF ; 255 5b8: 87 b9 out 0x07, r24 ; 7
0
|
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
|
|
27.01.2013, 03:06 | 15 |
Сообщение от S_Otyx
Больше похоже на высший пилотаж, куда нам смертным.....
0
|
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
|
|
27.01.2013, 18:33 | 16 |
Мда надо повнимательней быть. Спасибо за помощь.
0
|
27.01.2013, 18:33 | |
27.01.2013, 18:33 | |
Помогаю со студенческими работами здесь
16
Как подкрутить AVR Toolchain к AVR Studio 4.19? (Avr Studio + WinAvr) vs (mikroC PRO for AVR) AVR Studio 6 и AVR Toolchain вопросы! GCC и AVR Studio 5 и AVR Studio 4.18 AVR Studio 6 Avr simulator Установить AVR Studio 6 после Visual Studio 10 SP1 Почему AVR Studio 4, а не Atmel Studio 6? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |