Forum: Mikrocontroller und Digitale Elektronik erstes Programm mit AVR Studio


von Hans P. (gableguy2000)


Lesenswert?

Hallo,

habe eben mit mC Programmierugn angefangen.
Ich programmiere mit AVR Studio.
Ich habe folgendes Programm geschrieben:

#include <avr/io.h>
#include <stdint.h>

int main(void)
{


PORTB |= (1<<PB0);


return(0);

}

Ich will nur, das die LED0 leuctet, dafür habe ich den Port B, Pin0 doch 
auf 1 gesetzt, oder?
Jetzt ist er doch high und die LED müsste brennen? Ich benutze ein 
STK-500 Board, und eine Atmel 8515.
Ich habe es simuliert, aber ohne Erfolg, wenn ich in  AVR Studio dann 
rechts auf die I/O´s klicke, und dort PortB öffen, dann sehe ich 8 
weisse Kästchen, das erste müsset aber doch schwarz sein, oder?
Habe ich irgebdwas nicht richtig beachtet, oder mache ich es mir zu 
leicht.
Wie bekomme ich ein hex File hin, damit ich es auf mein Board (mC) 
übertragen kann?

LG

von ... .. (docean) Benutzerseite


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Tutorial ist gut.
Und um es kurz und knackig zu sagen:
Du musst dem Port auch noch mitteilen, dass dieser eine Pin, auf dem du 
auszugeben gedenkst, auch auf Ausgang zu schalten ist (über das DDR 
Register)

von horst (Gast)


Lesenswert?

Stichwort Data Direction Register

Was glaubst du, was nach
return (0)
passiert?
Verwende doch irgendwo eine Endlosschleife.

von Hans P. (gableguy2000)


Lesenswert?

Hallo,

O.K.

dann würde doch laut dem Tutorial der Befehle:

DDRB = 0x01;

damit sage ich Ihm doch, das er ein Ausgang ist, oder?
Habe die Zeile noch eingefügt, wenn ich das Programm jetzt rüberschicke, 
dann brenne ganz kurz die LED´s 5,6,7.
Das geht so schnell, dass ich es am Anfang nicht gesehen habe. Immer 
wennich in AVR Studio auf Programm klicke, dannleuchten diese drei LED´s 
kurz auf.

LG

von Karl H. (kbuchegg)


Lesenswert?

Hans Peter schrieb:
> Hallo,
>
> O.K.
>
> dann würde doch laut dem Tutorial der Befehle:
>
> DDRB = 0x01;

Genau.
Schreibs aber besser so

   DDRB |= (1<<PB0);

dann sieht es genau gleich aus wie die Ausgabe und men erkennt auch 
besser, dass Pin 0 auf Ausgang gesetzt wird. Irgendwann hast du nämlich 
mehrere Pins, die du auf Ausgang setzen willst und dann sieht man mit

   DDRB |= (1<<PB0) | (1<<PB1) | (1<<PB4);

besser welche das sind, als mit

   DDRB = 0x13;

von Karl H. (kbuchegg)


Lesenswert?

Hans Peter schrieb:

> Das geht so schnell, dass ich es am Anfang nicht gesehen habe. Immer
> wennich in AVR Studio auf Programm klicke, dannleuchten diese drei LED´s
> kurz auf.

Deswegen zwingt man auch den Prozessor in eine Endlosschleife. 
Normalerweise arbeitet man in dieser die Programmlogik ab
1
#include <avr/io.h>
2
#include <stdint.h>
3
4
int main(void)
5
{
6
  DDRB |= (1<<PB0);
7
8
  while( 1 ) {
9
    PORTB |= (1<<PB0);
10
  }
11
}

Bei dir ist die 'Programmlogik': immer wieder an PORTB den Ausgang 
setzen. Das ist zwar ein wenig sinnlos, weil man den Ausgang eigentlich 
nur einmal setzen müsste, aber was solls.

von Hans P. (gableguy2000)


Lesenswert?

Hallo,

ok, das leuchtet mir ein. Mein Programm sieht jetzt so aus:
#include <avr/io.h>
#include <stdint.h>


