Forum: Mikrocontroller und Digitale Elektronik Timer im Tiny13


von Thorsten F. (thorsten)


Lesenswert?

Moin moin

Irgendwie habe ich gerade leichte schwierigkeiten den Timer im Tiny13
für mein Programm richtig zu verwenden.

Der Codeauszug:

interrupt:
  in savesreg,sreg
  inc r21
  cpi r21,10
  brne _int0
  sbr flags,refresh_display
  clr r21
_int0:
  out sreg,savesreg
  reti

Stück aus dem hauptsprogramm:

ende:
  sbrc flags,refresh_display
  rjmp mai0
  rjmp ende

Das ganze soll alle 10 Interrupts halt das refresh_display bit setzen
in einem selbstgebastelten Flag register, damit das Hauptprogramm das
display mit neuen Daten füttert.

Das tolle ist: es geht nicht :)

wenn ich in der interrupt routine "manuell" ein zeichen immer wieder
auf das display ausgebe, funktioniert das einwandfrei. ergo= der
timerinterrupt funktioniert.

allerdings halt nicht mehr in dieser obigen kombination.

Umgebung: Tiny13,AVR Studio,PonyProg

von Hannes L. (hannes)


Lesenswert?

Mir ist aufgefallen:

  sbr flags,refresh_display

Richtig wäre:

  sbr flags,1<<refresh_display

sbr/cbr erwartet nicht die Bitnummer (wie sbrs/sbrc) sondern die
Bitmaske...

Den Rest des Codes habe ich nicht geprüft.

...

von Thorsten F. (thorsten)


Lesenswert?

Nabend

Danke Hannes. Das war der eine Grund.
Der andere war, dass SBR REG,0 nicht funktioniert, sondern dass SBR
REG,1 das Bit "0" anspricht.. somit war auch noch in meinen
Definitionen ein Fehler.

Funktioniert jetzt, danke.

mfg

von Hannes L. (hannes)


Lesenswert?

Na der zweite Grund entspricht doch dem Ersten...
Ist doch das gleiche Problem, nur eben mit Zahl statt mit Platzhalter.


Aber tröste dich, das passiert mir auch gelegentlich. Jedenfalls freut
es mich, dass es nun funktioniert.

Bit- & Bytebruch...
...HanneS...

von Thorsten F. (thorsten)


Lesenswert?

ne ich glaub das verstehst du jetzt falsch..

in meiner header datei war "refresh_display" als "0" definiert.
weils "bit 0" ansprechen sollte..

die funktion SBR setzt das bit 0 allerdings wenn mann SBR REG,1
benutzt..

ich zählte von 0-7, SBR zählt anscheinend von 1-8.

mfg

von Hartmut Gröger (Gast)


Lesenswert?

Hi

Esgibt einen Unterschied zwischen den Befehlen SBI und SBR (abgesehen
vom Ziel). Bei SBI gibt der Parameter die Bitnummer (0..7) an.
Der Parameter von SBR ist eine Bitmaske (0..255). Das heisst wenn du 0
benutzt wird kein Bit gesetzt. Der Wert 1 den du dann benutzt hast
entspricht der Maske für Bit 0.

MfG HG

von Hannes L. (hannes)


Lesenswert?

@Hartmut:
Danke, genau das meine ich die ganze Zeit...

Thorsten:
Du solltest öfters mal die Online-Hilfe zu AVR-Studio benutzen. Cursor
auf einen (unklaren) ASM-Befehl setzen und F1 drücken. Das ist manchmal
sehr aufschlussreich. Leider kommt man damit nicht an die Hilfe zu den
Direktiven und Operatoren, die erreichst du aber über den Menüpunkt
HELP.

Bit- & Bytebruch...
...HanneS...

von Thorsten F. (thorsten)


Lesenswert?

Moin

Okay ich denke ich habs jetzt auch verstanden, was Ihr meint. Danke
euch.

Bei unklaren Befehlen hab ich mir bis jetzt immer das Atmel Datenblatt
mit dem relativ ausfühlich beschriebenen Befehlssatz angeschaut.
Werds auch mal mit der Hilfe probieren.

mfg

von Mark S. (struberg)


Lesenswert?

SBR ist in Wirklichkeit nur ein bitwise OR.
CBR ein bitwise AND

sbr R23, 8
und
ori R23, 8

werden zB beide auf 0x6078 übersetzt.

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.