Display blinkt bei Externen Dateien

Gast #4123594
Lesenswert?
• ▲
▼
Ich habe verschiedene Teile meines Programms ausgelagert auf mehrere 
Dateien.
1
//Interrupt Adressen
2
.org 0x0000
3
rjmp    Init  
4
.org OVF0addr
5
rjmp    timer0_overflow 
6

7
//Init
8

9
Main:
10
rcall ADC_Check
11
rjmp Main
12

13
.include "Init.inc"
14
.include "Display.inc"
15
.include "ADC.asm"
16
.include "Text.asm"
17
.include "Timer0.asm"
18
.include "Menu.asm"
19
.include "delay.asm"

Die Funktion Init wird nach dem Reset aufgerufen, sie befindet sich in 
der Datei Init.inc  (Selbes Ergebnis auch wenn die Datei Init.asm heist)
1
[...]//Diverse Einstellungen zum Timer etc
2

3
//Variabeln Initialisierung
4
ldi menu, 0x00
5
ldi menu_item, 0xFF
6

7
//Displays Initialisieren
8
rcall Display1_Init
9
ldi ZL, LOW(Hallo*2)        
10
ldi ZH, HIGH(Hallo*2)
11
rcall Display1_Clear
12
rcall Display1_Flash_String
13

14
sei

Nun blinkt das Display mit dem Text aus "Hallo"

Wenn ich diese Initialisierung direkt in mein Hauptprogramm schreibe so 
blinkt das Display nicht mit dem Text. Warum ist das so? Es scheint mir 
als würde die Init Funktion in einem Nebenprogramm öfter aufgerufen als 
gewollt.
#4123649
Lesenswert?
• ▲
▼
Hallo,

wie gelangst du von Init: zu Μain: das ist aus deiner init.inc nicht zu 
erkennen.
Der Übersichtlichkeit wegen ist es keine gute Idee Subroutinen (erst 
recht in ausgelagerten Dateien) mit jmp/rjmp aufzurufen, da diese ja am 
Ende wieder einen jmp wo anders hin benötigen.

Also entweder
1
.org 0
2
rjmp start
3
...
4

5

6
start:
7
rcall init
8

9
Main:
10
//tu was
11
rjmp main
12

13
Include "init"
14
Inculde "noch was"
oder, den Code direkt an der benötigten Stelle einbinden
1
.org 0
2
rjmp init
3
...
4

5

6
init:
7
include "init"
8

9
Main:
10
//tu was
11
rjmp main
12

13
Inculde "noch was"

Sascha
Gast #4123857
Lesenswert?
• ▲
▼
Kump schrieb:

> Die Funktion Init wird nach dem Reset aufgerufen, sie befindet sich in
> der Datei Init.inc

Und endet wahrscheinlich mit einem "ret" oder einfach irgendwie.

Du mußt sie entweder mit ret enden lassen, dann aber auch mit einem 
"rcall init" statt eines "rjmp init" im Resetvektor aufrufen oder 
alternativ kannst du das rjmp init im Resetvektor stehen lassen, mußt 
dann aber am Ende von init auch ein "rjmp main" machen.

Antwort schreiben

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.

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.