avstudsning

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
SeniorLemuren
Inlägg: 8427
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: avstudsning

Inlägg av SeniorLemuren »

Skulle vara intressant att se programmet och vad det skall utföra. Det verkar som om TS inte förstått riktigt vad sodjan försöker förklara.

Att fortsätta ge 100 råd om hur man löser kontaktstudsproblemet förvillar ju bara det hela om ingen avstudsning behövs och det borde man kan avgöra om man ser programkoden och vet vad den förväntas utföra.
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: avstudsning

Inlägg av persika »

Här är kod, precis fått den att funka, har ännu inte hunnit testa så mycket angående avstudsningen:

Kod: Markera allt


// Övervakningsprogram för 8 st brandvarnare

#include <htc.h>

__CONFIG(FOSC_INTRCIO & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & BOREN_OFF & CPD_OFF & CP_OFF);


#define _XTAL_FREQ 4000000





#define  testbit(var, bit)  ((var) & (1 <<(bit)))
#define  setbit(var, bit)   ((var) |= (1 << (bit)))
#define  clrbit(var, bit)   ((var) &= ~(1 << (bit)))


//-----------------init----------------------------
void init(void)
{
PORTA = 0;
PORTB = 0;
PORTC = 0;


/*

TRISA
bit	data pin
0	1	19	AN0		ingång brandvarnare 1
1	1	18	AN1		ingång brandvarnare 2
2	1	17	AN2		ingång brandvarnare 3
3	1	4	RA3		knapp		(denna pinne är alltid ingång)
4	0	3	RA4		utgång displaysegment f
5	0	2	RA5		utgång displaysegment g
6	0	-
7	0	-

TRISB
bit	data pin
0	0	-
1	0	-
2	0	-
3	0	-
4	1	13	AN10		ingång brandvarnare 7
5	1	12	AN11		ingång brandvarnare 8
6	0	11	RB6		utgång relä bostad
7	0	10	RB7		utgång relä garage

TRISC
bit	data pin
0	1	16	AN4		ingång brandvarnare 4
1	1	15	AN5		ingång brandvarnare 5
2	1	14	AN6		ingång brandvarnare 6
3	0	7	RC3		utgång displaysegment c
4	0	6	RC4		utgång displaysegment d
5	0	5	RC5		utgång displaysegment e
6	0	8	RC6		utgång displaysegment b
7	0	9	RC7		utgång displaysegment a

*/
// port directions: 1=input, 0=output
TRISA = 0b00001111;
TRISB = 0b00110000;
TRISC = 0b00000111;



/*
ANSEL
bit	data pin
0	1	19	ANS0
1	1	18	ANS1
2	1	17	ANS2
3	0	3	ANS3
4	1	16	ANS4
5	1	15	ANS5
6	1	14	ANS6
7	0	7	ANS7

ANSELH
bit	data pin
0	0	8	ANS8
1	0	9	ANS9
2	1	13	ANS10
3	1	12	ANS11
4	0	-
5	0	-
6	0	-
7	0	-

*/

ANSEL  = 0b01110111;
ANSELH = 0b00001100;

ADCON1 = 0b01100000;	// FOSC/64

}

//-----------------init----------------------------



//-------------------Tidms------------------------
void Tidms( unsigned int ms )
{
	
while (ms > 0)
	{
	__delay_ms(1);
	ms--;
	}
}
//-------------------Tidms------------------------



//--------------------AnalogIngaang---------------
unsigned int AnalogIngaang( unsigned char IngaangNr )
{
unsigned int resultat;
	
// ADCON0 = 0b10xxxx01; Right justified, Vdd, ANx, On	
	
switch (IngaangNr)
{
case 1: 
	ADCON0 = 0b10000001; // Right justified, Vdd, AN0, On
	//           ^^^^
break;
case 2: 
	ADCON0 = 0b10000101; // Right justified, Vdd, AN1, On
	//           ^^^^
break;
case 3: 
	ADCON0 = 0b10001001; // Right justified, Vdd, AN2, On
	//           ^^^^
break;
case 4: 
	ADCON0 = 0b10010001; // Right justified, Vdd, AN4, On
	//           ^^^^
break;
case 5: 
	ADCON0 = 0b10010101; // Right justified, Vdd, AN5, On
	//           ^^^^
break;
case 6: 
	ADCON0 = 0b10011001; // Right justified, Vdd, AN6, On
	//           ^^^^
break;
case 7: 
	ADCON0 = 0b10101001; // Right justified, Vdd, AN10, On
	//           ^^^^
break;
case 8: 
	ADCON0 = 0b10101101; // Right justified, Vdd, AN11, On
	//           ^^^^
break;
}

Tidms(1);
setbit(ADCON0,1);	//   go /done

while (testbit(ADCON0,1))
	;
	
resultat = ADRESH;
resultat = resultat<<8;	
resultat = resultat|ADRESL;
	
return resultat; 
}
//--------------------AnalogIngaang---------------



