Forum: Mikrocontroller und Digitale Elektronik Inkrementalgeber verliert Schritte beim senden über uart


von Kostja (Gast)


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
}

von Matthias L. (Gast)


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..

von Kostja (Gast)


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??

von ARM-Fan (Gast)


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.

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.