Toggle Bit in 8-Bit integer

#4934942
Lesenswert?

Moin,
ich beabsichtige ein Bit in einem 8-Bit breiten uint8_t zu toggeln und 
diese int dann später per SPI zu senden.

Folgendes ist der Code in Atmel Studio, den ich auf meinem ATMega168 
laufen lasse:
1
  
2
#define MUTE_L 0
3
#define MUTE_R 1  
4
uint8_t spiRelBufferHigh = 3;
5
  
6
#define SRC_L 6
7
#define SRC_R 7
8
uint8_t spiRelBufferLow = 0;
9

10

11
    if (states.pushed_enc){
12
      usart_puts("Anfangszustand \n\r");
13
      usart_puti(spiRelBufferHigh);
14
      usart_puts("\n\r");
15
      spiRelBufferHigh ^= ( 1 << MUTE_L );
16
      usart_puts("nach mute_L \n\r");
17
      usart_puti(spiRelBufferHigh);
18
      usart_puts("\n\r");      
19
      spiRelBufferHigh ^= ( 1 << MUTE_R );
20
      usart_puts("nach mute_R \n\r");
21
      usart_puti(spiRelBufferHigh);
22
      usart_puts("\n\r");
23

24
      SPI_intTransmit(spiRelBufferHigh);
25
      SPI_intTransmit(spiRelBufferLow);
26
}

In meiner seriellen Ausgabe erscheint

Anfangszustand
0
nach mute_L
0
nach mute_R
21
Anfangszustand
0
nach mute_L
0
nach mute_R
0


Der selbe Code in C auf meinem Mac:
1
int spiRelBufferHigh = 0;
2
int spiRelBufferLow = 0;
3
int i = 9;
4

5
void main (void){
6

7
  for (int j = 0; j<10; j++){
8
    
9
    spiRelBufferHigh ^= ( 1 << 0 );
10
    spiRelBufferHigh ^= ( 1 << 1 );
11
    
12

13
    printf("spiBufferHi: %i\n\r", spiRelBufferHigh);

Hier ist die Ausgabe wie erwartet 3 und 0 im Wechsel.
Hat jemand eine Idee, was ich falsch gemacht habe?
#4935056
Lesenswert?

Stefan M. schrieb:
1
> #define MUTE_L 0
2
> #define MUTE_R 1
3
> uint8_t spiRelBufferHigh = 3;
4
> 
5
> #define SRC_L 6
6
> #define SRC_R 7
7
> uint8_t spiRelBufferLow = 0;
8
> 
9
> 
10
>     if (states.pushed_enc){
11
>       usart_puts("Anfangszustand \n\r");
12
>       usart_puti(spiRelBufferHigh);
13
>       usart_puts("\n\r");
14
>       spiRelBufferHigh ^= ( 1 << MUTE_L );
15
>       usart_puts("nach mute_L \n\r");
16
>       usart_puti(spiRelBufferHigh);
17
>       usart_puts("\n\r");
18
>       spiRelBufferHigh ^= ( 1 << MUTE_R );
19
>       usart_puts("nach mute_R \n\r");
20
>       usart_puti(spiRelBufferHigh);
21
>       usart_puts("\n\r");
22
> 
23
>       SPI_intTransmit(spiRelBufferHigh);
24
>       SPI_intTransmit(spiRelBufferLow);
25
> }

> Anfangszustand
> 0
> nach mute_L
> 0
> nach mute_R
> 21
> Anfangszustand
> 0
> nach mute_L
> 0
> nach mute_R
> 0

Anscheinend tut die Funktion usart_puti() nicht wie erwartet.

(schnipp)
#4935162
Lesenswert?

puti erwartete einen Pointer. Habe die Funktion selbst abgeändert und 
das wohl vergessen. Sorry für den unnötigen Post; da hätte ich selbst 
drauf kommen können!

1
void usart_puti(int *ival){
2
  unsigned char buffer[5];
3
  itoa(*ival, &buffer, 10);
4
  int i =0;
5
  while (buffer[i] != 0x00){
6
    while (!( UCSR0A & (1<<UDRE0)));                        // Wait for empty transmit buffer
7
    UDR0 = (buffer[i]);
8
    i++;
9
  }
10
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren