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

Александр5786336

Members
  • Постов

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

  • Посещение

Весь контент Александр5786336

  1. здравствуй, насчет извращения с указателем, разбираюсь с работой меток и указателей и тыкаю их куда попало, а насчет выводов предлагаете DDRD=0x00; PORTD=0xFF; требований никаких нет. по DDRD=0x00, portd=0x00, portd=0xff, почитал вроде ясно спасиба. мой косяк.
  2. Подскажите пожалуйста в чем может быть проблема, должно быть нажимаем на одну из 5 кнопок, а мк выводит на 7сег номер кнопки, сейчас если начинаем счет с 5ой и по убыванию то норм, если с 0 и по возрастанию то выводит только 0. до этого пробовал через switch результат такой же fine F_CPU 8000000 #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> unsigned char temp,rab,count,but; unsigned char *point; unsigned char mas[10]={0x3F,0x6,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F}; void initport() { DDRD=0x00; PORTD=0x00; DDRB=0xFF; PORTB=0x00; ACSR=0x80; } void inittimer() { TCCR1B|=(1<<WGM12)|(1<<CS12)|(1<<CS10); TIMSK|=(1<<OCIE1A); OCR1A=487; TCNT1=0; } unsigned char conversion(i) { but=*(point+i); return but; } int main(void) { initport(); inittimer(); point=&mas; while(1) { if (PIND!=0) { _delay_ms(100); while((PIND&(1<<count))==0) { ++count; } PORTB=conversion(count); count=0; } } }
  3. немного разобрался выводить инфу начал через прерывания, а на виртуальном терминале не показывал так как там скорость другая выставлена была.
  4. а не подскажешь зачем после цикла while точку с запятой ставить? это что такое? или это выполнение пустого цикла? запутался
  5. while (UCSRA&(1<<UDRE)) тут у нас цикл передачи начинается т.к. в регистре UCSRA бит UDRE выставлен в 1(UDR пуст в начале работы), после загрузки 0 или 1 в зависимости от нажатия кнопки цикл больше не выполняется до полной отправки кадра, а в варианте while (!(UCSRA&(1<<UDRE))) мы изначально не можем войти в цикл т.к. получаем в цикле проверки 0. как я понял. хотя везде используют while (!(UCSRA&(1<<UDRE))). в функции инициализации порта все сделано void initport() { DDRD=0xFF; PORTD=0x00; DDRB=0x00; PORTB=0x00; ACSR=0x80; } ну 1 это void sendusart(unsigned char but) { while (UCSRA&(1<<UDRE)) { UDR=but; } } данная функция 2 это void sendusart(unsigned char but) { while (!(UCSRA&(1<<UDRE))) { UDR=but; } } данная функция
  6. народ, подскажите пожалуйста в чем ошибка и есть ли она, в протеусе видно что число уходит в виртуальный терминал, а на дисплее ничего не отображается и еще, цикл передачи везде записывается как смотрите "2", а у меня при таком условии в цикл загрузки значения в регистр не заходит, а через "1" все норм. #include <avr/io.h> #include <util/delay.h> unsigned char temp,rab,button; void initport() { DDRD=0xFF; PORTD=0x00; DDRB=0x00; PORTB=0x00; ACSR=0x80; } void initusart() { UCSRB|=(1<<RXEN)|(1<<TXEN); UCSRC|=(1<<UCSZ1)|(1<<UCSZ0); UBRRH=0x00; UBRRL=0xCF; } //1// void sendusart(unsigned char but) { while (UCSRA&(1<<UDRE)) { UDR=but; } } int main(void) { initport(); initusart(); while(1) { if (PINB&(1<<0)) { if (button==0) { temp='1'; button++; } } else { temp='0'; } sendusart(temp); _delay_ms(200); } } //2// void sendusart(unsigned char but) { while (!(UCSRA&(1<<UDRE))) { UDR=but; } }
  7. на таймере не пробовал, сейчас на двухпроводный режим перехожу, адресация приемника(хочу попробовать с tiny2313 на tiny2313 числа передать) через define задается последние три числа как я понял? если есть куски трехпроводной буду премного благодарен (для общего развития)
  8. все отлично, в протеусе пошло спасиба, а то всю голову сломал.
  9. премного благодарен за ответ, буду пробовать.
  10. Народ, помогите разобраться пожалуйста вот код #include <avr/io.h> #include <stdlib.h> #include <avr/interrupt.h> unsigned char rab,i,b; ISR(USI_OVERFLOW_vect) { PORTD=0xFF; USISR|=(1<<USIOIF); b=1; } void initport() { DDRD=0xFF; PORTD=0x00; DDRB=0xFF; PORTB=0x00; ACSR=0x80; } void initusi(unsigned char temp) { b=0; USIDR=temp; USISR|=(1<<USIOIF); while(~(USISR&(1<<USIOIF))) { if ((USIDR!=0)||(b==0)) { USICR|=(1<<USIOIE)|(1<<USIWM0)|(1<<USICLK)|(1<<USITC); } else { return; } } } int main(void) { initport(); while(1) { sei(); rab=rand()%1000; initusi(rab); } } в atmel studio 6 видно что значение temp помещается в USIDR ,видно что происходит сдвиг, с увеличением счетчика, а забивая прогу в proteus на выходе с порта B, а именно с ножки MOSI ничего не выходит, даже синхронизирующий сигнал отсутствует, хотя регистр USITC выставлен и повторяется. заранее благодарен за ответы или направление.
×
×
  • Создать...