Elektronischer Würfel mit dem Sparrow
von Michael Gaus
Mit dieser Würfel-App für den Sparrow können Zahlen zwischen 1 und 6 zufällig gewürfelt werden.
Solange
Taster S1 gedrückt wird, blinken die rote und grüne LED schnell zur
Signalisierung, dass der Würfelvorgang gerade stattfindet. Wenn S1
losgelassen wird, dann wird noch ca. 500 ms weiter gewürfelt und danach
das Würfelergebnis über die beiden LEDs dargestellt.
Das Würfelergebnis ist folgendermaßen kodiert:
Zahl | grüne LED | rote LED
---------------------------
1 aus aus
2 aus ein
3 blinkt aus
4 blinkt ein
5 ein aus
6 ein ein
Folgende Merkhilfen zum Ablesen des gewürfelten Wertes gibt es:
- grüne LED zeigt die Größenordnung an: aus = klein (1 oder 2), blinkt = mittel (3 oder 4), ein = groß (5 oder 6)
- rote LED zeigt, ob das Ergebnis ungerade oder gerade ist: aus = ungerade (1, 3 oder 5), ein = gerade (2, 4 oder 6)
Die
Firmware wurde mit der kostenlosen Evaluation-Version (bis 4 kBytes
Codegröße) des C-Compilers CodeVision AVR V3.10 geschrieben. Die
Taktfrequenz beträgt 1,2 MHz (Clock prescaler = 8).
Links:
C-Compiler CodeVisionAVR V3: http://www.hpinfotech.ro/cvavr_download.html
Download: Sparrow_Wuerfel.zip
Direkt laden: http://tiny.systems/categorie/cheepit/ElektronischerW%C3%BCrfel.html
/*******************************************************
CodeVisionAVR V3.10 Evaluation
http://www.hpinfotech.com
Chip type : ATtiny13
AVR Core Clock frequency: 1,200000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 16
*******************************************************/
#include <tiny13.h>
#include <delay.h>
#define P_LED_GREEN PORTB.1
#define DP_LED_GREEN DDRB.1
#define P_LED_RED PORTB.3
#define DP_LED_RED DDRB.3
#define KEY_S1 PINB.0
#define KEY_S2 PINB.2
#define LED_OFF 0
#define LED_ON 1
#define LED_BLINK 2
volatile unsigned char cubeValue = 1;
volatile unsigned char ledGreen;
volatile unsigned char ledRed;
volatile unsigned char blinkTime;
// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
static unsigned char blinkCnt = 0;
static unsigned char blinkState = 0;
cubeValue++;
if(cubeValue > 6)
{
cubeValue = 1;
}
if(blinkCnt == 0)
{
blinkState ^= 0x01;
blinkCnt = blinkTime;
}
else
{
blinkCnt--;
}
if(ledGreen == LED_OFF)
{
P_LED_GREEN = 0;
}
else if(ledGreen == LED_ON)
{
P_LED_GREEN = 1;
}
else if(ledGreen == LED_BLINK)
{
P_LED_GREEN = blinkState;
}
if(ledRed == LED_OFF)
{
P_LED_RED = 0;
}
else if(ledRed == LED_ON)
{
P_LED_RED = 1;
}
else if(ledRed == LED_BLINK)
{
P_LED_RED = blinkState;
}
}
void initTimer(void)
{
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 150,000 kHz
// Mode: CTC top=OCR0A
// OC0A output: Disconnected
// OC0B output: Disconnected
// Timer Period: 1 ms
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0A=0x95;
OCR0B=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B) | (1<<OCIE0A) | (0<<TOIE0);
}
void main(void)
{
unsigned char count;
// Crystal Oscillator division factor: 8
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (1<<CLKPS1) | (1<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIS1) | (0<<ACIS0);
ADCSRB=(0<<ACME);
initTimer();
DP_LED_GREEN = 1;
DP_LED_RED = 1;
// Global enable interrupts
#asm("sei")
while (1)
{
while(KEY_S1 != 0);
delay_ms(20);
blinkTime = 70;
ledRed = LED_BLINK;
ledGreen = LED_BLINK;
while(KEY_S1 == 0);
delay_ms(500);
count = cubeValue;
blinkTime = 250;
switch(count)
{
case 1:
ledGreen = LED_OFF;
ledRed = LED_OFF;
break;
case 2:
ledGreen = LED_OFF;
ledRed = LED_ON;
break;
case 3:
ledGreen = LED_BLINK;
ledRed = LED_OFF;
break;
case 4:
ledGreen = LED_BLINK;
ledRed = LED_ON;
break;
case 5:
ledGreen = LED_ON;
ledRed = LED_OFF;
break;
case 6:
ledGreen = LED_ON;
ledRed = LED_ON;
break;
}
}
}