Bascom- AVR-Microcontroller-Forum
 
*
Willkommen Gast. Bitte einloggen oder registrieren.
Haben Sie Ihre Aktivierungs E-Mail übersehen?
04. September 2010, 04:51:05


Einloggen mit Benutzername, Passwort und Sitzungslänge


Seiten: 1 [2] 3   Nach unten
  Drucken  
Autor Thema: Attiny  (Gelesen 5398 mal)
0 Mitglieder und 2 Gäste betrachten dieses Thema.
gerold
Bitschubser
**
Offline Offline

Beiträge: 94



WWW
« Antworten #15 am: 12. Juli 2008, 12:53:39 »

Zitat von: minibot
achja was is jetzt mit hwstack?

Hallo Minibot!

- http://avrhelp.mcselec.com/index.html?memory_usage.htm
- http://avrhelp.mcselec.com/index.html?_hwstack.htm
- http://www.roboternetz.de/wissen/index.php/Bascom_Inside

Irgendwann werde ich im "Kleinen Bascom Avr Kurs" mehr darüber schreiben. Jetzt fehlt mir noch die Muse dafür.

mfg
Gerold
:-)
Gespeichert

http://halvar.at | Kleiner Bascom AVR-Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
don
**Forenbesitzer**
Longposter
*
Offline Offline

Geschlecht: Männlich
Beiträge: 4068



« Antworten #16 am: 12. Juli 2008, 13:03:03 »

Grundlagen gibts hier..
http://bascom-forum.de/index.php/topic,10.msg2160.html#msg2160
Gespeichert
minibot
Bytequäler
***
Offline Offline

Beiträge: 212


« Antworten #17 am: 12. Juli 2008, 17:02:24 »

hmm

schau mal ob ichs verstanden habe:

2 bytes pro gosub/return

das wären dann bei meinem code $hwstack = 8
(4 gosubs/returns * 2 bytes = 8 )

was hat es denn mit dem $framesize, $swstack, $hwstack auf sich? (unterschiede, was kommt wohin(variablen usw.))

kann ich einfach auch nur auf nummer sicher gehen und nen 32iger hinklatschen($hwstack = 32 usw.)?

Mfg Minibot
Gespeichert
gerold
Bitschubser
**
Offline Offline

Beiträge: 94



WWW
« Antworten #18 am: 12. Juli 2008, 19:19:58 »

Zitat von: minibot
kann ich einfach auch nur auf nummer sicher gehen und nen 32iger hinklatschen($hwstack = 32 usw.)?

Hallo Minibot!

Ich versuche mal einen Teil zu beantworten.

$hwstack, $swstack und $framesize sollten im Programm angegeben werden. Einfach, damit man den Überblick behält und damit das Programm, falls man es weitergibt auch bei Anderen läuft. Man kann ja nie wissen, welche Werte der Andere in seiner IDE eingestellt hat.

HWSTACK:

Der Hardware-Stack ist der Bereich im Speicher, der dafür reserviert ist um Rücksprungadressen und, bei einem Interrupt, eine Sicherung der Register abzulegen.

Springst du mit GOSUB irgendwo hin, dann wird zuvor die Adresse gespeichert, zu der bei einem RETURN wieder zurück gekehrt werden soll. Wenn du innerhalb dieser Unterroutine in die du gesprungen bist, noch einmal GOSUB verwendest, dann wird diese zweite Rücksprungadresse ebenfalls auf den Hardware-Stack (=Stapel) abgelegt.

Bei einem RETURN wird dann von der zweiten Unterroutine in die erste Unterruoutine zurück gesprungen. Dann wird die Adresse vom Stack gelöscht. Wird die erste Unterruoutine beendet (RETURN), dann springt das Programm zur ersten Rücksprungadresse zurück. Auch diese Adresse wird wieder vom Hardware-Stack gelöscht.

Wie viel Speicher für diese Springerei benötigt wird, hängt also nicht von der Anzahl an GOSUBs ab, sondern davon, wie viele GOSUB ineinander verschachtelt sind. Für ein GOSUB in eine Unterroutine und noch ein GOSUB innerhalb dieser ersten Unterroutine und dann noch ein GOSUB innerhalb der zweiten Unterroutine brauchst du 3 x 2 Byte. Wenn du also deine Programme nicht extrem verschachtelst, dann brauchst du selten mehr als 10 Byte Hardware-Stack für diese Springerei.

