PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR ganz hardwarenah programmieren?



Jacob2
30.09.2009, 17:50
Hi,
in der Schule programmieren wir einen Zilog Z80, indem wir direkt die Befehle (in diesem Fall hexadez.) hintereinander in den Programmspeicher schreiben (der Prozessor wird dort im Einzelschrittmodus betrieben).

Ist sowas auch mit einem AVR möglich und wo gibt es dann die Befehle als die direkten Zahlenwerte?

In dem Befehlssatz, den man hier bei Roboternetz downloaden kann ist zwar jeweils der Opcode angegeben, aber soviel mir Wikipedia sagen kann, ist das nur die Nummer eines Befehles! Wo finde ich diese Befehle?

Eine weitere Frage ist: Kann man überhaupt direkt auf den Programmspeicher zugreifen, obwohl ein AVR ja sozusagen ein in sich geschlossenes Controllersystem ist? Wenn nicht, gibt es einen ebenso günstigen Mikrocontroller/-prozessor wie die AVRs? max. 1,50€ oder so? Der sollte dann aber so einfach wie möglich aufgebaut sein!

Bestimmt hat hier jemand schonmal sowas ausprobiert oder weiß was darüber.

markusj
30.09.2009, 18:49
Wenn du _noch_ hässlicher als ASM programmieren willst, solltest du dir das AVR 8-Bit Instruction Set noch einmal genauer ansehen (gibts bei Atmel zum Download).
Dort ist u.a. zu sehen, wie die einzelnen Befehle auf Bytecode-Ebene aufgebaut sind.

mfG
Markus

the_Ghost666
30.09.2009, 18:56
Also du kannst den Code rein theoretisch auch so schreiben, es gibt eine Befehlsübersicht bei Atmel als PDF, wo auch die Codes bei stehen.
Den Programmspeicher direkt zuzugreifen ist nicht so einfach, du kannst aber glaube ich mit einem Programmieradapter den Programmspeicher auslesen, von hand manipulieren und zurück schreiben. Direkter geht es nicht, da die wenigsten Atmel über einen externen Programmspeicher/Speicherschnittstelle verfügen, wie du sie an dem Z80 scheinbar hast.
Naja, und ausserdem finde ich es teilweise fraglich, ob es wirklich sinnvoll ist. auf die Art braucht man viel länger um überhaupt gedanklich alles zu bauen, dann in hexcodes zu übersetzen, dafür gibt es ja die assembler mnemonics. Aber wir haben das auch auch in einer Vorlesung mal so gemacht, das war ein 8051 Kern, und hatte halt nen debugger, der direkt in den Programmspeicher geschrieben hat. Auch die Klausurfrage war an einer Stelle so, dass man den Code in Assembler übersetzten musste. Wenn man dann einmal einen Fehler bei der länge des Befehls gemacht hat, war der Rest zwar noch immer sinnvoll aber halt falsch.

oberallgeier
30.09.2009, 19:45
... in der Schule programmieren wir einen Zilog Z80 ...Juchei - es gibt sie also noch, die guten alten Z80. Und das nicht nur bei mir im Keller.


... programmieren wir einen Zilog Z80, indem wir direkt die Befehle (in diesem Fall hexadez.) hintereinander in den Programmspeicher schreiben ...Mal nur so nebenbei: im Schreibunterricht habt ihr noch Tontäfelchen oder sind bei euch schon diese Holzdinger mit Wachsfüllung eingeführt (bei denen man einfach viel besser korrigieren kann als bei Ton) ? ?

Ok, jetzt im Ernst. Natürlich könntest Du - theoretisch - auch hex schreiben - aber ich kenne leider keinen Editor, mit dem Du das kannst. Schade. ABER: AVRStudio hat etwas ganz feines: es hat einen Assembler, dort könntest Du so etwas ähnliches machen. Aber der Reihe nach.

Kannst Du bei Dir AVRStudio (mit WINAVR) installieren? Wie ist Deine Rechnerausrüstung?