int main(void)
{
DDRB |= (1<<PB0);
PORTB |= (1<<PB0);
return(0);
}

Muss das DDRB.... in den Main Block?
Wenn ich es so rüberschicke, dann brenen die gleichen LED´s kurz auf. 
Mehr nicht.
Ich will aber LED0 ansprechen, nicht LED 5-7?
Habe ich einen Denkfehler?

von Karl H. (kbuchegg)


Lesenswert?

Hans Peter schrieb:
> Hallo,
>
> ok, das leuchtet mir ein. Mein Programm sieht jetzt so aus:
> #include <avr/io.h>
> #include <stdint.h>
>
> DDRB |= (1<<PB0);

Das kann nicht ausserhalb einer Funktion stehen

> int main(void)
> {
> PORTB |= (1<<PB0);
> return(0);
> }
> Aber ich bekomme die fehlermeldung:
> ../Leuchtende_LED.c:4: error: expected identifier or '(' before
> 'volatile'
> ../Leuchtende_LED.c:4: error: expected ')' before '(' token
>
>
> Kann damit aber leider nix anfangen.

ausführbare Anweisungen stehen immer in einer Funktion.

> Habe doch überall Klammern und Semikolons, oder?

Aber du hast kein C-Buch

von Karl H. (kbuchegg)


Lesenswert?

Hans Peter schrieb:

> Ich will aber LED0 ansprechen, nicht LED 5-7?
> Habe ich einen Denkfehler?

Wie rum sind deine LED angeschlossen?
Brennt eine LED, wenn eine 0 oder wenn eine 1 ausgegeben wird?

Probier mal folgendes
1
#include <avr/io.h>
2
#include <stdint.h>
3
4
int main(void)
5
{
6
  DDRB |= 0xFF;
7
8
  while( 1 ) {
9
    PORTB |= 0xAA;
10
  }
11
}

das schaltet abwechselnd immer einen Pin auf 0 und den nächsten auf 1.
Wenn du am Port B 8 Led hängen hast, sollten 4 davon brennen.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Abschreiben sollte man können.

von Karl H. (kbuchegg)


Lesenswert?

Christian H. schrieb:
> Abschreiben sollte man können.

Copy&Paste ist schon erfunden :-)

von Hans P. (gableguy2000)


Lesenswert?

Hallo,

ich habe wie gesagt das Programm zum STK-500 geschickt, wenn ich in 
AVR-Studio auf Programm klicke, dann schickt er mir die Daten ans Board.
Wenn das geschieht, dann leuchten die LED´s 5-7.
Danach fängt dann die LED0 an zu leuchten.
Ich bin froh, dass die LED endlich leuchtet, so ist schonmal das 
ansprechen der Ausgänge klar geworden, aber warum die anderen 3 LED´s am 
Anfang brenne, das weis ich nicht, kann mir das auch nicht erklären.

Hat von euch einer eine Idee?

Lg und DANKE

von Stefan E. (sternst)


Lesenswert?

Hans Peter schrieb:

> Ich bin froh, dass die LED endlich leuchtet, so ist schonmal das
> ansprechen der Ausgänge klar geworden, aber warum die anderen 3 LED´s am
> Anfang brenne, das weis ich nicht, kann mir das auch nicht erklären.

Das sind die Pins, über die der Chip programmiert wird. Die leuchten 
nicht "am Anfang" des Programms, sondern während das Programm zum Chip 
transferiert wird.

von James (Gast)


Lesenswert?

Beim STK 500 Board ist die LED "ein" wenn der Port 0 ausgibt.

Daß beim Laden des Progs die LEDS 5,6,7 kurz aufleuchten ist
auch normal, die hängen nämlich an der MISO, MOSI und SCK-Leitung.
Gilt aber nur für die Ladezeit, dann sollten die LED das machen
was Du willst, vorausgesetzt die Ports sind Ausgänge......
Während des Ladens sind in der "Status"-LED, neben dem
"quadratischen µC" auf dem STK500-Board, die rote und die grüne
LED gleichzeitig an.

Du hast vermutlich das 10 polige Flachbandkabel vom PortB zu
den LED verwendet.

