Sida 1 av 1

Programmeringsprob...

Postat: 4 augusti 2009, 23:51:54
av sica06
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...

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

		
}

Re: Programmeringsprob...

Postat: 5 augusti 2009, 00:03:51
av sodjan
1. Förklara vad du vill ska hända.
2. Kommentera koden.

Just nu ser det mesta ut som skit. Det framgår inte vad du *vill*
ska hända. Det framgår inte heller vad du *tror* att koden gör.

Det går naturligstvis att se *vad* koden faktiskt gör men det är
ju helt ointressant när det inte framgår vad du *vill* att den ska
göra. Vad är då rätt eller fel ?

Gör om.

Re: Programmeringsprob...

Postat: 5 augusti 2009, 00:09:13
av sica06
sorry, sjukt trött här...

Gör om det imorgon. Problemet verkar så skruvat bara att jag tänkte att någon direkt visste vad det kunde vara.

God natt

Re: Programmeringsprob...

Postat: 5 augusti 2009, 00:12:35
av sodjan
> att jag tänkte att någon direkt visste vad det kunde vara.

Det tror jag säkert, om man vet vad du *vill* ska hända... :-)

Re: Programmeringsprob...

Postat: 5 augusti 2009, 08:03:00
av bos
Jag vet inte vad det är för gul pil du pratar om, men if-satsen är iallafall syntaktiskt korrekt och - under förutsättning att din kompilator inte är seriöst trasig - kommer att producera ett val-träd som stegar igenom alla dina fyra switchar.

Den sista else:n (continue) behöver du inte eftersom det är slutet på while-loopen. Kompilatorn kommer optimera bort den så du kan lika gärna ta bort den raden. Samma gäller return 1, koden kommer aldrig dit så du kan ta bort den också.

Re: Programmeringsprob...

Postat: 5 augusti 2009, 10:29:27
av MicaelKarlsson
"Jag vet inte vad det är för gul pil du pratar om"

Misstänker att det handlar om simulering i AVRStudio. Där finns "en gul pil" som visar var i programkoden "man är" då man kör simuleringen.


Det skulle ju inte skada om denna information gavs:
- Processor (nu gissar jag på AVR)
- Vilket (vilka) program som används (nu gissar jag på WinAVR och AVRStudio)
- Programfunktion

sica06: Om du kommenterar koden oavsett om du nu tycker att den är för kort eller enkel så är det en mycket god vana att kommentera koden. När du längre fram skapar mer avancerad kod kommer du att upptäcka att det kan bespara dig tid, mycket tid med väl kommenterad och strikt kod. Så lycka till och ge lite mer information så får du bättre svar!

Re: Programmeringsprob...

Postat: 5 augusti 2009, 11:10:52
av bos
MicaelKarlsson skrev:kommer du att upptäcka att det kan bespara dig tid
Det kommer även bespara oss andra tid...

Re: Programmeringsprob...

Postat: 5 augusti 2009, 11:48:35
av EBD
Jag vet ju inte hur du har konfigurerat kompilatorn, men jag gissar att felet beror på att stora delar av din kod optimeras bort. Variabeln som ändras i interruptet är inte deklarerad som volatile, och då utgår kompilatorn från att den aldrig kan ändras utanför "huvudprogrammet". Testa att antingen ändra den till volatile, eller slå av optimeringen helt bara för att testa. Simulering kan bete sig lite oväntat när koden är optimerad i bakgrunden.

Sen så heter variablen du ändrar sw_on_1, medans det är bit_sw_0 du testar, men det kanske är medvetet?

Re: Programmeringsprob...

Postat: 5 augusti 2009, 12:05:07
av MicaelKarlsson
bos: Jag har märkt att då man vädjar till människors egoism så fungerar det bättre än om man vädjar till deras vilja att underlätta för andra! Syniskt, självklart jag är ju också lite egoistisk! :D :D

Tack och avbön

Postat: 5 augusti 2009, 23:22:51
av sica06
EBD, tack för hjälpen - du hade helt rätt! :)
Hade aldrig kunna gissa det eftersom variabeln enligt AVRStudio var satt till icke-noll samt att jag har för lite erfarenhet av att använda static och volatile.

Sorry också för det ****** kassa inlägget. Var sjukt trött och kastade ur mig skit. Förhoppningsvis en läxa lärd.

Tills nästa gång...

Re: Programmeringsprob...

Postat: 6 augusti 2009, 12:40:05
av MicaelKarlsson
sica06: Lycka till med AVR och alla tokigheter man kan råka ut för! :D