mikrocontroller.net

Forum: Compiler & IDEs taster mit atmel8


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich bin noch AVR Anfänger, und hab auch mir auch schon das AVR Tutorial 
angeschaut.
Nun habe ich noch eine Frage, wie ich eine Taster Einstellung einlesen 
kann. Ich habe an Port D, Pin 2 und Pin 1 jeweils einen Taster 
angeschlossen, mit dem ich an Port C, Pin 0 und Pin 5 eine LED schalten 
möchte.

Hier mein Code:
#define F_CPU 100000
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdint.h>




void io()
{
  DDRB = 0x11;
  DDRD = 0xFF;


}

void long_delay(uint16_t ms)

{
    for (; ms>0; ms--) _delay_ms(1);

}


int main()
{

  io();


    while (1)
  {



  if ( PIND & (0<<PIND1) )
  {
    long_delay(1000);
    PORTB = 0b00000001;
  }



  if ( PIND & (0<<PIND2) )
  {
  long_delay(1000);
  PORTB = 0b00010000;
  }


    }

  return 0;

}


Vielen Dank schon mal für eure Hilfe

Gruß
Michael

Autor: Hans-jürgen Herbert (hjherbert) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da brauchst du nichts entprellen, weil immer das gleiche passiert: Wenn 
"PIND & (0<<PIND1)" kommt, dann wird "PORTB = 0b00000001" geschaltet, 
egal, ob einmal, oder mehrmals.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber das funktioniert so noch nicht...
Was kann ich ändern??

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

die LED auch an PortB anschließen?
Zitat: mit dem ich an Port C, Pin 0 und Pin 5 eine LED schalten möchte.

Ja was denn nun?

Gruß aus Berlin
Michael

Autor: Michael Kuehn (michael1104)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die LED's sind an Port B angeschlossen, die Taster an Port D.
Das Problem ist, ich will mit einem Taster 1 Led 1 einschalten und mit 
Taster 2 Led 2. Und wenn ich beide Schalter drücke, sollen beide Led's 
angehen...

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1)
  DDRD = 0xFF;
Wie willst du an D etwas einlesen, wenn der ganze Port als Ausgang 
konfiguriert ist?

2)
  if ( PIND & (0<<PIND1) )
Da steht effektiv "PIND & 0" und das ist immer false.

3)
#define F_CPU 100000
Meinst du wirklich, dass dein µC mit 100 kHz läuft?

Autor: Michael Kuehn (michael1104)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So die 1) und 3) hab ich geändert, das unter 2) versteh ich nocht nicht 
ganz, was ich da einstellen muss...

Autor: ernst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie im Tutorial beschrieben:
if (PIND&(1<<PD1))
{
//tuwas
}

oder du schreibst ein Makro:
#define GET(PORT,PIN)  ((PORT)&(1<<(PIN)))

//dann

if (GET(PIND,PD1))
{
//tuwas
}

ernst

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

immernoch ASM-Programmierer und ohne richtige C-Kenntnisse, trotzdem:

wenn er bei gedrückter Tste das Pin auf 0 abfragen will, sollte es dann 
nicht z.B.

if ((PIND&(1<<PD1)) == 0)
{
//tuwas
}

heißen?

Gruß aus Berlin
Michael

Autor: Michael Kuehn (michael1104)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, klappt alles...
Die Led's gehen auch wieder aus, wenn ich die IF Schleife noch um 
folgendes ergänze:

  else
  PORTB = 0;

Gruß
Michael

Autor: ernst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>wenn er bei gedrückter Tste das Pin auf 0 abfragen will, sollte es dann...

dann so:
if (!(PIND&(1<<PD1)))
{
//tuwas
}

gruß

Autor: Michael Kuehn (michael1104)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Frage habe ich noch, wieso messe ich an dem einen Port 5V und an 
dem anderen 2,5 Volt, am Ausgang?

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wahrscheinlich hast Du ihn ueberlastet oder falsch gemessen.

Autor: michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich muss doch am ausgang 5v gegen gnd messen...bei unbelasteten ports...

Autor: Christoph S. (mixer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: michael1104 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hilft mir irgendwie nicht weiter...

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Port, an dem du 2,5 V gemessen hast, war wahrscheinlich ein Eingang, 
und kein Ausgang.

Autor: Michael Kuehn (michael1104)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hier nochmal mein code, ich messe jeweils an einem ausgang 5V und an dem 
anderen Ausgang 2,5V. Realisiert durch jeweils einen Taster....

#define F_CPU 8000000
#include <avr/io.h>
#include <stdint.h>





void io()
{
  DDRB = 0xFF;
  PORTB = 0x00;
  DDRD = 0x00;
  PORTD = 0xFF;

}



int main()
{

  io();


    while (1)
  {



  if (( PIND & (1 << PD3)) == 0)
  {

    PORTB = 0b00010000;
  }



  if (( PIND & (1 << PD2)) == 0)
  {

  PORTB = 0b00000001;

  }

  else
  PORTB = 0;



    }

  return 0;

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das "else PORTB = 0;" bezieht sich nur auf das zweite if.
Wenn du also den Taster an PD3 drückst, wechselt PB4 sehr schnell 
zwischen 0 und 5 V hin und her. Macht im Mittel dann 2,5 V.

Ändere die Zeile
if (( PIND & (1 << PD2)) == 0)
in
else if (( PIND & (1 << PD2)) == 0)
und du wirst an beiden Pins 5 V messen.

> Und wenn ich beide Schalter drücke, sollen beide Led's
> angehen...
Das wird nach der Änderung dann aber nicht mehr gehen.

Autor: Michael Kuehn (michael1104)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So gehts auch, dann mess ich 2,5V...Das reicht mir

Vielen Dank

  if (( PIND & (1 << PD3)) == 0)
  {

    PORTB = 0x10;
  }

  else
  PORTB = 0x00;

  if (( PIND & (1 << PD2)) == 0)
  {

  PORTB = 0x01;

  }

  else
  PORTB = 0x00;

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.