www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupts. Was bedeutet "RAMEND"


Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe mir hier auf 
http://www.mikrocontroller.net/articles/AVR-Tutori...
den Artikel über Interrupts durchgelesen und das Prinzip verstanden.

Jeodoch weiß ich nicht, was speziell

 ldi temp, LOW(RAMEND)
         out SPL, temp
         ldi temp, HIGH(RAMEND)
         out SPH, temp


bewirkt. Könnt ihr mir helfen?

Danke!

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eigentlich selbsterklärend :-)
Üblicherweise wird der Stackbeginn ans Ende des RAMs gesetzt, dieses 
liegt aber bei den verschiedenen AVRs aufgrund unterschiedlicher 
RAM-Grösse an anderen Adressen.
Also wird in der entsprechenden .def-Datei diese letzte RAM-Adresse 
definiert und dann der SP mit diesem Wert initialisiert.

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da wird der Stackpointer initalisiert. Ohne Stack würde man anch einem 
Interupt im Nirvana landen.

RAMEND ist die Adresse der letzten SRAM-Speicherzelle. Der Stack beginnt 
man Ende des SRAMs und wächst dann Richtung Anfang. Man setzt daher den 
Stackpointer zu Beginn auf die letzte Speicherzelle.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das läd die allerletzte speicheraddresse in den stackpointer (Stack 
Pointer High + Stack Pointer Low SPL/SPH)

der stack ist der zwischenspeicher und wird von hinten her gefüllt.
damit es nicht mit deinen nutzdaten kollidiert die von vorne im speicher 
gefüllt werden muss der stackpointer eben auf die letzte speicherstellt 
= RAMEND zeigen.

RAMEND ist für jeden controller je nach speichergröße definiert


sollte man den stackpointer vergesseen zu definieren weiß der controller 
nach einer subroutine (z.b. interrupts) nicht mehr wohin er 
zurückspringen soll u. das programm spinnt.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
grrr... zu langsam ;)

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gleich so viele Antworten, danke Euch!


Ich arbeite mit einem Grundgerüst. Da wird der Stack  automatisch 
aktiviert:

+----------------------------------------------------------------------
;| Title    : myAVR Grundgerüst für ATmega8
;+----------------------------------------------------------------------
;| Funktion    : ...
;| Schaltung  : ...
;+----------------------------------------------------------------------
;| Prozessor  : ATmega8
;| Takt      : 3,6864 MHz
;| Sprache      : Assembler
;| Datum        : ...
;| Version      : ...
;| Autor        : ...
;+----------------------------------------------------------------------
.include  "AVR.H"
;----------------------------------------------------------------------- 
-
;Reset and Interrupt vector             ;VNr.  Beschreibung
  rjmp  main  ;1   POWER ON RESET
  reti    ;2   Int0-Interrupt
  reti    ;3   Int1-Interrupt
  reti    ;4   TC2 Compare Match
  reti    ;5   TC2 Overflow
  reti    ;6   TC1 Capture
  reti    ;7   TC1 Compare Match A
  reti    ;8   TC1 Compare Match B
  reti    ;9   TC1 Overflow
  reti    ;10  TC0 Overflow
  reti    ;11  SPI, STC Serial Transfer Complete
  reti    ;12  UART Rx Complete
  reti    ;13  UART Data Register Empty
  reti    ;14  UART Tx Complete
  reti    ;15  ADC Conversion Complete
  reti    ;16  EEPROM Ready
  reti    ;17  Analog Comparator
  reti    ;18  TWI (I²C) Serial Interface
  reti    ;19  Store Program Memory Ready
;----------------------------------------------------------------------- 
-
;Start, Power ON, Reset
main:  ldi  r16,lo8(RAMEND)
  out  SPL,r16
  ldi  r16,hi8(RAMEND)
  out  SPH,r16
  ;Hier Init-Code eintragen.
;----------------------------------------------------------------------- 
-
mainloop:  wdr
  ;Hier den Quellcode eintragen.
  rjmp  mainloop
;----------------------------------------------------------------------- 
-


kann ich dann also, wenn ich mit Interrupts arbeite genau das was ich 
eben zitiert habe weglassen, da der Stack ja in dem Grundgerüst schon 
aktiviert wird?