//--------------------KnappTryckt-------------------
unsigned int KnappTryckt()
{
Tidms(5);
return !testbit(PORTA,3);
}
//--------------------KnappTryckt---------------



//--------------------DisplaySeg_---------------
void	DisplaySeg_a( unsigned char taend ) 
{
if (!taend)
	setbit(PORTC,7);
else
	clrbit(PORTC,7);
}

void	DisplaySeg_b( unsigned char taend ) 
{
if (!taend)
	setbit(PORTC,6);
else
	clrbit(PORTC,6);
}

void	DisplaySeg_c( unsigned char taend ) 
{
if (!taend)
	setbit(PORTC,3);
else
	clrbit(PORTC,3);
}

void	DisplaySeg_d( unsigned char taend ) 
{
if (!taend)
	setbit(PORTC,4);
else
	clrbit(PORTC,4);
}

void	DisplaySeg_e( unsigned char taend ) 
{
if (!taend)
	setbit(PORTC,5);
else
	clrbit(PORTC,5);
}

void	DisplaySeg_f( unsigned char taend ) 
{
if (!taend)
	setbit(PORTA,4);
else
	clrbit(PORTA,4);
}

void	DisplaySeg_g( unsigned char taend ) 
{
if (!taend)
	setbit(PORTA,5);
else
	clrbit(PORTA,5);
}
//--------------------DisplaySeg_---------------



//--------------------SkrivDisplay-------------------
void SkrivDisplay( unsigned char tecken )
{

switch (tecken)
{
case '-': 
	{
	DisplaySeg_a(0);	
	DisplaySeg_b(0);	
	DisplaySeg_c(0);	
	DisplaySeg_d(0);	
	DisplaySeg_e(0);	
	DisplaySeg_f(0);	
	DisplaySeg_g(1);	
	}
break;
case ' ': 
	{
	DisplaySeg_a(0);	
	DisplaySeg_b(0);	
	DisplaySeg_c(0);	
	DisplaySeg_d(0);	
	DisplaySeg_e(0);	
	DisplaySeg_f(0);	
	DisplaySeg_g(0);	
	}
break;
case '0': 
	{
	DisplaySeg_a(1);	
	DisplaySeg_b(1);	
	DisplaySeg_c(1);	
	DisplaySeg_d(1);	
	DisplaySeg_e(1);	
	DisplaySeg_f(1);	
	DisplaySeg_g(0);	
	}
break;
case '1': 
	{
	DisplaySeg_a(0);	
	DisplaySeg_b(1);	
	DisplaySeg_c(1);	
	DisplaySeg_d(0);	
	DisplaySeg_e(0);	
	DisplaySeg_f(0);	
	DisplaySeg_g(0);	
	}
break;
case '2': 
	{
	DisplaySeg_a(1);	
	DisplaySeg_b(1);	
	DisplaySeg_c(0);	
	DisplaySeg_d(1);	
	DisplaySeg_e(1);	
	DisplaySeg_f(0);	
	DisplaySeg_g(1);	
	}
break;
case '3': 
	{
	DisplaySeg_a(1);	
	DisplaySeg_b(1);	
	DisplaySeg_c(1);	
	DisplaySeg_d(1);	
	DisplaySeg_e(0);	
	DisplaySeg_f(0);	
	DisplaySeg_g(1);	
	}
break;
case '4': 
	{
	DisplaySeg_a(0);	
	DisplaySeg_b(1);	
	DisplaySeg_c(1);	
	DisplaySeg_d(0);	
	DisplaySeg_e(0);	
	DisplaySeg_f(1);	
	DisplaySeg_g(1);	
	}
break;
case '5': 
	{
	DisplaySeg_a(1);	
	DisplaySeg_b(0);	
	DisplaySeg_c(1);	
	DisplaySeg_d(1);	
	DisplaySeg_e(0);	
	DisplaySeg_f(1);	
	DisplaySeg_g(1);	
	}
break;
case '6': 
	{
	DisplaySeg_a(1);	
	DisplaySeg_b(0);	
	DisplaySeg_c(1);	
	DisplaySeg_d(1);	
	DisplaySeg_e(1);	
	DisplaySeg_f(1);	
	DisplaySeg_g(1);	
	}
break;
case '7': 
	{
	DisplaySeg_a(1);	
	DisplaySeg_b(1);	
	DisplaySeg_c(1);	
	DisplaySeg_d(0);	
	DisplaySeg_e(0);	
	DisplaySeg_f(0);	
	DisplaySeg_g(0);	
	}
break;
case '8': 
	{
	DisplaySeg_a(1);	
	DisplaySeg_b(1);	
	DisplaySeg_c(1);	
	DisplaySeg_d(1);	
	DisplaySeg_e(1);	
	DisplaySeg_f(1);	
	DisplaySeg_g(1);	
	}
break;
case '9': 
	{
	DisplaySeg_a(1);	
	DisplaySeg_b(1);	
	DisplaySeg_c(1);	
	DisplaySeg_d(0);	
	DisplaySeg_e(0);	
	DisplaySeg_f(1);	
	DisplaySeg_g(1);	
	}
break;
case 'A': 
	{
	DisplaySeg_a(1);	
	DisplaySeg_b(1);	
	DisplaySeg_c(1);	
	DisplaySeg_d(0);	
	DisplaySeg_e(1);	
	DisplaySeg_f(1);	
	DisplaySeg_g(1);	
	}
break;
}

}
//--------------------SkrivDisplay---------------



