PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Denkfehler beim Programmieren



dpointeck
29.10.2007, 08:22
Hallo Leute!

Mein Name ist Daniel und bin neu hier im Forum.
Werde euch ab heute mit meinen Fragen belästigen.

und da ist mir dann auch schon eine eingefallen.
und zwar versuche ich mit einem PIC-16F877 einen Blinktakt zu
überprüfen.
Hab also mal ein Unterprogramm geschrieben das quasi überprüfen soll das deras Blinksignal kommt, d.h. nicht immer 1 bzw. nicht immer 0 ist.
Wie würdet ihr das Problem angehen???

mfg Daniel



void Blinker(void)
{
while(Taster == 0)
{
unsigned char a;
a = 6;

if((PORTB & 0b00001000) == 0b00001000)
{
a = a + 1;
}

if(a >= 5)
{
blink_test = 1;
}

}
}

askazo
29.10.2007, 10:13
Zuverlässig kannst Du das wohl nur überprüfen, wenn Du das ganze per Interrupt machst. Du hängst das Signal also an einen Interrupteingang und kannst dann in der ISR zählen, wie oft z.B. eine positive Flanke kommt und so das Blinken registrieren.

Mit der Polling-Lösung hast Du immer das Risiko, dass Du beim abfragen immer nur den High- bzw. den Low-Pegel des Signal triffst.

askazo

robocat
29.10.2007, 10:45
habe leider keinen pic zum testen da und in letzter zeit eher pc software gebastelt, deshalb ohne gewähr (bei den atmegas fragt man PINB ab). ich habe angenommen, dass Taster während der "messung" = 0 ist und seinen zustand auch innerhalb der funktion ändern kann (sonst läuft die funktion, bis ein flankenwechsel erfasst wird).

int check()
{
int state=PINB&0b00001000;
while(Taster==0&&(PINB&0b00001000==state);
if(Taster==0)return 1;
else return 0;
}

gruesse

dpointeck
29.10.2007, 11:04
Danke @askazo und robocat;
Hab mich für die Interrupt variante entschieden und hat auf anhieb funktioniert.

das sieht dann wie folgt aus:




void interrupt isr(void)
{

GIE=0;



if (RBIF) // Am port B hat sich etwas geändert
{

if ((PORTB & 0b00010000) == 0b00010000)
{
a = a + 1; // variable a die bei jeder high flanke um 1
// erhöht wird
}

if (a >= 15)
{
Blink_test = 1;
}
}