Igor-13

Members
  • Публикации

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

  • Посещение

Репутация

1 Обычный

О Igor-13

  • Звание
    Осваивающийся

Информация

  • Город
    Белгород

Электроника

  • Стаж в электронике
    10-20 лет
  • Сфера радиоэлектроники
    ремонт
  • Оборудование
    Осциллограф, ГСС, DT-838, паяльник-пистолет

Посетители профиля

853 просмотра профиля
  1. не равно нулю
  2. Пытаюсь сделать Переключатель на ATmega8. Вход -две кнопки независимы, выход - один порт 8 пинов. Каждая кнопка управляет своим сдвигом, а на выходе комбинация состояний. Сочинил программу, а она работает не так как задумал. Сдвиги по отдельности работают хорошо, а вот комбинацию их состояний не могу получить правильно. Где ошибка? Вот мой код #include <mega8.h> // частота CP 4мгц. #include <delay.h> unsigned char temp = 0x01; unsigned char n = 0; unsigned char temp1 = 0x01; unsigned char n1 = 0; unsigned char temp0 = 0x00; unsigned char m = 0; void main(void) { DDRB = 0xFF; PORTB = 0x00; DDRD = 0xFF; PORTD = 0x00; // выходы PORTB и PORTD. DDRC = 0x00; PORTC=0x03; // входы PC0 и PC1. подключаем нагрузочные резисторы к PC0 и PC1 while(1) { delay_ms(100); // главный цикл //A: while(PINC==0x03) {PORTD = temp0; } // если ничего не нажато, то топчемся здесь. if (PINC.0==0) { temp = temp << 1; n++;} // если PINC.0 нажат, сдвигаем на 1 разряд temp вправо ( n=1, 00000010.) while(PINC.0==0) { } // пока PINC.0 нажато, ждем когда отпустит while (n==!0) { m=n+n1; // бесконечный цикл. если n не нуль, то выбираем if (m==0) PORTD=0b00000000; if (n==1) {if (n1==8) PORTD=0b00000001;} else PORTD=0b00000000; if (n==2) {if (n1==7) PORTD=0b00000010;} else PORTD=0b00000000; if (n==3) {if (n1==6) PORTD=0b00000100;} else PORTD=0b00000000; if (n==4) {if (n1==5) PORTD=0b00001000;} else PORTD=0b00000000; if (n==5) {if (n1==4) PORTD=0b00010000;} else PORTD=0b00000000; if (n==6) {if (n1==3) PORTD=0b00100000;} else PORTD=0b00000000; if (n==7) {if (n1==2) PORTD=0b01000000;} else PORTD=0b00000000; if (n==8) {if (n1==1) PORTD=0b10000000;} else PORTD=0b00000000; } if (n==8) {temp = 0x01; n=0;} delay_ms(100); while(PINC==0x03) {PORTD = temp1; } if (PINC.1==0) { temp1 = temp1 << 1; n1++; } // сдвигаем на 1 разряд temp вправо while(PINC.1==0) { } while (n==!0) { m=n+n1; // бесконечный цикл. if (m==0) PORTD=0b00000000; if (n==1) {if (n1==8) PORTD=0b00000001;} else PORTD=0b00000000; if (n==2) {if (n1==7) PORTD=0b00000010;} else PORTD=0b00000000; if (n==3) {if (n1==6) PORTD=0b00000100;} else PORTD=0b00000000; if (n==4) {if (n1==5) PORTD=0b00001000;} else PORTD=0b00000000; if (n==5) {if (n1==4) PORTD=0b00010000;} else PORTD=0b00000000; if (n==6) {if (n1==3) PORTD=0b00100000;} else PORTD=0b00000000; if (n==7) {if (n1==2) PORTD=0b01000000;} else PORTD=0b00000000; if (n==8) {if (n1==1) PORTD=0b10000000;} else PORTD=0b00000000; } if (n1==8) {temp1 = 0x01; n1=0;} delay_ms(100); }} // фигня. PORTD.0 мигает по разному.
  3. про ШИМ забыл. почитаю попробую.
  4. спасибо. буду пробовать, мне трудно сообразить как это сделать, слаб в программировании, поэтому ёрзаю. вот мой пример генератор 2 кГц.rtf
  5. жаль, что на выходе не гамма 7 нот, а одна нота разных октав. продолжил мучить мк. запустил два таймера Т0 и Т1. хотел получить разные частоты. но на обоих портах одна частота. пробовал смешивать их сигналы, типа if (PINB.0==1) PORTD.0=PINB.3 получается трель непонятная, но не сумма. как бы на другом порту получить другую (не кратную первой) частоту?
  6. @Berg спасибо. запустил на все ножки порта (В0 - В7). работает отлично. то что надо.
  7. спасибо, попробую запустить.
  8. да, синусоидальным для меня это рановато. буду делить прерываниями, может быть получится.
  9. кратность допускаю. пусть будет типа 4кГц - 2,5кГц - 1.5кГц - 0,5кГц. я уже думал использовать внутренний генератор Т0 и делить его по разному, но пока не хватает знаний. так не интересно. учусь делать схемы на микроконтроллерах. узнаю их возможности. на одном таймере легко, если один выход. а надо 4 и более выхода с разными частотами одновременно. в принципе это возможно? или надо искать мк с множеством таймеров?
  10. Захотел сделать генератор звуковых импульсов на Мега8. Написал программу на кодевижн. Вроде все правильно. А он работает, звук есть на всех ножках, но не так как хотел, короткими вспышками. А я хотел, чтобы частоты на выходах шли беспрерывно, одновременно на всех выходах. В чем ошибка, подскажите пожалуйста. Код моей программы #include <mega8.h> // внутренний генератор 8мгц. #include <delay.h> #define BEEP0 PORTB.0 // назначаем ножки для выхода звука #define BEEP1 PORTB.1 #define BEEP2 PORTB.2 #define BEEP3 PORTB.3 #define BEEP4 PORTB.4 void Beep0() { register int i = 0; // подпрограмма звука for(i = 0; i<400; i++){ BEEP0 =!BEEP0; delay_us(1900); } } // частота равна 1/1,9 ms =526 Гц. около void Beep1() { register int i = 0; for(i = 0; i<400; i++){ BEEP1 =!BEEP1; delay_us(1500); } } // частота равна 1/1,5 ms =700 Гц. около void Beep2() { register int i = 0; for(i = 0; i<400; i++){ BEEP2 =!BEEP2; delay_us(1200); } } // частота равна 1/1,2 ms =800 Гц. около void Beep3() { register int i = 0; for(i = 0; i<400; i++){ BEEP3 =!BEEP3; delay_us(1000); } } // частота равна 1/1,0 ms =1000 Гц. около void Beep4() { register int i = 0; for(i = 0; i<400; i++){ BEEP4 =!BEEP4; delay_us(700); } } // частота равна 1/0,7 ms =1200 Гц. около void main(void) { PORTB=0x00; DDRB=0xFF; delay_ms(400); // инициализируем ножек порта B. while(1){ Beep0(); Beep1(); Beep2(); Beep3(); Beep4(); } }
  11. да, понял. спасибо. Оказалось, надо делать так - interrupt [USART_RXC] void usart_rx_isr(void) {обработчик прерывания} А потом, в майне вставить #asm("sei") // разрешаем глобально прерывания. И все заработало, вопрос-ответ, все норм. Только не выводит "Ок!" почему-то. CVAvr версия 2.05.0
  12. у меня получалось пересылать символы из МК в ПК и обратно из ПК в МК. там все нормально, без прерываний. а тут хочу получить ответ на посыл. и без прерывания не получается. вот код программы чего не хватает? вот говорит Error: function argument #1 of type 'flash unsigned char [10]' is incompatible with required parameter of type 'unsigned char []'
  13. В CVAVR не могу запустить программу вопрос-ответ через uart. не получается прерывание ISR, #include <mega8.h> ISR (USART_RXC_vect) { int b; b = UDR; // Это подпрограмма обработки прерывания Не работает функция ISR (USART_RXC_vect) - выдает ошибку. чего-то требует . остальная часть программы - без ошибок. может какую-то библиотеку надо? В папке CVAVR не нашел файла interrupt.h Как делается прерывание по uart ?