Forum: Projekte & Code Elektronischer Wüffel [ATtiny2313]


von Markus (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Es ist ein mini Projekt und auch mehr ein Spielzeug, aber vielleicht hat 
trotzdem jemand Interesse daran.
Es ist ein elektr. Würfel der auf einem Zufallszahlengenerator basiert.

"Features":
Maximaler Stromverbrauch (Augenzahl = 6): 45mA - max 1 min
Software verfügt über Sleep nach 1 min kein Tastendruck (EXT INT0 LOW 
LEVEL INTERRUPT).
Stromverbrauch Sleep: nicht messbar
Wake up: LOW LEVEL INT0 = EXT INT0 für Zufallszahl.
Nach Drücken der Taste um Würfelvorgang einzuleiten ist erst wieder das 
Drücken möglich, wenn die  Statusled Leuchtet (a' la: gewürfelt ist 
gewürfelt).

Ubrigens: im Code ist in der Anweisung switch(anzahl) eine ganze Menge 
auskommentiert. Das sind unterschiedliche "animationen" die das Würfeln 
darstellen sollen!

Soweit ich weiß habe ich in der Software keine Fehler... ist mein erstes 
AVR-Projekt :) Irgendwie machts spaß, vielleicht erstelle ich auch mal 
eine Leiterplatte dafür. wenn, dann stelle ich es auch hier rein!

LG und viel spaß beim ev nachbauen
1
/*  Eckdaten:
2
  Maximaler Stromverbrauch (Augenzahl = 6): 45mA - max 1 min
3
  Stromverbrauch Sleep: nicht messbar
4
  Stromverbrauch ohne Sleep, keine LED: 0,5mA 
5
  Software verfügt über Sleep nach 1 min kein EXT0 INT. 
6
  Wake up: LOW LEVEL INT0 = EXT INT0 für Zufallszahl
7
*/
8
9
//----------------------------------------------------------------------
10
#include  <avr/io.h>    // AVR Register und Konstantendefinitionen
11
#include    <util/delay.h>
12
#include  <avr/interrupt.h>
13
#include    <stdio.h>
14
#include   <stdlib.h>
15
#include   <math.h>
16
#include   <avr/sleep.h>
17
unsigned char anzahl = 0;  // Anzahl der Timer0 Überläufe für Zeitverzögreung
18
void zufallszahl();  
19
20
//-----------------H A U P T P R O G R A M M-------START----------------
21
//-----------------R E G I S T E R   I N I T-------START----------------
22
23
main ()            // Hauptprogramm, startet bei Power ON und Reset
24
{  DDRB = 0xFF;       // PORT B = AUSGANG (für die LEDS)
25
  PORTB = 0x00;      // AUSGANGSPINS resetten
26
  DDRD = 0x00;
27
  GIMSK = 0b01000000;    // Ext0 Int enable
28
  SREG = 0b10000000;     // Golbal interrupt enable
29
  MCUCR = 0b01110000;    // LOW LEVEL INT0 = interrupt UND POWER DOWN funktion
30
  TIMSK = 0b00000010;    // Timer0 Overflow Interrupt enable
31
32
//-----------------R E G I S T E R   I N I T-------END-------------------  
33
  while(1)
34
  {  
35
    if(TCCR0B == 0x00)  // wenn Timer0 angehalten ist, PORTB löschen und in den 
36
    {  
37
      PORTB = 0x00;   // POWER DOWN mode gehen. wird durch LOW LEVEL INT0 reaktiviert
38
      sleep_mode();  // siehe MCUCR setup
39
    }
40
  }
41
}
42
43
//----------------H A U P T P R O G R A M M-------END--------------------
44
//----------------E X T   I N T 0   I S R---------START----------------- 
45
46
ISR(INT0_vect)        // EXT INT0 LOW LEVEL INTERRUPT ISR
47
  {    GIMSK = 0x00;  // EXT INT0 verbieten - gewürfelt ist gewürfelt ;)
48
      anzahl = 0;    // Verzögerungszähler aus NULL setzen  
49
      zufallszahl();  // Zufallszahl Funktion starten
50
  }
