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
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)
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
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;
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
intmain(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.
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?
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
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
intmain(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.
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
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.
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
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
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
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.
> 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.
> 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
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.
> 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?
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.
>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
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.
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
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
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
intmain(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
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
>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
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'.
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
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.
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
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.
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
intmain(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
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
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
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