511 Messwerte über ADC aufnehmen und in EEPROM schreiben.
Seriell auslesen über Terminal / PC.




include"C:\Programme\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8def.inc"

.def    A     = r16
.def    B    = r17
.def    EEmode    = r20
.def    sicher    = r21
.def    EEadrl    = r22
.def    EEadrh    = r23
.equ   c1    = 64000            ;Durchläufe der Warteschleife   
   
    ;Stackpointer Init
    ldi    r16,LOW(RAMEND)       
    out SPL,r16
    ldi    r16,HIGH(RAMEND)       
    out SPH,r16

    ;ADC_Init
    ldi    A,3                            ;ADCTakt/8
    out    ADCSRA,A
    sbi    ADCSRA,ADEN

    ;USART_Init
    ldi r16,12                        ;Baudrate 9600 bei2 MHz
    ldi r17,00
    out UBRRH,r17                       
    out UBRRL,r16
    ldi r16,(1<<RXEN)|(1<<TXEN)        ;Enable TX+RX
    out UCSRB,r16
    ldi r16,0b10000110                            ;asyncron 8N1
    out UCSRC,r16

    sbi    DDRB,1                   ;LED
    sbi    portb,0                     ;Startschalter am Eingang PB0 mit Pullup!

Anfang:
        sbic    pinb,0                ;Abfrage Startschalter
        rjmp    Anfang

    sbi    portb,0                    ;pullup setzen

loop:
            ldi        A,0                         ;Drückerabfrage: kurz =lesen | lang=schreiben
           
sbic  pinb,0
     rjmp  loop
            rcall wait
            rcall wait
            sbic  pinb,0
            rjmp  lesen                        ;Taster kurz drücken            
    schreiben:                                      
        ldi    EEadrh,0           
        ldi    EEadrl,0
    schreiben1:
        ldi    B,5                                    ;Verzögerung Aufzeichnung (Meßpause)
    Zeit:
        rcall    wait
            cbi    portb,1                        ;LED aus
            dec    B
        brne    Zeit                                ;Zeitschleife
          sbi    portb,1                           ;LED ein
             rcall    RdADC
             rcall    USART_Transmit
             rcall   WrEE                        ;Block EEPROM schreiben
             inc     EEadrl
          cpi     EEadrl,255                ;Schleifenzähler L
        brlo    schreiben1
             ldi    EEadrl,0
             inc    EEadrh
          cpi    EEadrh,2                    ;Schleifenzähler H
        brlo    schreiben1
rjmp    loop

lesen:
        ldi     EEadrl,0
        ldi     EEadrh,0
        ldi     A,13
        rcall  USART_Transmit        ;Zeilensprung
    lesen1:           
        rcall   RdEE
        rcall   USART_Transmit
        inc     EEadrl
        cpi     EEadrl,255                   ;Schleifenzähler L
      brlo    lesen1
            ldi        EEadrl,0
            inc        EEadrh               
          cpi        EEadrh,2                  ;Schleifenzähler H
      brlo    lesen1
 rjmp    loop



RdEE:       sbic  EECR,EEWE           
         rjmp  RdEE
            out   EEARH,EEadrh
            out   EEARL,EEadrl
            sbi   EECR,EERE
            in    A,EEDR
        ret

WrEE:       sbic  EECR,EEWE
         rjmp  WrEE   
            out   EEARH,EEadrh
            out   EEARL,EEadrl
            out   EEDR,A
            sbi   EECR,EEMWE   
            sbi   EECR,EEWE   
        ret

USART_Transmit:
            sbis UCSRA,UDRE                ;Wait for emty transmit buffer
            rjmp USART_Transmit          ;Put Data into buffer, sends the data
            out UDR,A
        ret

USART_Receive:
            sbis UCSRA, RXC                ;wait for data to be received
            rjmp USART_Receive          ;get and return received data from buffer
            in A,UDR
        ret

RdADC:
            ldi       A,0b11100000            ;Interne Referenz-ADLAR, Eingang ADC0 aktiviert!!!
            out      ADMUX,A
            sbi      ADCSRA,ADSC            ;Wandlung starten
        ADrdyb:
            sbic    ADCSRA,ADSC            ;ADC busy
            rjmp   ADrdyb
            in        A,ADCH
       ret

wait:        in    sicher,SREG
                ldi    r25,HIGH(c1)                ;lade MSB-Register mit Schleifenwert c1
                ldi    r24,LOW(c1)                        ``
        Loop1:  
                sbiw r24,1                              ;Doppelregisterwert um 1 verringern
                brne Loop1   
                out   SREG,sicher
      ret



programmiert mit ATMEL Studio4 und ISP Programmer  über USB am Notebook


Rolf Grauer, 06.10.2024