51
52
//----------------E X T   I N T 0   I S R---------END----------------- 
53
//----------------T I M E R 0   O V E R V L O W   I S R--------START--
54
55
56
ISR(TIMER0_OVF_vect)
57
  {  anzahl++;                // Verzögerungszähler um 1 erhöhen
58
    if(anzahl < 14) TCCR0B = 0b00000100;  // TIMER0 RUN mit F_CPU / 256 für eine gut  einstellbare Zeitverzögerung der
59
    if(anzahl == 14) TCCR0B = 0b00000101;  // TIMER0 RUN mit F_CPU / 1024 für längere Verzögerung bis zum Anzeigen der Zahl
60
    switch(anzahl)              // einstellbare Zeitverzögerung der
61
    {  /*                  // animation des Würfelns
62
      case 1: PORTB = 0b00000001; break;
63
      case 2: PORTB = 0b00000010; break;
64
      case 3: PORTB = 0b00000100; break;
65
      case 4: PORTB = 0b01000000; break;
66
      case 5: PORTB = 0b00100000; break;
67
      case 6: PORTB = 0b00010000; break;
68
      case 7: PORTB = 0b00001000; break;
69
      
70
      case 1: PORTB = 0b00000001; break;
71
      case 2: PORTB = 0b00000011; break;
72
      case 3: PORTB = 0b00000111; break;
73
      case 4: PORTB = 0b01000111; break;
74
      case 5: PORTB = 0b01100111; break;
75
      case 6: PORTB = 0b01110111; break;
76
      case 7: PORTB = 0b01111111; break;
77
      
78
      case 1: PORTB = 0b00000001; break;
79
      case 2: PORTB = 0b00000011; break;
80
      case 3: PORTB = 0b00000110; break;
81
      case 4: PORTB = 0b00001100; break;
82
      case 5: PORTB = 0b00011000; break;
83
      case 6: PORTB = 0b00110000; break;
84
      case 7: PORTB = 0b00100001; break;
85
      case 8: PORTB = 0b00000011; break;
86
      case 9: PORTB = 0b00000110; break;
87
      case 10: PORTB = 0b00001100; break;
88
      case 11: PORTB = 0b00011000; break;
89
      case 12: PORTB = 0b00110000; break;
90
      case 13: PORTB = 0b00100000; break;
91
      */
92
      case 1: PORTB = 0b00000001; break;
93
      case 2: PORTB = 0b00000011; break;
94
      case 3: PORTB = 0b00000111; break;
95
      case 4: PORTB = 0b00001111; break;
96
      case 5: PORTB = 0b00011111; break;
97
      case 6: PORTB = 0b00111111; break;
98
      case 7: PORTB = 0b00111111; break;
99
      case 8: PORTB = 0b00111111; break;
100
      case 9: PORTB = 0b00111110; break;
101
      case 10: PORTB = 0b00111100; break;
102
      case 11: PORTB = 0b00111000; break;
103
      case 12: PORTB = 0b00110000; break;
104
      case 13: PORTB = 0b00100000; break;
105
106
      case 14: PORTB = 0x00; 
107
           TCNT0 = 0x00; break;      // TIMER0 zurücksetzen damit definierte Verzögerung bis zum Anzeigen der Zahl gewährleistet ist
108
      case 15: PORTB = GPIOR0;         // Display Zufallszahl
109
           GIMSK = 0b01000000;       // Ext0 Int wieder erlauben!!!
110
           TCNT0 = 0x00; break;  
111
      case 247: TCCR0B = 0x00;        // TIMER0 STOP
112
            TCNT0 = 0x00;  break;      // TIMER0 rücksetzen                                      
113
    }    
114
  }
115
116
//----------------T I M E R 0   O V E R V L O W   I S R--------END-----
117
//----------------Z U F A L L S Z A H L G E N E R A T O R------START---
118
119
void zufallszahl()
120
{    unsigned char min = 1;
121
    unsigned char max = 6;
122
    unsigned char erg = 0;
123
    
124
    erg = (rand() % (max-min+1) +min);      // Zufallszahl erzeugen
125
    switch(erg)                  // Umcodierung der Zufallszahl
126
    {  case 1: GPIOR0 = 0b11000000; break;    // zu den entsprechenden Bit-
127
      case 2: GPIOR0 = 0b10100100; break;    // kombinationen für den Würfel
128
      case 3: GPIOR0 = 0b11100100; break;
129
      case 4: GPIOR0 = 0b10101101; break;
130
      case 5: GPIOR0 = 0b11101101; break;    
131
      case 6: GPIOR0 = 0b10111111; break;
132
         
133
    }
134
    SREG = 0b10000000;                //Golbal interrupt enable
135
    TCCR0B = 0b00000101;            //Timer0 RUN mit f = F_CPU / 1024  
136
  }
137
//----------------Z U F A L L S Z A H L G E N E R A T O R-----END------

von Paule (Gast)


Lesenswert?

Hallo,

tolles Projekt.

Könntest du mal bitte eine fertige Hex Datei hochladen, ich habe keinen 
C Copiler und wollte eigentlich auch keinen installieren. Komme aus der 
Bascom Fraktion, für ein Projekt lohnt das installieren nicht wirklich.

von Thomas (Gast)


Lesenswert?

Ich würde mich auch über eine HEX Datei freuen !!

von Bloody (Gast)


Angehängte Dateien:

Lesenswert?

Wurde im anderen Forum gefragt, ob ichs compelieren kann.
Hier wird es auch gefragt:

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.