Forum: Mikrocontroller und Digitale Elektronik AVR Studio Simulator Timer ???


von Tobias (Gast)


Lesenswert?

Da meine Harware noch nicht fertig ist, arbeite ich zur Zeit mit dem AVR
Studio 4 Simulator. Controller ist der ATMEGA2561.
Ich habe einen 16Bit Timer zur PWM erzeugung Initialisiert und er zählt
auch und zum Compare Match wird der PIN auf High gesetzt. Wie es auch
sein sollte. Erreciht der Timer jedoch das TOP Level wird der PIN nicht
wieder auf LOW gesetzt. Ist das ein BUG im Smulator? Kennt das jemand,
oder ist da einfach ein Fehler, den ich nicht blicke?
Compiler ist der CodeVison AVR 1.25.1.

Hier der C-Code

#include <mega2561.h>

void main()

{
    #asm("sei");

    GTCCR=0x00;

    //Timer für Soundausgabe über PWM
    // PB6 OC1 SIG_PWM 16BIT
    TCCR1A= 0b00110011;     //Fast PWM Mode, Set OC1B on Compare Match,
clear on TOP. OC1A/C not active
    TCCR1B= 0b00011000;     //No Clock, Timer Stoped. Fast PWM Mode
    TCCR1C= 0b00000000;     //only active if "non PWM Mode"

    OCR1AH= 0x00;           //Define TOP Value
    OCR1AL= 0x7A;           //
    OCR1BH= 0x00;           //Define Compare Level
    OCR1BL= 0x56;
    TIMSK1= 0b00000000;     //Timer Overflow Interrupt enabled

    TCCR1B|=0x01;           //Starts the timer

    while(1)
    {
    #asm ("nop");
    }
}

Vielen Dank,

Tobias

von johnny.m (Gast)


Lesenswert?

Fehler finde ich im Code jetzt nicht. Der Timer scheint nach Abgleich
mit dem Datenblatt korrekt initialisiert zu sein. Ein Bug im
AVRStudio-Simulator ist durchaus denkbar. Wäre nicht der erste.

Es wäre (für die Zukunft) sinnvoll, wenn Du die Steuerregister nicht
mit binären Bitmasken beschreibst sondern die Namen der Steuerbits
verwendest. Das macht den Code wesentlich leichter lesbar. Also z.B.

TCCR1B = (1 << WGM13) | (1 << WGM12);
statt
TCCR1B= 0b00011000;


> TIMSK1= 0b00000000;     //Timer Overflow Interrupt enabled

Vielleicht auch drauf achten, dass der Kommentar zum Code passt, und
nicht wie hier Verwirrung stiftet...

BTW:
Hinter Präprozessor-Direktiven kommt kein Semikolon (in diesem Fall
hieße es #asm("nop")). Ist hier nicht schlimm, aber es kann, wenn man
nicht drauf achtet, zu Fehlern führen, v.a. bei #define.

von Tobias (Gast)


Lesenswert?

Danke erst mal für die Tips. Das mit dem Kommentar kommt durch das
ständige Probieren und Ändern.
Der Code ist echt viel besser lesbar wenn man das so macht.
Also lass ich mich dadurch erst mal nicht beirren und warte auf die
Hardware.

von daniel (Gast)


Lesenswert?

Hi,
ja manchmal gibt es Fehler im Simulator. Bei mir trat kein Interrupt
auf obwohl einer auftreten sollte.
Wollte es testen ging aber nicht in meinem AVR-Studio.

daniel

von Tobias (Gast)


Lesenswert?

Macht es Sinn den BUG Jemanden mitzuteilen, damit da im nächsten Update
geändert wird, oder kümmert sich da eh keiner drum?

von Cathrel (Gast)


Lesenswert?

Ja, es macht Sinn, denn die Fehler (auch in Datenblätter) werden
korrigiert. Du musst einfach zuerst in der "known errors" des
Programm schauen ob er bereits gelistet ist.

von johnny.m (Gast)


Lesenswert?

Über den Timer 1 steht nichts unter 'Known Issues'.
Wenn es Probleme mit AVRStudio gibt, schreibt man sinnvollerweise
direkt eine EMail an avrbeta@atmel.com
Das kommt dann gleich an der richtigen Stelle an. Der Support für
AVRStudio läuft über ATMEL Norwegen:
http://www.atmel.no/beta_ware/
Da gibts auch immer die neuesten Updates.

von crazy horse (Gast)


Lesenswert?

hast du auch den vom Compiler/Wizzard erzeugten Code mit dem Datenblatt
verglichen, insbesondere TCCR1? Auch da könnte natürlich schon ein
Fehler vorliegen, noch dazu, da der support für den 2561 noch recht neu
ist?

von Tobias (Gast)


Lesenswert?

Also die Adressen im Header stimmen mit dem im Datenblatt überein. Es
Funktioniert ja auch ein Mode, bei dem der Ausgangspin im Compara Match
Toggelt. Es könnte nun noch am Compiler liegen, dass der bei der
Umsetzung von C in Assembler was falsches macht, aber davon gehe ich
nicht aus, oder sollte man das auch überprüfen?

von Tobias (Gast)


Lesenswert?

Man kann sich ja im Simulator auch alle Register ansehen und die
Initialisierung des Timers stimmt mit meiner in C Code überein.

von crazy horse (Gast)


Lesenswert?

darum gehts doch gar nicht, sondern darum, was der code-wizzard aus der
von dir gewünschten Funktion gemacht hat. Diese Zuordnung
Funktion->TCCR1A,TCCR1B kann durchaus Fehler enthalten. Entweder
Unachtsamkeit beim Compilerbauer oder Benutzung von vorläufigen
Datenblättern.

von Tobias (Gast)


Lesenswert?

Ich hab den Code-Wizzard garnicht genutzt. Hab die Register nach den
Vorgaben im Datenblatt beschrieben.

von Tobias (Gast)


Lesenswert?

Der MEGA2561 ist außerdem garnicht im Code-Wizzard vorhanden

von crazy horse (Gast)


Lesenswert?

ok, dann ist das was anderes.

von ich (Gast)


Lesenswert?

Hallo

Hatte gleichen Fehler im Simulator. Hat mich ein paar Stunden Suche
gekostet. Trotzdem lief hardwareseitig alles korrekt. Am besten mit
Oszi anschauen, spart viel Zeit.

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.