Forum: Mikrocontroller und Digitale Elektronik Toggle Bit in 8-Bit integer


von Stefan M. (stefatronik)


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?

von Jim M. (turboj)


Lesenswert?

Die Ausgabe oben entsprechen nicht dem gezeigten Code.
Bitte komplettes Beispiel posten.

von Joe F. (easylife)


Lesenswert?

Wird von deinem Code irgendwas in einer Interrupt-Routine ausgeführt?

von Axel S. (a-za-z0-9)


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)

von Stefan M. (stefatronik)


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
}

von Peter D. (peda)


Lesenswert?

Stefan M. schrieb:
> puti erwartete einen Pointer.

Pointer verwendet man nicht einfach so aus Spaß, sondern wenn es 
sinnvoll ist.
Z.B. bei Übergabe von Structs, Arrays oder wenn eine Variable geändert 
werden soll.

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.