Gruß

James

von Hans P. (gableguy2000)


Lesenswert?

Ja, das habe ich gemacht. Stand ja auch so in der Beschreibung.
Auf jeden fall klappt es jetzt.
Habe auch schon die LED zum blinken bekommen.
Jetzt will ich die LED noch über einen Taster ein- bzw. ausschalten.


LG

von Hans P. (gableguy2000)


Lesenswert?

Hallo,

ich bin es noch mal.
Habe jetzt versucht die LED über eine Taster einzuschalten, hier der 
Code:

#include <avr/io.h>
#include <stdint.h>


int main( void )
{
    DDRB ^= (1 << PB0); //LED ist ausgeschaltet
  DDRD = (0 << PD0) ;//Als Ausgang deklarieren

  if (1<<PIND0) //Abfrage ob PIND0 = 1 ist
  {
     PORTB |= (1<<PB0); //LED zu leuchten bringen
   }

    return 0;
}

Aber es geht nicht.

LG

von Marcus K. (marcusk)


Lesenswert?

da musst du aber schnell sein, du hast schon wieder keine haupt scheife 
in den Programm. Jetzt musst du den Taster inerhalb von ein paar µS 
drücken - viel spass.

von Hans P. (gableguy2000)


Lesenswert?

Hallo,

ich habe doch die main, oder ist das keine Schleife?
Kannst du mir erklären was du genau mit Hauptschleife meinst?

LG

von Marcus K. (marcusk)


Lesenswert?

> ich habe doch die main, oder ist das keine Schleife?
ein schleife ist etwas, wo auch etwas wiederhohlt wird wo ist das bei 
main der Fall?

lies dir doch mal bitte alle Beiträge durch, es steht schon sehr gut 
beschrieben was das ist.

von Oliver (Gast)


Lesenswert?

> ich habe doch ...

Aber du hast immer noch kein C-Buch.

C (und jede andere Programmiersprache auch) ist nicht selbsterklärend. 
Die Grundlagen muß man sich schon anlesen.

Oliver

von Hans P. (gableguy2000)


Lesenswert?

Was wenn ich eine while Schleife drumbaue, geht es dann?
Brauche ich immer so eine Schleife?
Es gibt doch auch Programme in C die keine Schleife habe?
Ich will doch nur wenn der Taster gedrückt wird, dass eine LED angeht.
Dafür habe ich die if-Schleife programmiert.

von Marcus K. (marcusk)


Lesenswert?

> Es gibt doch auch Programme in C die keine Schleife habe?
richtig, und was machen sollte programm nach dem sie fertig sind, sie 
beenden sich. Willst du das sich dein Programm beendet?

von Hans P. (gableguy2000)


Lesenswert?

Also, wenn ich den Taster gedrückt habe und die LED brennt, dann kann es 
sich ruhig beenden.
Mir geht es ja nur darum, erstmal die LED zu schalten.
Was ist hiermit:
#include <avr/io.h>
#include <stdint.h>


int main( void )
{
    DDRB = (1 << PB0); //LED ist ausgeschaltet
    DDRD  = (0 << PD0) ;//Als Ausgang deklarieren
  while(1)
{
  if (1<<PIND0) //Abfrage ob PIND0 = 1 ist
  {
     PORTB = (1<<PB0); //LED zu leuchten bringen
   }
}
    return 0;
}

Geht zwar auch nicht, aber ich habe ein Schleife.

von Oliver (Gast)


Lesenswert?

>Was wenn ich eine while Schleife drumbaue, geht es dann?
Nein.

>Brauche ich immer so eine Schleife?
Nein.

>Es gibt doch auch Programme in C die keine Schleife habe?
Ja.

>Ich will doch nur wenn der Taster gedrückt wird, dass eine LED angeht.
Tja, um sowohl C, als auch das Programmieren von Mikrocontrollern 
generell, als auch speziell das Programmieren von AVR's zu lernen, das 
ist schon eine ganze Menge.