Autor: Christian S. (mueke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, klar
Du brauchst das ja nicht doppelt schreiben...
In deinem Grundgerüst stehen doch genau die selben Zeilen, die du am 
Anfang zitiert hast...

MfG
Muecke

Autor: thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Egal, ob Du Interrupts nutzt oder nicht, der Stack sollte zu Beginn des 
Programms initialisiert werden.

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
alles klar, das hat mich halt was verwirrt, weil ich nicht genau wusste, 
was es ist.
Ich bedanke mich

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also so hab ich es jetzt zusammengefügt


;+----------------------------------------------------------------------
;| Title    : myAVR Grundgerüst für ATmega8
;+----------------------------------------------------------------------
;| Funktion    : ...
;| Schaltung  : ...
;+----------------------------------------------------------------------
;| Prozessor  : ATmega8
;| Takt      : 3,6864 MHz
;| Sprache      : Assembler
;| Datum        : ...
;| Version      : ...
;| Autor        : ...
;+----------------------------------------------------------------------
.include  "AVR.H"
.include "m8def.inc"
;----------------------------------------------------------------------- 
-
;Reset and Interrupt vector             ;VNr.  Beschreibung
  rjmp  main  ;1   POWER ON RESET
  reti    ;2   Int0-Interrupt
  reti    ;3   Int1-Interrupt
  reti    ;4   TC2 Compare Match
  reti    ;5   TC2 Overflow
  reti    ;6   TC1 Capture
  reti    ;7   TC1 Compare Match A
  reti    ;8   TC1 Compare Match B
  reti    ;9   TC1 Overflow
  reti    ;10  TC0 Overflow
  reti    ;11  SPI, STC Serial Transfer Complete
  reti    ;12  UART Rx Complete
  reti    ;13  UART Data Register Empty
  reti    ;14  UART Tx Complete
  reti    ;15  ADC Conversion Complete
  reti    ;16  EEPROM Ready
  reti    ;17  Analog Comparator
  reti    ;18  TWI (I²C) Serial Interface
  reti    ;19  Store Program Memory Ready
;----------------------------------------------------------------------- 
-
;Start, Power ON, Reset
main:  ldi  r16,lo8(RAMEND)
  out  SPL,r16
  ldi  r16,hi8(RAMEND)
  out  SPH,r16
  ;Hier Init-Code eintragen.
;----------------------------------------------------------------------- 
-
.def temp = r16

.org 0x000
         rjmp main            ; Reset Handler
.org INT0addr
         rjmp int0_handler    ; IRQ0 Handler
.org INT1addr
         rjmp int1_handler    ; IRQ1 Handler


main:                         ; hier beginnt das Hauptprogramm



         ldi temp, 0x00
         out DDRD, temp

         ldi temp, 0xFF
         out DDRB, temp

         ldi temp, 0b00001010  ; INT0 und INT1 konfigurieren
         out MCUCR, temp

         ldi temp, 0b11000000  ; INT0 und INT1 aktivieren
         out GICR, temp

         sei                   ; Interrupts allgemein aktivieren

loop:    rjmp loop             ; eine leere Endlosschleife

int0_handler:
         push temp             ; Das SREG in temp sichern. Vorher
         in   temp, SREG       ; muss natürlich temp gesichert werden

         sbi PORTB, 0

         out SREG, temp        ; Die Register SREG und temp wieder
         pop temp              ; herstellen
         reti

int1_handler:
         push temp             ; Das SREG in temp sichern. Vorher
         in   temp, SREG       ; muss natürlich temp gesichert werden

         cbi PORTB, 0

         out SREG, temp        ; Die Register SREG und temp wieder
         pop temp              ; herstellen
         reti
;----------------------------------------------------------------------- 
-



und ich bekomme jede Menge Fehler beim komilieren:

Assembler Meldungen:
m8_Grundgeruest.s:15  Can't open m8def.inc for reading: Datei nicht 
gefunden.
m8_Grundgeruest.s:45  Fehler: unknown pseudo-op: `.def'
m8_Grundgeruest.s:55  Fehler: symbol `main' is already defined
m8_Grundgeruest.s:59  Fehler: ein konstanter Wert wird erwartet:
Kontrollieren Sie bitte die Schreibweise dieser Zeile.
 Erwarte Register ab: 15
m8_Grundgeruest.s:60  Fehler: ein konstanter Wert wird erwartet:
Kontrollieren Sie bitte die Schreibweise dieser Zeile.
m8_Grundgeruest.s:62  Fehler: ein konstanter Wert wird erwartet:
Kontrollieren Sie bitte die Schreibweise dieser Zeile.
 Erwarte Register ab: 15
m8_Grundgeruest.s:63  Fehler: ein konstanter Wert wird erwartet:
Kontrollieren Sie bitte die Schreibweise dieser Zeile.
m8_Grundgeruest.s:65  Fehler: ein konstanter Wert wird erwartet:
Kontrollieren Sie bitte die Schreibweise dieser Zeile.
 Erwarte Register ab: 15
m8_Grundgeruest.s:66  Fehler: ein konstanter Wert wird erwartet:
Kontrollieren Sie bitte die Schreibweise dieser Zeile.
m8_Grundgeruest.s:68  Fehler: ein konstanter Wert wird erwartet:
Kontrollieren Sie bitte die Schreibweise dieser Zeile.
 Erwarte Register ab: 15
m8_Grundgeruest.s:69  Fehler: ein konstanter Wert wird erwartet:
Kontrollieren Sie bitte die Schreibweise dieser Zeile.
m8_Grundgeruest.s:76  Fehler: ein konstanter Wert wird erwartet:
Kontrollieren Sie bitte die Schreibweise dieser Zeile.
m8_Grundgeruest.s:77  Fehler: ein konstanter Wert wird erwartet:
Kontrollieren Sie bitte die Schreibweise dieser Zeile.
m8_Grundgeruest.s:81  Fehler: ein konstanter Wert wird erwartet:
Kontrollieren Sie bitte die Schreibweise dieser Zeile.
m8_Grundgeruest.s:82  Fehler: ein konstanter Wert wird erwartet:
Kontrollieren Sie bitte die Schreibweise dieser Zeile.
m8_Grundgeruest.s:86  Fehler: ein konstanter Wert wird erwartet:
Kontrollieren Sie bitte die Schreibweise dieser Zeile.
m8_Grundgeruest.s:87  Fehler: ein konstanter Wert wird erwartet:
Kontrollieren Sie bitte die Schreibweise dieser Zeile.
m8_Grundgeruest.s:91  Fehler: ein konstanter Wert wird erwartet:
Kontrollieren Sie bitte die Schreibweise dieser Zeile.
m8_Grundgeruest.s:92  Fehler: ein konstanter Wert wird erwartet:
Kontrollieren Sie bitte die Schreibweise dieser Zeile.
Ende.


was kann das sein

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jochen wrote:
> also so hab ich es jetzt zusammengefügt

Du vermischt 2 verschiedene Assembler.
Das kann nicht gut gehen.

Entweder du benutzt den Assmebler, der mit deinem
MyAVRBord mitgekommen ist oder du benutzt den Assembler
den man bei Atmel über das AVR-Studio bekommt.
Aber beides zusammen geht nicht ( = auch wenn beides
'Assembler' heist, so sind es doch verschiedene Sprachen)


Autor: Christian S. (mueke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit deinen ".org" befehlen sagst, du dem Assembler, dass er ab dieser 
Speicherstelle anfangen soll in den Programmspeicher zu schreiben. 
Standartmäßig fängt er bei 0x0000 an.

Wenn du dein Programm also wie folgt anfängst:
;Reset and Interrupt vector             ;VNr.  Beschreibung
  rjmp  main  ;1   POWER ON RESET
  reti    ;2   Int0-Interrupt
  reti    ;3   Int1-Interrupt
  reti    ;4   TC2 Compare Match
  reti    ;5   TC2 Overflow
.
.
.
Brauchst du die .org direktiven nicht mehr zu machen... Das ist daselbe.
Schreib bei den Interruptvektoren die du brauchst, statt einem reti den 
Sprungbefehl zu deinen ISR's rein. Und diese dann mit reti beenden. Die 
.org's kannst du dann rausnehmen

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab jetzt
.def temp = r16

.org 0x000
         rjmp main            ; Reset Handler
.org INT0addr
         rjmp int0_handler    ; IRQ0 Handler
.org INT1addr
         rjmp int1_handler    ; IRQ1 Handler


main:                         ; hier beginnt das Hauptprogramm

         ldi temp, LOW(RAMEND)
         out SPL, temp
         ldi temp, HIGH(RAMEND)
         out SPH, temp

         ldi temp, 0x00
         out DDRD, temp

         ldi temp, 0xFF
         out DDRB, temp

         ldi temp, 0b00001010  ; INT0 und INT1 konfigurieren
         out MCUCR, temp

         ldi temp, 0b11000000  ; INT0 und INT1 aktivieren
         out GICR, temp

         sei                   ; Interrupts allgemein aktivieren

loop:    rjmp loop             ; eine leere Endlosschleife

int0_handler:
         push temp             ; Das SREG in temp sichern. Vorher
         in   temp, SREG       ; muss natürlich temp gesichert werden

         sbi PORTB, 0

         out SREG, temp        ; Die Register SREG und temp wieder
         pop temp              ; herstellen
         reti

int1_handler:
         push temp             ; Das SREG in temp sichern. Vorher
         in   temp, SREG       ; muss natürlich temp gesichert werden

         cbi PORTB, 0

         out SREG, temp        ; Die Register SREG und temp wieder
         pop temp              ; herstellen
         reti



in das AVR Studio geschrieben und erhalte noch die Meldungen

error: Use of undefined or forwar referenced symbol INT0addr in .org
error: Overlap in .cseg addr=0x conflicts with 0x0:0x1
error: Use of undefined or forwar referenced symbol INT0addr in .org
error: Overlap in .cseg addr=0x conflicts with 0x0:0x1

Assembly failed, 4 errors

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry hatte die Datei .include "m8def.inc" nicht eingebunden

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jochen wrote:
> ich hab jetzt
> in das AVR Studio geschrieben und erhalte noch die Meldungen

Jetzt fehlt dir der
.include "m8def.inc"

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry dass ich fragen muss aber wie bekomme ich denn mit dem Programm 
AVR Studio ein Programm in den Mikrocontroller geschrieben?

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich bekomme keine Verbindung, sie kommt nicht zu stande.
Habe ICE 40 angeklickt und dann USB ber es funktioniert nicht

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du das myAVr-Board mit USB? Dann wählst du im Studio 
Tools->AVRprog.

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

dann bekomme ich die Meldung

no supported board found
AVRprog vers. 1.40

was kann das sein, das myavr Board ist mit USB verbunden.

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Als welcher COM-Port hat sich der USB-Chip angemeldet? AVRprog sucht nur 
auf Com1 bis 4.

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, ja daran lag es dann wohl

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.