PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tasten an PIC softwaretechnisch lösen...



SECh
06.04.2006, 20:50
Hallo,

ich habe an einem PIC16F84 einige Taster angeschlossen und möchte sie nun mit einigen Funktionen belegen.
Für den Anfang habe ich mir gedacht, an jeder Taste einen Ton auszugeben.
In etwa so:
Taste 1 -> ein X Piep
Taste 2 -> zwei X Piep usw bis Taste 4 entwprechend 4 X Piep.

Allerdings ist es nicht so einfach.
Bei einer Taste klappt es, aber sobald eine zweite ansteuern wird, fängt es an wild zu werden.
Nämlich, Taste 1 -> ein Piep, Taste 2 -> nicht zwei sondern mal 4 mal 6 mal 7 oder endlos.

Weiter unten findet man das Programm mit dem ich den PIC für diese Funktion betreiben möchte.
Vielleicht kann mir der eine oder andere einen Tipp geben oder vielleicht gibt es auch eine elegantere Lösung.

Vielen Dank
Sech


// --------------------------------------------------------------------------------------------------------------------------------------------
#include <c:\cc5\cc5xfree\16f84a.h>
#pragma config |= 0b.1111.1111.0010
/*--------------------------------------------------------------------*/
/* KonfigWort -> Bit 1,0: 11-RC, 10-HS, 01-XT, 00-LP
Bit 2: 1-Watchdog Ein, 0-Watchdog Aus
Bit 3: 0-Power up Tmer Ein, 1-Power up Timer Aus
Bit 4...13: 0-Leseschutz Ein, 1-Leseschutz Aus*/
/*--------------------------------------------------------------------*/

int i;


void pause(void)
{
OPTION=2;
TMR0=131;
while(TMR0);
}
//------------------------------------------------------------------------------------
void verzoegerugn(void)
{
i=250;
while (i)
{
pause();
pause();
pause();
pause();
i--;
}
}
//--------------------------------------------------------------------------------------
void piep(void)
{
bit beep @ PORTB.0;
i=100;
while (i)
{
beep=1;
pause();
beep=0;
pause();
i--;
}
}
//--------------------------------------------------------------------------------------

void main(void)
{
int a=1;
char Taste;
TRISB=0b.0000.0000;
PORTB=0;
piep();
while(a!=0)
{
//sprung:
Taste = PORTA & 0b.0000.1111;
switch(Taste)
{
case 0:{PORTB=0; break;}

case 1:{piep();verzoegerugn();
break;}
case 2:{ piep();verzoegerugn();

i=2;
while(i)
{ //piep();verzoegerugn();
i--;
piep();verzoegerugn();
}
break;
}

/*case 3:{
i=3;
while(i)
{ //piep();verzoegerugn();
i--;
piep();verzoegerugn();
}
break;
}

case 4:{
i=4;
while(i)
{ //piep();verzoegerugn();
i--;
piep();verzoegerugn();
}
break;
}*/
}
}
//goto sprung;
}
// --------------------------------------------------------------------------------------------------------------------------------------------

lion1984
06.04.2006, 21:33
Hiho,

hm, ich sehe das du i als globale varialbe setzt, vielleicht scheitert es daran. versuch mal in dem case call einfach sooft piep zu setzen wie oft du es brauchst, also zb Taste 2:




case 2: {
PIEP;
Pause;
Piep;
Pause;
break;
}


weiterer tip wäre sicher, tasten entprellen zu lassen.

SECh
08.04.2006, 11:44
Hallo Lion,
das habe ich schon versucht einzeln im case die Unterfkt zu laden, allerdings klappts auch nicht so wie man sich das vostellt.
Kann man eine Tastenentprellung softwaretechnisch lösen?
Wenn ja wie?

Danke

lion1984
08.04.2006, 12:10
Hiho,

habe zurzeit kein beispiel, werde dir aber eines raus suchen, bis dahin es ist einfach, du arbeitest mit einer IF, while schleife was auch immer, Beispiel Port B Pin1, du wiederholfst die schleife solange Port B Pin1 wieder Low ist, solange befindest du dich in dieser schleife.

mfg Lion

[EDIT]
finde den source jetzt nicht auf die schnelle, sry, aber weitere gute seite ist http://www.fernando-heitor.de, da wird einem oft und schnell geholfen. wenn du ins forum gehst und unter "entprellen" und "entprellung" suchst, fidnest du einige möglichkeiten, auch andere.