Hallo, ich habe ich Problem und hoff ihr könnt mir dabei weiter helfen. Ich möchte mehrere LEDs mit einem Hall Effekt Sensor(A1120EUA-T) ansteuern. Die LED soll jedes mal wenn der Magnet am Sensor vorbeigeht für ein paar msec. aufleuchten und dann aufhören zu leuchten. Das ganze habe ich versucht mit einer ISR zu machen und habe dafür auf den Interrupt-on-Change verwendet. Jedoch macht es was ganz anderes: die LED leuchtet auf wenn ich mit dem Magneten am Sensor bin und geh ich wieder weg mit dem Magneten hört sie auf zu leuchten. Zum Programmieren verwende ich "C" (MPLAB IDE) und den Compiler XC8. Mein PIC: PIC18f2520 ------------------------------------------------------------------------ ----- #include <htc.h> #include <xc.h> #include <pic18f2520.h> int i=0; //__CONFIG(INTIO & WDTDIS & PWRTDIS & MCLRDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS; #define _XTAL_FREQ 4000000; void interrupt ISR(); int main(void) { TRISB = 0b11111111; TRISA = 0b00000000; //Alle Ports sind Ausgänge TRISAbits.RA0 = 0; TRISAbits.RA1 = 0; TRISAbits.RA2 = 0; TRISAbits.RA3 = 0; TRISAbits.RA4 = 0; TRISAbits.RA5 = 0; TRISBbits.RB4 = 1; T0CONbits.T08BIT = 1; // Timer0 is configured as a 8-bit timer/counter T0CONbits.T0CS = 0; // Internal instruction cycle clock (CLKO) T0CONbits.T0PS0 = 1; // 1:2 Prescale value T0CONbits.T0PS1 = 1; T0CONbits.T0PS2 = 1; T0CONbits.PSA = 0; // Timer0 prescaler is assigned. Timer0 clock input comes from prescaler output INTCONbits.TMR0IF = 0; // TMR0 register has overflowed (must be cleared in software) INTCONbits.TMR0IE = 1; // Enables the TMR0 overflow interrupt T0CONbits.TMR0ON = 0; // Enables Timer0 INTCONbits.GIE = 1; INTCONbits.RBIE = 1; // Enables the RB port change interrupt INTCONbits.RBIF = 0; // None of the RB<7:4> pins have changed state LATAbits.LATA5 = 0; while(1) { LATAbits.LATA0 = 0; for(i=0; i<231; i++); LATAbits.LATA0 = 1; for(i=0; i<8; i++); } } void interrupt ISR() { if(INTCONbits.RBIF == 1) { LATAbits.LATA5 = 1; for(i=0; i<231; i++); //LATAbits.LATA5 = 1; } INTCONbits.RBIF = 0; LATAbits.LATA5 = 0; }
Peter schrieb: > for(i=0; i<231; i++); Was meinst du, wie lange (oder besser wie kurz) das dauert? Bist du überhaupt sicher, dass dein Compiler den Code nicht wegoptimiert, weil dort sowieso nichts passiert? Guck mal deine Compilereinstellungen an. Übrigens ist es ganz übel, den Prozessor in einem Interrupt mit Zeittotschlagen zu beschäftigen, weil er dann blockiert ist.
- Wieso machst du die PORTx Zuweisung mehrfach?
- Wieso formatierst du deinen Code nicht richtig. Du verstehst doch so
überhaupt nicht was dein Programm macht?
- Wieso initialisierst du Timer1 wenn du ihn nicht brauchst? Codeschrott
erzeugen?
> for(i=0; i<231; i++);
- Solche "leeren" for-Schleifen werden vom Compiler ersatzlos
wegoptimiert (gestrichen)
- Schleifen in einer ISR sind völlig deplatziert.
Ja da ist etwas an Codeschrott dabei, weil ich einen alten Code genommen habe und ihn überschrieben habe. Die Schleife sollte nicht wegkomprimiert werden da ich das mit einem Oszilloskop nachgemessen habe. Zur Schleife in der ISR, da wusste ich nicht das so etwas den Interrupt blockieren kann. Ich wollte mit der Schleife einfach nur die zeit einstellen wie lange die LED leuchten bzw. nicht leuchten soll... Wie könnte ich das dann anders lösen ohne der Schleife in der ISR? Habt ihr da einen Tipp für mich?
Wolfgang schrieb: > Peter schrieb: >> for(i=0; i<231; i++); > > Was meinst du, wie lange (oder besser wie kurz) das dauert? 23µsec
Wolfgang schrieb: > Peter schrieb: > Bist du > überhaupt sicher, dass dein Compiler den Code nicht wegoptimiert, weil > dort sowieso nichts passiert? Guck mal deine Compilereinstellungen an. wird nicht wegkomorimiert > Übrigens ist es ganz übel, den Prozessor in einem Interrupt mit > Zeittotschlagen zu beschäftigen, weil er dann blockiert ist. wird geändert danke :D
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.