Mikrocontroller-Anwendungen

Programme und Tipps zum ATtiny13


Felix Irmscher hat die folgenden Programme entwickelt: 

MELODIE-GUTEN_ABEND.asm

Programmauszug:

TIM0_OVF:                    ;Timer-ITR für Ton-/Pausenlänge
   
    in Sicher_ITR,SREG

    out TCNT0,Preload
    dec Laenge
   
TIM0_ENDE:
    out SREG,Sicher_ITR
reti
;----------------------------------------------------------
MELODIE:
;"Guten Abend, gut' Nacht"
 
.db    fis4,t8,fis4,t8,a4,t4p,fis4,t8,fis4,t4,a4,t4
.db pause,t4,fis4,t8,link,0,a4,t8,d5,t4,cis5,t4p,h4,t8
.db    h4,t4,link,0,a4,t4,e4,t8,link,0,fis4,t8,g4,t4
.db e4,t4,e4,t8,link,0,fis4,t8,g4,t4,pause,t4,e4,t8
.db link,0,g4,t8,cis5,t8,link,0,h4,t8,a4,t4,cis5,t4
.db    d5,t4,pause,t4,d4,t8,d4,t8,d5,t2,h4,t8,g4,t8,a4,t2
.db fis4,t8,d4,t8,g4,t4,a4,t4,h4,t4,a4,t2,d4,t8
.db d4,t8,d5,t2,h4,t8,g4,t8
.db    a4,t2,fis4,t8,d4,t8,g4,t4,fis4,t4,e4,t4,d4,t2     
.db ende,ende

Das Melodie-Modul lässt sich mittels .db mit Noten füllen. Taktänderungen, Pausen und Haltebögen (verbundene Noten)
sind möglich. Nötig ist nur ein Piezo-Transducer an PB3. 


HeartBeat_5-091007.asm

Programmauszug:

;----------------------------------------------------------
COUNTER:                    ;zählt die 4033 hoch
                            ;Überträgt HeartBeat auf Display
  in Sicher,SREG

  sbi portb,2                ;Reset für alle 4033
  nop                        ;ggf. wieder weg
  cbi portb,2
 
  cpi HeartBeat,25            ;Anzeigegrenzen für HeartBeat
  brlo ENDE_COUNTER            ;falls zu gross/klein:
  cpi HeartBeat,230            ;Anzeige von Null
  brsh ENDE_COUNTER
 
  LOOP_1:
       sbi portb,1                ;je einen Zähltakt übertragen
    nop                        ;ggf. wieder weg
    cbi portb,1
   
    dec HeartBeat
  brne LOOP_1
  ENDE_COUNTER:
  out SREG,Sicher            ;SREG zurück

ret
;----------------------------------------------------------

DIVISION_5400:                ;Eigenes Divisionsprogramm
                            ;durch n-fache Substraktion

    in   Sicher,SREG        ;SREG sichern
    clr  HeartBeat            ;HeartBeat <- 0
    clr  t_30_h                ;t_30_h <- 0                   
    ldi  j,0x15                ;0x1518 (=5400) in Divident
    mov  Divident_h,j        ;(Divisor ist t_30_h:t_30)
    ldi  j,0x18
    mov  Divident_l,j
    tst  t_30                ;if t_30=0 -> keine Division !
    breq ENDE_DIVI
     
  LOOP_DIVI:
    cp   Divident_l,t_30
    cpc  Divident_h,t_30_h    ;Divident kann nicht mehr geteilt
    brlo ENDE_DIVI            ;werden (Divident < Divisor)

    sub  Divident_l,t_30      ;Divident <- Divdent - Divisor
    sbc  Divident_h,t_30_h

    inc  HeartBeat            ;HeartBeat <- HeartBeat + 1
  rjmp   LOOP_DIVI


  ENDE_DIVI:
    out  SREG,Sicher        ;SREG zurück
ret
;----------------------------------------------------------

Das Herzfrequenzmessgerät hat als Takteingang hier nur einen Taster. Den Differenzverstärker müsste man dann noch selbst entwerfen. Die Ausgabe erfolgt über drei kaskadierte CMOS 4033 mit  drei LED-Anzeigen. Die ICs lassen sich sehr schnell und einfach hochzählen. Zwischenspeicherung ist nicht notwendig. Vor der nächsten Anzeigesequenz wird dann einfach ein Reset ausgelöst. Als Ausgabe wäre auch gut das Unterprogramm WRCOM geeignet. Gemessen wird das Zeitintervall von drei Herzschlägen und dann entsprechend umgerechnet. 


Sirene_2-111007.asm

Programmauszug:

;----------------------------------------------------------
TIM0_OVF:                    ;Oszillator an PB3

    in Sicher_ITR,SREG        ;SREG sichern
 
  DEC_kk:
    ldi ii,1
    dec kk
    cp kk,ii
    brsh OSZILLIEREN
    ldi ii,10
    mov kk,ii
               
    ldi ii,1
    cp  Down,ii                ;momentan hoch/runtergezählt ?
    breq RUNTER

  HOCH:
    ldi ii,150
    cp jj,ii                ;ganz oben auf 150 ?
    brsh WIEDER_RUNTER
    inc jj
    rjmp OSZILLIEREN

    WIEDER_RUNTER:
    ldi ii,1
    mov Down,ii
    rjmp OSZILLIEREN

  RUNTER:
      ldi ii,20
    cp  jj,ii                ;ganz unten auf 20 ?
    brlo WIEDER_HOCH
    dec jj
    rjmp OSZILLIEREN
   
    WIEDER_HOCH:
    ldi ii,0
    mov Down,ii
    rjmp OSZILLIEREN
 
   
  OSZILLIEREN:
    mov ii,jj
    WAIT_ITR:
        nop
        dec ii
    brne WAIT_ITR

    sbic portb,3
    rjmp PIEP_AUS

    PIEP_EIN:
    sbi  portb,3
    rjmp ENDE_ITR

    PIEP_AUS:
    cbi  portb,3
  ENDE_ITR:
     
    out SREG,Sicher_ITR        ;SREG zurück
   
reti
;----------------------------------------------------------

Die Sirene arbeitet als Interrupt. So kann man beispielsweise ein Alarmanlagenprogramm ohne Unterbrechung weiterlaufen lassen, während die Sirene an ist. Auch hier ist ein Piezo-Transducer notwendig. 

Es wurde ein Modul selbst gebaut, mit dem Vorteil, auch PB0 bis PB2 zu nutzen. Als Multiplexer dient ein einfacher 4xUM-Schalter. Hier werden PB0,PB1,PB2 und VCC umgeschaltet zwischen RS232 und Steckboard/Batterie 

Die Spannungsregelung 7805 ist fliegend angeschraubt. Es besteht die Möglichkeit, auch ohne PC zu arbeiten, da mit Batterien entweder 4,5V oder - mit entsprechendem zusätzlichem Spannungsregler 7805 - 9V für eine stabilisierte VCC angelegt werden können.