mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Löschen eines Bits löscht auch ein ganz anderes Bit. Weshalb?


Autor: Schmidt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ihr Lieben,

beim Versuch den Timer1 des ATMega8515 zu benutzen ist mir Dank des 
AVRStudio Simulators folgendes aufgefallen:
...
(1) TIMSK |= (1<<TOIE1); //Interrupt bei Überlauf Timer/Counter1 erlauben
(2) TIMSK &= (1<<OCIE1A); //Kein Interrupt bei Vergleichswert A (Timer/Counter1)
...

Befehl (1) wurde korrekt ausgeführt.
Befehl (2) löschte auch das vorher gesetzte Bit TOIE1.

Somit funktioniert mein Mikrocontroller natürlicht nicht mehr wie er 
soll.

Ich habe im Datenblatt eine Erklärung gesucht, sie jedoch nicht 
gefunden. Dabei habe ich allerdings nicht jede der 251 Seiten gründlich 
durchgelesen.



Kann mir jemand dieses Verhalten erklären?


Ich habe Befehl (2) einfach auskommentiert, da nach einem Reset sowieso 
alle Werte auf 0 gesetzt sind. Schreibt man nur einsen, dann geht alles 
glatt. So funktioniert es.

Was jedoch, wenn ich nun nach einiger Zeit meinen Timer1 umstellen und 
anders nutzen möchte?


Es scheint nun also nicht zu funktionieren die entsprechend zu ändernden 
Bits auf 1 oder 0 zu setzen.
Aber kann ich mir andersherum sicher sein, dass bei einem setzen eines 
Bits auf 0 alle Bits gelöscht werden? Kann ich mich darauf verlassen und 
danach nur noch die einsen schreiben?

Um sicher zu gehen, dass alles wie gedacht gesetzt wird müsste ich 
zuerst alle nullenden Befehle aufrufen und dann erst all jene, die auf 1 
setzen.

Das führt zu einem Recht unübersichtlichem Kuddelmuddel das ich gerne 
vermeiden wollen würde.
Oben wird ein Teil der Clockselect Bits auf Null gesetzt, dann kommt 
etwas ganz anderes was auf null gesetzt wird, und noch viel viel weiter 
unten wird dann ein anderer Teil der Clockselect Bits auf eins gesetzt.
Ein unangenehmes Durcheinander würde das.


Ich hoffe auf fachkundige und erleuchtende Erklärungen.

Vielen Dank
Schmidt

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>(1) TIMSK |= (1<<TOIE1); //Interrupt bei Überlauf Timer/Counter1 erlauben
>(2) TIMSK &= (1<<OCIE1A); //Kein Interrupt bei Vergleichswert A

(2) TIMSK &= ~(1<<OCIE1A); //Kein Interrupt bei Vergleichswert A

Autor: Chris L. (kingkernel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchs mal damit:
TIMSK &= ~(1 << OCIE1A);

Autor: Testuser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TIMSK &= ~(1<<OCIE1A)

Autor: Chris L. (kingkernel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei
 TIMSK &= (1<<OCIE1A);
löschst du alle Bits bis auf das in OCIE1A. Mit ~ kehrst du das Byte 
bitweise um und behälst alle, bis auf dieses

Autor: Schmidt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach schade...

..schade, dass es wieder mal ein öder "Ein-Zeichen-Fehler" war.

Ich dachte es würde viel spannender werden und tiefer in die Materie 
gehen.

Vielen Dank für eure Antworten.

Gruß
Schmidt

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich dachte es würde viel spannender werden und tiefer in die Materie
>gehen.

Wenn du was spannendes willst:

In der Mainloop

if(wert1 == 0) PORTB |= 0x03;
else PORTB &= ~0x03;

In einem Interrupt:

if(wert2 == 0) PORTB |= 0x0C;
else PORTB &= ~0x0C;

Viel Spaß beim nachdenken;)

Autor: Schmidt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
> Wenn du was spannendes willst:
>
> In der Mainloop
>
> if(wert1 == 0) PORTB |= 0x03;
> else PORTB &= ~0x03;
>
> In einem Interrupt:
>
> if(wert2 == 0) PORTB |= 0x0C;
> else PORTB &= ~0x0C;
>
> Viel Spaß beim nachdenken;)

Worin besteht das Rätsel?

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.