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)
Gast
#1452668
Stichwort Data Direction Register Was glaubst du, was nach return (0) passiert? Verwende doch irgendwo eine Endlosschleife.
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
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.
Abschreiben sollte man können.
Christian H. schrieb:
> Abschreiben sollte man können.
Copy&Paste ist schon erfunden :-)
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.
Gast
#1452739
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.
Hallo, ich habe doch die main, oder ist das keine Schleife? Kannst du mir erklären was du genau mit Hauptschleife meinst? LG
> 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.
Gast
#1452865
> 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.
Gast
#1452882
>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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
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
Gast
#1452926
Ei kostenloses C-Buch... http://download.galileo-press.de/openbook/c_von_a_bis_z/galileocomputing_c_von_a_bis_z.zip
Gast
#1452929
PORTB |= (1<<PB2); //LED ausschalten PORTB &= ~(1<<PB2); // LED zum leuchten bringen Beim STK500 sind die LEDs low aktiv.
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
>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
Gast
#1454291
Wie genau hast du denn ein neues Projekt erstellt? Oliver
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
nehem, dann leuchtet die LED0, aber es wird ncit auf den Taster reagiert. LG
Wo ist das LED dran an B0 oder B2? Michael
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
Wenn du B0 als Ausgang gesetzt hast und im Hauptprogramm B2 ein- und ausschaltest, das passt nicht zusammen. Michael
Oh man, manchmal sieht man den Wald vor lauter Bäumen nicht. Vielen Dank, jetzt funktioniert es. LG
Hallo, bin gerade noch mal mit Tastern dran. Habe mir den Code aus dem Tutorial zusammengesucht, aber ich finde den Fehler nicht.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
Gast
#1460034
>PORTD |= ( 1 << PB0) | (1<<PB1);// Pullup-Widerstand aktiviert
Die D's und B' solltest du nochmal richtig sortieren.
Oliver
Hallo, habe jetzt den unteren Teil geändert:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
aber es passiert nix.
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
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
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.