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
schon mal mit dem simulator laufengelassen? dort kann man jedes register anschauen. ohne genauer hingeschaut zu haben - wie steht's mit dem Stack.
LCD - bedeutet ueblicherweise Timing beachten. siehe Datenblatt
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!
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;;;;;; |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.