Byte zerteilen

Gast #2391582
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
Gast #2391655
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. ;)

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.