Forum: Mikrocontroller und Digitale Elektronik 16-bit Timer ATmega8515


von Tobi (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe seit kurzem ein STK500 und arbeite mich durchs AVR-GCC-Tutorial 
durch und bis dato gings auch ganz gut. Am 16-bit Timer bin ich nun 
allerdings hängen geblieben und deshalb wollte ich hier mal fragen ob 
ihr mal kurz über meinen Code schauen könnt (Im Anhang).
Im Prinzip wollte ich nur den Timer setzen und ihn mit meinen 
vorgegebenen Werten die ich ins Output Compare Register geschrieben habe 
vergleichen. Im Falle eines "Matches" sollte dann die ISR aufgerufen 
werden und abwechselnd alle ports von C high und low schalten.
kompilieren tut er ohne probleme, aber sehen tu ich nichts (an port C 
hängen die LEDs vom STK500)

Ich wär sehr dankbar wenn da jemand mal rüberschauen könnte, bin noch 
nicht lang dabei.

MfG,
Tobi

von Rainer U. (r-u)


Lesenswert?

Was macht diese Zeile am Anfang der ISR?

  int8_t status=0;

:-)

von Tobi (Gast)


Lesenswert?

Hallo,
die soll dafür sorgen das beim Aufruf der ISR einmal die LED´s an und 
beim nächsten mal wieder ausgeschaltet werden. Je nachdem ob status=0 
oder 1 ist wird das if oder das else aufgerufen. So jedenfalls der 
Grundgedanke.

von Spess53 (Gast)


Lesenswert?

Hi

> TCCR1B=(1<<CS12)|(1<<CS11)|(1<<CS10);  // (CS12=1 CS11=0 CS10=1)=>1024

Du solltest dich an deinen Kommentar halten. Du hast einen externen Takt 
eingestellt.

MfG spess

von Dave C. (dave_chappelle)


Lesenswert?

"status" wird IMMER 0 sein, da du die Variable jedes mal neu 
initialisierst.

Also einfach vor der main das hier einfügen:

volatile uint8_t status = 0;

von Tobi (Gast)


Lesenswert?

Ouh, jaa das sehe ich ein. Habe ich auch schon geändert. bewirkt hat es 
leider nichts, die LED´s sind immer noch duster.

MfG

von Spess53 (Gast)


Lesenswert?

Hi

Nochmal: Deine Takteinstellung ist falsch.

Beitrag "Re: 16-bit Timer ATmega8515"

MfG Spess

von Tobi (Gast)


Lesenswert?

Tschuldige, deinen Beitrag habe ich im Eifer des Gefechts wohl 
übersehen. das (1<<CS11) ist mir wohl "rausgerutsch", habe ich gerade 
mal geändert. Ist aber immernoch alles duster...
Wenn ich mal den "Compare"-Kram weglasse und die Ausgänge per 
Overflow-ISR hin und her-schalten lasse funktioniert das ganze 
komischerweise...

von Dave C. (dave_chappelle)


Lesenswert?

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
volatile uint8_t toggle = 0;
5
6
int main(void)
7
{
8
   DDRC = 0xFF;   //äquivalent zu deiner Schreibweise
9
   OCRIA = 3599;  //ebenfalls
10
11
   TCCR1B = (1<<CS12)|(1<<CS10);  //Prescaler 1024
12
   TIMSK = (1<<OCIE1A);           //Compare Interrupt Enable
13
   sei();                         //Globale Interrupt Enable
14
   
15
  for(;;)
16
  {
17
  }
18
}
19
20
ISR(TIMER1_COMPA_vect)
21
{
22
 if(toggle)
23
 {
24
   PORTC = 0xFF;
25
   toggle = 0;
26
 }
27
 else
28
 {
29
   PORTC = 0x00;
30
   toggle = 1;
31
 }
32
}

Funktioniert bei mir einwandfrei.

PORTC Toggelt mit 1/(Taktfrequenz/1024/3599) Sekunden.

Gruss

von Tobi (Gast)


Lesenswert?

Habs gerade mal compiliert und rauf-geflasht, gleiches Bild. Alles 
duster...

von Spess53 (Gast)


Lesenswert?

Hi

>

Habs gerade mal compiliert und rauf-geflasht, gleiches Bild. Alles
>duster...

Dann überprüfe mal oder richtige Controller eingestellt ist, un ob du 
überhaupt das richtige Programm flashst.

MfG Spess

von Tobi (Gast)


Lesenswert?

Ooh man ich glaubs nicht...Im voraus schonmal danke für eure Geduld mit 
mir! Es lag daran das AVRStudio tatsächlich nicht automatisch das 
Programm flasht was ich zuvor programmiert habe, sondern das was ich 
anfangs mal ausgewählt habe... Liegt nahe, wusste ich aber nicht. Naja, 
jetzt funktioniert es, danke euch allen!

MfG

von Spess53 (Gast)


Lesenswert?

Hi

>Ooh man ich glaubs nicht...

Du bist nicht der Erste, mich eingeschlossen, und wirst auch nicht der 
Letzte sein, dem das passiert.

MfG Spess

von Tobi (Gast)


Lesenswert?

Naja, eventuell merke ichs mir ja jetzt besser :)
Eine Frage habe ich noch, ich wollte nicht unbedingt einen neuen Thread 
deshalb aufmachen:

Ich wollte nun mal die Input Capture Funktion des Timers benutzen, jetzt 
steht im Datenblatt das PE0 als alternative Funktion auch als ICP dient. 
Da steht auch etwas von Override-Signals aber da steig ich nicht durch 
und das Tutorial hilft da irgendwie nicht. Was genau muss ich denn 
anstellen um PE0 als ICP verwenden zu können?

MfG

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.