| 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
 |