1. Си / Говнокод #19695

    −20

    1. 1
    Нужно что б выводила данные из switch на семисигментный дисплей, ни черта не работает

    Нужно что б выводила данные из switch на семисигментный дисплей, ни черта не работает... :( Компилятор пишет: warning: statement with no effect


    #include <inttypes.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/sleep.h>
    #include <util/delay.h>

    void port_int(){
    DDRA=0xFF; PORTA=0x00;
    DDRB=0xFF; PORTB=0x00;
    DDRC=0x00; PORTC=0xFF;
    DDRD=0x00; PORTD=0xFF;
    }

    void init_interp(void){
    MCUCR |=(1<<ISC01);
    GICR |=(1<<INT0); //INT0 PD2 кнопка
    }

    char i=0;
    ISR(INT0_vect){
    i+=1;
    switch (i){
    case 0x01: 0x06;
    break;
    case 0x02: 0x5B;
    break;
    case 0x03: 0x4F;
    break;
    case 0x04: 0x66;
    break;
    case 0x05: 0x6D;
    break;
    case 0x06: 0x7D;
    break;
    case 0x07: 0x07;
    break;
    case 0x08: 0x7F;
    break;
    case 0x09: 0x6F;
    break;
    case 0x0A: 0x3F;
    break;
    case 0x0B: 0x80;
    break;
    //default 0x3F;
    }
    PORTB=i;
    }
    int main()
    {
    port_int();
    init_interp();
    sei();
    // Write your code here

    while (1){
    _delay_ms(50);

    PORTA=PINB;

    _delay_ms(50);
    }
    ;
    return 0;
    }

    Запостил: Azerhud, 25 Марта 2016

    Комментарии (20) RSS

    • ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА 
      ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА ЛАБА
      Ответить
    • case 0x01: 0x06; 
      /*        ^
                |
                +- а сюда никакой функции 
                вывода не надо воткнуть?
      */
      break;
      Ответить
      • воткнул case 0x01: PORTA=0x06; break
        .....
        .....
        Но всё равно не работает. По задумке это счётчик. На порту В просто светодиоды
        8 шт. а на порту А семисигментный индикатор. ...
        Ответить
        • функция ISR(INT0_vect)
          объявлена, но не вызывается в функции main()

          срочно взять отладчик и пройтисть по этому безобразию, это даже не говнокод, а неработающее хз что
          Ответить
          • какой отладчик?

            Для начала отформатировать код!
            Ответить
          • Нагуглил: http://www.nongnu.org/avr-libc/

            Поиск по слову ISR меня сразу привёл к рекомендации:

            When using the optimizer, in a loop like the following one:

            uint8_t flag;
            ...
            ISR(SOME_vect) {
              flag = 1;
            }
            ...
            
            	while (flag == 0) {
            		...
            	}


            the compiler will typically access flag only once, and optimize further accesses completely
            away, since its code path analysis shows that nothing inside the loop
            could change the value of flag anyway. To tell the compiler that
            this variable could be changed outside the scope of its code path
            analysis (e. g. from within an interrupt routine), the variable needs
            to be declared like:

            volatile uint8_t flag;



            ISR — это макрос, объявляющий функцию с директивой extern, т. е. предполагается, что кто-то будет дёргать эту функцию извне.
            Ответить
            • ага, если б я ещё понял... :(
              Ответить
              • Короче, в коде перед объявлением функции ISR есть строка char i=0;

                Компилятор не догадывается, что ISR будет эту переменную изменять, потому что в коде модуля нет явного вызова ISR. Чтобы помочь компилятору, нужно к объявлению переменной i добавить слово volatile, т. е. написать:

                volatile char i=0;
                Ответить
                • Спасибо большое, всё заработало..


                  #include <inttypes.h>
                  #include <avr/io.h>
                  #include <avr/interrupt.h>
                  #include <avr/sleep.h>
                  #include <util/delay.h>

                  void port_int(){
                  DDRA=0xFF; PORTA=0x3F; //Все порты как выход 0x3F для отображения начального нуля.
                  DDRB=0xFF; PORTB=0x00; //Все порты как выход
                  DDRD=0xFB; PORTD=0x04; //Порт PD2/INT0 как вход с кнопки, поднят внутренний подтягиваюўий резистор
                  }

                  void init_interp(void){ //объявили переменную init_interp
                  MCUCR |=(1<<ISC01); //Выбор режима внешнего прерывания INT0 и INT1 // MCUCR общий регистр управления прерываниями
                  GICR |=(1<<INT0); //запрет/разрешение прерываний по сигналам на входах INT0, INT1
                  }

                  volatile char i=0; //Объявили переменную,
                  // Компилятор не догадывается, что ISR будет эту переменную изменять,
                  //потому что в коде модуля нет явного вызова ISR. Чтобы помочь компилятору,
                  //нужно к объявлению переменной i добавить слово volatile. Спасибо inkanus-gray

                  ISR(INT0_vect){ //Обработчик прерываний (хз что это...)
                  i+=1;
                  switch (i){
                  case 0x01: PORTA=0x06;break; //подставляем свои значения для индикатора
                  case 0x02: PORTA=0x5B;break;
                  case 0x03: PORTA=0x4F;break;
                  case 0x04: PORTA=0x66;break;
                  case 0x05: PORTA=0x6D;break;
                  case 0x06: PORTA=0x7D;break;
                  case 0x07: PORTA=0x07;break;
                  case 0x08: PORTA=0x7F;break;
                  case 0x09: PORTA=0x6F;break;
                  case 0x0A: PORTA=0x3F;break;
                  case 0x0B: PORTA=0x80;break;
                  }
                  }
                  int main(){
                  port_int(); // хз
                  init_interp(); // что
                  sei(); // это

                  while (1){
                  _delay_ms(50); //задержка
                  PORTB=PINA; // следим по светодиодам 2 битный код что на индикаторе
                  _delay_ms(50);
                  }
                  ;
                  return 0;
                  }
                  Ответить
              • чего именно ты не понял?
                ты не знаешь что такое макрос?
                ты не знаешь что такое extern?
                ты не знаешь английского?
                ты не знаешь си?
                Ответить
                • вот представь, не знаю английского.
                  я уже писал что учу си 4 день...
                  Ответить
                  • Это оченьплохо

                    Без английского в программировании никуда
                    Ответить
    • чото я не опнял
      а где outb какой нить
      или как там в порты пишут?

      или там MMIO и надо писать в память

      А кроме того код не форматирован
      Автор говно
      жизнь дерьмо
      бабы бляди
      Ответить
      • Автор даже на ГК не смог в нужное поле код впихнуть.
        Ответить
        • я всего 4 день изучаю Си. ...


          ..УмничАт мы висе умеим...
          Ответить
          • Давай я тебе хороших книг насоветую
            http://shop.oreilly.com/product/9780596006976.do
            http://www.programming1189.ru/files/Kern_Ritch.pdf
            http://icube-icps.unistra.fr/img_auth.php/d/db/ModernC.pdf

            Си вообще простой язык, главное понимать как устроена память, что такое стек и куча
            Но мне было проще, я асм под реальный режим уже знал, когда начинал си учить
            Ответить
    • вот без switch, всё работает..

      ..и долба..бов до хера..
      Ответить
      • #include <inttypes.h>
        #include <avr/io.h>
        #include <avr/interrupt.h>
        #include <avr/sleep.h>
        #include <util/delay.h>

        void port_int(){
        DDRA=0xFF; PORTA=0x00;
        DDRB=0xFF; PORTB=0x00;
        DDRC=0x00; PORTC=0xFF;
        DDRD=0x00; PORTD=0xFF;



        }

        void init_interp(void){
        MCUCR |=(1<<ISC01);
        GICR |=(1<<INT0); //INT0 PD2 кнопка
        }

        char i=0;
        ISR(INT0_vect){
        i+=1;
        PORTB=i;
        }
        int main()
        {
        port_int();
        init_interp();
        sei();
        // Write your code here

        while (1){
        _delay_ms(50);

        PORTA=PINB;;
        _delay_ms(50);
        }
        ;
        return 0;
        }
        Ответить

    Добавить комментарий