Stack für anfänger ATmega16

Gast #372144
Lesenswert?
• ▲
▼
morgen,

bin noch recht neu im bereich mikrocontroller. habe aber eine
praxisarbeit angefangen, bei der ich eine last bzw netzgerät mit einem
externen gerät digital steuer, d.h. ich gebe die gewünschte spannung
ein und diese wird an der last ausgegeben.
nun soll das gerät noch ein paar funktionen mehr haben und nun habe ich
ein problem. ich will mehrere spannungen und zeiten einlesen, nur es
herrscht leider ein registermangel. nun wolllte ich dies auf den sram
legen, nur folgendes problem: da meine eingaben durch unterschiedliche
längen verschiedene rcall´s und ret´s habe, variiert auch die
stackpointer adresse. kann ich die auch irgendwie abspeichern oder so
was in der art, damit ich wieder darauf zugreifen kann?

hier einmal ein ausschnitt aus dem einlesen einer spannung und einer
zeit:

spg_einlesen:


  ldi   temp, 0b11111011
  mov   menu_help, temp

  ldi    LCD_out,lcdclear          ; LCD löschen
  rcall  sendebefehl


  ldi    LCD_out,zeile1        ; setzte Cursor in zweite Zeile (Anfang)
  rcall  sendebefehl
  mov   temp, temp4_LCD
  ldi    temp,13
  mov   temp4_LCD, temp          ; lade 15 in Register temp4
  ldi    zl,low(text12*2)        ; Zeige auf Z-Pointer Lowbyte von 
Tabelle1
  ldi    zh,high(text12*2)        ; Zeige auf Z-Pointer Highbyte von 
Tabelle1
loop_msg13:
  lpm              ; lade R0 mit Wert auf der der Z-Pointer zeigt
  mov    LCD_out,r0          ; kopiere R0 in LCD_out
  rcall  write_LCD_data          ; Daten senden
  inc    zl            ; Incrementiere Z-Pointer LOW
  brcc  no_carry13          ; Springe falls Carryflag gelöscht
  inc    zh            ; Incrementiere Z-Pointer High
no_carry13:
  dec    temp4_LCD            ; Decrementiere temp4
  brne  loop_msg13
  ldi    LCD_out,zeile2        ; setzte Cursor in zweite Zeile (Anfang)
  rcall  sendebefehl

  rcall  start

menu_weiter3:
  push  r31
  push  r30

  ldi   temp, 0b11101111
  mov   menu_help, temp

;  ldi    LCD_out,lcdclear          ; LCD löschen
;  rcall  sendebefehl


  ldi    LCD_out,zeile3        ; setzte Cursor in zweite Zeile (Anfang)
  rcall  sendebefehl
  mov   temp, temp4_LCD
  ldi    temp,15
  mov   temp4_LCD, temp          ; lade 15 in Register temp4
  ldi    zl,low(text13*2)        ; Zeige auf Z-Pointer Lowbyte von 
Tabelle1
  ldi    zh,high(text13*2)        ; Zeige auf Z-Pointer Highbyte von 
Tabelle1
loop_msg14:
  lpm              ; lade R0 mit Wert auf der der Z-Pointer zeigt
  mov    LCD_out,r0          ; kopiere R0 in LCD_out
  rcall  write_LCD_data          ; Daten senden
  inc    zl            ; Incrementiere Z-Pointer LOW
  brcc  no_carry14          ; Springe falls Carryflag gelöscht
  inc    zh            ; Incrementiere Z-Pointer High
no_carry14:
  dec    temp4_LCD            ; Decrementiere temp4
  brne  loop_msg14

  ldi    LCD_out,zeile4        ; setzte Cursor in zweite Zeile (Anfang)
  rcall  sendebefehl

  rjmp  start_t

menu_weiter3_2:

  push  r26

  ldi    LCD_out,lcdclear          ; LCD löschen
  rcall  sendebefehl

  dec   spg_anz
  cpi    spg_anz, 0
  brne  spg_einlesen

  mov    spg_anz, spg_anz2

das ist meine schleife in der meine benötigten daten eingelesen werden.
nur wie lese ich sie nun aus? kann mir da jemand helfen?
schonmal ein dankeschön im voraus
Gast #372145
Lesenswert?
• ▲
▼
Du musst nicht den Stack benutzen um auf den SRAM zuzugreifen. Es gibt
befehle um daten an eine bestimmte stelle im SRAM zu schreiben (hab ich
noch nich gemacht deswegen fallen mir jetzt gerade die befehle nicht ein
aber ein blick ins datenblatt sollte helfen)
Gast #372148
Lesenswert?
• ▲
▼
Zum Beispiel µC & Eektronik.

Die Codesammulung ist für funktionierenden Code, der auch für andere
nützlich sein könnnte, damit man ihn hier zur Verfügung stellen kann.
Steht aber eigentlich schon direkt bei der Überschrift dran.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.