Außer dieser Rücksprungadressen, legt Bascom auch die Werte der Register in diesen Stack, sobald ein Interrupt auftritt und der zugehörige Interrupt-Handler (ISR) angesprungen wird.

Bevor also die Unterprozedur aufgerufen wird, die immer dann automatisch ausgeführt wird, wenn ein Interrupt auftritt, werden die Register in den HWStack gesichert. Dafür werden 32 Byte benötigt. Wenn du also Interrupts aktivierst, dann brauchst du mindestens 32 Byte HWStack. Da man in einem Interrupt-Handler so wenig wie möglich macht und die Hauptarbeit normalerweise in der MainLoop verrichten lässt, ist es unüblich, innerhalb eines Interrupt-Handlers Unterprozeduren anzuspringen. Wenn du es aber doch machst, was ja kein Problem ist, dann musst du zu den benötigten 32 Byte noch die Byte für die Springerei dazuzählen.

Ich würde mal sagen, dass du beim HWSTACK mehr als großzügig bist, wenn du diesen am Anfang auf 40 Byte festlegst. Und falls du weißt, dass du nicht so viel brauchst, weil du z.B. keinen Interrupt aktiviert hast, dann kannst du später den HWSTACK entsprechend verkleinern.

Code:
$hwstack = 40

mfg
Gerold
:-)
Gespeichert

http://halvar.at | Kleiner Bascom AVR-Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
gerold
Bitschubser
**
Offline Offline

Beiträge: 94



WWW
« Antworten #19 am: 12. Juli 2008, 19:42:23 »

Zitat von: gerold
Code:
$hwstack = 40

So, und jetzt zum Software-Stack. Gleich wie beim Hardware-Stack gilt, dass nicht die Anzahl an Unterprozeduren (SUB) dafür ausschlaggebend ist, wie groß der Software-Stack sein muss. Ausschlaggebend ist, wie verschachtelt die Aufrufe untereinander sind.

Wenn du zehn Unterprozeduren hast, aber immer nur eine dieser Unterprozeduren gleichzeitig aktiv wird, brauchst du nur so viel Software-Stack-Speicher wie ihn diese eine Unterprozedur benötigt. Wenn du innerhalb einer Unterprozedur eine andere Unterprozedur aufrufst, dann brauchst du im Software-Stack für beide Unterprozeduren Platz.

Wie viel Platz ist das überhaupt?
Du brauchst für jede Variable, die an die Unterprozedur als Parameter übergeben wird, 2 Byte im SWStack. Hast du also eine Unterprozedur mit 2 Parametern, dann brauchst du dafür 4 Byte SWStack. Rufst du innerhalb dieser Unterprozedur eine andere Unterprozedur auf, die 3 Parameter erwartet, dann brauchst du zu den bereits verbrauchten 4 Byte noch (3 x 2) 6 Byte dazu. Das wären dann 10 Byte.

Jede innerhalb einer Unterprozedur mit dem Befehl LOCAL erstellte Variable braucht ebenfalls je 2 Byte im SWStack.

Nehmen wir also an, dass du im Normalfall bis zu 4 Parameter an eine Unterprozedur weitergibst und innerhalb der Prozeduren maximal 3 Variablen mit LOCAL definierst.
Weiters nehmen wir mal an, dass du innerhalb einer solchen Unterprozedur maximal noch eine weitere Unterprozedur mit wiederum 4 Parametern aufrufst, die auch wieder bis zu 3 lokale Variablen hat, dann braust du für die Parameter der ersten Prozedur (4 x 2) 8 Byte. Und für die lokalen Variablen der ersten Prozedur (3 x 2) 6 Byte. Das sind für die erste Prozedur 14 Byte SWStack. Und die gleiche Menge kommt noch für den Verschachtelten Aufruf der zweiten Unterprozedur dazu. Das wären dann 28 Byte die für den SWStack reserviert werden müsste.

Wenn man noch ein paar Reserverbytes dazu tut, dann bist du in solch einem Fall mit 32 Byte SWStack gar nicht mal so schlecht dran.

