Forum: Mikrocontroller und Digitale Elektronik ATMega32 CTC Mode ?


von Marv (Gast)


Lesenswert?

Hey,

Da der selbst geschrieben Code einfach nich compillierbar war, hab ich 
mal probiert ein Fertigen Code vom AVR Totorial zu kompillieren.
ABER: Wir bekommen nur ein Fehlercode. Hat jemand einen Tipp für uns,
was wir übersehen haben ?
AVR: Atmega32
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
 
4
int main(void)
5
{
6
  // Timer 0 konfigurieren
7
  TCCR0A = (1<<WGM01); // CTC Modus
8
  TCCR0B |= (1<<CS01); // Prescaler 8
9
  // ((1000000/8)/1000) = 125
10
  OCR0A = 125-1;
11
 
12
  // Compare Interrupt erlauben
13
  TIMSK |= (1<<OCIE0A);
14
 
15
  // Global Interrupts aktivieren
16
  sei();
17
 
18
  while(1)
19
  {
20
    /*Hier kann die aktuelle Zeit
21
      ausgeben werden*/
22
  }
23
}
24
 
25
26
27
ISR (TIMER0_COMPA_vect)
28
{
29
 
30
}

Der Errorcode:
1
Compiling C: main.c
2
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./main.lst  -std=gnu99 -MMD -MP -MF .dep/main.o.d main.c -o main.o 
3
main.c: In function 'main':
4
main.c:7: error: 'TCCR0A' undeclared (first use in this function)
5
main.c:7: error: (Each undeclared identifier is reported only once
6
main.c:7: error: for each function it appears in.)
7
main.c:8: error: 'TCCR0B' undeclared (first use in this function)
8
main.c:10: error: 'OCR0A' undeclared (first use in this function)
9
main.c:13: error: 'OCIE0A' undeclared (first use in this function)
10
main.c: At top level:
11
main.c:27: warning: 'TIMER0_COMPA_vect' appears to be a misspelled signal handler
12
make.exe: *** [main.o] Error 1
13
14
> Process Exit Code: 2
15
> Time Taken: 00:01

Irgendwelche Tipps oder Lösungsvorschläge??? Wäre echt dankbar bin 
nähmlich schon halber am verzweifeln :)

Greetings :]

von Martin (Gast)


Lesenswert?

Marv schrieb:
> AVR: Atmega32

Und was ist in der Entwicklungsumgebung für ein Prozessor eingestellt?

von Uwe (de0508)


Lesenswert?

hallo,

bitte schau dir das Datenblatt von atmega32 an, dann findest Du auch die 
richtigen Registerbezeichnungen.

Ok?

von Marv (Gast)


Lesenswert?

Martin schrieb:
> Und was ist in der Entwicklungsumgebung für ein Prozessor eingestellt?

Mfile ist für mega 32 ausgelegt. Andere Funktionen (Z.B auch der Timer0 
im normalmodus) können compilliert und übertragen werden. (und die 
funktionieren auch noch xD)

von Marv (Gast)


Lesenswert?

Uwe S. schrieb:
> Ok?

Nee leider nicht,
hab mich heute morgen schon mit dem Datenblatt beschäftigt und die 
Register vergliechen. Ich glaub dass könne was mit TCCR0A/B zu tun 
haben, denn die Register/Registerunterteilung findet sich weit und breit 
nicht im Datenblatt. Oder muss man anstatt TCCR TCNT benutzen? Hab 
leider noch nie mit dem Controllertyp gearbeitet.

von Martin (Gast)


Lesenswert?

Bist du sicher, dass der Code für einen ATmega32 ist. Der µC hat 
eigentlich nur ein TCCR0 Register. Mit A und B wird das also nix.

von Marv (Gast)


Lesenswert?

Nein ich bin eben nicht Sicher, mir wird aber auch aus dem Datenblatt 
nicht klar, wie ich den Timer im CTC modus betrieben kann?

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Schau doch mal im Datenblatt unter "Register description" im Kapitel 
"8-Bit Timer/Counter 0".

von Michael (Gast)


Lesenswert?

Marv schrieb:
> Irgendwelche Tipps oder Lösungsvorschläge??? Wäre echt dankbar bin
> nähmlich schon halber am verzweifeln :)

Nimm als Arbeitshypthese: Code ok, Registernamen falsch
Die Namen, die der Compiler für den ATmega32 kennt, stehen in iom32.h

Dann anhand des Datenblattes oder iom32.h gucken, in welchem Register 
die Bits liegen. Der Sprungvektor dürfte TIMER0_COMP_vect heißen.

von Marv (Gast)


Lesenswert?

Jap da hab ich geschaut aber da gibts trzd. kein Programmbeispiel xD. So 
lässts sichs zumindest schonmal kompillieren:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
 
4
int main(void)
5
{
6
  // Timer 0 konfigurieren
7
  TCCR0 = (1<<WGM01), (1<<CS01); // CTC Modus
8
    // ((1000000/8)/1000) = 125
9
  OCR0 = 125-1;
10
 
11
  // Compare Interrupt erlauben
12
  TIMSK |= (1<<OCIE0);
13
 
14
  // Global Interrupts aktivieren
15
  sei();
16
 
17
  while(1)
18
  {
19
    /*Hier kann die aktuelle Zeit
20
      ausgeben werden*/
21
  }
22
}
23
 
24
25
26
ISR (TIMER0_COMP_vect)
27
{
28
 
29
}
Obs funktioniert bleibt noch dahingestellt xD

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.