2 kurze Fragen zum ATmega16 (Fusebits, Befehle)

Gast #637172
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")
Gast #637178
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.
Gast #637199
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?
#637206
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.
#637223
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...)
Gast #637226
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.
#637252
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren