Hallo,
ich baue gerade ein 2 Kanal VU Meter mit je 10 LEDs, dass über RS232 an
PC verbunden werden kann.
Nun habe ich mir das so überlegt, dass ich ein Byte schicke und in
diesem stehen die Werte für beide Kanäle und zwar so: Die ersten 4 Bit
(erste Ziffer in der HEX Schreibweise) ist für den linken Kanal und die
anderen 4 Bit für den Rechten Kanal.
Nun bin ich soweit, dass das Multiplexing steht und ich mit RS232 ein
Byte empfangen kann. Doch wie teile ich nun den Byte auf die 2 Werte
auf?
Mein Code ist bis jetzt so:
1 | //2 Kanal VU Meter
|
2 | //
|
3 | //µC: Attiny2313
|
4 | //Taktfrequenz: 1 MHz
|
5 | //baudrate: 4800
|
6 |
|
7 | //Taktfrequenz setzen
|
8 | #define F_CPU 1000000
|
9 |
|
10 | //Includes
|
11 | #include <avr/io.h>
|
12 | #include <util/delay.h>
|
13 | #include <avr/interrupt.h>
|
14 | #include "uart.c"
|
15 | #include <stdlib.h>
|
16 |
|
17 | //Variablen
|
18 | int NumberPortD[11] = {0x00,0x20,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60};//Bitmuster für die Zahlen für PortD
|
19 | int NumberPortB[11] = {0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};//Bitmuster für PortB
|
20 | volatile uint8_t BarRight; //rechter Bargraph Wert
|
21 | volatile uint8_t BarLeft; //linker Bargraph Wert
|
22 | uint8_t b = 0; //Bargraphnummer für Multiplexing
|
23 | uint8_t bw = 0; //Bargraphwert
|
24 |
|
25 | //Funktionen
|
26 | void init();
|
27 |
|
28 | //MAIN
|
29 | int main(void) {
|
30 |
|
31 | //Initialisierung
|
32 | init();
|
33 |
|
34 | //Hauptschleife
|
35 | while(1) {
|
36 | uint8_t rec;
|
37 | rec = uart_getc_wait();
|
38 |
|
39 | BarRight = ;
|
40 | }
|
41 |
|
42 | return 0;
|
43 |
|
44 | }
|
45 |
|
46 | //Initfunktion
|
47 | void init() {
|
48 |
|
49 | //Ports setzen
|
50 | DDRB = 0xFF;
|
51 | DDRD = 0xFF;
|
52 |
|
53 | //Timer0 konfigurieren Prescaler 8
|
54 | TCCR0B = (0<<CS02) | (1<<CS01) | (0<<CS00);
|
55 |
|
56 | //Overflowinterrupt erlauben
|
57 | TIMSK |= (1<<TOIE0);
|
58 |
|
59 | //Global Interrupts aktivieren
|
60 | sei();
|
61 |
|
62 | //UART ini
|
63 | uart_init();
|
64 | }
|
65 |
|
66 |
|
67 | //Timer0 Interrupt
|
68 | ISR (TIMER0_OVF_vect) {
|
69 |
|
70 | b++; //b = 0 --> linker Bargraph
|
71 | if (b == 2) {b = 0;}; //b = 1 --> rechter Bargraph
|
72 |
|
73 | //Ports ausschalten
|
74 | PORTD = 0x00;
|
75 | PORTB = 0x00;
|
76 |
|
77 | if (b == 0) {
|
78 | bw = BarLeft;
|
79 | } else {
|
80 | bw = BarRight;
|
81 | };
|
82 |
|
83 | //Bitmuster in Ports schreiben
|
84 | PORTB = NumberPortB[bw];
|
85 | PORTD = NumberPortD[bw];
|
86 |
|
87 | //Bargraph einschalten
|
88 | if (b == 0) {
|
89 | PORTD |= (1<<PD4);
|
90 | } else {
|
91 | PORTD |= (1<<PD3);
|
92 | }
|
93 | }
|
Ich hoffe ihr könnt mir helfen. Wäre nett