>Dafür habe ich die if-Schleife programmiert.
Es gibt keine if-Schleifen. Und die Bedingung in der Klammer ist Unsinn. 
Wie man den Wert eines Pins liest, steht, wie vieles andere auch, oben 
links im Tutorial. Bitte arbeite das doch mal durch. Ein C-Buch oder 
eine online verfügbare Einführung in C brauchst du aber trotzdem.

Oliver

von Marcus K. (marcusk)


Lesenswert?

weil du dir immer noch nicht die Grundlagen anglesen hast.

> if (1<<PIND0) //Abfrage ob PIND0 = 1 ist

ist zwar syntaktisch richtig, aber inhaltlich komplett falsch.

von Karl H. (kbuchegg)


Lesenswert?

Hans Peter schrieb:
> Also, wenn ich den Taster gedrückt habe und die LED brennt, dann kann es
> sich ruhig beenden.

Dein Programm läuft ohne die Hauptschleife in ein paar µs durch. Denkst 
du wirklich, dass du die Taste schnell genug zum richtigen Zeitpunkt 
drücken kannst, nachdem das Programm angefangen hat zu laufen?

Und nein, wenn dein Programm aus main() wieder zum 'Aufrufer' zurück 
kommt, wird es nicht neu gestartet, sondern der µC stellt seine Arbeit 
ein (ist nicht ganz richtig, aber der Effekt ist derselbe). Wenn dein 
Programm aus dem main() also rauskommt, passiert nichts mehr. Gar nichts 
mehr.

> Mir geht es ja nur darum, erstmal die LED zu schalten.

Dann studiere(!) das Tutorial. Link dazu hast du ja schon.