Die Befehlsübersicht gibts z.B. hier (für den ATmega48PA/88PA/168PA/328P) - einfach downloaden (klick hier drauf) (http://www.atmel.com/dyn/resources/prod_documents/doc8161.pdf) und auf Seite 427 anfangen. Da siehst Du aber leider nur die Mnemonics und nicht den Opcode in hex.

Im AVRStudio könntest Du mit diesen Mnemonics so programmieren - wieder klick (http://oberallgeier.ob.funpic.de/main_asm.jpg), dann kommt ein Beispiel eines einfachen Programmes. Die zugehörigen Opcodes siehst Du hier (was wohl - richtig - klicken *ggg*). (http://oberallgeier.ob.funpic.de/break_asm.jpg)

Wenn Du nun ein passendes Programm geschrieben und assembliert hast, dann könntest Du etwas Feines machen: Du kannst den Programmablauf im Simulator (des AVRStudio) laufen lassen - auch im Einzelschritt - und dabei kannst Du Registerveränderungen, Auswirkung von Befehlen - z.B. Sprünge etc. sehen - ohne dass Du einen Mikrocontroller kaufen müsstest. Und AVRStudio gibt es - zusammen mit dem AVRGCC umsonst (na ja - wie heißt es: ausgenommen Verbindungskosten *ggg*).


... Eine weitere Frage ist: Kann man überhaupt direkt auf den Programmspeicher zugreifen ...Nein - der Programmspeicher kann nur unter bestimmten Voraussetzungen beschrieben werden. ABER: im Simulator (siehe oben) geht das. Wie gesagt: kostet (fast) nur Mühe.

Wär das was für Dich?

Gut - es bliebe noch die Frage nach dem Nutzen. Du könntest mal überlegen ob - und inwieweit - der RISC auch wirklich ein RISC und kein CISC ist. Und wozu ein so ein reduzierter Instruction Set gut sein könnte - das wird Dir vermutlich aus der Z80-Quälerei aber schon geläufig sein.

Nachtrag: natürlich kannst Du in Hex auch bei At mels programmieren: Notepad öffnen und z.B. dies hier reinschreiben:

:020000020000FC
:1000000009C031C0189539C01895189518951895DC
:10001000189518957FE97DBF79E177BBC19A76E0A5
:1000200076B971E077B973E073BF72E075BF70E4C1
:100030007BBFF89474B771FD01C011C070E07BBF45
:1000400045E0C49A4AD054171CF438D061FFFBCF66
:10005000C49848D070E48AB786FD7ABF7BBF789495
:100060000000FDCF08950FB729D0603011F00FD0F8
:1000700002C02ED000C00FBF18951FB7222722BF85
:100080003395303510F0332753951FBF189570E026
:100090007BBF45E0C39A882720D0541724F40ED0A4
:1000A000603011F0FACF80E1C3981CD084FF10D0EB
:1000B00070E48AB786FD7ABF7BBF0895379A369A77
:1000C0003699FECF369A3699FECF65B137980895A6
:1000D00041E0C09A0AD0C0980895552772E079BFD0
:1000E00078940895772779BF0895F7DF5417F0F3D0
:0400F000F9DF089597
:00000001FFDies ist übrigens der Hexfile des oben erwähnten Programms . . . Gut was? DAS könnte man im AVRStudio im Assembler reinladen - und dann durchklickern. Und Fehler über Fehler sehen - es sei denn, das hatte der Assembler schon gemacht als er die Hexdatei erstellt hat.

neumi
30.09.2009, 23:42
Hi Jacob2!

Ich glaub ich weiß worauf du hinauswillst: Ihr fangt gerade erst mit hardwarenaher Programmierung an und das erste was ihr in die Hand bekommen habt ist ein µPf stimmts? *beep* *beep* *beeep*
Ganz im ernst es tut sich niemand an die Mnemonics tatsächlich händisch in die entsprechenden opcodes zu übersetzten. Als ich noch nicht wusste, dass es Assembler gibt und wir mit dem uPf "gequält" wurden hab ich mit dem Gedanken gespielt mir selbst ein Programm zu schreiben dass mir die Mnemonics übersetzt (einen Assembler halt). Zum Glück haben uns unsere Profs. dann doch gesagt dass es Programme die das tun schon gibt.
Also lad dir AVR-Studio herunter, such dir ein AVR-Tutorial (im Wiki, auf mikrocontroller.net,...) und arbeite das durch.

askazo
01.10.2009, 07:47
Hach, das erinnert mich an die Zeiten, wo wir für den guten, alten Commodore die Hex-Codes aus dem 64er-Magazin abgetippt haben und hinterher suchen mussten, welche Ziffern denn nun falsch waren - denn beim ersten mal ist das nie gelaufen...

Aber wirklich, ein Programm in Hex-Code schreiben macht heutzutage keinen Sinn. Assembler ist das hardwarenaheste, was geht. Alles andere darunter ist nur eine andere Schreibweise. Wenn Du natürlich wirklich Lust dazu hat, könntest Du anstatt Hex das ganze auch Binär schreiben - aber da wird man wahrscheinlich ziemlich schnell wahnsinnig dran.

Gruß,
askazo

Pedder
01.10.2009, 12:27
Als ich vor 22 Jahren eine Umschulung zum Informationselektroniker machte,
hatten wir noch auf dem MFA die Befehle mit Schalter eingegeben

Adresse über Thumbweels auswählen - Daten/Befehl über 8 Schalter eingeben Übernehmen-taste drücken
Nächste Adresse......

toll wars doch.

Infos zum Computer:

http://209.85.229.132/search?q=cache:lYglv6nSsnAJ:de.wikipedia.org/wiki/Mikrocomputer_f%C3%BCr_Ausbildung+BFZ+%2BMFA&cd=10&hl=de&ct=clnk&gl=de

oberallgeier
01.10.2009, 15:35
Ich glaube, da muß ich für die mitlesenden Puristen und solche, die es sein müssen oder noch werden wollen, auf einen typischen Minimalcomputer verweisen. Hier gleich als virtuelle Maschine, aber ziemlich elmentar. Viel Vergüngen! (http://www.wolfgang-back.com/knowhow_home.php)

Richard
01.10.2009, 18:28
Als ich vor 22 Jahren eine Umschulung zum Informationselektroniker machte,
hatten wir noch auf dem MFA die Befehle mit Schalter eingegeben

Adresse über Thumbweels auswählen - Daten/Befehl über 8 Schalter eingeben Übernehmen-taste drücken
Nächste Adresse......

toll wars doch.

Infos zum Computer:

http://209.85.229.132/search?q=cache:lYglv6nSsnAJ:de.wikipedia.org/wiki/Mikrocomputer_f%C3%BCr_Ausbildung+BFZ+%2BMFA&cd=10&hl=de&ct=clnk&gl=de

Moin moin.

Ich bin vor ca. 27 Jahren angefangen und da war das nicht anders. :-)
Ich halte diese "erste" Erfahrung auch heute noch für sehr wichtig!
Denn genau SO lehrnt Mensch wie so ein Controller (denkt)/arbeitet,
jedenfalls wenn es sich um eine von Neumann Maschine handelt.

So hat/bekommt der Programmierer schnell und leidvoll die Strafe
für Schlamperei und kann keinen Compiler die Schuld geben. :)

Wirklich producktiv privat wie Beruflich kann man heute so natürlich nicht
arbeiten, außer im Hochsicherheitsbereich wo Zeit und Kosten eine
andere Relevanz besitzen.

Aber jeder der wirklich ernsthaft Beruflich sein Leben mit Programmieren
"verschwenden" will, sollte die Schritte binär, Hex, Assembler eine
gewisse Zeit durchlaufen. Jedenfalls wen erSie letztendlich einmal echt
ewin guter Profi werden will. Laufen lehrnen fäng ja auch mit Krabnbeln
an!

@ askazo Ich weis es nicht mehr, abe es waren etliche tausend Seiten
abgetippter Hexcode....Immerhin, eine 6 x Torsteuerung Wegbeleuchtung
Kamerasteuerung u.s.w. läufte seit ca. 24 Jahren 24 h/Tag auf einem
in assembler programmierten C64. Natürlich mit Ausgabe auf Video. :-)

