Hall Effekt Sensor Programmieren

Gast #4122180
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;
}
Gast #4122186
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.
Gast #4122195
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.
Gast #4122208
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?
Gast #4123214
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.