;****************************************Datenlogger**********************************************



;
60 analoge Messwerte über PB3 einlesen und im EEPROM speichern, seriell  mit Terminal / PC auslesen.


; ATTiny13 auf  1,2 MHz  Prozessortakt geschalten.

      .include "C:\Dokumente und Einstellungen\Reglermax\Eigene Dateien\tiny13\tn13def.inc"      

     .def   A            = r16             ;Register Definition
     .def   Delay     = r17
     .def   Count     = r18
     .def   EEadr     = r19                            
     .def   B            = r20    
     .def   sicher     = r22
     .def   timer       = r23
     .def   teile        = r24
     .def   EEmode = r25

                 
     .equ   TXD    = 1                   ;Port B
     .equ   RXD    = 2
     .equ   LED    = 4
      rjmp   Anfang
      .org    0x0003                      ;Interruptvektor für Timer
      rjmp   TIM0_OVF                 ;Timer 0 Overflow

Anfang:
        ldi     A,5
        out   TCCR0B,A                 ;Timer Vorteiler/1024
        ldi     A,2
        out   TIMSK0,A                  ;Timer Interrupt freigeben
        sei                    
        sbi    ddrb,TXD                  ;Datenrichtung TXD
        sbi    ddrb,LED
                
rcall   AdcInit

Schleife:
        rcall      RdCOM                 ;Starten neuer Meßreihe    
        cpi        A,108                    ;nur Lesen wenn "l" eingegeben wird!
        breq      Lesen        
        ldi         EEadr,0            
        
Schreiben:
        sei
        ldi         teile,5                    ;5er Teiler für Takt von 1Sek!
Teiler:
        sbis      portb,0                   ;Auslösung durch Timerinterrupt
        rjmp      Teiler
        cbi         portb,0
        cbi        portb,LED        
        dec       teile
        brne     Teiler
        sbi        portb,LED
        rcall      RdADC
        mov      B,A                        ;sichere Ergebnis in B, weil WrCom A überschreibt!
        rcall      WrCom                   ;schreibe Messwert am Terminal
        rcall      WrEE                     ;speichere Meßwert in EEPROM
        inc        EEadr
        cpi        EEadr,60                ;nutzbarer EEPROM
        brne     Schreiben               ;60 mal
        ldi         A,13
        rcall      WrCOM                 ;Zeilenvorschub
        cli                                      ;Timer Interrupt sperren!                    
        
 Lesen:       
        ldi         EEadr,0
 Lesen1:
                rcall  RdEE                ;lese EEPROM in A
                rcall  WrCOM
                inc    EEadr
                cpi    EEadr,60
                brlo   Lesen1              ;60 mal
                rjmp  Schleife

TIM0_OVF:
                in       sicher,SREG    ;Statusregister sichern    
                ldi      timer,24
                out    TCNT0,timer     ; 256 - 24 = 234 bis Overflow, für 1Sek-Takt
                sbi    portb,0
                out    SREG,sicher     ;Statusregister rückladen
          reti
AdcInit:
              ldi   A,3             
              out  ADCSRA,A            ;Clock / 8
              sbi   ADCSRA,ADEN    ;AD einschalten
              ret
RdADC:
              ldi    A,3                        ;Eingang ADC an PB3
              out   ADMUX,A       
              sbi   ADMUX,ADLAR     ;Left adjust
              sbi    ADMUX,REFS0    ;interne Ref 1,1V , Messerfisch 0 bis 1,1V
              sbi   ADCSRA,ADSC     ;Wandlung starten
ADrdy:
              sbic  ADCSRA,ADSC   
              rjmp  ADrdy
              sbi    ADCSRA,ADSC
ADrdyb:
              sbic  ADCSRA,ADSC   
              rjmp  ADrdyb
              in        A,ADCH
              ret
RdEE:    
            sbic     EECR,EEWE
            rjmp    RdEE
            out      EEAR,EEadr
            sbi      EECR,EERE
            in         A,EEDR
            ret
WrEE:    
            sbic        EECR,EEWE
            rjmp       WrEE
            ldi           EEmode,0
            out         EECR,EEmode
            out         EEARL,EEadr
            out         EEDR,B             ;Ergebnis in B, weil WrCom A überschreibt!    
            sbi         EECR,EEMPE
            sbi         EECR,EEPE
        ret

RdCOM:
             sbis      pinb,RXD           ;Datenempfang seriell
             rjmp      RdCOM
             ldi         Delay,58  
D1:        dec       Delay
             brne      D1
                ldi      A,0
                ldi      Count,8
L1:          lsr       A
               sbic    pinb,RXD
                ori      A,128
                ldi      Delay, 38  
D2:         dec      Delay
                brne   D2
                dec    Count
                brne   L1
                ldi      Delay, 38
D3:          dec     Delay
                brne   D3
                com   A                        ;invertieren weil Ausgabe ohne Inverter
                ret

WrCOM: sbi   portb,TXD               ;Senden
                ldi   Delay,38
D4:          dec   Delay
               brne  D4
               ldi   Count,8
L2:          sbrc  A,0
               rjmp  OFF
               rjmp  ON
ON:         sbi   portb,TXD
               rjmp  BitD
OFF:       cbi   portb,TXD
               rjmp  BitD
BitD:       ldi   Delay,38  
D5:         dec   Delay
               brne  D5
               lsr   A
               dec   Count
               brne  L2
               cbi   PORTB,TXD
               ldi   Delay,38   
D6:          dec   Delay
               brne  D6
               ret


Rolf Grauer, 22.12.2014