Forum: Mikrocontroller und Digitale Elektronik Hall Effekt Sensor Programmieren


von Peter (Gast)


Lesenswert?

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;
}

von Wolfgang (Gast)


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

- 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.

von Peter (Gast)


Lesenswert?

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?

von Peter (Gast)


Lesenswert?

Wolfgang schrieb:
> Peter schrieb:
>> for(i=0; i<231; i++);
>
> Was meinst du, wie lange (oder besser wie kurz) das dauert?

23µsec

von Peter (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.