> #include <avr/io.h>
> #include <stdint.h>
>
>
> int main( void )
> {
>     DDRB = (1 << PB0); //LED ist ausgeschaltet
>     DDRD  = (0 << PD0) ;//Als Ausgang deklarieren

Nein. Das geht so nicht.
Dein Glück ist, dass jeder Port beim Starten des Prozessors sowieso auf 
Eingang geschaltet ist.

>   while(1)
> {
>   if (1<<PIND0) //Abfrage ob PIND0 = 1 ist

PIND0 kannst du nicht abfragen.
PIND0 ist nichts anderes als ein Zahlenwert, der den Pin spezifiziert. 
Aber an welchem Port?

    if( PIND & ( 1 <<PIND0 ) )

PIND einlesen und mit einem & das dich interessierende Bit 
herausmaskieren.

> Ghet zwar auch nicht, aber ich habe ein Schleife.

Und du hast immer noch kein C-Buch

von Hans P. (gableguy2000)


Lesenswert?

Nein, das schaffe ich natürlich nicht.
Habe es jetzt mal so versucht, aber es bringt nix, außer das jetzt LED0 
(PB0) brennt.

#include <avr/io.h>
#include <stdint.h>


int main( void )
{
    DDRB = (1 << DDB0); //LED ist ausgeschaltet
    DDRD = (0 << DDD0) ;//Als Ausgang deklarieren

  while(1)
{
  if( PIND & ( 1 <<PIND0 ) ) //Abfrage ob PIND0 = 1 ist
  {
     PORTB |= (1<<PB2); //LED zu leuchten bringen
   }
}
    return 0;
}


Kannst du mir denn mal ein gutes Buch für den Einstieg empfehlen?
Will ja nicht den ganzen Tag irgendwelche Leute hier im Forum nerven.

LG

von Karl H. (kbuchegg)


Lesenswert?

Hans Peter schrieb:
> Nein, das schaffe ich natürlich nicht.
> Habe es jetzt mal so versucht, aber es bringt nix, außer das jetzt LED0
> (PB0) brennt.

Dann wird wohl dein Taster so verschaltet sein, dass er standardmässig 
eine 1 bringt wenn er nicht gedrückt ist, und eine 0 bringt wenn er 
gedrückt wird.
1
#include <avr/io.h>
2
#include <stdint.h>
3
4
int main( void )
5
{
6
  DDRB = (1 << DDB0); //LED ist ausgeschaltet
7
8
  PORTD = ( 1 << DDD0 );  // Pullup Widerstand an D0 einschalten
9
10
  while(1)
11
  {
12
    if( ( PIND & ( 1 <<PIND0 ) ) == 0 )
13
      PORTB |= (1<<PB2); //LED zu leuchten bringen
14
    else
15
      PORTB &= ~(1<<PB2); //LED wieder ausschalten
16
  }
17
}

> Kannst du mir denn mal ein gutes Buch für den Einstieg empfehlen?

Der Klassiker: Kernighan & Ritchie, Programmieren in C
Deine ersten Sporen in der C-Programmierung solltest du dir auf einem PC 
verdienen. Da fällt das ganze Sonderwissen, welches man zur 
µC-Programmierung braucht und um welches es hauptsächlich im Tutorial 
geht, nämlich erst mal weg.
Um es klar zu sagen: Das Tutorial ist für Leute geschrieben, welche 
schon ein wenig C können

von Kasperle (Gast)


Lesenswert?


von Kasperle (Gast)


Lesenswert?

PORTB |= (1<<PB2); //LED ausschalten

PORTB &= ~(1<<PB2); // LED zum leuchten bringen

Beim STK500 sind die LEDs low aktiv.

von Hans P. (gableguy2000)


Lesenswert?

Hallo,

ich hätte noch Fragen zu AVR Studio.
Wenn ich ein Projekt schließe, und ien neue anlege, dort den 
Programmcode reinschriebe, dann F7 (Build) drücke, dann läuft das 
Programm ja durch und wird auf Fehler kontrolliert, oder?
Danach klicke ich immer auf das kleine IC, wo AVR draufsteht.
Dann öffent ssich ja ein fenster in dem ich meinen mC auswählen kann und 
dann mein .hex File.
Wenn ich das bis dorthin alles gemacht habe, dann finde ich aber auch 
kein .hex File. Ich habe auch schon in dem default Ordner geschaut, aber 
dort sind nur meine alten drin.
Ich habe meine .c Datei am Anfang z.B. LED_schalten genannt.
Generiert er mir da nicht automatisch eine .hex Datei mit dem gleichen 
Namen?


LG

von Oliver (Gast)


Lesenswert?

>Ich habe meine .c Datei am Anfang z.B. LED_schalten genannt.
>Generiert er mir da nicht automatisch eine .hex Datei mit dem gleichen
>Namen?

Nein. Er generiert dir automatisch eine .hex-Datei mit dem Namen des 
Projektes. Den Projektnamen hast du beim anlegen des neuen Projektes 
eingegeben. Die .hex-Datei befindet sich im default-Ordner des Ordners, 
in dem das Projekt angelegt wurde. Ist da keine .hex-Datei zu finden, 
ist beim Kompilieren oder Linken irgend etwas schief gegangen. Schau mal 
in allen Ausgabefenstern unten rechts nach, ob da nicht doch 
Fehermeldungen stehen.

Oliver

von Karl H. (kbuchegg)


Lesenswert?

Hans Peter schrieb:
> Hallo,
>
> ich hätte noch Fragen zu AVR Studio.
> Wenn ich ein Projekt schließe, und ien neue anlege, dort den
> Programmcode reinschriebe, dann F7 (Build) drücke, dann läuft das
> Programm ja durch und wird auf Fehler kontrolliert, oder?

Fehler kontrolliert ist gut :-)

An dieser Stelle wird dein C-Programm in ein vom AVR ausführbares 
Programm umgewandelt. Bis dahin ist deine C-Datei nichts anderes als 
einfach nur ein Text, so wie Göthes Faust auch nur ein Text ist.
Nur dann, wenn diese Umwandlung (das Compilieren und Linken) auch 
fehlerfrei gelingt, entsteht die HEX-Datei.

> Wenn ich das bis dorthin alles gemacht habe, dann finde ich aber auch
> kein .hex File.

Wenn keines vorhanden ist, dann ist der vorhergehende Schritt nicht 
fehlerfrei abgelaufen. Also immer im Output-Fenster kontrollieren, ob da 
etwas von Fehlern steht (und natürlich die Fehlermeldung lesen und den 
Fehler beheben)

Ansonsten ist die Hex-Datei in einem Unterordner deines Projektordners. 
Wenn ich mich recht erinnere, heißt dieser Ordner 'Default'.

von Hans P. (gableguy2000)


Lesenswert?

Hallo,

das schriebt er mir am Anfang von dem Build Fesnter:
rm -rf led_schalten.o  Leuchtende_LED.elf dep/* Leuchtende_LED.hex 
Leuchtende_LED.eep

Das letzte Projekt hieß Leuchtende_LED.
Warum macht daraus ein .hex File und nicht aus dem anderen?
Außerdem steht noch folgendes in dem Message-Fenster:

Loaded partfile: C:\Programme\Atmel\AVR 
Tools\PartDescriptionFiles\ATmega8515.xml
AVR Simulator: Please wait while configuring simulator...
AVR Simulator: ATmega8515 Configured OK
Loaded objectfile: C:\Dokumente und Einstellungen\CastorA\Eigene 
Dateien\default\Leuchtende_LED.elf
Loaded objectfile: C:\Dokumente und Einstellungen\CastorA\Eigene 
Dateien\default\Leuchtende_LED.elf
gcc plug-in: Exported makefile to C:\Dokumente und 
Einstellungen\CastorA\Eigene Dateien\Makefile

Das sind ja total falsche Dateien, und auch der mC ist falsch, habe 
überall den Atmega32 eingestellt.

LG

von Oliver (Gast)


Lesenswert?

Wie genau hast du denn ein neues Projekt erstellt?

Oliver

von Karl H. (kbuchegg)


Lesenswert?

Hans Peter schrieb:

> Das sind ja total falsche Dateien, und auch der mC ist falsch, habe
> überall den Atmega32 eingestellt.

Man könnte das jetzt suchen und korrigieren.
Aber am einfachsten ist es, wenn du noch einmal ein neues Projekt 
anfängst und genau darauf achtest, was du an Konfiguration vorgibst.

von Hans P. (gableguy2000)


Lesenswert?

Project->new Projekt
und das alte vorher geschlossen

unter Projects, gibt es noch Confoguration Options, da kann man auch 
einen Datei Namen einstellen, und auch den mC, sollte man da was machen, 
er will dort den Namen für die .elf Datei.

LG

von Karl H. (kbuchegg)


Lesenswert?

Hans Peter schrieb:
> Project->new Projekt
> und das alte vorher geschlossen
>
> unter Projects, gibt es noch Confoguration Options, da kann man auch
> einen Datei Namen einstellen, und auch den mC, sollte man da was machen,
> er will dort den Namen für die .elf Datei.

Kannst du ja alles mal ändern.
Aber Achtung: Der Simulator hat seine eigenen Einstellungen. An die 
kommt man als Benutzer allerdings erst rann, wenn der Simulator schon 
läuft.

von Hans P. (gableguy2000)


Lesenswert?

Hallo,

habe jetzt mal rumgespielt, und jetzt bekomme ich das Programm ohne 
Fehler rüber.
Aber es funktioniert nicht.
Wenn ich den Programmcode von oben:
1
#include <avr/io.h>
2
#include <stdint.h>
3
4
int main( void )
5
{
6
  DDRB = (1 << DDB0); //LED ist ausgeschaltet
7
8
  PORTD = ( 1 << DDD0 );  // Pullup Widerstand an D0 einschalten
9
10
  while(1)
11
  {
12
    if( ( PIND & ( 1 <<PIND0 ) ) == 0 )
13
      PORTB |= (1<<PB2); //LED zu leuchten bringen
14
    else
15
      PORTB &= ~(1<<PB2); //LED wieder ausschalten
16
  }
17
}
nehem, dann leuchtet die LED0, aber es wird ncit auf den Taster 
reagiert.

LG

von Michael W. (retikulum)


Lesenswert?

Wo ist das LED dran an B0 oder B2?

Michael

von Hans P. (gableguy2000)


Lesenswert?

Hallo,

es geht um das STK-500 Board, auf dem die LED´s sind, nicht um eine 
externe Schaltung.
Die LED´s sind mit dem PORT B verbunden.

Und SWITCHES mit dem PORTD

LG

von Michael W. (retikulum)


Lesenswert?

Wenn du B0 als Ausgang gesetzt hast und im Hauptprogramm B2 ein- und 
ausschaltest, das passt nicht zusammen.
Michael

von Hans P. (gableguy2000)


Lesenswert?

Oh man,

manchmal sieht man den Wald vor lauter Bäumen nicht.

Vielen Dank, jetzt funktioniert es.


LG

von Hans P. (gableguy2000)


Lesenswert?

Hallo,

bin gerade noch mal mit Tastern dran.
Habe mir den Code aus dem Tutorial zusammengesucht, aber ich finde den 
Fehler nicht.
1
#include <avr/io.h>
2
#include <inttypes.h>
3
#ifndef F_CPU
4
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"
5
#define F_CPU 3686400UL     /* Quarz mit 3.6864 Mhz  */
6
#endif
7
#include <util/delay.h>     /* bei alter avr-libc: #include <avr/delay.h> */      
8
 
9
/* Einfache Funktion zum Entprellen eines Tasters */
10
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
11
{
12
13
if ( ! (*port & (1 << pin)) )
14
    {
15
        /* Pin wurde auf Masse gezogen, 100ms warten   */
16
        _delay_ms(50);  // max. 262.1 ms / F_CPU in MHz
17
        _delay_ms(50); 
18
        if ( *port & (1 << pin) )
19
        {
20
            /* Anwender Zeit zum Loslassen des Tasters geben */
21
            _delay_ms(50);
22
            _delay_ms(50); 
23
            return 1;
24
        }
25
    }
26
    return 0;
27
}
28
29
int main (void)
30
{
31
32
DDRD &= ~( 1 << PD0 )  | (1 << PD1) ; // PIN PD0 und PD1 auf Eingang (Taster)
33
34
PORTD |= ( 1 << PB0)  | (1<<PB1);// Pullup-Widerstand aktiviert
35
36
  while(1) 
37
  {
38
    if(debounce(&PIND,PD1))            // Falls Taster an PIN PD0 gedrueckt.
39
      PORTB = PINB ^(1<<PB0);
40
      
41
  
42
43
    
44
  }
45
}

von Oliver (Gast)


Lesenswert?

>PORTD |= ( 1 << PB0)  | (1<<PB1);// Pullup-Widerstand aktiviert

Die D's und B' solltest du nochmal richtig sortieren.

Oliver

von Hans P. (gableguy2000)


Lesenswert?

Hallo,

habe jetzt den unteren Teil geändert:
1
int main (void)
2
{
3
4
DDRD &= ~( 1 << PD0 )  ; // PIN PD0 und PD1 auf Eingang (Taster)
5
6
PORTD |= ( 1 << PD0) ;// Pullup-Widerstand aktiviert
7
8
  while(1) 
9
  {
10
    if(debounce(&PIND,PD0))            // Falls Taster an PIN PD0 gedrueckt.
11
      PORTB = PINB ^(1<<PB0);
12
      
13
  
14
15
    
16
  }
aber es passiert nix.

von Michael W. (retikulum)


Lesenswert?

Du hast vergessen in DDRB, zumindest einen Pin, als Ausgang zu setzen.

PORTB = PORTB ^(1<<PB0);

PINB hat da nichts zu suchen, da du den Port schaltest und nicht 
abfragst.
Michael

von Hans P. (gableguy2000)


Lesenswert?

Ok,

habe jetzt noch die Zeile:
DDRB |= (1<< PB0);

eingefügt.
Habe gedacht, dass die Zeile:
PORTB = PORTB ^(1<<PB0);

das übernimmt. Wenn die Zeile es nicht macht, was macht Sie dann?
Ich kann doch den B auch anders auf 1 setzen oder?

LG

von Michael W. (retikulum)


Lesenswert?

PORTB = PORTB ^(1<<PB0);
schaltet den aktuellen Pegel um, eine 1 wird zu 0 und umgekehrt. Hat 
aber nix mit dem DDRB zu tun.
Mixhael

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.