Forum: Mikrocontroller und Digitale Elektronik Hilfe beim Programm (ADWandler Ergebnisumwandlung)


von Der Gast (Gast)


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

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.