//--------------------StaellRelaeBostad------------
void StaellRelaeBostad( unsigned char till )
{
if (till)
	setbit(PORTB,6);
else	
	clrbit(PORTB,6);
}
//--------------------StaellRelaeBostad------------



//--------------------StaellRelaeGarage------------
void StaellRelaeGarage( unsigned char till )
{
if (till)
	setbit(PORTB,7);
else	
	clrbit(PORTB,7);
}
//--------------------StaellRelaeGarage------------






const unsigned char MaxAntBrandV = 8;
const unsigned int LarmStroemGraens = 300;
const unsigned int AnslutStroemGraens = 10;

const unsigned char LarmTidGraens = 30;		//  antal 1/10 sek
const unsigned char VisningsTidGraens = 10;	



//-----------------main----------------------------
void main(void)
{
unsigned char BrandVNr;
unsigned char LarmTid;  
unsigned char VisningsTid;  

init();


Start:
StaellRelaeBostad(0);
StaellRelaeGarage(0);
SkrivDisplay('8');
Tidms(1000);
SkrivDisplay(' ');
Tidms(1000);
SkrivDisplay('-');


while (1)
	{
	BrandVNr = 1;
	while ( BrandVNr <= MaxAntBrandV )	
		{
		if ( KnappTryckt() )
			goto AnslutTest;
		
		LarmTid = 0;
		while ( AnalogIngaang(BrandVNr) > LarmStroemGraens  )
			{
			Tidms(100);
			LarmTid = LarmTid + 1;
			if ( LarmTid > LarmTidGraens )
				{
				SkrivDisplay('0'+BrandVNr);
					
				if (BrandVNr<7)
 					StaellRelaeBostad(1);
 				else
 					StaellRelaeGarage(1);
 					
				Tidms(3000);	
				
				StaellRelaeBostad(0);
				StaellRelaeGarage(0);
					  
				while ( !KnappTryckt() )
					;
				goto AnslutTest;
				}
			}
		BrandVNr = BrandVNr + 1;	
		}
	}

	

AnslutTest:
SkrivDisplay('-');
Tidms(1000);
BrandVNr = 1;
while ( BrandVNr <= MaxAntBrandV )
	{
	if ( !KnappTryckt() )
		goto Start;
		
	if ( AnalogIngaang(BrandVNr) < AnslutStroemGraens  )
		{		
		SkrivDisplay('0'+BrandVNr);	

		VisningsTid = 0;
		while ( VisningsTid < VisningsTidGraens )
			{
			if ( !KnappTryckt() )
				goto Start;
			Tidms(100);
			VisningsTid = VisningsTid + 1;
			}
		}
		
	BrandVNr = BrandVNr + 1;
	}


// Test är klar
SkrivDisplay('A');
while ( KnappTryckt() )		// Vänta tills knapp släppts.
	;

goto Start;

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

Re: avstudsning

Inlägg av sodjan »

OK. Jag har inte fattat vad syftet är så koden säger inte så mycket. :-)
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: avstudsning

