Hi Leute, Es klingt jetzt villeicht krass, aber ich suche seit langem ein Tutorial und finde keins. Ich habe mir ein STK500 + ATmega16 + ATmega32 gekauft und würde nun gerne einwenig damit rumspielen um mich reinzuarbeiten. Doch leider finde ich niergens das was ich suche. Ich suche nähmlich einen Quellcode mit einem MiniProgramm (von mir aus nur ne LED die leuchtet wenn ich einen Taster drücke) und eine passende Make-Datei. Wie gesagt ich programmiere mit dem STK500 Board und benutze zum übertragen des Codes also die AVRStudio Software und als C-Compiler habe ich die WinAVR Soft. Was ich jetzt brauche ich ein Miniprogramm damit ich sehe wie sowas Strukturiert ist, eine Make-Datei (auch wegen Struktur und Parameter) und was auh noch gut wäre, das wäre wenn ich wüsste wie ich einen Eingang (Taster) und einen Ausgang (LED) im Programm-Code definiere. Kurz: uC's: ATmega16, ATmega32 Programmierer: STK500 Software: AVRStudio4 Sprache: C Compiler: WinAVR Suche: MiniProgramm in C + Make-Datei für ATmega16/32
Für das Makefile brauchst du eigentlich nur "mfile", welches beim WinAVR-Paket mitgeliefert wird. Um einen Einstieg in die C-Programmierung empfiehlt sich die Tutorien (anklickbar auf der linken Seite...)
Du kannst mit AVR Studio einfach ein Projekt anlegen und wählst AVR.GCC als Compiler aus. Den Rest (einschliesslich makefile) macht avr-studio für Dich. Einfache Beispiele findest Du hier im avr-gcc tutorial (siehe links auf der linken seite)
@ Rahul: Ich habe jedoch keine Ahnung und kann mir also nicht Vorstellen was ich da einstellen muss weil die Datei muss ja an den jeweiligen ATmega angepasst werden... @ Ingo: Das heisst ich brauch garkeinen externen Compiler?? Ich kan also alles mit dem AVRStudio machen??? Falls AVRStudio also alles macht inklusive Make-File dann brauch ich ja nur noch zu wissen wie ich die pins richtig anspreche ... Und natürlich wie so ein Programm ausehen soll wenss fertig ist. Ich werde mir dafür mal das Tutorial "AVR-GCC-Tutorial" ansehen...
Hast du es dir schon angeguckt? bei mfile brauchst du eigentlich nur den Controller angeben. Der Rest ist so eingestellt, dass es schon passt (standard...). Da kann man dran drehen, wenn man etwas mehr Erfahrung hat. Sonst solltest du Ingos Rat folgen...
jo aber wenn ich Ingos rat folge brauch ich doch die mfile nicht zu bearbeiten oder versteh ich da wieder was nicht?
Nein, brauchst du nicht. Wenn du WinAvr und deas AVRS-Studio installiet hast findet das AVR-Studio den Compiler automatisch und bietet dir bei einem neuen Projekt an, ob du GCC oder Assembler nehmen willst. Das Makefile erstellt der dann mehr oder weniger selbst.
Boah hab jetzt mehrfach in dem Tutorial gestöbert und versteh immer noch nur Bahnhof. DDRx Datenrichtungsregister für Portx. x entspricht A, B, C, D usw. (abhängig von der Anzahl der Ports des verwendeten AVR). Bit im Register gesetzt (1) für Ausgang, Bit gelöscht (0) für Eingang. PINx Eingangsadresse für Portx. Zustand des Ports. Die Bits in PINx entsprechen dem Zustand der als Eingang definierten Portpins. Bit 1 wenn Pin "high", Bit 0 wenn Portpin low. PORTx Datenregister für Portx. Dieses Register wird verwendet, um die Ausgänge eines Ports anzusteuern. Bei Pins, die mittels DDRx auf Eingang geschaltet wurden, koenen ueber PORTx die internen Pull-Up Widerstände aktiviert oder deaktiviert werden (1 = aktiv). Kann mit bitte einer erklären wie ich mit diesen Informationen was anfangen soll? Ich möchte jetzt zb ein Programm schreiben das so ausieht: if (TASTER_1 == GEDRüCKT) { LED_1 == EIN } das klingt simpel aber ich weiss absolut nicht wie ich sowas machen soll??? Und Rahul hat gemeint ich bräuchte nur den uC Typ angeben in der Mfile. Doch sieht das im Tutorial GANZ anders aus da sind sauviele Sachen beschrieben usw...
Schritt 1: Geh zu Atmel auf die Web-Site und hole Dir das AVR_Studio Schritt 2: Hol Dir den Win-AVR (Irgendwo am Anfang des Tutorials steht die Web-Adress) Schritt 3: Installiere beides Schritt 4: Oeffne AVR-Studio und erzeuge ein neues Projekt. Im Zuge des Projekterstellens fragt Dich AVR-Studio nach der Art des Projektes. Dort waehlst Du AVR-GCC aus Fuer Initiali-File und Project Name waehlst Du den gleichen Namen aus. Dann klickst Du auf 'Next' und stellst ein: 'AVR-Simulator' und 'ATMega16' Dann klickst Du auf Finish und AVR-Studio erstellt dir das Projekt und richtet es so ein, dass es fuer einen Mega16 passt. Schritt 5: Jetzt schreibst Du Dein C Program. Ich wuerde dir mal grundlegende Lieteratur ueber C empfehlen. Aber wass solls. So sieht Dein Program aus. Das schreibst du in das Fenster rein, das sich da geoefnet hat: #include <avr/io.h> int main() { DDRA = 0b11111111; /* die LED an Port A */ DDRB = 0b00000000; /* die Taster an Port B */ PORTB = 0b11111111; /* die Pullupwiderstaende einschalten */ while( 1 ) { PORTA = PINB; } } Schritt 5: Jetzt laesst du den C-Compiler das ganze mal uebersetzen. Dazu waehlst du den Menuepunkt 'Build / Build' aus oder drueckst ganz einfach 'F7'. Im unteren Fenster tut sich jetzt eine Menge. Die letzte Zeile muss dan zeigen: Build succeeded with 0 Warnings... Dann ist dein Program ersetzt worden. Wenn das ganze nicht so aussieht, dann hast du entweder im Vorfeld irgendwo einen Fehler gemacht, oder beim Abtippen des Programmes ist ein Fehler passiert. Korriegier ihn. Schritt 6: Jetzt simulierst Du das Programm mal im AVR-Studio. Dazu waehlst Du den Menüpunkt 'Debug / Start Debugging' Grummel, Grummel, Grummel, der Debugger startet und bei der oeffnenden Klammer in main() erscheint ein gleber Pfeil. Dieser Pfeil zeigt an, welche Anweisung als naechstes ausgefuehrt wird. Mit F10 wird die Anweisung auch tatsaechlich ausgefuehrt und der Pfeil wandert eine Zeile runter zur Anweisung DDRA = 0b11111111; Fuehr die noch nicht aus, sondern schalte mal im linken Fenster ueber den Reiter um auf 'I/O View'. In der Baumdarstellung machst Du den Pfad 'I/O ATMEGA16' auf und dort wiederum oeffnest du 'PORTA' und 'PORTB'. So jetzt laesst Du DDRA = ... ausfuehren und sofort siehst Du, dass sich im simulierten ATMega16 was getan hat. Ein paar F10 spaeter, stehst du mitten in der Schleife, in der der PortB nach PortA kopiert wird. Klicke mal mit der Maus in eines der Qudrate neben PINB und mach ein paar F10. Du muesstest sehen, wie der Inhalt von PINB nach PortA kopiert wird. (PIN ist die Bezeichnung wenn du von einem Port lesen willst und der Port auf Eingang geschaltet ist. PORT ist die Bezeichnung wenn man auf einen Port schreiben will und der Port als Ausgang geschaltet ist). Schritt 7: Die Simulation sieht soweit gut aus. Beende sie mit 'Debug / Stop Debugging' und brenn das Programm mal in den echten Chip. Wie das konkret geht, haengt von deinem Brenner ab ich denke aber das AVR-Studio mit dem STK-500 gut zurecht kommen sollte. Unter 'Tools / AVR-Prog' muesste sich eigentlich die Brennsoftware verstecken. Schritt 8: Konfiguriere die Hardware so wie es das Prgramm haben moechte: die LEDS kommen an den PORTA, die Taster an den PORTB Schritt 9: Lass den echten ATMega16 mal das Programm ausfuehren. Druecke auf ein paar Taster und erfreu dich an den Lichtspielen Schritt 10: Geh in die naechste Buchhandlung und kauf Dir Literatur zum Thema 'C-Programmierung' HTH
Ich habe das Programm schonmal im Simulator getestet und es funktioniert, ich versteh jedoch die Schleife nicht weil die ja garkeine bedingung hat: solange a==b .... Und dann das mit dem PullUp Widerstand, muss der jedesmal so Programmiert werden wenn ich ne LED ansprechen will? Und Dieses Programm ist das jetzt für eine LED? Dann brauch ich für die zweite LED mit dem zweiten Taster ja nur das gleiche zumachen??
PORTA = LEDs, PORTB = Taster. Die Pullups haben nichts mit den LEDs zu tun, sondern mit den Tastern. Warum man Pullups bei Tastern verwendet, findest Du mit Hilfe der Forensuche (wie auch die Lösung auf so ziemlich alle Probleme). Die Schleife ist eine Endlosschleife. Sonst würde das Programm genau einmal durchlaufen und fertig. Meine Empfehlung: Mach Dich erst einmal mit den minimalsten elektronischen Grundlagen bekannt (was ist ein Stromkreis) und dann schaust Du erstmal nach, was ein Bit, ein Byte und ein Port ist. Nicht böse gemeint, aber wenn Du mit den Port-Definitionen aus dem GCC nichts anfangen kannst, fehlen Dir das Grundlagenwissen.
DDRA = 0b11111111; ?? seit wann gehen binäre-werte in winavr-c
Seit wann das geht, weiß ich nicht. Aber es geht schon ne ganze Weile! Und nicht nur in WINAVR!
> weil die ja garkeine bedingung hat
Doch, die hat eine Bedingung
while( 1 )
Die Bedingung lautet: 1
Laut C Konvention ist alles was 0 ist logisch falsch (false)
und alles was ungleich 0 ist logisch wahr (true). Auch
ein Vergleich ist nichts anderes als ein Ausdruck, der
ein Ergebnis liefert: a == b hat ein Ergebnis. Es ist
entweder 0, wenn a ungleich b ist oder 1 wenn sie gleich
sind. Eine logische Bedingung muss also nicht unbedingt
etwas sein, in dem ein Vergleich vorkommt. Jeder beliebige
Ausdruck, der 0 oder nicht 0 liefert ist gueltig.
1 ist ein arithmetischer Ausdruck und sein Wert ist 1, also
nicht 0 und damit logisch wahr.
d.h. obige Bedingung ist immer wahr und die Schleife
läuft endlos. Genau das wollen wir auch, wie wollen
dass die Schleife immer und immer wieder wiederholt wird.
Ein Schleifendurchlauf dauert vielleicht ein paar Mikrosekunden
und du glaubst doch nicht im Ernst, dass du in der Lage bist
genau in der richtigen Mikrosekunde den Taster zu druecken.
Also lassen wir den Rechner die Umkopieraktion immer wieder
und immer wieder machen.
"Seit wann das geht, weiß ich nicht. Aber es geht schon ne ganze Weile!" für winavr-c ist das keine binäre anweisung sondern eine zahl: 11.111.111 = elfmillion-einhundertelftausend-einhundertelf. he....he....
ihr solltet euch mal intensiver mit winavr-c beschäftigen...
@karl-heinz der Praefix 0b ist zwar kein Standard-C Preaefix, den gibt es allerdings in AVR-gcc schon eine ganze Weile. Vielleicht solltest Du dich mal etwas naeher damit beschaeftigen.
Für den Thread-opener: Kleine Beispiel-Programme: http://homepage.hispeed.ch/peterfleury/avr-software.html#examples Sind für Winavr, ohne AVR-Studio. Gruß Elektrikser
Es wir euch jetzt sicher ärgern aber in der Schule hat man mir heute empfohlen in Assembler zu programmieren da ich das fürs nächste Jahr brauche also war das C Programm jetzt Quasi umsonst. Das einziege was ich jetzt brauche ist eine Einführung in Assembler wei bei C weiss ich wenigstens wie mein ein if (){} aufbaut aber von Assembler hab ich garkeine Ahnung. Was schlagt ihr mir vor (welches Buch oder Tutorial)?
>... >Es wir euch jetzt sicher ärgern aber in der Schule hat man mir >heute empfohlen in Assembler zu programmieren >... Nur mal so aus Interesse... was für eine Schule empfiehlt das? Grüße
> Was schlagt ihr mir vor
Dann fang einfach mal mit dem Tutorial
auf dieser Site an.
Das techniche Gymnasium... Sie sagen nicht dass Assembler besser ist aber da ich nächstes Jahr ein Projekt machen muss für die Schule, (Ein Roboter der per uC gesteuert wird)das in Assembler programmiert werden muss, sagn die Lehrer sei es fR mich Vorteilhafter wenn ich mit meinem ATmega32 in Assembler rum spiele weil ich dann schon weiss wies geht. Ich selbst komm besser mit C klar, aber wenn ich für die Schule Assembler brauch dann ist es wohl rasam damit zu arbeiten...
>Dann fang einfach mal mit dem Tutorial >auf dieser Site an. Welches Tutorial meinst du? Ich kann nur die AVR-Assembler Vergleichstabelle finden... Aber niergens die Struktur von einem Programm. Und wie ich die PORTS Anspreche usw...
1. bei uns an der uni haben wir auch assemler-programmiert (war ein 8086), wenn man überhaupt keinen plan davon hat, wie die maschine intern arbeitet, dann sollte man die programmierung generell (auch in hochsprache) lassen. 2. assembler ist nicht schwer, besonders, wenn man einen c-compiler hat, der list-files ausspuckt. dann kann man die optimierung abschalten, schreibt das programm in c und schaut sich die mnemonics an. nach einer weile hat man dann verstanden, wie man zahlen addiert, funktionen aufruft usw. besonders, da bei cross-compilern immer die selben code-abschnitte kommen, d.h. eine while-schleife sieht immer (bis auf die bedingung) gleich aus.
@ hans dieter: Ich will ja eben nicht mit solchen "Tricks" (C-Compiler) arbeiten um an den Assembler Code zu kommen. Ich versuche lieber gleich NUR in Assembler zu programmieren um dann fit zu sein wenns los geht weil es soll ende dieses Schul Jahres schon losgehen mit Midicom...
Um Source Code Studium anderer wirst Du nicht rumkommen. Ob Du jetzt den Assembler Code eines C-Kompilers analysierst oder den Assembler-Code von Hannes spielt wahrlich keine grosse Rolle. Du sollst den Kompiler ja auch nicht benutzen um zu 'tricksen'. Du sollst den Kompiler benutzen um zu studieren wie ein Profi diverse Dinge in Assembler programmiert.
Gibts keine Liste mit den AVR Assembler Befehlen wo bei steht was die bewirken weil hier hab ich nur ne Liste gefunden wo drin steht welcher uC welche Befehle annimmt aber nicht was die jeweiligen Befehle bewirken... Dann wollte ich fragen ob die LED's und Taster gleich angesprochen werden wie bei C also mit: DDRA = 0b11111111; /* die LED an Port A */ DDRB = 0b00000000; /* die Taster an Port B */ PORTB = 0b11111111; /* die Pullupwiderstaende einschalten */
@ Karl Heinz Buchegger Das Problem ist ja dass ich momentan in keiner Sprache wirklich richtig uC programmieren kann. Und bevor ich jetzt C lerne (was wesentlich einfacher ist als Assembler), um danach den Assembler code des Compilers zu analysieren, werde ich lieber gleich Assembler lernen weil das dann enorm Zeit spart...
Natuerlich gibt es solche Listen. Rate mal wo man solche Befehlsreferenzen kriegt. Richtig! Beim Hersteller der Prozessoren! http://www.atmel.com Im uebrigen hilft Dir so eine Befehlsreferenz nicht viel. Das ist wie beim Schachspiel. Nur weil ich weiss welche Figuren es gibt und wie sie ziehen koennen, kann ich noch lange nicht Schachspielen. Genauso in der Programmierung: Die einzelnen Befehle sind meist trivial. Es ist die Kombination von mehreren Befehlen die das Geheimnis ausmacht. Und das kannst Du am besten lernen, indem Du anderen Code studierst. Zu Deiner konkreten Frage: Warum um alles in der Welt wehrst Du Dich so dagegen endlich einen Blick ins Tutorial zu werfen und dort ganz einfach mal mit lesen und lernen anzufangen?
doch, das Ding nennt sich "Instruction Set Summery" und ist bei Atmel (wo auch sonst?) zu finden. In ASM geht das mit "in" und "out" oder so (ich programmiere in C...). Welche Schule zwingt einen bitte nur in Assembler zu programmieren? (nichts gegen Assembler!). Liegt wohl daran, dass die Lehrer die Aufgabenlösung in Asm vorliegen haben... Übrigens schadet es nie, von beidem Ahnung zu haben... [OT] Das, was ich sonst noch schreiben wollte, spare ich mir lieber, weil es ziemlich persönlich geworden wäre. [/OT]
Das Problem mit den meisten Tutrials ist dass sie ungenau sind. Wenn man wie ich keine Ahung davon hat braucht man was wie sowas: In: PORTB1 <-- Setzen des Eingangs Out: PORTB2 <-- Setzen des Ausgangs If (PORTB1 == 1){ PORTB2 == 1 } <-- Wenn Taster an PORTB1 gedrückt dann LED an PORTB2 an. So würde ich es in C probieren (dass dies nicht funktioniert weiss ich selbst), aber das ist nunmal das einzige was ich mir momentan unter all dem vorstellen kann... Nur mit einem solchen Tutorial kann man lernen und verstehen wie es funktioniert...
Noch mal ganz kurz 1. Wie kan ich mit AVR Studio4, wenn ich in C was geschrieben habe, den Assembler Code ansehen?? 2. Wie kann ich hier in diesem Forum mein pw ändern?
Du suchst die Liste der AVR-Assembler-Befehle? Die steht in komprimierter Form (druckbar!) Am Ende der AVR-Datenblätter. Gleich daneben gibt es die Liste der I/O-Adressen, meist mit Seitenangabe, wo das jeweilige Register erklärt wird. Wenn du dann konkretere Hilfe zu den ASM-Befehlen möchtest, dann nutze die Online-Hilfe des AVR-Studio. Tippe den gewünschten Befehl ins Editorfenster, setze den Cursor drauf und drücke die F1-Taste. Geht leider nicht bei Direktiven, die kannst du aber über das Help-Menü "erhangeln". Du brauchst wirklich nix weiter außer AVR-Studio, Datenblätter, AVR-Appnotes und etwas Geduld. ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.