www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik mega2561 neue timer registernamen


Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
gibt es eigentlich schon ein paar hier die mit dem mega256(0/1) 
arbeiten? Ich hab seit ca. einer woche ein modul mit diesem µC und komme 
ganz gut klar, allerdings verstehe ich die Änderungen bei den Timern 
nicht. Kriege nichtmal mein einfaches beispiel vom mega32 geportet. Weiß 
jemand rat?

#define CPU   16000000
#define TIMER   65535 - (CPU/1024)

volatile int second=0;

void timer_init (void) {
    TCCR1B = (1<<CS12) | (1<<CS10);
    TIMSK |= (1<<TOIE1);
    TCNT1 = TIMER;
    sei ();
}

SIGNAL (SIG_OVERFLOW1)
{
  second++;
  TCNT1 = TIMER;
}

int main()
{
  timer_init();

    TCCR0 = (_BV(WGM00) | _BV(COM01) | _BV(COM00) | _BV(CS00));

    for(;;);
    return 0;

}

Danke :).

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SIGNAL (SIG_OVERFLOW1)


Das ist "veraltet". In WinAVR wird das anders beschrieben: (glaub das 
war so)
ISR(USART_TXC_vect)

gucke aber mal lieber nach

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aha, ist mir nie aufgefallen. Ich habe versucht das mit der erhältlichen 
Tabelle zu porten, es lässt sich auch kompilieren nur leider zeigt es 
keinerlei funktion.

so sieht der port aus:

#define CPU 8000000
#define TIMER 65535 - (CPU/1024)

volatile int second=0;


SIGNAL (SIG_OVERFLOW0) {
  second++;
  TCNT0 = TIMER;
}
void timer_init (void) {
    TCCR1B = (1<<CS12) | (1<<CS10);
    TIMSK0 |= (1<<TOIE1);
    TCNT0 = TIMER;
    sei ();
}

int main()
{
  timer_init();
    TCCR0A = (_BV(WGM01)| _BV(WGM00) | _BV(WGM01) | _BV(COM0A1) | 
_BV(COM0A0) | _BV(COM0B1) | _BV(COM0B0));

    for(;;);
    return 0;
}

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define CPU 8000000
#define TIMER 65535 - (CPU/1024)
/* da kommt nicht sinnvolles bei raus, der avr-gcc
rechnet konstanten per default als 16Bit-Ints
erster schritt ist also: */
#define CPU 8000000UL //das u ist nicht unbedingt notwendig, aber das L!
#define TIMER 65535 - (CPU/1024)
// eigentlich ist F_CPU üblich:
#define F_CPU 8000000UL
Und das sei() in der init-Funktion halte ich zumindest für keine so gute 
Idee, wenn die Initialisierung noch nicht fertig ist.

hth. Jörg

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mag wohl sein, aber mit dem Mega32 funktioniert es immer blendend, 
dennoch danke für die korrektur war mir dabei nicht so genau sicher. 
Weiß denn keiner wie das mit dem mega2561 geht? Ich versteh die Tabelle 
im Datenblatt nicht besonders, gerade weil ich nicht genau weiß welcher 
von den neuen Timern wie funktioniert..

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum TCNT_NULL in der ISR?

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Tabelle ist doch wirklich leicht zu verstehen!

scnr --Jörg

ps.: Ich hab keine Ahnung welche Tabelle du meinst

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
murks zwischen Timer 1 und Timer 0

Timer0 wird konfiguriert und kriegt ne ISR, Timer kriegt den Takt.
thumbs up

Timer0 ist übrigens nur 8bit-->dein TIMER #define

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.atmel.com/dyn/resources/prod_documents/2549S.pdf Seite 10 und 
folgende, wenn das alles so falsch ist warum berichtigt es dann keiner? 
Ich verstehe es eben noch nicht so ganz.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Philipp,
mir ist nicht mal klar, was du eigentlich machen willst. Aber auf jeden 
Fall solltest du dich auf EINEN Timer festlegen. Der AVR hat mehrere, 
Timer0, Timer1, Timer2 und Du arbeitest mal mit dem einen ein bisschen, 
dann mit dem anderen. Aber keiner wird zuende/richtig initialisiert.

statt  TCCR1B = (1<<CS12) | (1<<CS10);

ist auf JEDEN FALL

 TCCR0B = (1<<CS12) | (1<<CS10);

besser! :)

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ist allerdings möglich dass keine vollständige initialisierung 
stattfindet, im moment versuche ich das beispiel für den mega32 auf den 
mega2561 zu portieren, es soll mit jedem überlauf die die second 
variable erhöhen und somit eine einfache Uhr bzw. die Laufzeit 
darzustellen.

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so ich habe jetzt eine funktionierende version hinbekommen, da war 
wirklich eine kleine verwechslung der register drin, danke nochmal, 
bitte korrigiert den code wenn er dennoch falsch ist:

#define CPU 8000000UL
#define TIMER 65535 - (CPU/1024)

SIGNAL (SIG_OVERFLOW1) {
  second++;
  TCNT1 = TIMER;
}

void timer_init (void) {
    TCCR1B = (1<<CS12) | (1<<CS10);
    TIMSK1 |= (1<<TOIE1);
    TCNT1 = TIMER;
    sei ();
}

int main()
{
  timer_init();
    TCCR0A = (_BV(WGM00) | _BV(COM0A1) | _BV(COM0A0) | _BV(CS00));
}

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Bit CS00 ist in TCCR0B nicht T...A. ;-)
Beim Timer1 wäre der CTC-Modus besser geeignet, als manuell das 
TCNT-Register nachzuladen:
    // timer1 zählt bis:
    ICR1 = F_CPU/1024;
    // Mode 12, "CTC mit ICR als TOP", prescaler 1024
    TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS12)|(1<<CS10);
Achja, schreib doch entweder die ganzer Timer initialisierung in eine 
(static inline) Funktion, oder alles in main(), aber so halb-und-halb 
ist irgendwie unschön ;)

hth. Jörg

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was macht denn die main NACH der timer initialisierung...?
;-)

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Matthias:
> Was macht...
Wir sehen hier doch nur das gekürzte Programm, in echt gibt's da 
natürlich 'ne Endlosschleife ;-)

scnr --Jörg

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.