Forum: Compiler & IDEs taster mit atmel8


von Michael (Gast)


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

von Hans-jürgen H. (hjherbert) Benutzerseite


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.

von Michael (Gast)


Lesenswert?

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

von Michael U. (amiga)


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

von Michael K. (michael1104)


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

von Stefan E. (sternst)


Lesenswert?

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

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

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

von Michael K. (michael1104)


Lesenswert?

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

von ernst (Gast)


Lesenswert?

Wie im Tutorial beschrieben:
1
if (PIND&(1<<PD1))
2
{
3
//tuwas
4
}

oder du schreibst ein Makro:
1
#define GET(PORT,PIN)  ((PORT)&(1<<(PIN)))
2
3
//dann
4
5
if (GET(PIND,PD1))
6
{
7
//tuwas
8
}

ernst

von Michael U. (amiga)


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

von Michael K. (michael1104)


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

von ernst (Gast)


Lesenswert?

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

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

gruß

von Michael K. (michael1104)


Lesenswert?

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

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Wahrscheinlich hast Du ihn ueberlastet oder falsch gemessen.

von michael (Gast)


Lesenswert?

ich muss doch am ausgang 5v gegen gnd messen...bei unbelasteten ports...

von Christoph S. (mixer) Benutzerseite


Lesenswert?


von michael1104 (Gast)


Lesenswert?

Hilft mir irgendwie nicht weiter...

von Stefan E. (sternst)


Lesenswert?

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

von Michael K. (michael1104)


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;

von Stefan E. (sternst)


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
1
if (( PIND & (1 << PD2)) == 0)
in
1
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.

von Michael K. (michael1104)


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;

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.