Assembler Tiny2313 und Timer0 (evtl. für Anfänger)

Status
Für weitere Antworten geschlossen.
Hi
Kein 1mSek-Flag. Das macht nicht wirklich Sinn, aber wenn du eine ISR hast, die jede mSek. aufgerufen wird, dann zähl halt bis 100, das passt in ein Byte. Dann setzt du ein Bit und hast ein Flag für das Hauptprogramm, welches alle 1/10 tel Sekunden gesetzt wird. Nun kannst du im Hauptprogramm daraus bilden was du willst. Diese Zeitbasis ist so genau, wie es dir der Quarz oder Taktgeber vorgibt. Im Prinzip hast du ja recht, ob ich 5 Sek oder 4, 9921 Sek. auf irgend etwas warte, ist egal. Aber diese Zeitbasis ist nur für diesen Zweck geeignet, für eine andere Anwendung kann sie bereits zu ungenau sein. Warum dann nicht gleich einen "richtigen" Zeittakt bilden. Der ist dann aber immer brauchbar.
Gruß oldmax
 
Hallo Leute,
ich kämpfe immer noch mit LotadaC Blockschema "clockint2".
Was mir logisch wiederspricht, ist das ich die .equ fuenfsecunden=19 verwenden soll.
Das Blockschema zeigt doch unterschiedliche Konstanten.
Zu Beginn temp1=>69, dann <69, dann <46, dann <23 (evtl. für Konst. 23 gedacht).
für 19 würde es dann so aussehen.
temp1=>57, <57, <38, <19
Die Entscheidung zu Beginn habe ich versucht, aber es gelingt nicht.
So wie ich lese, befinden sich die Bits 0-5 im Status-Register zu Beginn, also Reset auf LOW.
Also zurück gesetzt. In der ISR wird temp1 dekr. In der loop-Schleife vergleiche ich mit
cpi temp1 mit >57 (doch nicht fuenfsecunden, oder?)
Ist der Vergleich da, werden jetzt die Bits 0-5 vom Status-Register gesetzt.
brsh wacht auf das Status-Register, und bei gesetzten Bits von SREG (hier schwimme ich schon)!
Im Buch steht "brsh...Verzweigung bei C=0 unsigned größer / gleich"
mh... das soll nun einer verstehen!
Dann müßte ich doch bei Carry=0 weiter zur nächsten Entscheidung springen,
und PB0-PB2 nicht setzen, dies erst dann, wenn Carry=1.
D.h. temp1 ist zu Null dekrementiert worden.

Ich hatte vor ca. 40 Jahren (Fa. Hauni in Hamburg) mal einen Vorgesetzten und der brachte
uns in einer kleinen Gruppe die ersten Gehversuche mit einen Controller von Intersiel bei.
Die Fa. spendierte für jeden von uns einen Bausatz.
Und der sagte "ihr müßt nachts von träumen, es darf euch nicht mehr loslassen".
So weit bin ich jetzt wier!

Aber wenn was nicht läuft steigt man erst richtig ein.

Grüße

Rolf
 
Hi
Ich hab jetzt nicht alles nochmal genau nachgelesen, aber irgendwo wolltest du 5 Sekunden haben. Die 19 ergibt sich aus folgender Gleichung:
1
---------------------= 4,98.... Sekunde
1000000/1024/255/19

Gruß oldmax
 
Hallo Oldmax,
ja, so ist es!

t=1/f...=1ySek. x 1024 x 255 = 261mSek. x 19 = 4,96 Sekunden.

Ein Erfolg habe ich, nach Reset leuchten nach 5 Sek. PB0-PB2

Das Ganze sieht so aus:

.INCLUDE "tn2313def.inc"

.def akku=r16
.def temp1=r17
.equ fuenfsekunden = 19

rjmp reset ; Reseteinsprung
.ORG OVF0addr ; Interrupt-Vektor
rjmp TIMER0_OVF ; Sprung zur ISR


reset: ldi akku,(1<<PB2)|(1<<PB1)|(1<<PB0)
out DDRB,akku ;Datenricht. PB0 - PB2=Output


; Timer0 initialisieren:
ldi akku,(1<<CS02)|(1<<CS00) ;Pr.= 1024
out TCCR0B,akku
ldi akku,(1<<TOIE0) ;Register TIMSK (Bit1=1)
out TIMSK,akku
sei ;Timer frei



ldi akku,0
out PORTB,akku


ldi temp1,38
weiter1: cpi temp1,fuenfsekunden ;vergleiche r17
; mit Konst.19
;wenn r17=19, setze C in SREG (=1)

brsh weiter1 ;wenn C=0 Verzweigung nach weiter1:

ldi akku,(1<<PB2)|(1<<PB1)|(1<<PB0)
out PORTB,akku ;PB0 - PB2 = High


loop: rjmp loop

;Interrupt-ISR

TIMER0_OVF:

dec temp1 ;Dekrement (r17-1)
brne weiter ;nach weiter, wenn C=0

;wenn r17=0 >> hat C=1 keine Verzweigung >> nach ldi.....
ldi temp1,fuenfsekunden
weiter: reti

Grüße

Rolf

ich warte immer noch auf:
Geändert von Dirk (02.08.2012 um 09:00 Uhr) Grund: Bitte unbedingt Code-Tags verwenden. Der Beitrag ist sonst nicht so gut zu lesen!
 