Guuute alte Zeiten. :-) ich habe noch einen original neuwertigen
C64 mit datasette, Floppy und Drucker.. (unverkäuflich).

Gruß Richard

Richard
01.10.2009, 18:45
Ich glaube, da muß ich für die mitlesenden Puristen und solche, die es sein müssen oder noch werden wollen, auf einen typischen Minimalcomputer verweisen. Hier gleich als virtuelle Maschine, aber ziemlich elmentar. Viel Vergüngen! (http://www.wolfgang-back.com/knowhow_home.php)

Danke, hat Spass gemacht. :-)

Gruß Richard

Jacob2
01.10.2009, 19:17
Hi,
scheinen sich ja viele gern zu erinnern..

Die Programmierung läuft bei uns in etwa so ab wie von Pedder beschrieben.

@oberallgeier
Der Z80 ist bewusst gewählt, weil man den u.a. im Einzelschrittbetrieb betreiben kann. Bei uns solln wir diese Teile mehr oder weniger von Grund auf kapieren: Deshalb haben wir letztes Jahr Halb- bzw. Volladdierer, Register, Steuertore, Speicher (Flipflops) und ähnliches durchgenommen (am Ende stand ein Einfachst-Prozessor nur aus Relais). Nächstes Jahr gehts dann um einen Fußballroboter in Basic.

Diese Frage war eigentlich eher so gemeint, dass ich es lustig gefunden hätte auch mal mit nem AVR zahlen zwischen Registern hin- und herzuschieben! Wenn ich wirklich vorhabe, ein großeres Programm zu schreiben, dann mache ich das in C, welches ich, würde ich mal so behaupten, mittlerweile gut beherrsche.

Ok, da man also an den Programmspeicher nicht (oder nur schwer) drankommt, müsste ich also das hex-File, welches ich mit z.B. PonyProg einlese und progge, selbst schreiben. In den Datenblättern der AVRs sind die Mnemonics zwar schön aufgelistet, aber, wie schon von oberallgeier angemerkt, leider nicht der hex bzw. binär oder halt generell Zahlencode!

Das war im ersten Post nicht ganz zu merken, ich denke ihr wisst jetzt um was es mir geht!

Besserwessi
01.10.2009, 22:32
Die Zahlenwerte zu den opcodes bekommt man z.B. aus der Onlinehilfe on AVRStudio. Ist da sogar noch binär, also noch etwas Hardware näher.

Wenn man das ganz alte Feeling wieder haben will, müßte man eine Art Bootloader schreiben, der die Daten von ein Paar Schaltern einliest, oder von Lochkarten (ggf. 1 byte zur Zeit) einliest. ... Das wäre ja mal was: ein µC mit Lochkarten, oder Lochstreifen.

Vitis
01.10.2009, 22:44
wär mal geil, nei Hollerithmaschine am AVR um das Programm zu flashen ...

http://www.heise.de/bilder/89597/1/1

Aber nur wenns die Dame gratis dazu gibt

PICture
02.10.2009, 01:38
Hallo!

@ Jakob2

Hardwarenäheste Programmiersprache ist Assembler (Maschinensprache). Von der Hochsprachen ist das C, die du schon kennst, und dann kommen die anderen... :)

Wenn schnelstmögliches Ausführen benötigt wird, setzt man in Hochsprachen entsprechende Assemblerfragmente als Funktionen ein.

MfG

PicNick
02.10.2009, 07:30
Ich hab mal wegen eines Dis-Assemblers den AVR-Code durchanalysiert.

Vielleicht findest du da ein paar Info, die du brauchen kannst
http://www.rn-wissen.de/index.php/Atmel_Controller_Mega16_und_Mega32#Aufbau

Ich hab auch noch irgendwo alle anderen Instructions aufgeschlüsselt, sag es, wenn es dich interessiert

neumi
02.10.2009, 14:56
Es wurde zwar schon mal erwähnt aber hier nochmal explizit: http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf Das komplette Instruction Set der 8-bit AVR-Mikrocontroller (155 Seiten wo genau aufgeschlüsselt ist wie jeder Befehl aufgebaut ist und funktioniert. Leider gibt es die Opcodes nur binär aber das sollte jetzt nicht so das Problem sein wenn du schon unbedingt Bytes und Bits sehen willst.

Jacob2
02.10.2009, 16:00
Ok,
jetzt hätt ich schonmal die Befehle. Allerdings hab ich in nächster Zeit keine Zeit dafür... =;
Vielleicht komm ich aber zu einer vereinfachten Version, die zumindest etwas das Feeling vermittelt :cheesy: :
Ich lasse den AVR ganz normal die Löcher einlesen (vllt. CNY70) und simuliere die Befehle aber in C auf dem AVR. Als Programmspeicher könnt ich mir z.B. ein Array machen X*16bit oder vielleicht auch nur 8bit-Befehle. Oder ein externer EEPROM (habe 24C08 bei mir da)?
Variablen könnten als Register dienen.

So richtig richtig ist das dann natürlich nicht! Aber wesentlich einfacher zu realisieren.