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


von Spyro (Gast)


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")

von STK500-Besitzer (Gast)


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.

von Spyro (Gast)


Lesenswert?

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

von STK500-Besitzer (Gast)


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?

von Johannes M. (johnny-m)


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.

von Spyro (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


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?

von Spyro (Gast)


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?

von Johannes M. (johnny-m)


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...)

von Spyro (Gast)


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.

von Falk B. (falk)


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

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
Noch kein Account? Hier anmelden.