Hallo zusammen,
MEIN AUFBAU:
-STK 500
-Mega8 4mHz ext. Oszillator (PB6)
-USB FTDI 232BM Schnittstelle (PD0/PD1)
-IR-Empfänger TSOP 1738 (PB0)
FUNKTIONSBESCHREIBUNG:
Habe mir einen Code geschrieben der per
Input Capture die abstände zwischen den flanken messen soll,
hierzu habe ich den Timer1 verwendet mit einem 1/64 Prescaler.
Das Hauptprogramm prüft ledeglich zwei flags und gibt dessen status an
portC auf LEDs aus. Abhängig von den Flags schiebt es daten aus zwei
registern auf den stack oder fängt an zuvor auf dem stack abgelegte
daten über usb zu senden.
Der Input-Capture-Interrupt sichert den MEsswert in
zwei registern, toggelt die Flanke, stellte den timer auf null und setzt
ein StatusFlag um zu signalisieren das sich die werte in den besagten
zwei registern geändert haben. Sobald der Interrupt abgearbeitet ist
schiebt das hauptprogramm den inhalt der register auf den Stack (hierbei
wird für jedes PUSH ein zähler um eins erhöht) und löscht das Flag
wieder.
Der Timer-Overflow-Interrupt setzt lediglich ein zweites status Flag
das signalisiert das der IR-Code vorbei ist (da zu viel zeit
verstrichen)
und die MEsswerte vom Stack per USART/FTDI-USB an den rechenr gesendet
werden können (für jedes POP wird der zähler wieder um eins veringert).
Es wird so lange gesendet bis der zähler auf null ist.
MEIN PROBLEM:
erstens kommen die Daten nicht alle am PC an, probleme mit dem FTDI
konnte ich auschliessen da über den RS232-Spare das selbe passiert.
zweitens toggelt mein Flag zum Senden der Daten in unregelmässigen
abständen jedoch deutlich sichtbar.
Denke mal das ich irgendwo im Programm einen denkfehler mache und
irgendwas nicht so funktionieren kann....bin dankbar für
verbesserungsvorschläge die das ganze zum laufen bringen
MEIN uC PROGRAMM:
(denke es ist ausreichen kommentiert)
>stellte den timer auf null
Da hat jemand ICP nicht richtig verstanden:
Beim ICP lässt man den Timer durchlaufen.
Sobald der ICP-Interrupt auftritt sichert man den Timerwert (der im ICR
steht) in einer Variable. Um die Zeit zwischen zwei Flanken zu
errechnen, muss man dann nur den älteren Wert vom neueren subtrahieren.
Den Timer lässt man schon in Ruhe weiter laufen.
Da ich von ASM wenig Ahnung habe, habe ich mir dein Programm nicht
angeguckt.
Hallo,
@STK500-Besitzer (Gast):
>Da hat jemand ICP nicht richtig verstanden:>Beim ICP lässt man den Timer durchlaufen.
naja, man muß nicht alles gleich zum Dogma erheben. ;-)
Wenn die zeitlichen Verhältnisse es zulassen, spricht auch nichts gegen
seine Lösung.
Allerdings würde ich mir dann in jedem Fall erstmal den Capturewert
besorgen, bevor ich am Timer rumprogrammiere und vielleicht damit einen
Captureinterrupt erzeuge.
Vor verlassen der IRQ-Routine würde ich deshalb auch das dessen
Interruptflag vorsichtshalber löschen.
Das vermutlich wichtigste aber: Du sicherst SREG nicht, veränderst aber
mit eor die Flags...
Gruß aus Berlin
Michael
hallo,
habe zum ersten mal was mit dem ICP gemacht, deswegen
hab ich das hier auch reingestellt.....um die fehlenden lücken zu
füllen^^
Zeitlich müsste alles hinkommen, habe den prescaler so gewählt das ich
die längste vorgesehene zeitspanne messen kann und ebenso die
kleinste...
@Michael
muss ich das SREG immer sichern bei interrupts?
habe das auch noch nicht ganz durchblickt...
Die Flags sind ja von mir selbst also nicht aus dem SREG
sonder r20....vielleicht hab ich ja generell bei
der registerwahl einen fehler gemacht
danke schonmal
für die infos
gruß ben