Inlägg av Icecap »

Koden säger mig däremot ganska mycket. En sak den säger är "uerfaren programmör" men det är ju en fråga om att jobba på bara...

Det konstigaste är följande:

Kod: Markera allt

unsigned int KnappTryckt()
  {
  Tidms(5);
  return(!testbit(PORTA,3));
  }
Frågan är: varför tusan Tidms(5); ??? Att det förbrukar 5ms är nog ganska klart men vilken nytta ger detta? Det finns INGEN avstutsning i detta.

Ett (dåligt) sätt att faktisk göra det en del vettigare kan vara:

Kod: Markera allt

unsigned int KnappTryckt()
  {
  char X;
  if(!testbit(PORTA,3)) X = 1;
  else X = 0;
  Tidms(5);
  return((!testbit(PORTA,3)) && X);
  }
Då får man två avläsningar med 5ms mellan och om de BÅDA är aktiva kommer man att få en aktiv tillbaka.

Men programmet har ett allvarligt grundläggande fel: det har med larm att göra och skulle något i main-loopen hänga sig kan det missa larm. I den nuvarande konfiguration lär det inte betyda mycket men eftersom tiden går och det byggs på kan det få betydelse.
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: avstudsning

Inlägg av persika »

Jag hade en tanke med det som Icecap anmärker på, men eftersom jag är en så "uerfaren programmör" har jag inte förmågan att förklara hur det hänger ihop.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: avstudsning

Inlägg av sodjan »

Jag tycker att det mest intressanta här är vad prylen faktiskt ska göra!

I ett tidigt inlägg stog det att:

> Ett antal ingångar ska "skannas", när en ingång ger signal ska en 7-segment
> display tändas med ingångens nummer, och efter det ska programmet
> gå i en vänteslinga tills knappen trycks in.

Här missförstog nog i alla fall jag dig från början... :-)

Det är alltså ett antal "larmingångar" (som triggar att 7-seg displayen
visar en siffra) och sedan *en* gemensam "Reset" knapp för att återställa
larmet. Stämmer det?

Om man bortser från filtrering av eventuella störningar på ingångarna, så
behöver inget av detta någon "avstudsning".

Ingångarna kommer alltså inte från någon *mekanisk* switch eller knapp?
I så fall så studsar de ju inte alls.

Och för återställningen så spelar det ju ingen roll om den görs 1 eller 10
gånger i snabb följd. Återställt blir det ju i alla fall.

Så jag förstår fortfarande inte vad eventuella kontaktstudsar har för negativ
inverkan på applikationen.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: avstudsning

Inlägg av v-g »

Jag gör exakt som Icecap säger (läs av i avbrottsrutin och j€#%r vad bra det fungerar. Trots billiga knappar eller "stoppa tråd i experimentkort" så får man aldrig en studs etc.

Samtidigt är det enkelt att göra "håll in för att spara", "håll in för snabbt öka värde" osv
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: avstudsning

Inlägg av persika »

Jag vill att moderator tittar på inlägget med: "Koden säger mig däremot ganska mycket. En sak den säger är "uerfaren programmör" men det är ju en fråga om att jobba på bara..." om det bryter mot forumets regel 5.1

Att det jag gör och skriver det tycker jag att man får räkna med att det kan bli kritiserat, men att det ska närma sig personangrepp det tycker jag inte är acceptabelt.
Man får t.ex inte säga nåt om felstavningar, det har jag inte gjort och inte gjort i detta fall heller.

Jag tycker inte att man ska bli personligt angripen och förlöjligad här på forumet.
Kommer denna stil att fortsätta, kommer jag att gå ur forumet.

Detta är skrivet efter en sömnlös natt.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9120
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Re: avstudsning

Inlägg av AndersG »

Jag vill att moderator tittar på inlägget med: "Koden säger mig däremot ganska mycket. En sak den säger är "uerfaren programmör" men det är ju en fråga om att jobba på bara..." om det bryter mot forumets regel 5.1
Håller med. Det är onödigt att skriva så.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: avstudsning

Inlägg av sodjan »

Det finns en liten röd knapp med ett "!" för det.
Använd gärna den, det är min erfarenhet att det brukar fungera bra.

Sen, när det gäller Icecap's inlägg, eftersom du redan har tagit
upp det här i tråden...

Jag har själv en son med AS (Aspergers Syndrom) och jag vet att
det ibland kan bli lite väl svart/vitt, så att säga. Man får läsa Icecaps
inlägg med det i bakhuvudet och inte ta alla formuleringar och ordval
så väldigt ordagrant. :-) Ja, jag reagerade också på inlägget, men
som sagt, jag läser Icecap's inlägg med ett extra filter påslaget. Bakom
de ibland kanske lite kantiga ordvalen brukar det dock vara vettigt.

