Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 113 lines (105 sloc) 2.615 kb
d624ec0e » Unicorn
2011-02-08 first commit
1 /* ersteuhr.c
2 Eine kleine Binäruhr.
3 Taste 1 schaltet auf Sekunden,
4 Taste 2 auf Minuten,
5 Taste 3 auf Stunden um.
6 Taste 4 invertiert die Anzeige.*/
7 #include <avr/interrupt.h>
8 #include <avr/io.h>
9 #include <stdlib.h>
10
11 volatile uint8_t sekunden, minuten, stunden;
12 volatile uint8_t modus, inverse;
13 volatile uint8_t anti_prell;
14 void timer0_on();
15 void timer1_on();
16
17
18 int main (void)
19 {
20 modus = 1;
21 inverse = 0;
22 DDRB = 0; //Port B auf Input setzen
23 PORTB = 0x0F; //Setze Pullup Wiederstände im Atmel für Taster (gibt 5V auf den Ausgang die die Schalter dann gegen Ground schalten)
24 DDRC = 0xFF; //Port C auf Output setzen
25 srand(121); //randomseed initialisieren
26 sekunden = rand() % 60; //sekunden auf einen Wert setzen
27 minuten = rand() % 60; //minuten ebenso
28 stunden = rand() % 24; //stunden eh
29 timer0_on(); //schalte Timer0 an
30 timer1_on(); //schalte Timer1 an
31 sei(); //Schaltet Interrupts an
32
33 while(42) {
34 switch(inverse){
35 case 0:
36 switch(modus){
37 case 1:
38 PORTC= sekunden;
39 break;
40 case 2:
41 PORTC= minuten;
42 break;
43 case 3:
44 PORTC= stunden;
45 break;
46 }
47 break;
48 case 1:
49 switch(modus){
50 case 1:
51 PORTC = (sekunden^0xFF);
52 break;
53 case 2:
54 PORTC = (minuten^0xFF);
55 break;
56 case 3:
57 PORTC = (stunden^0xFF);
58 break;
59 }
60 break;
61 }
62 }
63 }
64
65 SIGNAL(SIG_OUTPUT_COMPARE1A){
66 sekunden++;
67 if (sekunden > 59){
68 sekunden = 0;
69 minuten++;
70 }
71 if (minuten > 59){
72 minuten = 0;
73 stunden++;
74 }
75 if (stunden > 23){
76 stunden = 0;
77 }
78 }
79
80 SIGNAL(SIG_OUTPUT_COMPARE0){
81 if((++anti_prell%12)==0){
82 switch(PINB&0x0f){
83 case 0x0E: //button 1 -> sekunden
84 modus = 1;
85 break;
86 case 0x0D: //button 2 -> minuten
87 modus = 2;
88 break;
89 case 0x07: //button 4 -> stunden
90 modus = 3;
91 break;
92 case 0x0B: //button 3 -> invertieren
93 inverse = (inverse+1)&1;
94 break;
95 }
96 }
97 }
98
99 void timer0_on(){
100 TCCR0 |= (1 << WGM01); //CTC Modus
101 TCCR0 |= (1 << CS00); // Prescaler auf 1024
102 TCCR0 |= (1 << CS02); // Prescaler auf 1024
103 TIMSK |= (1 << OCIE0); // Interrupt auslösen wenn CTC-Match
104 OCR0 = 150; //Schwellenwert für CTC
105 }
106
107 void timer1_on(){
108 TCCR1B |= (1 << WGM12); //CTC Modus
109 TCCR1B |= (1 << CS12); // Prescaler auf 1024
110 TCCR1B |= (1 << CS10); // Prescaler auf 1024
111 TIMSK |= (1 << OCIE1A); // Interrupt auslösen wenn CTC-Match
112 OCR1A = 15624; //Schwellenwert für CTC
113 }
Something went wrong with that request. Please try again.