Wenn du also schon am Anfang deines Programmes den SWSTACK auf 32 stellst, dann sind solche (eher schon komplexe) Vorgänge recht gut abgedeckt. Wenn du später erkennst, dass du nicht so viel SWSTACK-Speicher benötigst, dann kannst du ihn ja immer noch verkleinern.

Code:
$swstack = 32

mfg
Gerold
:-)
Gespeichert

http://halvar.at | Kleiner Bascom AVR-Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
gerold
Bitschubser
**
Offline Offline

Beiträge: 94



WWW
« Antworten #20 am: 12. Juli 2008, 20:07:04 »

Zitat von: gerold
Code:
$swstack = 32

Und weiter geht es mit dem FRAME. Im Frame werden Daten und keine Adressen gespeichert. Wenn an eine Unterprozedur ein Parameter übergeben wird, dann wird die Adresse dieses Parameters im SWSTACK gespeichert. Der Wert, also das was in dieser Variable drinnen steht, wird im FRAME gespeichert. Allerdings nur, wenn der Parameter mit dem Schlüsselwort BYVAL an die Prozedur übergeben wurde. Da es in den meisten fällen besser ist, Werte mit BYVAL zu übergeben, können wir auch davon ausgehen, dass der Wert der Variable im Frame gespeichert wird.

Nehmen wir wieder unsere Unterprozedur. Die mit den vier Parametern. Nehmen wir mal an, dass der erste und der zweite Parameter je eine BYTE-Variable sind. Der dritte Parameter eine ist eine WORD-Variable. Und der vierte Paramter eine STRING-Variable für 10 Zeichen.
Weiters sind in der Unterprozedur 3 lokale BYTE-Variablen.

Wird diese Unterprozedur aufgerufen, dann wird vorher in den HWSTACK die Rücksprungadresse abgelegt. Dann werden im SWSTACK die Adressen der Parameter und der lokalen Variablen abgelegt. -- jetzt kommts -- Und im FRAME wird für die Parameter und die lokalen Variablen Speicher reserviert.

2 x BYTE = 2 Byte
1 x WORD = 2 Byte
1 x STRING * 10 = 11 Byte (inkl. Abschlussbyte)
3 x BYTE = 3 Byte (lokale Variablen)

Für diesen Aufruf werden im FRAME also 18 Byte benötigt.

Bascom braucht den FRAME aber auch für andere Sachen, wie z.B. die Umwandlung von Variablen in andere Datentypen. Du kannst also den FRAME recht groß dimensionieren. Nur wenn dir der übrige Speicher ausgeht, dann musst du den FRAME auf das Nötigste verkleinern.

Wenn du den FRAME großzügig mit 60 Byte beglückst, dann sollten die meisten Anwendungsfälle des ATmega8 abgedeckt sein. Wenn du weißt, dass du weniger brauchst, dann kannst du den FRAME ja kleiner machen.

Code:
$framesize = 60

mfg
Gerold
:-)
Gespeichert

http://halvar.at | Kleiner Bascom AVR-Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
gerold
Bitschubser
**
Offline Offline

Beiträge: 94



WWW
« Antworten #21 am: 12. Juli 2008, 20:22:31 »

Hallo!

Damit sind wir bei diesen Vorschlägen:

ATmega8/ATmega16:
Der ATmega8 hat insgesamt 1024 Byte SRAM zur Verfügung. Von diesem SRAM werden die Bytes für den HWSTACK, den SWSTACK und den FRAME abgezogen.
Code:
$hwstack = 40
$swstack = 32
$framesize = 60
Dann bleiben für die Variablen des Hauptprogrammes noch 892 Byte übrig. Man kann also noch gut nach oben korrigieren, falls mehr HWSTACK, SWSTACK oder FRAME benötigt wird.

Code:
$hwstack = 100
$swstack = 100
$framesize = 100
Auch mit diesen Werten sollte alles so lange gut laufen, so lange das Programm nicht mehr als 700 Byte verbraucht.

ATtiny13:
Der ATTiny13 hat insgesamt nur 64 Byte SRAM. Da muss man schon aufpassen, keine zu großen Werte für die Stacks und den Frame zu verwenden. Wer den ATtiny13 verwendet, **muss** auf jeden Fall genau wissen, wieviel Speicher für was verwendet wird.
Ich habe z.B. ein Programm auf dem ATtiny13 laufen, das diese Einstellungen verwendet:
Code:
$hwstack = 32
$swstack = 5
$framesize = 20
Es bleiben also gerade noch 7 Byte für das restliche Programm übrig.

