Weitere Artikel aus dem Elo-Magazin

Ein Würfelprogramm für den Tiny13

von Felix Irmscher

 

Lego

 

Ein Bausatz-Klassiker, hier für den ATtin13/ ATtiny13V. Es werden nur sehr wenig externe Bauteile benötigt, wie im Programmcode dargestellt.

 

innen


Damit die wenigen Ausgänge des tiny13 ausreichen, sind einige LEDs zusammengeschaltet. Der Würfel verfügt über eine AUTO POWER OFF-Funktion (Power Down - Mode). Da ich den Würfel für meinen kleinen Sohn Moritz gebaut habe, befindet er sich in einem selbstgebauten LEGO-Gehäuse.

 

Taster

 

Download Assembler-Quelltext (cube_240108_1.zip, 3 KB)

 

 

;###CUBE_240108_1###
;Würfelprogrammmitdiv.Features:
;-DurchPOWERDOWNMODEnureinenTasterzumAnschalten
;undneuWürfeln
;-Ruhestrommittn13(keinV-Typ)imPowerDownModeca.0,3uA
;-WürfeltnachdemEinschalten,sobaldTasterwiederlosge-
;lassenwird.Wirddanninnerhalbdernächsten15Sekunden
;(Variable:sek)erneutdieTastegedrücktundwieder
;losgelassen,sowirdwiedergewürfelt.
;-NachdemLoslassenwirdimmereinAusrollendesWürfels
;simuliert
;-erfolgtinnerhalbvon15secnachderWürfel-Ausgabekein
;Tastendruck,sowirdindenSLEEP-Mode:POWERDOWN
;geschaltet
;-INT0-ITRanTasterangeschlossen(alternatefunctionPB1)
;-ITR-Subroutineistleer,dakeineVoreinstellungenvor
;demNeustartnotwendigsind
;ZeitgeberüberTIM0_OVF
.include"tn13def.inc"
;ZUSAMMENGESCHALTETEPUNKTEDESWÜRFELS
.equmitte=0;Mitte
.equlu_ro=2;linksunten&rechtsoben
.equlo_ru=3;linksoben&rechtsunten
.equlm_rm=4;linksMitteundrechtsMitte
.equTaster=1
.defI=r16
.defj=r17
.defk=r18
.defSicher=r19;SicherungvonU-Prg.s
.defZahl=r20;ÜbergabevariablefürAUSGABE
.defAugen=r21;tatsächlichgewürfelteZahl
.defSicher_ITR=r22
.defsek=r23
.deftimer=r24
.deftimer2=r25
rjmpANFANG
.org0x0001
rjmpEXT_INT0;Ext.ITRmitINT0(fürSLEEP)
.org0x0003
rjmpTIM0_OVF;Timer0-Overflow
ANFANG:
cli
sbiddrb,mitte;AusgängefürPunkte
sbiddrb,lu_ro
sbiddrb,lo_ru
sbiddrb,lm_rm
sbiportb,Taster;INT0mitpullupfürTaster
clrAugen
WAIT_TASTER:
Sbicpinb,Taster;Tasternochgedrückt?
RjmpAUSROLLEN
CpiAugen,6;Augen=tatsächlichgewürfelteZahl
BrloAugen_INC
LdiAugen,0
AUGEN_INC:
IncAugen
RjmpWAIT_TASTER
;----------
AUSROLLEN:
LdiZahl,0
Ldii,0
LOOP_i:
CpiZAHL,6
BrloZAHL_INC
LdiZAHL,0
ZAHL_INC:
IncZAHL
RcallAUSGABE;Pseudo-WertfürsAusrollen
RcallWARTESCHLEIFE;kurzePause
Ldik,10
Addi,k
Cpii,230
BrloLOOP_i
;----------
movZahl,Augen;echtenWertausgeben
rcallAUSGABE
clrAugen

 

 

 

 

 

 

;###Timerstarten###

lditimer,6;250bisOVF,/1024->30Hz
OUTTCNT0,timer
ldii,3;Prescaler:1200kHz/64
outTCCR0B,i
ldii,2;Timer-ITRfreigeben
outTIMSK0,i
clrsek
clrtimer2
sei;GlobalITRfrei!

