Forum: Mikrocontroller und Digitale Elektronik Mit AtMega16 und Timern LEDs blinken lassen


von CSG (Gast)


Lesenswert?

Hallo,

ich habe mir gerade einige Anleitungen zur Programmierung mit Timern 
angeschaut, habe jedoch noch einige Fragen bzgl. den Interrupts, die von 
den Timern ausgelöst werden.

Wie eingangs im Betreff erwähnt möchte ich zum Test eine LED (PD5) im 
Timer-Intervall des Timers 0 blinken lassen. Um etwas zu sehen, wollte 
ich das Prescaling auf Takt/1024 stellen, also setze ich im Register 
TCCR0 folgende Bits:
CS00: 1
CS01: 0
CS02: 1

Der Interrupt soll ausgelöst werden, wenn ein Overflow der 
Timer-Variable vorliegt. Welche Bits müssen hierfür noch gesetzt werden 
und wie fange ich diesen Interrupt dann ab? Habe zwar einige Tutorials 
gefunden, allerdings waren die alle für Assembler und das kann ich nicht 
wirklich.

Ich programmiere mit AVR-GCC unter Linux.

Vielen Dank!

von Karl H. (kbuchegg)


Lesenswert?

> Habe zwar einige Tutorials
> gefunden, allerdings waren die alle für Assembler und das kann
> ich nicht wirklich.

Auch in Assembler werden dieselben Register mit denselben Werten belegt.

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
// Timer/Counter0 Overflow
5
//
6
ISR( TIMER0_OVF_vect )
7
{
8
  // ... mach was
9
} 
10
11
int main(void)
12
{
13
14
  //
15
  // Konfiguration Timer0
16
  //
17
  TCCR0 |= (1 << CS00) | (1 << CS02);
18
  TIMSK |= (1 << TOIE0);                // Overflow Interrupt
19
20
  sei();
21
22
  while(1)
23
  {
24
  }
25
}

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

von oldmax (Gast)


Lesenswert?

Hi
Was ist an Assembler so schwer ? Es ist die einfachste Art, ein Programm 
zu coden und zu wissen, was sich auf dem Chip tut. Wer C beherscht, weiß 
noch lange nicht, wie oft ein Wert in den Registern manipuliert wird. 
Erkann nicht so einfach sagen, dieser Programmabschnitt wird in 31 µSek 
durchlaufen. Aber das braucht er vermutlich auch nicht. Andererseits, 
grad bei Bitbearbeitung ist's nicht verkehrt, wenn die Manipulation der 
Werte im Programm "sichtbar" ist. Und umfangreiche Programme lassen sich 
in C genauso unübersichtlich  wie sich Assemblerprogramme mit den 
richtigen Methoden übersichtlich gestalten lassen können. Von daher ist 
es kein Grund, Assemblerroutinen von vorn herein abzulehnen. Ich glaube 
eher, das liegt nicht an der Programmiersprache, sondern daran, das ein 
Anderer seine Gedanken zu einem Programm geformt hat. Und wenn eines 
schwierig ist, ist es Programme anderer zu analysieren. Geht mir mit C, 
Basic, Pascal und Assembler und diversen anderen Steuerungs-Programmen 
genauso. Nur meine eigenen Versuche sind völlig logisch und klar.... 
(Ironie aus) Übrigends sehen es meine Kollegen genauso.
Versuch doch mal, die in den Tutorialsbesschriebenen Programme 
abzuarbeiten. Soviel Code ist's ja nicht und man kann sehr leicht 
nachvollziehen, was da geschieht. Hast du die Timer verstanden, ist's 
mit dem Blinken kein Problem mehr. Dafür ist eine XOr Verknüpfung 
bestens geeignet. Ich habe mir in meine Programme ein Blink-Maske 
gebaut.
1
LDS R10, Blink_Mask ; Register 10 mit Variable laden
2
LDI R11, 0b11111111 ; Register 11 mit logischen 1sen belegen 
3
(nicht wegen dem Format meckern, ich weiß, das es auch anders geht)
4
EOR R10, R11        ; XOr mit 1 ergibt in Variable andere Bitlage
5
STS Blink_Mask, R10 ; Variable zurückschreiben
6
LDS R11, Ausgabe    ; Ausgabewert holen
7
AND R11, R10        ; Und BlinkMaske
8
STS Ausgabe         ; und zurückschreiben, Ausgabe erfolgt in eigener UP
Damit erhälst du eine Blinkende Ausgabe, wenn du diese Zeilen in 
bestimmten Zeitintervallen aufrufst.
Gruß oldmax

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.