Няшная / Говнокод #19695 Ссылка на оригинал

0

  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 Azerhud, (Updated )

Комментарии (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 и надо писать в память

    А кроме того код не форматирован
    Автор говно
    жизнь дерьмо
    бабы бляди
    Ответить
  • вот без 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;
      }
      Ответить

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

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8