Inkrementalgeber verliert Schritte beim senden über uart

Gast #1065125
Lesenswert?

Hallo,
ich arbeite mit einem AtMega32 und paar Inkrementalgeber(Code aus dem 
Forum & Handbetrieb), die UART lib nutze ich von Peter Fleury.
Ich Sende mit 9600 Baud da ich mit Bluetooth arbeite. Alles funktioniert 
gut solange ich die Position anfahre dann halte und erst dann Sende 
(Aufbau mit Taster...). Sobald ich aber ununterbrochen sende verliert 
der Sensor die Position!
Ich wollte aber gern das, dass senden im Hintergrund läuft und am 
liebsten ununterbrochen.
Jetzt habe ich im Forum gesucht nach einer Möglichkeit so zu senden das 
es funktioniert aber ohne Erfolg!
1
#include ….....
2

3

4
/* 9600 baud */
5
#define UART_BAUD_RATE      9600  
6

7

8
#define PHASE_A1  (PINC & 1<<PINC2)  // PINC.0
9
#define PHASE_B1  (PINC & 1<<PINC3)  // PINC.1
10

11

12
volatile int16_t  enc_delta1;  
13

14

15
char sendString1[4];
16

17
//-------------------------
18

19

20

21

22
int main(void){
23
  
24
      uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
25
  
26
  sei();
27

28
  while(1){
29
    asm volatile("nop");
30

31
      static char enc_last1 = 0x01;
32
          char i1 = 0;
33

34
          if( PHASE_A1 )
35
              i1 = 1;
36

37
          if( PHASE_B1 )
38
              i1 ^= 3;        // convert gray to binary
39

40
            i1 -= enc_last1;      // difference new - last
41

42
          if( i1 & 1 ){        // bit 0 = value (1)
43
              enc_last1 += i1;      // store new as next last
44

45
              enc_delta1 += (i1 & 2) - 1;    // bit 1 = direction (+/-)
46
          }
47

48

49
      if(!(PINB &(1<<PB0))){
50

51

52
        itoa(enc_delta1,sendString1,10);
53

54
        uart_puts(sendString1);
55
        uart_putc('x');
56

57
      }
58
  }
59
}
Gast #1065129
Lesenswert?

>Ich wollte aber gern das, dass senden im Hintergrund läuft und am
>liebsten ununterbrochen.

Dann musst du das auch so programmieren.
1
itoa(enc_delta1,sendString1,10);
2
uart_puts(sendString1);
3
uart_putc('x');

Das verplempert so ziemlich viel Zeit und versperrt den µC..
Gast #1065185
Lesenswert?

Dachte immer die freie Zeilen würden nichts ausmachen da der Compiler 
das später alles zusammenfasst!
Ist auch bei der Simulation so das er die  freien Zeilen nicht 
abklappert oder Irre ich mich da??
Gast #1065190
Lesenswert?

>Dachte immer die freie Zeilen würden nichts ausmachen

;-) Nein, den Tipp hast du falsch verstanden.

Die 3 Zeilen bezogen sich auf

>Das verplempert so ziemlich viel Zeit und versperrt den µC..

Während er deine Zahl in einen String wandelt und sendet,
verpaßt er Inkremente.

Deswegen solltest du dich mal mit (Timer-)Interrupts beschäftigen,
um eine (quasi-)parallele Abarbeitung oder wie du sagst "im Hintergrund"
stattfinden zu lassen.

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