Forum: Mikrocontroller und Digitale Elektronik AVR Attmega8a Routinenaufruf fumktioniert nicht (asm)


von Fritz B. (kleinfritzchen)


Angehängte Dateien:

Lesenswert?

hier der zweite Versuch mit anders formulierter Frage.
In der Datei rufe ich oben in der Initialisierung vor der Endlosschleife 
die Methode DHT_lesen auf. Die Parameter werden unmittelbar davor 
eingestellt(Speicheradresse für Y; Datenmaske für die Abfrage des PINC 
und setzen des PortC und Position des Kursers im Display)
Der anschließende Aufruf funktioniert auch was jedoch nicht geht ist ein 
weiterer Aufruf mit geänderten Vorgaben.
Der zweite Aufruf funktioniert aber wenn ich den forigen auskommentiere!
also sollte eigentlich das Programm die Werte beider Sensoren eigentlich 
im Display ausgeben. Aber es läuft immer nur bis zur Positionierung des 
Cursers für die Werte des zweiten Sensors und das wwars dann.

Wo liegt der Fehler das der 2te Aufruf der Routine nicht gemacht wird?

MfG Fritz

von jeehoo (Gast)


Lesenswert?

schon mal mit dem simulator laufengelassen? dort kann man jedes register 
anschauen. ohne genauer hingeschaut zu haben - wie steht's mit dem 
Stack.

von jeehoo (Gast)


Lesenswert?

LCD - bedeutet ueblicherweise Timing beachten. siehe Datenblatt

von Fritz B. (kleinfritzchen)


Lesenswert?