Wer einen kleinen µC braucht, aber zu wenig SRAM hat, der sollte bei den ATtiny-Controllern auf den ATtiny45 setzen. Der ATtiny45 hat 256 Byte SRAM.

Je kleiner der SRAM, desto mehr muss man bei der Vergabe der Speicherbereiche aufpassen. Ab dem ATmega8 ist das nicht mehr so ein großes Problem, da man mehr Speicher zur Verfügung hat.

Lesestoff:
- http://avrhelp.mcselec.com/index.html?memory_usage.htm
- http://avrhelp.mcselec.com/index.html?stcheck.htm
- http://www.roboternetz.de/wissen/index.php/Bascom_Inside

mfg
Gerold
:-)
Gespeichert

http://halvar.at | Kleiner Bascom AVR-Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
minibot
Bytequäler
***
Offline Offline

Beiträge: 212


« Antworten #22 am: 13. Juli 2008, 12:15:36 »

Wunderbar!!

danke!

Code:
ATMega AVR 8-16 PDIP
Gehäuse: DIL-28
MHz: 16
Flash: 8
EEProm: 512
RAM: 1K
I/O: 23

Zitat
Auch mit diesen Werten sollte alles so lange gut laufen, so lange das Programm nicht mehr als 700 Byte verbraucht.
wird das programm nicht ins eeprom geschrieben? und: wo sehe ich die größe des programmes

also ins RAM werden die von dir beschriebenen dinge hineingespeichert.(atmega 8 ca.1k)
was ist dann mit dem flash?


Mfg Minibot
Gespeichert
gerold
Bitschubser
**
Offline Offline

Beiträge: 94



WWW
« Antworten #23 am: 13. Juli 2008, 13:50:34 »

Zitat von: minibot
wird das programm nicht ins eeprom geschrieben? und: wo sehe ich die größe des programmes

also ins RAM werden die von dir beschriebenen dinge hineingespeichert.(atmega 8 ca.1k)
was ist dann mit dem flash?

Hallo Minibot!

Der ATmega8 hat 8 kByte FLASH. In diesen Flash wird das Programm gespeichert. Dieses Programm bleibt im µC auch wenn man den Strom vom µC nimmt.

Der ATmega8 hat 1 kByte SRAM. In diesem SRAM finden die Werte der Programmvariablen und auch der HWSTACK, der SWSTACK und der FRAME seinen Platz. Dieser Speicher verliert die Werte wenn kein Strom mehr am µC anliegt.

Der ATmega8 hat 512 Byte EEPROM. Das ist ein nichtflüchtiger Speicher, der beschrieben werden kann. Das ist vergleichbar mit einer SD-Karte, wie man sie aus den digitalen Fotoaparaten kennt. In diesen EEPROM kannst du Einstellungen ablegen, die nach dem Aussschalten gespeichert bleiben sollen.

Die Größe des Programmes siehst du, nach dem Kompilieren im Bascom im Menü "Programmieren" auf den Menüeitrag "Ergebnis anzeigen" klickst.

Die Größe des Programmes zeigen die Zeilen ROMIMAGE und FLASH USED an.

mfg
Gerold
:-)
Gespeichert

http://halvar.at | Kleiner Bascom AVR-Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
minibot
Bytequäler
***
Offline Offline

Beiträge: 212


« Antworten #24 am: 13. Juli 2008, 21:01:07 »

Hi

Der ATmega8 hat 8 kByte FLASH. In diesen Flash wird das Programm gespeichert. Dieses Programm bleibt im µC auch wenn man den Strom vom µC nimmt.

nicht 8 byte statt 8 kbyte?

ROMIMAGE     : 108 hex  -> Will fit into ROM
ROMIMAGE     :  264 dec
FLASH USED   :  3  %
BAUD         : 9600 Baud
XTAL         : 16000000 Hz
BAUD error   : 0.16%

FLASH USED   :  3  % --> bedeutet das 3 byte oder 3 prozent der insgesamt 8 byte?
ROMIMAGE     :  264 dec --> HuchHuchHuch

