Hilfe beim Programm (ADWandler Ergebnisumwandlung)

Gast #1151290
Lesenswert?

Hallo Leute!

Ich bin dabei gerade ein Programm für ein Volt Amperemeter mit nen
ATMega8 inklusive Display ausgabe zu schreiben.
Und da ich Absoluter µC Einsteiger bin bräuchte ich
eine stützende Hilfe.

Mit den Totourials bin ich schon so weit gekommen das
mir wenn keine Fehler vorhanden sind
- Die Mittelwertbildung für 64 Messwerte fehlt
- Die Umwandlung der Messwerte in ACSII
- Ausgabe am Display
nur noch fehlen.

Könntet Ihr mir damit auf die Sprünge helfen?


Ist es möglich/sinnvoll ein Display 4 mal
in der Sekunde anzusteuern?

Ich hätte gedacht das ich bei einen Output CompareMatch
einmal das gesamte Messprogramm alle 0.25s ausführe.

Meine Referenz ist am ATMega ein TL431 für 2.5V
Eine Spannung von 0 V - 20 V wird von 0 - 2 V
runtergeteilt zusätzlich hab ich einen Impendanzwandler
zwischen Spannungsteiler und ADCPin

Der Strom von Maximal 2 Ampere wird über einen
Shunt und OpAmp *10 Verstärkt und liefert ein
0 - 2 V Signal.

Die Platine und alles ist schon auf den Rechner ich warte
nur noch bis das Programm auch noch Fertig ist.

Alle Display Ansteuerungs Kommandos die ich hinzugefügt habe
funktionieren einwandfrei und brauchen nicht kontrolliert werden.

Danke =)
1
.include "m8def.inc"
2
 
3
.def temp1 = r21
4
.def temp2 = r22
5
.def temp3 = r23
6

7
; Bildet das 16 Bit Register für die Ergebnisse
8
.def messwerteH  = r16
9
.def messwerteL  = r17
10
; Ist für den Messungs Zähler zuständig
11
.def zaehler  = r18 
12

13

14
; Interruptvectortabelle
15
.org 0x0000
16
           rjmp    main               ;Adresse für das Hauptprogramm
17
.org OC1Aaddr
18
           rjmp    Messung        ;Startet mit einer Messung und Anzeige
19

20

21
main:  
22
  
23
; LOW-Byte der obersten RAM-Adresse
24
           ldi temp1, LOW(RAMEND)        
25
           out SPL, temp1
26
; HIGH-Byte der obersten RAM-Adresse         
27
           ldi temp1, HIGH(RAMEND)       
28
           out SPH, temp1
29

30
; Display initialisieren
31
           rcall lcd_init
32
; Display löschen                      
33
           rcall lcd_clear               
34

35

36
; Compare Match Register für 4 Anzeigewiderholungen in der Sekunde
37

38
       ldi    temp1,high(46875)                            
39
       out    OCR1AH, temp1
40
       ldi    temp1,low (46875)
41
          out    OCR1AL, temp1
42

43

44
; Timer Initialisieren; Prescaler=256; O
45

46
       ldi       temp1, ( 1 <<WGM12 ) | ( 1 <<CS12 )
47
         out    TCCR1B, temp1
48

49
       ldi    temp1, 1 << OCIE1A
50
       out    TIMSK, temp1         
51
      
52
; ADWandler Initialisieren ;Prescaler=32 ,Single Run ,Externe Referenz
53
    
54
       clr    temp1
55
       out    ADMUX,temp1
56

57
       ldi    temp1, (1 <<ADEN ) | ( 1 << ADPS2 ) | ( 1 << ADPS0 ) 
58
       out    ADCSRA,temp1
59
      
60
; Aktiviere Interrupts
61
           sei
62

63

64

65

66
loop:
67
  
68
    rjmp loop
69

70

71

72

73

74
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
75
; Das gesamte Programm für eine Spannungs und Strom Messung und der 
76
; Anzeigen Ansteuerung
77
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
78

79

80

