mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zur 8-bit-AVRs


Autor: Steffen K. (human)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte mich erstmal bedanken für die Hilfe beim Einstieg in die Welt 
der Mikrocontroller!

Hab mich zwischenzeitlich auch ein bisschen mit ein paar Modellen 
(ATtiny2313, ATmega8515, ATmega32) zusammen mit dem STK500 
herumgespielt.

Zu meinen Fragen:

Wenn ich das richtig verstanden habe, dann wird ein "normaler" 
Assemblerbefehl (keine EPROM-Befehle usw.) pro Takt abgearbeitet, also 
bei 8 MHz werden 8.000.000 Befehle pro Sekunde abgearbeitet?

Wenn das so ist, und ich einen 8-Bit-Timer habe, der mit dem Takt 
hochzählt, dann im Interrupt-Teil 256 oder mehr Assemblerbefehle habe, 
dass dann nurnoch der Interrupt ausgeführt wird und sonst nichts mehr 
oder noch schlimmer, der Interrupt wird dann auch immer wieder vom 
gleichen unterbrochen?

Und was passiert wenn man mit einen Pointer außerhalb des 
Speicherbereichs zugreifen versucht, z.B. das RAM ist 1024 Bytes (hat 
dann die Adresse 0x000 bis 0x400) groß und ich greife auf die Adresse 
0x401 zu?

Ich freune mich schon sehr auf eure Antworten!

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn ich das richtig verstanden habe, dann wird ein "normaler"
>Assemblerbefehl (keine EPROM-Befehle usw.) pro Takt abgearbeitet, also
>bei 8 MHz werden 8.000.000 Befehle pro Sekunde abgearbeitet?

Nö.

>oder noch schlimmer, der Interrupt wird dann auch immer wieder vom
>gleichen unterbrochen?

Nö.

>>Und was passiert wenn man mit einen Pointer außerhalb des
>Speicherbereichs zugreifen versucht, z.B. das RAM ist 1024 Bytes (hat
>dann die Adresse 0x000 bis 0x400) groß und ich greife auf die Adresse
>0x401 zu?

Dann schmiert die Kiste ab.

Autor: Achim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na, wenn das nicht mal genau so ne Antwort war auf die sich Steffen 
gefreut hat ;).

>Wenn ich das richtig verstanden habe, dann wird ein "normaler"
>Assemblerbefehl (keine EPROM-Befehle usw.) pro Takt abgearbeitet, also
>bei 8 MHz werden 8.000.000 Befehle pro Sekunde abgearbeitet?

Die meisten Instruktionen benötigen 1 Takt. Es gibt aber auch welche die 
mehr brauchen, wie z.B. Sprünge. Genauere Informationen findest du hier 
drin: http://www.atmel.com/atmel/acrobat/doc0856.pdf

>Wenn das so ist, und ich einen 8-Bit-Timer habe, der mit dem Takt
>hochzählt, dann im Interrupt-Teil 256 oder mehr Assemblerbefehle habe,
>dass dann nurnoch der Interrupt ausgeführt wird und sonst nichts mehr
>oder noch schlimmer, der Interrupt wird dann auch immer wieder vom
>gleichen unterbrochen?

Wenn dein Timer ohne Prescaler läuft sind zwischen zwei Overflows nur 
256 Takte Zeit. Deine Interrupt Routine darf allerdings keine 256 Takte 
haben damit sie noch komplett zwischen 2 Overflows ausgeführt werden 
kann, da es auch noch ein paar Takte braucht um in den Interrupt zu 
springen und nachher wieder raus zu kommen. Dein Interrupt kann nicht 
von einem anderen unterbrochen werden, wenn du das nicht explizit 
zulässt. Genaueres dazu findest du im Datenblatt deines AVRs unter 
"Reset und Interrupt Handling". Deine Interrupt-Routinen solltest du 
natürlich immer so kurz wie möglich halten.

>Und was passiert wenn man mit einen Pointer außerhalb des
>Speicherbereichs zugreifen versucht, z.B. das RAM ist 1024 Bytes (hat
>dann die Adresse 0x000 bis 0x400) groß und ich greife auf die Adresse
>0x401 zu?

Dein SRAM beginnt aber nicht an Adresse 0x0, sondern erst an 0x60. Davor 
befinden sich noch die Register und der I/O Bereich. Was passiert wenn 
du auf ne ungültige Adresse zugreifst hab ich noch nicht absichtlich 
getestet und dokumentiert ist das meines Wissens auch nicht. Also 
versuch es einfach zu vermeiden.

Autor: Herr Mueller (herrmueller)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die meisten einfachen Befehle brauchen tatsächlich nur einen Takt. 
Vergleiche und Laden/Speichern im SRAM brauchen länger. Wenn Dein 
Interruptprogramm länger ist, als die das Aufrufintervall, ist Dein 
Programm "unklug" aufgebaut. Der AVR merkt sich während der IR-Routine 
den erneuten Aufruf und führt ihn nach Beendigung wieder durch.
Du hast jedoch die Möglichkeit den Timertakt zu teilen - bis /1024. 
Schau mal im Datenblatt unter TIMER PRESCALER.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.