zum eeprom: kommen da die fusebits rein die man ja nur einmal programmieren muss?

Mfg Minibot
Gespeichert
gerold
Bitschubser
**
Offline Offline

Beiträge: 94



WWW
« Antworten #25 am: 13. Juli 2008, 21:17:37 »

nicht 8 byte statt 8 kbyte?
zum eeprom: kommen da die fusebits rein die man ja nur einmal programmieren muss?

Hallo Minibot!

- http://de.wikipedia.org/wiki/Byte
- http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf

Und wo die Fusebits (2 Byte) gespeichert werden ist mir völlig wurscht. ;-)

mfg
Gerold
:-)
Gespeichert

http://halvar.at | Kleiner Bascom AVR-Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
minibot
Bytequäler
***
Offline Offline

Beiträge: 212


« Antworten #26 am: 13. Juli 2008, 21:18:16 »

Hi

http://www.roboternetz.de/wissen/index.php/Bild:Ispschaltplan.gif

bei dem ISP- dongle liegt zwischen der diode und dem kondensator etwas für mich unbekanntes. was ist das?

PS: ich meinte nur: hat der atmega 8, 8 byte oder 8 kilobyte flash wie du es oben angegeben hast

Mfg Minibot
Gespeichert
gerold
Bitschubser
**
Offline Offline

Beiträge: 94



WWW
« Antworten #27 am: 13. Juli 2008, 21:59:17 »

Hallo Minibot!

bei dem ISP- dongle liegt zwischen der diode und dem kondensator etwas für mich unbekanntes. was ist das?
Das sind die Stromanschlüsse des ICs. Die müssen auch ran.

Zitat von: minibot
PS: ich meinte nur: hat der atmega 8, 8 byte oder 8 kilobyte flash wie du es oben angegeben hast

Der Text "Hallo Welt" besteht aus 10 Zeichen. Diese 10 Zeichen sind das Äquivalent zu 10 Byte. In 8 Byte hätte also nur der Text "Hallo We" platz.

Damit du das selber raus findest, habe ich dir den Link zum Wikipedia-Artikel gepostet. Und dann kannst du dir deine Frage selbst beantworten.

Außerdem steht im ATmega8-Datenblatt, zu dem ich dir ebenfalls den Link gepostet habe, auf der ersten Seite, wie viel Flash-Speicher der ATmega8 hat.

Ein bischen mehr Eigeninitiative von dir wäre nicht schlecht. Jede Kleinigkeit vorkauen macht keinen Spaß.

mfg
Gerold
:-)
Gespeichert

http://halvar.at | Kleiner Bascom AVR-Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
minibot
Bytequäler
***
Offline Offline

Beiträge: 212


« Antworten #28 am: 14. Juli 2008, 15:37:02 »

HI

ROMIMAGE     : 108 hex  -> Will fit into ROM
ROMIMAGE     :  264 dec
FLASH USED   :  3  %
BAUD         : 9600 Baud
XTAL         : 16000000 Hz
BAUD error   : 0.16%

FLASH USED   :  3  % --> bedeutet das 3 byte oder 3 prozent der insgesamt 8192 byte?
ROMIMAGE     :  264 dec -->  Huch Huch Huch


ein letztes mal:
daten des atmega 8(soweit ich es verstanden habe):

EEprom: 512 byte
Ram: 1024 byte
Flash: 8192 byte(8 KByte)

1 KByte = 1024 byte


Mfg Minibot
Gespeichert
Panzer4000
Greenhorn
*
Offline Offline

Geschlecht: Männlich
Beiträge: 40



« Antworten #29 am: 14. Juli 2008, 20:32:29 »

Hallo !

Gerold deine Aufklärung war großartig.
Gute kurze aber genaue Erklärung.
Da kann man was lernen.

MfG


Gespeichert

Das Genie formuliert die Frage. Das Talent beantwortet sie.
Seiten: 1 [2] 3   Nach oben
  Drucken  
 
Gehe zu:  

Ab 20€ Spende faellt die Werbung weg,fuer 1 Jahr.
impressum
Dilber MC Theme by HarzeM
Powered by SMF 1.1.11 | SMF © 2006-2009, Simple Machines LLC

©Bascom-forum.de