Ja, det gäller väl faktiskt de flestas inlägg, det är bara olika filter. :-)

Icecap har själv skrivit om sin Asperger, så jag ser inget problem med att nämna det.
http://elektronikforumet.com/forum/view ... er#p644054
http://elektronikforumet.com/forum/view ... er#p682543

Se det mer som en förklaring än som en ursäkt för det lite onödigt vassa inlägget.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9120
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Re: avstudsning

Inlägg av AndersG »

Se det mer som en förklaring än som en ursäkt för det lite onödigt vassa inlägget.
Du har rätt. Jag hade helt glömt den saken.
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: avstudsning

Inlägg av Icecap »

Uj uj uj... någon känner sig påhoppad!

Jag anser att koden visar en oerfaren programmör - men tydligen tolkar TS det som att det betyder "dåligt människa". Jag har helt riktigt AS och regeln är: tolka inte mina ord! De betyder exakt vad som står, inget annat! Jag står för min värdering, jag ämnar inte be om ursäkta för att ha min åsikt och det finns inget påhopp i det!

Efter två sidor med tips om hur man kan avstutsa väljer TS att inte använda någon information om detta alls - och varför då fråga? Jag kan inte se att projektet faktisk behöver avstutsning - men en ytterligare utbyggnad kanske kan behöva detta och det är ju bra att kunde tekniken.

Alla råd innebär en integration av knappsignalen i någon form, vara sig det är i mjukvara eller hårdvara. Och alla verkar vara ganska överens om att olika brytare/reläer har olika debounce-tider, detta betyder att ett filter bör antingen ställas till worst-case eller vara ställbart.

Med en delay() funktion kan man skapa detta, tyvärr kan det kosta onödig processortid - men har den inte bråttom är det lugnt. En sak som man ska ha klart för sig är att om man:
Läser portpinne, utför en delay() och sedan läser portpinne igen och då har två olika avläsningar måste man ha ytterligare en delay() för att säkerställ att avläsningen inte upprepas för snabbt.

I detta fall är delay'en 5ms, inte mycket tid, varken i debounce eller människotid - men för en PIC på 8MHz blir det ändå 10.000 instruktioner som kastas bort i onödan. Med dessa 10.000 instruktioner hade den lätt klarat av att serva en timer-interrupt, kollat porter efter knapptryckningar, debouncad dom och givit klara och tydliga signaler ifrån sig - och ändå ha massor av tid över. Och allt bara på en bråkdel av den 5ms vänttid som en delay() låser programexekveringen. Det finns en anledning till att man kan använda timers till att ge interrupt...

Har man krav på kända tider kommer en timer-interrupt in nästan som ett krav, då får man kända tider mellan samplingarna och jag har testat en hel del och kommit fram till att om en "total avkänning" ska kännas rätt och man ska fånga snabba knapptryckningar behöver denna totala avkänning ta maximalt 100ms. Bra tider är mellan 50ms och 100ms.

Vill man alltså ha 3 lika avläsningar ska tiden mellan varje avläsning vara maximalt 100ms/3 = ~33ms. Och precis som v-g skriver gör det saken enklare att ha "håll inne knappen i 3 sekunder för..." osv.

