Programmeringsprob...

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sica06
Inlägg: 83
Blev medlem: 31 augusti 2008, 17:31:50
Ort: Karlskrona

Programmeringsprob...

Inlägg 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;
		}
	}

		
}
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Programmeringsprob...

Inlägg 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.
sica06
Inlägg: 83
Blev medlem: 31 augusti 2008, 17:31:50
Ort: Karlskrona

Re: Programmeringsprob...

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Programmeringsprob...

Inlägg 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... :-)
bos
Inlägg: 2311
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Programmeringsprob...

Inlägg 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å.
Användarvisningsbild
MicaelKarlsson
Inlägg: 4669
Blev medlem: 18 juni 2004, 09:16:07
Ort: Aneby
Kontakt:

Re: Programmeringsprob...

Inlägg 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!
bos
Inlägg: 2311
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Programmeringsprob...

Inlägg av bos »

MicaelKarlsson skrev:kommer du att upptäcka att det kan bespara dig tid
Det kommer även bespara oss andra tid...
EBD
Inlägg: 136
Blev medlem: 10 maj 2006, 18:50:48
Ort: Sundsvall

Re: Programmeringsprob...

Inlägg 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?
Användarvisningsbild
MicaelKarlsson
Inlägg: 4669
Blev medlem: 18 juni 2004, 09:16:07
Ort: Aneby
Kontakt:

Re: Programmeringsprob...

Inlägg 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
sica06
Inlägg: 83
Blev medlem: 31 augusti 2008, 17:31:50
Ort: Karlskrona

Tack och avbön

Inlägg 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...
Användarvisningsbild
MicaelKarlsson
Inlägg: 4669
Blev medlem: 18 juni 2004, 09:16:07
Ort: Aneby
Kontakt:

Re: Programmeringsprob...

Inlägg av MicaelKarlsson »

sica06: Lycka till med AVR och alla tokigheter man kan råka ut för! :D
Skriv svar