1 | .include "m328pdef.inc"
|
2 |
|
3 | .def temp1 = r16 ; allgemeines temp Register, zur kurzfristigen Verwendung
|
4 | .def temp2 = r17 ; Register für 24 Bit Addition, Lowest Byte
|
5 | .def temp3 = r18 ; Register für 24 Bit Addition, Middle Byte
|
6 | .def temp4 = r19 ; Register für 24 Bit Addition, Highest Byte
|
7 | .def adlow = r20 ; Ergebnis vom ADC / Mittelwert der 256 Messungen
|
8 | .def adhigh = r21 ; Ergebnis vom ADC / Mittelwert der 256 Messungen
|
9 | .def messungen = r22 ; Schleifenzähler für die Messungen
|
10 | .def ztausend = r23 ; Zehntausenderstelle des ADC Wertes
|
11 | .def tausend = r24 ; Tausenderstelle des ADC Wertes
|
12 | .def hundert = r25 ; Hunderterstelle des ADC Wertes
|
13 | .def zehner = r26 ; Zehnerstelle des ADC Wertes
|
14 | .def zeichen = r27 ; Zeichen zur Ausgabe auf den UART
|
15 |
|
16 | .equ F_CPU = 8000000 ; Systemtakt in Hz
|
17 | .equ BAUD = 9600 ; Baudrate
|
18 |
|
19 | ; Berechnungen
|
20 | .equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1) ; clever runden
|
21 | .equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1))) ; Reale Baudrate
|
22 | .equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000) ; Fehler in Promille
|
23 |
|
24 | .if ((BAUD_ERROR>10) || (BAUD_ERROR<-10)) ; max. +/-10 Promille Fehler
|
25 | .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
|
26 | .endif
|
27 |
|
28 | ; hier geht das Programm los
|
29 |
|
30 | ldi temp1, LOW(RAMEND) ; Stackpointer initialisieren
|
31 | out SPL, temp1
|
32 | ldi temp1, HIGH(RAMEND)
|
33 | out SPH, temp1
|
34 |
|
35 | ;UART Initalisierung
|
36 |
|
37 | ldi temp1, LOW(UBRR_VAL) ; Baudrate einstellen
|
38 | out UBRR0L, temp1
|
39 | ldi temp1, HIGH(UBRR_VAL)
|
40 | out UBRR0H, temp1
|
41 |
|
42 | sbi UCSR0B, TXEN0 ; TX einschalten
|
43 |
|
44 | ; ADC initialisieren: ADC0, Vcc als Referenz, Single Conversion, Vorteiler 128
|
45 |
|
46 | ldi temp1, (1<<REFS0) ; Kanal 0, interne Referenzspannung 5V
|
47 | out ADMUX, temp1
|
48 | ldi temp1, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
|
49 | out ADCSRA, temp1
|
50 |
|
51 | Main:
|
52 | clr temp1
|
53 | clr temp2
|
54 | clr temp3
|
55 | clr temp4
|
56 |
|
57 | ldi messungen, 0 ; 256 Schleifendurchläufe
|
58 |
|
59 | ; neuen ADC-Wert lesen (Schleife - 256 mal)
|
60 |
|
61 | sample_adc:
|
62 | sbi ADCSRA, ADSC ; den ADC starten
|
63 |
|
64 | wait_adc:
|
65 | sbic ADCSRA, ADSC ; wenn der ADC fertig ist, wird dieses Bit gelöscht
|
66 | rjmp wait_adc
|