Forum: Mikrocontroller und Digitale Elektronik Byte zerteilen


von VU (Gast)


Lesenswert?

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

von Uwe (de0508)


Lesenswert?

Hallo,

Diese Anweisung ist unnötig und der Kompiler sollte das anmerken !
1
BarRight = ;

Beispiel:
1
uint8_t u_data = 0x12 ;
2
uint8_t u_links = u_data >> 4 ; // == 0x01
3
uint8_t u_rechts = u_data & 0x0f ; // == 0x02

von VU (Gast)


Lesenswert?

Uwe S. schrieb:
> Hallo,
>
> Diese Anweisung ist unnötig und der Kompiler sollte das anmerken !BarRight = ;

ja ich hab das geschrieben und hab dann überlegt, wie ich das am besten 
mache und dann gespeichert und musste dann weg. Das ist noch nicht 
kompiliert und ich weiß, dass das nicht geht. Werds mal ausprobieren. ;)

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.