- 1
Нужно что б выводила данные из switch на семисигментный дисплей, ни черта не работает
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−20
Нужно что б выводила данные из 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;
}
.....
.....
Но всё равно не работает. По задумке это счётчик. На порту В просто светодиоды
8 шт. а на порту А семисигментный индикатор. ...
объявлена, но не вызывается в функции main()
срочно взять отладчик и пройтисть по этому безобразию, это даже не говнокод, а неработающее хз что
Для начала отформатировать код!
Поиск по слову ISR меня сразу привёл к рекомендации:
When using the optimizer, in a loop like the following one:
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:
ISR — это макрос, объявляющий функцию с директивой extern, т. е. предполагается, что кто-то будет дёргать эту функцию извне.
Компилятор не догадывается, что ISR будет эту переменную изменять, потому что в коде модуля нет явного вызова ISR. Чтобы помочь компилятору, нужно к объявлению переменной i добавить слово volatile, т. е. написать:
#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 и надо писать в память
А кроме того код не форматирован
Автор говно
жизнь дерьмо
бабы бляди
..УмничАт мы висе умеим...
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
Си вообще простой язык, главное понимать как устроена память, что такое стек и куча
Но мне было проще, я асм под реальный режим уже знал, когда начинал си учить
..и долба..бов до хера..
#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;
}