Forum: Projekte & Code Stack für anfänger ATmega16


von Philipp (Gast)


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

von Hauke Radtki (Gast)


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)

von Netzpolizei (Gast)


Lesenswert?

Falsches Forum.

von Philipp (Gast)


Lesenswert?

in welchem forum sollte ich da suchen?

danle für den tipp mit dem direktzugriff

von Netzpolizei (Gast)


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.

von Philipp (Gast)


Lesenswert?

ja ok ich merks mir für die zukunft

danke nochmals

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.