Forum: Mikrocontroller und Digitale Elektronik Display blinkt bei Externen Dateien


von Kump (Gast)


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.

von Sascha W. (sascha-w)


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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Kump schrieb:
> Nun blinkt das Display mit dem Text aus "Hallo"

Vllt. rennt der MC einfach in ein Reset rein und wiederholt das bis 
Pflaumenpfingsten.

von c-hater (Gast)


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.

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.