Programmeringsprob...
Postat: 4 augusti 2009, 23:51:54
Tjena,
Har suttit ett tag med lite ny kod till min MCU. Jag vet inte om jag har hjärnsläpp eller vad som händer, men jag blir inte riktigt klok på koden - eller, snarare, problemen med den..
Tänkte prova lite utr jag har (switchar och LED:s), så jag försöker köra ett program som ska tända LEDs vid knapptryckning.
Main består främst av en while-sats som kollar om en switch är nertryckt. Jag sväljer min stolthet och provar här.
Två scenarior:
1. Om jag endast har if-satser (och inte else if) rullar while-satsen på som den ska. Problemet är dock att trots att sw_on_0 ändras till icke-noll, vägrar if-satsen att släppa igenom den och while-satsen rullar vidare som inget hänt.
2. Om jag ändrar till if och else if, händer följande:
Första if (sw_on_0) kollas, allt som vanligt. Efter detta hoppar "den" (den gula pilen) till else if (sw_on_4). Hoppar sedan till sw_on_1 för att sedan stegra ner till sw_on_4 där den stannar.
...huvudbry...
Har suttit ett tag med lite ny kod till min MCU. Jag vet inte om jag har hjärnsläpp eller vad som händer, men jag blir inte riktigt klok på koden - eller, snarare, problemen med den..
Tänkte prova lite utr jag har (switchar och LED:s), så jag försöker köra ett program som ska tända LEDs vid knapptryckning.
Main består främst av en while-sats som kollar om en switch är nertryckt. Jag sväljer min stolthet och provar här.
Två scenarior:
1. Om jag endast har if-satser (och inte else if) rullar while-satsen på som den ska. Problemet är dock att trots att sw_on_0 ändras till icke-noll, vägrar if-satsen att släppa igenom den och while-satsen rullar vidare som inget hänt.
2. Om jag ändrar till if och else if, händer följande:
Första if (sw_on_0) kollas, allt som vanligt. Efter detta hoppar "den" (den gula pilen) till else if (sw_on_4). Hoppar sedan till sw_on_1 för att sedan stegra ner till sw_on_4 där den stannar.
...huvudbry...
Kod: Markera allt
/*
- 5 Leds och 5 switchar
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <stdlib.h>
//#define led_toggle PORTC ^= _BV(PC5)
#define u8 uint8_t
#define bit_led_0 PC0
#define bit_led_1 PC1
#define bit_led_2 PC2
#define bit_led_3 PC3
#define bit_led_4 PC4
#define bit_sw_0 PD0
#define bit_sw_1 PD1
#define bit_sw_2 PD2
#define bit_sw_3 PD3
#define bit_sw_4 PD4
#define byte_sw_allD PIND
u8 sw_on_0;
u8 sw_on_1;
u8 sw_on_2;
u8 sw_on_3;
u8 sw_on_4;
u8 led_on_0;
//static volatile int button_is_pressed;
void init_ports();
void init_timers();
int main(void)
{
sei();
init_ports();
init_timers();
while(1)
{
if(sw_on_0)
{
PORTC =0;
sw_on_0 = 0;
}
else if(sw_on_1)
{
PORTC ^= _BV(PC1);
sw_on_1 = 0;
}
else if(sw_on_2)
{
PORTC ^= _BV(PC2);
sw_on_2 = 0;
}
else if(sw_on_3)
{
PORTC ^= _BV(PC3);
sw_on_3 = 0;
}
else if(sw_on_4)
{
PORTC ^= _BV(PC4);
sw_on_4 = 0;
}
else
{
continue;
}
}
return (1);
}
void init_ports()
{
PORTD = _BV(bit_sw_0)|_BV(bit_sw_2)|_BV(bit_sw_4);
PORTC = _BV(PC5);
DDRC = _BV(PC5);
}
//256/1Mhz * 1024 =
void init_timers()
{
// Prescaler = FCPU/64
TCCR0B|=(1<<CS01)|(1<<CS00);
//Enable Overflow Interrupt Enable
TIMSK0|=(1<<TOIE0);
//Initialize Counter
TCNT0=0;
}
ISR (TIMER0_OVF_vect)
{
static volatile u8 count0, count1, count2, count3, count4;
// Read button's state
if(bit_is_clear(byte_sw_allD, bit_sw_0))
{
count0++;
if (count0 == 1)
{
sw_on_1 = 5;
count0 = 0;
}
}
}