WAIT_PUSH:
Sbispinb,Taster;warten,bisTawiedergedrückt
RjmpWAIT_TASTER;beginntvonvorne

;------------------
SLEEP_TEST:;längeralsXsecgewartet?

Cpisek,15;SekundenbiszumAUTOPOWEROFF
BrloWAIT_PUSH
Ldii,0
OutTCCR0B,i;Zähleraus!
Ldii,0
OutTIMSK0,I;TimerITRaus!
cli
;76543210
Ldii,0b00110000;b0:ISC00b1:b0=0:0,dh.ITRby
OutMCUCR,I;b1:ISC01lowlevelofINT0S.55
;b3:SM0b4:b3=1:0,dh.
;b4:SM1powerdownmodeS.27
;b5:SEb5=1SleepenableS.27
;b6:PUDb6=0pullupdisabS.51
;76543210
Ldii,0b01000000;b5:PCIFb5=0PinChangeITRS.56
OutGIMSK,I;b6:INTF0B6=1.56
;=ExternalITRRequest0enable

Cbiportb,mitte
Cbiportb,lu_ro
Cbiportb,lo_ru
Cbiportb,lm_rm

sei
sleep;###POWERDOWNstarten!!!###
cli
;76543210;SEaus!
Ldii,0b00000000
OutMCUCR,i

;76543210
Ldii,0b00000000;ExtITRRequestaus!
OutGIMSK,I

rjmpWAIT_TASTER

 

 

 

 

;============================================================
AUSGABE:;Übergabevariable:ZAHL

InSicher,SREG
Cbiportb,mitte;alleLEDslöschen
Cbiportb,lu_ro
Cbiportb,lo_ru
Cbiportb,lm_rm

ZAHL_0:
CpiZahl,0
BrneZAHL_1
;keinAugesetzen
RjmpAUSGABE_ENDE
ZAHL_1:
CpiZahl,1
BrneZAHL_2
Sbiportb,mitte
RjmpAUSGABE_ENDE
ZAHL_2:
CpiZahl,2
BrneZAHL_3
Sbiportb,lu_ro
RjmpAUSGABE_ENDE
ZAHL_3:
CpiZahl,3
BrneZAHL_4
Sbiportb,mitte
Sbiportb,lo_ru
RjmpAUSGABE_ENDE
ZAHL_4:
CpiZahl,4
BrneZAHL_5
Sbiportb,lu_ro
Sbiportb,lo_ru
RjmpAUSGABE_ENDE
ZAHL_5:
CpiZahl,5
BrneZAHL_6
Sbiportb,mitte
Sbiportb,lu_ro
Sbiportb,lo_ru
RjmpAUSGABE_ENDE
ZAHL_6:
CpiZahl,6
BrneZAHL_1
Sbiportb,lu_ro
Sbiportb,lo_ru
Sbiportb,lm_rm
RjmpAUSGABE_ENDE
AUSGABE_ENDE:
OutSREG,Sicher
ret
;------------------------------------------------------------
WARTESCHLEIFE:;Übergabevariable:i
inSicher,SREG

ldij,0
LOOP_j:
Ldik,255
LOOP_k:;innereNICHTvariableSchleife
nop
nop
deck
brneLOOP_k

incj;j<-j+1
cpj,i;wartetumsolänger,jegrößer
brloLOOP_j;iist
outSREG,Sicher
ret
;------------------------------------------------------------
TIM0_OVF:;ITRfürTimer0
;Ausgabevariable:sek

inSicher_ITR,SREG
lditimer,6
outTCNT0,timer;250bisOverflow
inctimer2
cpitimer2,75
brloTIM0_ende
clrtimer2
incsek

TIM0_ende:

outSREG,Sicher_ITR;SREGzurück
reti
;------------------------------------------------------------
EXT_INT0:
reti


Literatur: AVR-RISC Embedded Software selbst entwickeln

 

 

 

 

Kontakt
Warenkorb: 0 Artikel
Gesamtwert: EUR 0,00