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

Дар

Участник
  • Постов

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

  • Посещение

Репутация

0 Обычный

Информация о Дар

  • День рождения 12.08.1990

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. не помогло, изтятие из програмы 3 диода, оставил только два. тоже самое. заскакивает в прервание сраху после выхода.
  2. бЛин точно, спасибо. это да, это дали маху. только что попробывал вырубить, походу это не едиственый бок. так как не помогло.
  3. Спасибо за указания, попробую переделать макет. Хотя все еще не понимаю как по вашему функция atoi. и printf могут быть связаны с прерыванием(я их на ассеблере видел, ну то что отображаеться в cntrl+D).
  4. И что в схеме не так? и почему этого раньше никто не заметил. В КПИ уже 3 курс используют этот макет.
  5. реальная схема в аудитории. но макет с нее делался.
  6. я пробывал вырубать все оставляя только светодиоды и прерывание. #include <reg51.h> //#include <stdlib.h> //#include <stdio.h> sbit P3_5 = P3^5; sbit P3_4 = P3^4; sbit P3_3 = P3^3; static unsigned int delay = 0; char xdata str[200]; //volatile int N; unsigned int L = 1; unsigned int i = 0; unsigned int a = 1; unsigned int b = 0; unsigned int c = 0; void initialize_system (void){ // SCON = 0x52; // TMOD |= 0x20; // TH1 = 0xFa; // TR1 = 1; // TI = 1; P3_3 = a; P3_4 = b; P3_5 = c; TCON |=0x04; // 3 IE |=0x84; } /* unsigned int num_element() { printf("\nEnter the number of push on button Int1 for invert led\n",str); gets (str, sizeof(str)); N = atoi(str); // ASCII to integer return N; } */ void intrrupt_butInt1(void) interrupt 2 { while (i == 5 - 1){ i = 0; if (a == 1, b == 0, c == 0){ a = 0; b = 1; c = 1; } else { a = 1; b = 0; c = 0; } P3_3 = a; P3_4 = b; P3_5 = c; } i++; // IE1 = 0; } void main( void ){ P3 ^= 0x00; initialize_system(); for (delay = 0; delay < 0x1FFF; delay++); // N = num_element(); while(TH0 < 10){ L++; } } тот же эфект. Не понятно вообще ничего. почему при записи на языке Асм вся норально, а на Си. такая хрен. ведь не олжно быть разницы. посути в дизасемблировании то эе самоенаписано.
  7. Ну я не знаю как определить частотоу мигания в герцах. но мне кажтеться не очень быстро(нет ну на вид так мелкают почти не разглядеть, но если учесть что если устроить мигание диодов в цикле без прерывания. то без задержки не будет видно как они зжаигаються и тухнут. Слишком быстро, будет видно что они как будто поагшены вся время). СКорость передчи 4800 бод. , а внутреяя частота процсора 11.0592 мГц. стоит. но вот еще и картинка сехемы, что б в портеусе не открыватья макет(тем более что его может и не быть) ________________.rar
  8. intel 8051AH EA =1; разрешение всех прерываний EX1 IE.2 Бит разрешения внешнего прерывания 1. Установка/сброс программой для разрешения/запрета прерываний. IT1 ОН ЖЕ TCON.2 Бит управления типом прерывания 1. Устанавливается/ сбрасывается программно для спецификации запроса ЗПР1/ (срез/низкий уровень). IE1 TCON.3 Флаг фронта прерывания 1. Устанавливается аппаратно, когда детектируется срез внешнего сигнала ЗПР1/ (INT1/) Сбрасывается при обслуживании прерывания . ЕСЛИ УСТАНОВИТЬ ЭТОТ БИТ В РУЧНУЮ ТО ПРОСТО БУДЕТ ПОПАДПТЬ В ПРЕРЫВАНИЕ БЕЗНАЖАТИЯ НА КНОПКУ. тАК ЧТО Я НЕ ПОНЯЛ О КАКОЙ НАСТРОЙКЕ МЕНЯ СПРАШИВАЛИ, ЕСЛИ МОЖНО ОБЬЯСНИ. TCON |=0x04; IE |=0x84; ТОЧНО ТАКИЕ ЖЕ НАСТРОЙКИ, ТОЛЬКО НЕ ПО БИТОВО , А НАПРЯМУЮ В РЕГИСТРЫ // да когда повторно попадает\заходит в прерывание выполняет все команды в нем. SP ? А что сп востанавливаеться. после выхода, и ояпть меняеться после вход. только очень быстро не пошагово не видно. если в числах(хотя не знаю что это может показать то sp=0x2f в main и 31 при начаде прерывания, потом 35 и опять 2а после reti и след шагом снова 31.) Я очень подробно описываю и часто повторяюсь по старой привычке инфы мало не бывает.
  9. проблема в том что я вижу в дизасеблере как включаеться команда reti выходит в точку и тут же возвращаеться назад как будто кнопка нажата еще раз. то есть выходит и сразу заходит на зад на вектор прервания.
  10. У меня работает модель в протеусе. Аедь не может быть что бы на ассемблере програма выходила из прерывания а в си модель не работала. я пробывал делать while бесконечный. тоже самое. Эм, обьясни зачем оно переменным в данном случае. Ну кроме того что прописаная истина. переписывал с таким концом void main( void ){ P3 ^= 0x00; initialize_system(); for (delay = 0; delay < 0x1FFF; delay++); N = num_element(); // kscanf(sss); // L = atoi(sss); while(TH0 < 10){ L++; // pprintf(L); } } цикл Вайл теперь бесконечный, не помогло.
  11. У меня возникла очень странная на мой взгляд проблема. Перешел к изучению програмирования МК на языке высокого уровня. Выбрал Си. Написал пару очень простых задач из университетского курса. Но в обоих програмах возникла проблема с прерыванием. у меня на плате к прерыванию по внешнему срезу 1- подключена кнопка. При нажатии на кнопку, в прерывание попадает как и положенно. А вот потом я так и не понял толи у меня из прерывания вообше не выходит, то ли выходит но сразу запрыгивает назад. итог один. прерывание после одной активации работает как зацикленную функцию. Не могу понять в чем дело? те же проги на асемблере у меня выходили нормально. Пример. программы. Прграмма не сложная должна инвертировать светодиоды, после определенного нажатия нак кнопку. ( а делает: после вызова прерывания 1 раз. прерывание циклиться и светдиоды просто мигают постоянно) #include <reg51.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include "C:\Keil\C51\inc\Pprintf.h" #include "C:\Keil\C51\inc\kscanf.h" sbit P3_5 = P3^5; sbit P3_4 = P3^4; sbit P3_3 = P3^3; static unsigned int delay = 0; char xdata str[200]; unsigned int N; unsigned int A; unsigned int i = 0; int b = 0; int c = 0; int a = 1; void initialize_system (void){ SCON = 0x52; TMOD |= 0x20; TH1 = 0xFa; TR1 = 1; TI = 1; P3_3 = a; P3_4 = b; P3_5 = c; EA = 1; EX1 = 1; IT1 = 1; } unsigned int num_element() { printf("\nEnter the number of push on button Int1 for invert led\n",str); gets (str, sizeof(str)); N = atoi(str); // ASCII to integer return N; } void intrrupt_butInt1(void) interrupt 2 { if (i == N - 1){ i = 0; if (a == 1, b == 0, c == 0){ a = 0; b = 1; c = 1; } else{ a = 1; b = 0; c = 0; } P3_3 = a; P3_4 = b; P3_5 = c; } i++; // WHY WHEN cursor CAME TO THIS POINT, JUMP TO BEGIN INTERRUPT. BUT DON'T T0 MAIN // IE1 = 0; если активировать то выйдет, но назад по нажатиюю кнопки не попадет. } void main( void ){ P3 ^= 0x00; initialize_system(); for (delay = 0; delay < 0x1FFF; delay++); N = num_element(); kscanf(str); A = atoi(str); while(TH0 < A){ pprintf(str); } } макет платы на протеусе прилагаеться.
  12. У меня возникла очень странная на мой взгляд проблема. Перешел к изучению програмирования МК на языке высокого уровня. Выбрал Си. Написал пару очень простых задач из университетского курса. Но в обоих програмах возникла проблема с прерыванием. у меня на плате к прерыванию по внешнему срезу 1- подключена кнопка. При нажатии на кнопку, в прерывание попадает как и положенно. А вот потом я так и не понял толи у меня из прерывания вообше не выходит, то ли выходит но сразу запрыгивает назад. итог один. прерывание после одной активации работает как зацикленную функцию. Не могу понять в чем дело? те же проги на асемблере у меня выходили нормально. Пример. программы. Прграмма не сложная должна инвертировать светодиоды, после определенного нажатия нак кнопку. ( а делает: после вызова прерывания 1 раз. прерывание циклиться и светдиоды просто мигают постоянно) #include <reg51.h> #include <stdlib.h> #include <stdio.h> #include <math.h> //#include <avr/io.h> //#include <avr/interrupt.h> sbit P3_5 = P3^5; \\ светодиод1 sbit P3_4 = P3^4; \\ светодиод 2 sbit P3_3 = P3^3; \\ светодиод 3 static unsigned int delay = 0; char xdata str[20]; unsigned int N; int i ; int b = 0; int c = 0; int a = 1; /* начало коментария // enter MK to PowerDown while int1 = 0 void EnterPowerDown(void) { MCUCR = (1 << SE) | (1 << SM1); // int1 level sensitive + power-down GICR = (1 << INT1); asm("sleep"); } //enter MK in idle mode, while INT1 in zero. void WaitOnInt1ToGetHigh(void) { if (PIND & (1 << PD3)) // INT1 high? { // the level already high, no need to go idle return; } MCUCR = (1 << SE) | (1 << ISC11) | (1 << ISC10); // int1 on rising edge + idle GICR = (1 << INT1); asm("sleep"); }*/ закоментированная часть проги, подозреваю что не для той версии кейла, или вообще не к этому процесору. void initialize_system (void){ SCON = 0x52; TMOD |= 0x20; TH1 = 0xFa; TR1 = 1; TI = 1; } unsigned int num_element() { printf("\nEnter the number of push on button Int1 for invert led\n",str); gets (str, sizeof(str)); N = atoi(str); // ASCII to integer return N; } void intrrupt_butInt1(void) interrupt 2 { if (N >= i){ i = 0; if (a == 1, b == 0, c == 0){ a = 0; b = 1; c = 1; } else{ a = 1; b = 0; c = 0; } P3_3 = a; P3_4 = b; P3_5 = c; for (delay = 0; delay < 0x1FF; delay++); } else {i++;} // WHY? WHEN cursor CAME TO THIS POINT, JUMP TO BEGIN INTERRUPT. BUT DON'T T0 MAIN } void main( void ){ P3 ^= 0x00; initialize_system(); for (delay = 0; delay < 0x1FFF; delay++); P3_3 = a; P3_4 = b; P3_5 = c; N = num_element(); while(TH0 < 6){ TCON |=0x04; IE |=0x84; } } макет платы на протеусе прилагаеться. ______ZIP___WinRAR.zip
×
×
  • Создать...