erstes Programm mit AVR Studio

#1452653
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
#1452671
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
#1452681
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;
#1452692
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.
#1452693
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?
#1452702
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
#1452712
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.
#1452728
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
#1452738
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.
Gast #1452739
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
#1452834
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
#1452878
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.
Gast #1452882
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
#1452886
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
#1452901
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
#1452910
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
#1454261
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
Gast #1454273
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
#1454274
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'.
#1454283
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
#1454309
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.
#1454339
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
#1460025
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren