Taddus
23.03.2014, 09:53
Hallo,
ich habe ein Spieler das ich mit dem unterten Programmcode steuere. Einmal ändert sich über eine PWM die Geschwindigkeit meines Spiels,
mittels eines Lichtschrankenpaares soll der aktuelle Spielstand abgefragt werden und daraufhin LED's angesteuert werden.
Es funktioniert alles soweit, ausser das in meiner Interrupt Routine der Controller zwar den PIN auf Low setzt den er soll, den anderen
allerdings nur ganz kurz auf high und danach sofort wieder auf LOW.
Bin ein wenig ratlos woran das liegt, vlt kann mir hierbei jemand weiterhelfen.
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
volatile uint8_t a=0;
volatile uint8_t b=0;
volatile uint8_t c=0;
volatile uint8_t d=0;
volatile uint8_t Eingang;
enum {Spieler_1,Spieler_2,Spieler_3,Spieler_4};
void set_output(void)
{
DDRB = 0x08;
TCCR0 |= (1<<WGM00)|(1<<WGM01) |(1<<COM01)|(1<<CS00);
}
ISR(INT1_vect)
{
if (~PINB & (1<<PB4))
{
Eingang=Spieler_1;
a++;
}
if (~PINB & (1<<PB5))
{
Eingang=Spieler_2;
b++;
}
if (~PINB & (1<<PB6))
{
Eingang=Spieler_3;
c++;
}
if (~PINB & (1<<PB7))
{
Eingang=Spieler_4;
d++;
}
switch (Eingang)
{
case Spieler_1:
switch (a)
{
case 1:
PORTA = (PORTA | (1 << PA4)) & ~(1 << PA0);
break;
case 2:
PORTA &= ~(1<<PA4);
PORTC |= (1<<PC7);
break;
case 3:
PORTC &= (1<<PC7);
break;
default:
break;
}
break;
case Spieler_2:
switch (b)
{
case 1:
PORTA = (PORTA | (1 << PA5)) & ~(1 << PA1);
break;
case 2:
PORTA &= ~(1<<PA5);
PORTC |= (1<<PC6);
break;
case 3:
PORTC &= (1<<PC6);
break;
default:
break;
}
break;
case Spieler_3:
switch (c)
{
case 1:
PORTA = (PORTA | (1 << PA6)) & ~(1 << PA2);
break;
case 2:
PORTA &= ~(1<<PA6);
PORTC |= (1<<PC5);
break;
case 3:
PORTC &= (1<<PC5);
break;
default:
break;
}
break;
case Spieler_4:
switch (d)
{
case 1:
PORTA = (PORTA | (1 << PA7)) & ~(1 << PA3);
break;
case 2:
PORTA &= ~(1<<PA7);
PORTC |= (1<<PC4);
break;
case 3:
PORTC &= (1<<PC4);
break;
default:
break;
}
break;
}
}
int main(void)
{
MCUCR |= (1<<ISC10)|(1<<ISC11);
GICR |= (1<<INT1);
DDRB = 0x00;
DDRA = 0xFF;
DDRC = 0xF0;
PORTA = 0x0F;
PORTC = 0x00;
int max_value=5;
int value = 0;
int max_value_2=5;
int value_2 = 0;
sei ();
while(1)
{
value = (rand()%max_value);
switch (value)
{
case 1: set_output();
OCR0 = 64;
break;
case 2: set_output();
OCR0 = 128;
break;
case 3: set_output();
OCR0 = 192;
break;
case 4: set_output();
OCR0 = 255;
break;
default:
break;
}
value_2 = (rand()%max_value_2);
switch (value_2)
{
case 1:
_delay_ms(1000);
break;
case 2:
_delay_ms(2000);
break;
case 3:
_delay_ms(3000);
break;
case 4:
_delay_ms(4000);
break;
default:
_delay_ms(2500);
break;
}
}
}
Vielen Dank schon mal
Taddus
ich habe ein Spieler das ich mit dem unterten Programmcode steuere. Einmal ändert sich über eine PWM die Geschwindigkeit meines Spiels,
mittels eines Lichtschrankenpaares soll der aktuelle Spielstand abgefragt werden und daraufhin LED's angesteuert werden.
Es funktioniert alles soweit, ausser das in meiner Interrupt Routine der Controller zwar den PIN auf Low setzt den er soll, den anderen
allerdings nur ganz kurz auf high und danach sofort wieder auf LOW.
Bin ein wenig ratlos woran das liegt, vlt kann mir hierbei jemand weiterhelfen.
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
volatile uint8_t a=0;
volatile uint8_t b=0;
volatile uint8_t c=0;
volatile uint8_t d=0;
volatile uint8_t Eingang;
enum {Spieler_1,Spieler_2,Spieler_3,Spieler_4};
void set_output(void)
{
DDRB = 0x08;
TCCR0 |= (1<<WGM00)|(1<<WGM01) |(1<<COM01)|(1<<CS00);
}
ISR(INT1_vect)
{
if (~PINB & (1<<PB4))
{
Eingang=Spieler_1;
a++;
}
if (~PINB & (1<<PB5))
{
Eingang=Spieler_2;
b++;
}
if (~PINB & (1<<PB6))
{
Eingang=Spieler_3;
c++;
}
if (~PINB & (1<<PB7))
{
Eingang=Spieler_4;
d++;
}
switch (Eingang)
{
case Spieler_1:
switch (a)
{
case 1:
PORTA = (PORTA | (1 << PA4)) & ~(1 << PA0);
break;
case 2:
PORTA &= ~(1<<PA4);
PORTC |= (1<<PC7);
break;
case 3:
PORTC &= (1<<PC7);
break;
default:
break;
}
break;
case Spieler_2:
switch (b)
{
case 1:
PORTA = (PORTA | (1 << PA5)) & ~(1 << PA1);
break;
case 2:
PORTA &= ~(1<<PA5);
PORTC |= (1<<PC6);
break;
case 3:
PORTC &= (1<<PC6);
break;
default:
break;
}
break;
case Spieler_3:
switch (c)
{
case 1:
PORTA = (PORTA | (1 << PA6)) & ~(1 << PA2);
break;
case 2:
PORTA &= ~(1<<PA6);
PORTC |= (1<<PC5);
break;
case 3:
PORTC &= (1<<PC5);
break;
default:
break;
}
break;
case Spieler_4:
switch (d)
{
case 1:
PORTA = (PORTA | (1 << PA7)) & ~(1 << PA3);
break;
case 2:
PORTA &= ~(1<<PA7);
PORTC |= (1<<PC4);
break;
case 3:
PORTC &= (1<<PC4);
break;
default:
break;
}
break;
}
}
int main(void)
{
MCUCR |= (1<<ISC10)|(1<<ISC11);
GICR |= (1<<INT1);
DDRB = 0x00;
DDRA = 0xFF;
DDRC = 0xF0;
PORTA = 0x0F;
PORTC = 0x00;
int max_value=5;
int value = 0;
int max_value_2=5;
int value_2 = 0;
sei ();
while(1)
{
value = (rand()%max_value);
switch (value)
{
case 1: set_output();
OCR0 = 64;
break;
case 2: set_output();
OCR0 = 128;
break;
case 3: set_output();
OCR0 = 192;
break;
case 4: set_output();
OCR0 = 255;
break;
default:
break;
}
value_2 = (rand()%max_value_2);
switch (value_2)
{
case 1:
_delay_ms(1000);
break;
case 2:
_delay_ms(2000);
break;
case 3:
_delay_ms(3000);
break;
case 4:
_delay_ms(4000);
break;
default:
_delay_ms(2500);
break;
}
}
}
Vielen Dank schon mal
Taddus