also ich hab grad den Simulator laufen lassen kann aber bis jetzt nichts 
im Ablauf finden was stört oder nicht so läuft wie es soll. Allerdings 
musste ich etliche Methoden umändern oder auskommentieren damit ich es 
erst mal im Simulator laufen lassen konnte (z.B. die Initialisierung des 
LCD oder alle Routinen die eine Eingabe benötigen.
Das Timing für das LCD ist unproblematisch und funktioniert!
Der Stack ist anscheinend auch kein Problem denn von den 1024 Byte 
benötige ich nur 10 Byte für die Zwischenspeicherung der Sensor Werte.
Beim Ablau fdes Programms werden auch beide Sensoren nacheinande 
ausgelesen und die werte in die Byts geschreben.
Kann es an irgendwelchen rjmp Befehlen liegen die nicht funktionieren?
Der Ablauf funktioniert genau bis zum setzen des Cursers an die Stelle 
wo die Daten des zweiten Sensors ausgegeben werden sollen und dann 
.....nichts!

von Fritz B. (kleinfritzchen)


Lesenswert?

Fehler gefunden! Aber warum funktioniert das jetzt?
Das einzige das ich geändert hab ist das setzen des DDRC Portregisters 
auf eine ander weise (nämlich über r16 und nicht über r24 (DHTmaske).
Ich kanns mir nicht erklähren aber um zukünftig besser klar zu kommen 
wäre es hilfreich das ganze zu verstehen....
Wäre echt dankbar für eine Erklährung des ganzen!
danke!!!

MfG Fritz
alter code:
1
;;;;;;;;;;;;AVRinit;;;;;;;;;;;;
2
.include "m8adef.inc"
3
4
5
6
7
main:
8
9
  ldi r16, LOW(RAMEND)    ;Stackinit
10
  out SPL, r16
11
  ldi r16, HIGH(RAMEND)
12
  out SPH, r16
13
14
  ldi  r16,0b00000101
15
  out  DDRC,r16
16
  out  PORTC,r16
17
.def  temp  = r16
18
.def  temp2  =  r20
19
.def  temp3  = r21  
20
.def  DHTmaske  = r24
21
.equ   LCD_PORT = PORTD
22
.equ   LCD_DDR  = DDRD
23
.equ  LCDS_PORT = PORTD
24
.equ  LCDS_DDR  = DDRD
25
.equ  LCD_RS  = 1
26
.equ  LCD_RW  = 2
27
.equ  LCD_E  = 3
28
.equ  RH_H  =0x0060
29
.equ  RH_2  =0x0065
30
31
32
33
.def  arg    = r17    ;argument for calling subroutines
34
.def  arg2  = r18    ;argument for mathematics
35
.def  return  = r19    ;return value from subroutines
36
.def  byte  = r25
37
38
  
39
;;;;;;LCDinit;;;;;;
40
41
      ;wartezeit zur initialisirung des 
42
      ldi temp,200
43
      rcall waitMs
44
      rcall  LCD_init
45
46
47
  ldi ZL,LOW(text*2)
48
  ldi ZH,HIGH(text*2)
49
  ldi arg,0x00
50
  rcall  LCD4ZTxt
51
52
  ldi YH,HIGH(RH_2)
53
  ldi YL,LOW(RH_2)
54
  ldi  DHTmaske,0x04
55
    ldi arg,0x46
56
  rcall  LCD_pos
57
    rcall  DHT_lesen
58
  
59
  rcall wait2s
60
  
61
  ldi DHTmaske,0x01  
62
;  out  DDRC,DHTmaske
63
;  out PORTC,DHTmaske
64
  ldi YH,HIGH(RH_H)
65
  ldi YL,LOW(RH_H)
66
67
    ldi arg,0x1a
68
    rcall  LCD_pos
69
    rcall DHT_lesen
70
71
72
73
  
74
75
;;;;;;Main;;;;;;
funktionierender Code:
1
;;;;;;;;;;;;AVRinit;;;;;;;;;;;;
2
.include "m8adef.inc"
3
4
5
6
7
8
main:
9
10
  ldi r16, LOW(RAMEND)    ;Stackinit
11
  out SPL, r16
12
  ldi r16, HIGH(RAMEND)
13
  out SPH, r16
14
15
16
.def  temp  = r16
17
.def  temp2  =  r20
18
.def  temp3  = r21  
19
.def  DHTmaske  = r24
20
.equ   LCD_PORT = PORTD
21
.equ   LCD_DDR  = DDRD
22
.equ  LCDS_PORT = PORTD
23
.equ  LCDS_DDR  = DDRD
24
.equ  LCD_RS  = 1
25
.equ  LCD_RW  = 2
26
.equ  LCD_E  = 3
27
.equ  RH_H  =0x0060
28
.equ  RH_2  =0x0065
29
30
31
32
.def  arg    = r17    ;argument for calling subroutines
33
.def  arg2  = r18    ;argument for mathematics
34
.def  return  = r19    ;return value from subroutines
35
.def  byte  = r25
36
37
  
38
;;;;;;LCDinit;;;;;;
39
40
      ;wartezeit zur initialisirung des 
41
      ldi temp,200
42
      rcall waitMs
43
      rcall  LCD_init
44
45
46
  ldi ZL,LOW(text*2)
47
  ldi ZH,HIGH(text*2)
48
  ldi arg,0x00
49
  rcall  LCD4ZTxt
50
51
  ldi YH,HIGH(RH_2)
52
  ldi YL,LOW(RH_2)
53
    ldi  r16,0b00000101
54
  out  DDRC,r16
55
  out  PORTC,r16
56
  ldi  DHTmaske,0x04
57
    ldi arg,0x46
58
  rcall  LCD_pos
59
    rcall  DHT_lesen
60
  
61
  rcall wait2s
62
  
63
  ldi DHTmaske,0x01  
64
;  out  DDRC,DHTmaske
65
;  out PORTC,DHTmaske
66
  ldi YH,HIGH(RH_H)
67
  ldi YL,LOW(RH_H)
68
  ldi  r16,0b00000101
69
  out  DDRC,r16
70
  out  PORTC,r16
71
    ldi arg,0x1a
72
    rcall  LCD_pos
73
    rcall DHT_lesen
74
  rcall wait2s
75
76
77
78
79
80
81
82
;;;;;;Main;;;;;;

von Karl H. (kbuchegg)


Lesenswert?

Fritz Bie schrieb:

> Das einzige das ich geändert hab ist das setzen des DDRC Portregisters
> auf eine ander weise (nämlich über r16 und nicht über r24 (DHTmaske).

Vor allen Dingen setzt du es, während in deinem Originalcode
1
DHT_lesen:
2
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3
  ;  Initialisieren der Startsequenz
4
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5
  
6
  nop
7
  nop
8
  nop
9
  ldi temp,0x00
10
;  ldi arg,0x00
11
  out  PORTC,r0
12
  ldi r16,6    ;6 mS
13
  rcall waitMs  ;min 1ms warten
14
15
16
  out  PortC,DHTmaske  ;über DHT auf 1 setzen (ist Pin an dem der Sensor hängt)
17
  ldi  arg,8
18
...

genau das eben nicht grantiert war. Hier wurde nur PORTC per DHTmaske 
gesetzt, nicht jedoch DDRC.


Das andere ist natürlich, dass du eine unterschiedliche Behandlung des 
Bits an der Wertigkeit 0x04 hast.

hier
1
  ldi DHTmaske,0x01  
2
...
3
    rcall DHT_lesen
ist es nicht gesetzt.
Hier
1
  ldi  r16,0b00000101
2
  out  DDRC,r16
3
  out  PORTC,r16
aber schon.

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.