mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Komisches Verhalten des Taster-Pins


Autor: Michael S. (michl-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Halle Leute, ich besitze das Explorer16- Entwicklungsboard von 
Microchip.
Auf dem ist an PortA-7 ein Taster angeschlossen. Unentprellt, active 
low. Gleichzeitig hängt an diesem Pin auch noch ne LED dran, über einen 
Jumper ausschaltbar.

Jetzt zu dem Verhalten:
Lese ich den PortA ein, so steht jedes mal 0x00 im Register, als ob alle 
Pins, insbesondere Pin7, LOW sind. (taster also gedrückt wäre???)
Auch meine Button-Routine erkennt LOW, also Taster gedrückt. Die Routine 
funktioniert, denn wenn ich diesem Button-Event einen anderen Port 
zuweise funktionierts. Also liegt es definitiv an dem Port.
Er ist als Eingang definiert und es hängt nichts weiteres mehr daran. 
Wenn ich mit dem DMM messe, liegen auch 3,3V an. Stimmt also.
Vielleicht hat jemand von euch noch eine Idee woran das liegen könnte...

Es dreht sich um den S5, bzw S5_INPUT im Code.

Systeminfos:
µC: dsPIC33FJ256GP710
IDE: MPLAP IDE v8.40 mit ICD2
#include "p33FJ256GP710.h"
#include "timer.h"
#include "nmea.h"
#include "buttons.h"


/***** ISR (autp_psv) definition *****/
#define _ISR_AUTOPSV __attribute__((interrupt, auto_psv))


int put_select;
unsigned char timer_cnt;



void Init_Timer1 (void)
{
  T1CON = 0;
  T1CONbits.TCKPS = 0b10;
  T1CONbits.TCS  = 0;
  TMR1  = 0x0000;
  PR1    = 31250;

  IPC0bits.T1IP = 0x05;
  IFS0bits.T1IF = 0;
  IEC0bits.T1IE = 1;

  T1CONbits.TON = 1;

  timer_cnt = 0;
  reset_buttons();
}


void _ISR_AUTOPSV _T1Interrupt( void )
{
  unsigned char counter;

  timer_cnt++;

  button[ENTER].status &= (~ENTER_INPUT);
  button[UP].status    &= (~UP_INPUT);
  button[RIGHT].status &= (~RIGHT_INPUT);
  button[DOWN].status  &= (~DOWN_INPUT);
  button[LEFT].status  &= (~LEFT_INPUT);
  button[S3].status   &= (~S3_INPUT);
  button[S4].status   &= (~S4_INPUT);
  button[S5].status    &= (~S5_INPUT);
  button[S6].status    &= (~S6_INPUT);


  if (timer_cnt >= 2)
  {
    timer_cnt = 0;

    for (counter = 0; counter < MAX_SIZE; counter++)
    {
      if (button[counter].status)
        button[counter].event = 1;
      else
        button[counter].status = 1;
    }
  }    
  IFS0bits.T1IF = 0;
}
#define ENTER_INPUT PORTDbits.RD3
#define UP_INPUT   PORTDbits.RD4
#define RIGHT_INPUT PORTDbits.RD5
#define DOWN_INPUT   PORTDbits.RD6
#define LEFT_INPUT   PORTDbits.RD7
#define S3_INPUT   PORTDbits.RD6
#define S4_INPUT  PORTDbits.RD13
#define S5_INPUT  PORTAbits.RA7
#define S6_INPUT  PORTDbits.RD7




enum buttons
{
  ENTER,
  UP,
  RIGHT,
  DOWN,
  LEFT,
  S3,
  S4,
  S5,
  S6,
  MAX_SIZE  
};


typedef struct {
  unsigned char event;
  unsigned char status;
}button_attributes;



extern button_attributes  button[MAX_SIZE];


void reset_buttons (void);
  while(service == UNSELECTED)
  {
    if (button[S5].event)
    {
      service = TRACKER;
      init_put_track();
      tracking_status = START_TRACKING;
      button[S5].event = 0;
    }

    if (button[RIGHT].event)
    {
      service = VIEWER;
      button[RIGHT].event = 0;
    }
  }

Und genau hier oben tritt immer(!) ein button-S5-Event ein.
Timer kommt alle 10ms zum entprellen.
In dem Datenblatt auf Seite 33 - Abschnitt 4.2.9 ff.
http://ww1.microchip.com/downloads/en/DeviceDoc/Ex...

Autor: Michael S. (michl-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe gerade nochmal geschaut. Der Debugger zeigt die korrekten Werte 
für PortA0 - PortA5 an. Nur 6 und 7 haben keinen Einfluss iwie obwohl 
ich sie direkt auf 3,3V gehängt habe...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael S. schrieb:
> Ich habe gerade nochmal geschaut. Der Debugger zeigt die korrekten Werte
> für PortA0 - PortA5 an. Nur 6 und 7 haben keinen Einfluss iwie obwohl
> ich sie direkt auf 3,3V gehängt habe...

Hä?

Du hast sie direkt auf 3.3V gehängt UND da hängt dann auch noch ein 
active-Low Taster drann?

Das ergibt einen Kurzen, wenn du den Taster betätigst.

Autor: Michael S. (michl-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo is mir klar, deswegen habe ich den in diesem Moment auch nicht 
gedrückt! War nur zum Einlesen so angeschlossen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß nicht, welcher Chip auf deinem Board verbaut ist.
Aber bei einigen AVR ist es zb so, das ausgewählte Ports (namentlich 
diejenigen die über einen ADC angesprochen werden können) eine eigene 
Spannungsversorgung am IC haben. Schliesst man die nicht an, kommt es 
auch zu solch seltsamen Effekten.

Vielleicht hat der Port auf deinem IC auch irgendso eine Sonderrolle?

Autor: Michael S. (michl-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Ausgang-Funktion des Pins funktioniert noch.
Kanns sein, dass der Input-Zweig im Ar*** ist, oder...

Sonderrolle wäre AD-Eingang 22 und 23. ADC ist aber aus.

Autor: dsPIC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könnte hinkommen. Was meint der Rest der µC-Welt?^^

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.