mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 2 kurze Fragen zum ATmega16 (Fusebits, Befehle)


Autor: Spyro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
hab mal 2 kurze Fragen zum ATmega16:

1. Muss ich die Fusebits immer manuell setzen bzw. einstellen. auch wenn 
ich die Includedatei verwende (muss man ja eigentlich) und mit Ponyprog 
flashe (mit welchem Programm ist ja im Prinzip egal, oder?)

2. Kann ich eigentlich statt den Assemblerbefehlen "icall" und "rcall" 
auch den einfachen Befehl "call" verwenden. (ein anderes Beispiel wäre 
"ret" und "reti")

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu 1: Ja. Fuses haben (bis auf die JTAG-Fuse) nichts mit dem Programm 
zutun; eine Include-Datei aber schon.

zu 2: ret und reti sind zwei (völlig) verschiedene Befehle. Ret ist der 
Rücksprung aus einem Unterprogramm und reti der Rücksprung aus einer 
ISR.
Zu den anderen Befehlen sollte die Instruction Set Summary etwas "sagen" 
können.

Autor: Spyro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zu 1.: also brauch ich die fuses bei einem neu gekauften µc nicht immer 
zu setzen?
zu 2.: ok, ist geklärt

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>zu 1.: also brauch ich die fuses bei einem neu gekauften µc nicht immer
>zu setzen?

Wenn dir die Grundeinstellung zusagt, brauchst du auch nichts ändern.
Wenn sie aber nicht dem entspricht, was du brauchst, wirst du sie ändern 
müssen.
Wo ist denn das Problem?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu 1. ist schon alles gesagt...
Zu 2.: ret und reti sind nicht völlig verschieden. Der einzige 
Unterschied ist, dass reti das I-Bit im SREG setzt und dementsprechend 
die Interrupt-Bearbeitung wieder freigibt. Das ist wichtig beim 
Rücksprung aus einem Interrupt Handler. Man kann sagen: Rücksprung aus 
einem "normalen" Unterprogramm, das mit call, rcall oder icall 
aufgerufen wurde, immer mit ret, Rücksprung aus Interrupt Handler mit 
reti.

rcall ist ein relativer Unterprogrammaufruf, der aufgrund der 
verfügbaren Adressbreite max. 8 KiB Programmspeicher (4 Ki-Worte) 
adressieren kann, aber weniger Speicher (1 Programmwort) benötigt, als 
der normale call (2 Worte). Deshalb gibt es auf den AVRs bis einschl. 8 
KiB Flash auch nur den rcall-Befehl, weil sich mit dem der komplette 
Speicher ansprechen lässt. Bei den AVRs ab 16 KiB Flash brauchts dann 
den call. Gleiches gilt für jmp und rjmp (und wegen der größeren Breite 
von jmp gegenüber rjmp sind auch bei den AVRs ab 16 KiB die 
Interrupt-Vektoren doppelt so breit, eben damit auch ein jmp reinpasst; 
beliebter Anfänger- bzw. Umsteiger-Fehler!). icall ist ein indirekter 
call, der die Sprungmarke nicht im Befehl selbst eingebaut hat, sondern 
diese aus einem Pointer-Register bezieht.

Autor: Spyro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ähm, das ist jetzt bestimmt relativ dumm, aber wie ist die 
grundeinstellung?
So wie im datenblatt beschrieben, also die pnnbelegung und ähnliches.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Grundeinstellung ist das, was im Datenblatt unter "Fuse Bits" in den 
Tabellen unter "default value" steht. Kann doch nicht SO schwer sein, 
oder?

Autor: Spyro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja ok, habs kapiert. aber kann das eigentlich sein, das wenn ich an den 
fusebits nichts eingestellt habe, und den mc mit einem programm geflsht 
habe, das er dadurch kaputt gegangen ist?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Spyro wrote:
> ja ok, habs kapiert. aber kann das eigentlich sein, das wenn ich an den
> fusebits nichts eingestellt habe, und den mc mit einem programm geflsht
> habe, das er dadurch kaputt gegangen ist?
Durch das Programmieren allein sicher nicht (es sei denn, Dein 
Programmiergerät entspricht nicht den Vorgaben und hat den µC 
gekillt...)

Autor: Spyro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die widerstände im programmiergerät (hab ich mir selber gebaut) sind ja 
hauptsächlich nur dazu da, um die copmuterbuchse zu schützen und nich 
den controller?
ich habe einen druckeranschluss, und da 220ohm widerstände dazwischen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Spyro (Gast)

>2. Kann ich eigentlich statt den Assemblerbefehlen "icall" und "rcall"
>auch den einfachen Befehl "call" verwenden. (ein anderes Beispiel wäre

NEIN!

icall springt auf die Adresse des Z-Registers
rcall ist ein relativer Sprung, der max. +/- 4096 Adressen weit geht
call ist ein absoluter Spung, welcher 64K Adressraum anspringen kann, 
ist nicht auf allen AVRs verfügbar

>"ret" und "reti")

GANZ FALSCH!

ret beendert ein Unterprogramm
reti beendet einen Interrupt und setzt dabei das I-Statusbit

MFG
Falk

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.