81

82
;Interruptvectoradresse -> Startet mit diesen Program bei jedem Compare Match
83
Messung:
84

85

86
; Löscht das gesamte Display
87
       rcall lcd_clear
88
;Springt mit den Cursor zur ersten Stelle
89
       rcall lcd_home
90
; Adresse des Strings in den Z-Pointer laden
91
       ldi ZL, LOW (Erste_Zeile*2)         
92
           ldi ZH, HIGH(Erste_Zeile*2)        
93
; Gebe 'Erste Zeile' aus
94
           rcall lcd_flash_string
95
; Springt mit den LCD Cursor in der Zweiten Zeile
96

97
; Leert die Register mit den Messwerten
98
        clr MesswerteL        
99
        clr MesswerteH
100

101
; Läd den SChleifenzähler
102
        ldi zaehler,64       
103
    
104

105
; Wählt den ADC Kanal=PC1 für die Spannungsmessung aus
106
      sbi  ADMUX,1 << MUX0  
107

108
; Ruft das Unterprogramm für den ADC auf
109
      rcall starte_adc
110
      
111
          
112
; Liest die ADC Werte in den X-Pointer
113
      in   XL,ADCL
114
      in   XH,ADCH
115

116
; Addiert die ADC Werte in die Messwerte Register 
117
      add  MesswerteL,XL
118
      adc  MesswerteH,XH
119
      
120
; Zieht vom Zaehler 1 ab
121
      dec  zaehler
122

123
; Wenn noch keine 64 Messungen durchgeführt wurden -> Springe zu starte_adc
124
      brne starte_adc  
125

126
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
127
;
128
; Hier fehlt die :
129
; - Mittelwertbildung
130
; - Binär zu ASCII umwandlung
131
; - Ausgabe am Display
132
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
133

134

135

136

137
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
138
; Hier folgt die Strommessung
139
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
140

141
; Springt mit den Cursor zur der Stelle wo die Strommesswerte 
142
; angezeigt werden soll
143
       rcall lcd_cursor_ampere_line
144

145
; Leert die Register mit den Messwerten
146
        clr MesswerteL
147
        clr MesswerteH
148

149
; Wählt den ADC Kanal=PC0 für die Spannungsmessung 
150
      cbi  ADMUX,1 << MUX0
151

152
; Ruft das Unterprogramm für den ADC auf
153
      rcall starte_adc
154
            
155

156
        
157
; Läd den Zählerschleifer
158
        ldi zaehler,64
159
       
160
; Liest die ADC Werte in den SRAM
161
      in   XL,ADCL
162
      in   XH,ADCH
163

164
; Addiert die ADC Werte in die Messwerte Register aus den SRAM
165
      add  MesswerteL,XL
166
      adc  MesswerteH,XH
167
      
168

169
; Zieht vom Zaehler 1 ab
170
      dec  zaehler
171

172
; Wenn noch keine 64 Messungen durchgeführt wurden -> Springe zu starte_adc
173
      brne starte_adc  
174

175
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
176
;
177
; Hier fehlt die :
178
; - Mittelwertbildung
179
; - Binär zu ASCII umwandlung
180
; - Ausgabe am Display
181
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
182
                                
183
;Verlässt den Timerinterrupt wieder
184
      reti
185

186

187

188

189

190

191
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
192
; Hier folgen diverse Unterprogramme
193
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
194

195

196
; Startet den ADC
197
starte_adc:
198

199
        sbi     ADCSRA, ADSC
200
      rcall   warte_adc
201

202
; Wartet bis die Messung abgeschlossen ist
203
warte_adc:
204
        sbic    ADCSRA, ADSC        
205
         rjmp    warte_adc
206
      ret  
207

208
Erste_Zeile:
209
           .db "Spannung   Strom ",0   ; Stringkonstante, durch eine 0
210
                                       ; abgeschlossen  
211

212

213
.include "lcd-routines.asm"
214

215
    
216

217
           .DSEG                   ; Datensegment SRAM

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren