Forum: Compiler & IDEs AVR Studio - Fehler bei Zuweisung von Registern


von Bruno W. (apineapple027)


Lesenswert?

Hallo,

ich habe gerade ein kleines Programm geschrieben, das den Timer von 
meinem ATtiny13 benutzt, um eine LED blinken zu lassen(wollte mal sehen 
ob ich den Timer verstanden habe).
Folgender Code initialisiert den Timer:
1
12: TCCR0A |= (1 << WGM01);
2
13: TCCR0B |= (1 << CS01);
3
14:
4
15: OCR0A = 149;
5
16:
6
17: TIMSK0 |= (1 << OCIE0A);

Beim kompilieren erhalte ich folgende Fehler jeweils in Zeile 12, 13, 15 
und 17:

  - expected identifier or '(' before 'volatile'
  - expected ')' before '(' token

Andere Schreibweisen wie z.B.
1
TCCR0A = TCCR0A | (1 << WGM01);
helfen auch nicht, genauso wenig wie überall Klammern zu setzen...
Sonst meldet gibt es keine Fehler. Ich benutze übrigens AVR Studio 6.
Irgendeine Idee was da los ist ?

Gruß

von Timmo H. (masterfx)


Lesenswert?

also mit Atmel Studio 6.2 ( -mmcu=attiny13) kann man folgenden Code 
compilieren:
1
#include <avr/io.h>
2
3
int main (void)
4
{
5
6
7
 TCCR0A |= (1 << WGM01);
8
 TCCR0B |= (1 << CS01);
9
10
 OCR0A = 149;
11
12
 TIMSK0 |= (1 << OCIE0A);
13
14
}
Vermutlich verwendest du noch eine sehr alte Version von AVR Stdio bzw. 
einen veralteten Compiler, welcher den Tiny nicht unterstützt. Oder aber 
du hast die avr/io.h nicht included, oder du hast mmcu nicht richtig 
angegeben oder du enthältst uns code vor.

von Max M. (jens2001)


Lesenswert?

Bruno W. schrieb:
> 12: TCCR0A |= (1 << WGM01);
> 13: TCCR0B |= (1 << CS01);
> 14:
> 15: OCR0A = 149;
> 16:
> 17: TIMSK0 |= (1 << OCIE0A);

Das ist doch nicht der ganze Code!?

von Bruno W. (apineapple027)


Lesenswert?

Ich habe AVR Studio 6.0.1843, werd ich gleich mal updaten.
Zum vorenthaltenen Code:
1
#define F_CPU 1200000UL
2
3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
6
uint_t16 z = 1;
7
8
9
TCCR0A |= (1 << WGM01);
10
TCCR0B |= (1 << CS01);
11
12
OCR0A = 149;
13
14
TIMSK0 |= (1 << OCIE0A);
15
16
ISR(TIM0_COMPA_vect)
17
{
18
  if(z == 1000)
19
  {
20
    DDRB ^= (1<<PB3);
21
    z = 1;
22
  }else{z++;}
23
  
24
}
25
26
int main(void)
27
{
28
  
29
  
30
  while(1)
31
  {
32
    
33
  }
34
}
Mal schauen obs mit der neuesten Version geht...

von Karl H. (kbuchegg)


Lesenswert?

Bruno W. schrieb:
> Ich habe AVR Studio 6.0.1843, werd ich gleich mal updaten.
> Zum vorenthaltenen Code:
>
1
> #define F_CPU 1200000UL
2
> 
3
> #include <avr/io.h>
4
> #include <avr/interrupt.h>
5
> 
6
> uint_t16 z = 1;
7
> 
8
> 
9
> TCCR0A |= (1 << WGM01);
10
> TCCR0B |= (1 << CS01);
11
> 
12
> OCR0A = 149;
13
> 
14
> TIMSK0 |= (1 << OCIE0A);
15
>


dacht ichs mir doch.

Davon, dass ausführbarer Code in C in einer Funktion stehen muss, hast 
du noch nie gehört?

Na ja. Jetzt weißt du wenigstens, dass dann seltsame und undurchsichtige 
Fehlermeldungen kommen, wenn der Compiler versucht, das Konglomerat als 
die Definition von Variablen aufzufassen und auf keinen grünen Zweig 
damit kommt.
1
#define F_CPU 1200000UL
2
3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
6
uint16_t z = 1;
7
8
ISR(TIM0_COMPA_vect)
9
{
10
  if(z == 1000)
11
  {
12
    PORTB ^= (1<<PB3);
13
    z = 1;
14
  }
15
  else
16
  {
17
    z++;
18
  }
19
}
20
21
int main(void)
22
{
23
  DDRB |= (1<<PB3);
24
  
25
  TCCR0A |= (1 << WGM01);
26
  TCCR0B |= (1 << CS01);
27
28
  OCR0A = 149;
29
30
  TIMSK0 |= (1 << OCIE0A);
31
  
32
  sei();
33
34
  while(1)
35
  {
36
    
37
  }
38
}

PS: Die restlichen Fehler hab ich dir auch gleich noch korrigiert.
Lass erst mal Timer Timer sein und sieh zu, dass du die noch banaleren 
Grundlagen in den Griff kriegst. WIe zb. Portansteuerung.

: Bearbeitet durch User
von Bruno W. (apineapple027)


Lesenswert?

Oh oh peinlich peinlich...
Aber, wer hätte es gedacht: Jetzt funktioniert es !
Naja vielen Dank für die Hilfe !

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.