Mina tester har även visat att 2 avläsningar efter varandra med mellan 33ms och 50ms mellan räcker helt fint till att undvika störningar om det inte är synnerligt svåra fall (långa ledningar osv.) - där man ändå måste skydda med ingångsfilter osv.

Det viktiga är att man enbart avläser porten en enda gång per interrupt! Ska man använda avläsningen i "rå form" fler gångar får man mellanspara avläsningen i minnet men i essens är det viktiga att ha en sekvens i form av:

Kod: Markera allt

Minnen:
'Now' är en (eller fler) variabel/variabler som fungerar som mellanregister. Behöver inte sparas mellan varje interrupt.
'Previous' och 'Used' är samma storlek variabler och de MÅSTE sparas mellan varje interrupt. Jag brukar ange dom i ISR'n och deklarera dom som 'static'.

Now = port(); // Läsa knapp-porten, en eller fler. Sparas i variabeln Now.
if((Now == Previous) && (Now & ~Used))
  {
  Used = Now; // Spara att knapptryckningen redan är använd.
  // Gör vad som ska göras när en knapptryckning avkänns. Gör dock inte detta i en interruptrutin om inte det är en mycket snabb grej!
  // Jag brukar skriva till en variabel som main-loopen kan avkänna och nolla när den har använd knapptryckningen. Är det lite större projekt har jag ibland gjort en FIFO för knapptryckningar.
Ganska ofta använder jag "n-key rollover"-funktionen för att kunde säkerställa att knapptryckningar i snabb följd inte ställer till det för varandra.
  }
Previous = Now; // Spara denna avläsning som "förra"
if(!Previous) Used = 0x00; // Om knapparna är släppta nollställs 'Used'
Man kan behöva justera koden lite om man har '1' som inaktiva nivåer, behöver maska ut specifika bitar osv.

Och det enda jag skrev om oerfaren var att jag såg det och att erfarenheten kommer med tiden. Erfarenhet är in mina ögon inte att ha gjort en sak många gångar, det är att lära av sina fel! Och ja, jag har lärt väldigt mycket av mina fel, helt enkelt för att jag har gjort så många! Jag är oerfaren på en del områden, jag har t.ex. bara kört moppe en enda gång (för 36 år sedan), motorcykel en enda gång (som förare), det var dock en RR-trimmad Suzuki 750 på Anderstorp. Jag har testat en cross-hoj (500cm³) en enda gång - och jag kunde inte hålla gång i skiten...

Jag är inte sämre människa för det - men likaväl oerfaren på vissa områden - och det helt utan att skämmas för det.
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: avstudsning

Inlägg av persika »

sodjan:
>Så jag förstår fortfarande inte vad eventuella kontaktstudsar har för negativ
>inverkan på applikationen.

Jag har provkört programmet, på kretskortet som är gjort för detta.
Det fungerar bra!
Jag håller med Sodjan, det behövs ingen avstudsning till detta.
I början av de två olika programdelarna label:Start och label: AnslutTest finns det långa fördröjningar, som gör att studsarna aldrig läses av.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: avstudsning

Inlägg av sodjan »

Jag förstår fortfarande inte riktigt vad programmet ska göra.
Man det kanske inte spelar någon roll... :-)
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: avstudsning

Inlägg av persika »

8 st brandvarnare får sin matningsspänning från kretskortet, via transistorer, motstånd och kondensatorer mäts strömförbrukning för respektive brandvarnare och läggs in på 8st ingångar på pic'en som spänningar.

Del 1. Ingångarna skannas av en efter en, när strömmen överstiger ett visst värde ( c:a 20mA, =larm) ska displayen indikera vilken brandvarnare det kommer ifrån, och sen går programmet in en vänteslinga som väntar på knapptryck, om ingen brandvarnare larmar körs denna skanningsrutin hela tiden.
När knappen tryckts in går programkörningen till del 2.

Del 2. Det finns även en testdel i programmet.
När man håller knappen intryckt så skannas ingångarna av för att se så tomgångförbrukningen ( c:a 10 uA ) finns för varje brandvarnare.
Om tomgångsförbrukningen är rätt visas inget i displayen, om uppmätt ström är för liten eller 0, visas brandvarnarens nummer i displayen 1 sek, sen testas nästa, när alla är testade visas A i displayen så länge knappen hålls in, när knappen släpps återgår programkörningen till del 1.
Skriv svar