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;
}
}
}