mikrocontroller.net

Forum: Compiler & IDEs 2 Taster mit Interrupt


Autor: Chris F. (lieutenantfeist)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus,

Ich habe da ein kleines Problem. Ich schreibe grade ein Programm wo ich 
2 LEDs mit 2 Tastern benutzen moechte. Das laeuft im Moment noch nicht 
so ganz, sieht im Moment so aus:
#define F_CPU 3686400
#include <avr\io.h>
#include <inttypes.h>
#include <avr\interrupt.h>
//----------------------------------------------------------------------
volatile unsigned char buffer;

SIGNAL(SIG_INTERRUPT0)
{
  if( (!PIND2 & 4)){
    buffer = 3;
  }else if((!PIND2 & 8)) == 0){
    buffer = 1;
  }
}
//----------------------------------------------------------------------
main()
{
  DDRB  = 0xff;                // PortB = Output
  PORTB = 0xff;         // alle LEDs ON
  cbi(DDRD,2);                // PortD = Input
  cbi(DDRD,3);
  sbi(PORTD,2);
  sbi(PORTD,3);
  GICR  = 0x40;                // enable external int0 Bit 6
  MCUCR = 0x02;                // falling egde: int0 Bit 1
  sei();                       // enable interrupts
  do
  {
    PORTB = buffer;
  }
  while (true);                 // Mainloop
}
//----------------------------------------------------------------------

Taster 1 ist mit D.2, und Taster 2 mit D.3 verbunden. Die eine LED (die 
durch Taster 1 angeschaltet werden soll) ist an B.0, die zweite LED (zu 
Taster 2) and B.1. Ich dachte da kann man in einem Interrupt einfach 
schaun welcher der beiden Taster jetzt gedrückt ist...D.2 würde ja einer 
Bitkombination von 0b00000100 entsprechen (4) und D.3 0b00001000 (8). 
Und dann halt Buffer entsprechend setzen. Irgendwo ist da noch der Wurm 
drinnen und ich seh es nicht, oder ich hab totalen Bockmist gebaut :D. 
Tips was ich falsch gemacht habe, oder wo ein Gedankenfehler ist sind 
sehr willkommen.

Lg,
Chris

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Feist wrote:
#define F_CPU 3686400
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
//----------------------------------------------------------------------
volatile unsigned char buffer;

SIGNAL(SIG_INTERRUPT0)
{
  if (!(PIND & (1 << PIND2)))
  {
    buffer = 3;

1) falsch geklammert?
2) auch auf windose-rechnern / bei include, kein \
3) schon mal was von Entprellung gehört (debounce)?
4) PIND2 ist immer 2, das SFR heisst PIND. In C gibt es keine 
Bitvariablen.

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.