ASt7, WS2812 Fehlermeldung: "internal error: out of range error"

Gast #4466735
Lesenswert?

Den Code habe ich abgekupfert: 
Beitrag "Re: Lightweight WS2811/WS2812 Library"

Beim Compilieren mit dem Atmel Studio 7 erhalte ich eine Fehlermeldung 
("internal error: out of range error"). Der Cursor steht auf der Zeile 
25 ("asm volatile").

Was ist außerhalb des Bereichs in der Assemblerkonstruktion?
1
#include <avr/io.h>
2

3
/*
4

5
  RGB 3 x 8 Bits 24 Bits 
6
  
7
  0er Bit = High (0,35 µs (+/- 150 n) Low  (0,9 µs +/- 150 n)
8
  1er Bit = Low  (0,35 µs (+/- 150 n) High (0,9 µs +/- 150 n)
9
  
10
  Reset   = Low (> 50 µs)
11

12
*/
13

14
#define ws2812_port 0x18  // Number of the data port register
15
#define ws2812_pin 4    // Number of the data out pin
16

17
void WS2812SendBytes(uint8_t *data, uint16_t n)
18
{
19
  uint8_t curbyte,ctr;
20
  
21
  while (n--)
22
  {
23
    curbyte=*data++;
24
    
25
    asm volatile
26
    (
27
    "    ldi  %0,8       \n\t"    // 0
28
    "    nop\n\t"
29

30
    "loop%=:lsl  %1      \n\t"    //  1     Datenbit ins Carry
31
    "    dec  %0         \n\t"    //  2     Schleifenzähler in Z-Flag
32
    "    sbi  %2,  %3    \n\t"    //  4
33

34
    "    nop\n\t"                  //  5
35
    "    nop\n\t"                  //  6
36

37
    "    brcs .+2        \n\t"    //  7l / 8h
38
    "    cbi  %2,  %3    \n\t"    //  9l / -    Überspringen bei C=1
39

40
    "    nop\n\t"                  // 10l /  9h
41
    "    nop\n\t"                  // 11l / 10h
42
    "    nop\n\t"                  // 12l / 11h
43
    "    nop\n\t"                  // 13l / 12h
44
    
45
    "    brcc .+3        \n\t"    // 15l / 13h
46
    "    cbi  %2,  %3    \n\t"    // -  / 15h   Überspringen bei C=0
47

48
    "    nop\n\t"                  // 16
49
    "    nop\n\t"                  // 17
50
    "    nop\n\t"                  // 18
51
    "    nop\n\t"                  // 19
52

53
    "    brne loop%=     \n\t"    // 11 loop /10nt  Weiter, wenn Z=1
54

55
    :  "=&d" (ctr)
56
    :  "r" (curbyte), "I" (ws2812_port), "I" (ws2812_pin)
57
    );
58
    
59
    // loop overhead including byte load is 6+1 cycles
60
  }
61
}
62

63
uint8_t LED[] = 
64
{
65
  0x30, 0x60, 0x90
66
};
67

68
int main(void)
69
{
70
  WS2812SendBytes(LED, 3);
71
  
72
    while (1) 
73
    {
74
    }
75
}

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