ich warte immer noch auf:
Geändert von Dirk (02.08.2012 um 09:00 Uhr) Grund: Bitte unbedingt Code-Tags verwenden. Der Beitrag ist sonst nicht so gut zu lesen!

Hallo Rolf,

auf was wartest du? Soll ich deinen Beitrag ändern und dort Code-Tags einbauen? :confused:
 
"QUOTE=Rolf.H;24828]...Was mir logisch wiederspricht, ist das ich die .equ fuenfsecunden=19 verwenden soll.
Das Blockschema zeigt doch unterschiedliche Konstanten.
Zu Beginn temp1=>69, dann <69, dann <46, dann <23 (evtl. für Konst. 23 gedacht)...[/QUOTE]
Ja, die Schemata sind noch von den 23 ausgegangen, insofern...
...für 19 würde es dann so aussehen.
temp1=>57, <57, <38, <19...
Die anderen Zahlen sind ja das 2 bzw 3fache der 19 (23) - deswegen der Vorschlag, das als Assembler-Konstante zu vereinbaren, und dem Präprozessor das ausrechnen der vielfachen zu überlassen - dann kan man hinterher am einfachsten dran drehen...
...Die Entscheidung zu Beginn habe ich versucht, aber es gelingt nicht...
?
...So wie ich lese, befinden sich die Bits 0-5 im Status-Register zu Beginn, also Reset auf LOW.
Also zurück gesetzt. In der ISR wird temp1 dekr. In der loop-Schleife vergleiche ich mit
cpi temp1 mit >57 (doch nicht fuenfsecunden, oder?)
Ist der Vergleich da, werden jetzt die Bits 0-5 vom Status-Register gesetzt.
brsh wacht auf das Status-Register, und bei gesetzten Bits von SREG (hier schwimme ich schon)!
Im Buch steht "brsh...Verzweigung bei C=0 unsigned größer / gleich"
mh... das soll nun einer verstehen!
Dann müßte ich doch bei Carry=0 weiter zur nächsten Entscheidung springen,
und PB0-PB2 nicht setzen, dies erst dann, wenn Carry=1.
D.h. temp1 ist zu Null dekrementiert worden....
Ohje - hier kommt mehreres zusammen...
also, das ">57" steht für "mehr als 15 sekunden" (>(3*19)). Der Countdown arbeitet ja immer wieder 4 Abschnitte ab: (4*5s..3*5s), (3*5s..2*5s), (2*5s..1*5s), (1*5s..0+5s) klar? Die 5s stecken in der Konstante (19 bzw 23) und wo die Vielfachen stecken, sollte auch klar sein. Wenn der Countdown 0 erreicht, wird er in der ISR mit (4*5s) neu geladen. Sind damit die Vergleichskonstanten klar?
Zu den Vergleichen: "Du" schreibst selbst nicht im SREG irgendwelche Werte um! Das überläßt Du den Vergleichen.
CPI temp1, 57 macht folgendes: Der Controller berechnet (intern und binär) temp1-57. Das Ergebnis wird nirgendwo hingeschrieben, aber einige Bits im SREG werden manipuliert. für uns ist das Carry (C-flag) interessant. Das wird nämlich genau dann gesetzt, wenn 57>temp1. Für temp1>=57 ist das Carry 0 (cleared).
BRSH - Branch if Same or Higher - springe bei "größer/gleich" (binär, ohne Vorzeichen) hat den Opcode: 1111_01kk_kkkk_k000.
BRCC - Branch if Carry Cleared - springe bei Carry=0 hat den Opcode: 1111_01kk_kkkk_k000. fällt Dir was auf?
Wenn das Carry=0 ist, also der Countdown >=57, könntest Du mit BRCC/BRSH irgendwohin springen, wo die Beinchen "angeschaltet" werden.
Sinniger ist es, nach dem Vergleich+Sprungbefehl den "Beinchen-setz-code" anzuordnen, und ggf mit BRCS/BRLO zu überspringen (wenn temp1<57, also "temp1 lower 57" bzw das Carry durch CPI gesetzt wurde (Carry Set).
Noch ein Kommentar zu Variante3:
Die 3 "temp1<K" Vergleiche müssen andersrum angeordnet werden, da sonst bereits der erste Vergleich dei anderen beiden "miterschlägt", und diese nie abgefragt werden.
 
Hallo Rolf
Nun, ist dein Programm jetzt völlig tatenlos ?
Was glaubst du, passiert an dieser Stelle
Code:
Loop: RJMP Loop
:stupid:
Ach ja, die ISR.... nun ja, sie zählt Temp1 fleißig von 19 nach Null. :hahaha:
So langsam solltest du mal ein "Delete" auf dein Programm anwenden und mal nacharbeiten, was in meinem Beitrag steht, bzw. die Hinweise und Tipps aus dieser Diskussion versuchen nachzuvollziehen. Das ist völliger Murks, immer nur ein wenig am eigenen Code zu schrauben, ohne zu wissen, was da wirklich passiert. :rolleyes:
Dann passiert halt sowas
Code:
Loop: RJMP Loop

Gruß oldmax
 
Status
Für weitere Antworten geschlossen.

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)