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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Stefan M. (stefatronik)


Bewertung
0 lesenswert
nicht 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)


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

von Joe F. (easylife)


Bewertung
0 lesenswert
nicht lesenswert
Wird von deinem Code irgendwas in einer Interrupt-Routine ausgeführt?

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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.