Forum: Mikrocontroller und Digitale Elektronik Daten einlesen über ICP arbeitet nicht korrekt


von Semi (Gast)


Lesenswert?

Hallo Liebes Forum,
habe ein Problem:
ich versuche mit dem ATMEGA 8 ein Datensignal über das ICP-Pin 
einzulesen.
von dem Datenstrom benötige ich aber jeweis die erste Steigende Flanke 
die fallende Flanke und die darauffolgede steigende.
    _    _
 __|  |__|

   |  |  |

Mit diesen zwei Bit will ich dann ein Zeitstempel speichern.
leider funzt mein code nicht ganz oder nicht immer. Einige Bits die ich 
einlese sind genau so wie ich sie haben will und alle paar bits ist es 
verschoben. Die Bitzeit ist ca. 20µs.
woran kann das liegen????
ein Abschnitt aus dem Code ist im Anhang.
Wäre auch über andere Lösungsmöglichkeiten sehr Dankbar.
Viele Grüße
Semi

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

>leider funzt mein code nicht ganz oder nicht immer.
Der würde schon sehr interessieren...
>ein Abschnitt aus dem Code ist im Anhang.
Nee, isser nicht!

von Semi (Gast)


Lesenswert?

;*********************************************************************** 
***
;Seicherreservierung
INIT:

ldi  buffer, LOW(RAMEND)   ;Initiate Stackpointer
out  SPL, buffer     ; wegen Interrupts und Unterprogr.
ldi  buffer, HIGH(RAMEND)
out  SPH, buffer
;*********************************************************************** 
***


START_ZEICHEN:
;*********************************************************************** 
***
;Manuelle ID Eingabe
ldi  buffer, 0x05
sts  ID_HIGH, buffer
ldi  temp, 0x0f
sts  ID_LOW, temp

;*********************************************************************** 
***

clr  NULL
clr  High_Test
clr  Low_Test
clr  BUSRUHE_GELESEN
ldi  buffer, 0xfe
out  ddrb, buffer  ;Port B wird Ausgang
ldi  buffer, 0xff  ;PortB Pin 0 ist Eingang
out      ddrd, buffer  ;Port d wird Ausgang




;*********************************************************************** 
***
; Die Counter werden aktiviert und zählen jetzt los.
; Damit die 8-Bitzeiten Busruhe eingehalten werden können wird
; in das OUTPUT COMPARE REGISTER(OCR1B) ein Wert geladen

out  ocr1ah, buffer
out  ocr1al, buffer

ldi      buffer, (1<<OCIE1B)  ;Es werden Interrupts zugelassen für
out  timsk, buffer     ;Compare Counter B
ldi   buffer,(1<<COM1B1)
out   tccr1a, buffer     ;Compare Counter B wird aktiviert
ldi   buffer, (1<<CS10)
out  tccr1b, buffer
sei
ldi  buffer, BUSRUHE_HIGH
out  ocr1bh, buffer
ldi  buffer, BUSRUHE_LOW
out  ocr1bl, buffer


;*********************************************************************** 
***
;Diese Schleife wird so oft durchlaufen bis die 8_bitzeiten abgelaufen 
sind.
;Sollten während der Busruhe von 8-Bitzeiten eine Low-Flanke auftreten,
;wird der Counter auf Null gesetzt.
;Hiermit wird Sichergestellt, dass die Messung nicht in der Mitte eines 
Frames anfängt

LOOP:
sbi  portd,6
sbic   PINB,0
rjmp  RUECKSETZEN

rjmp  LOOP

RUECKSETZEN:

out  tcnt1h, NULL
out  tcnt1l, NULL
rjmp  loop

;*********************************************************************** 
***
;Einfache Warteschleife

START:
sbi  portd,6
rjmp   START

;*********************************************************************** 
***
;Erstes Bit nach der Busruhe wurde eingelesen.
;Das INPUT CAPTURE REGISTER(ICP) wird nun auf steigende Flanke
;gesetzt und der Counter wird damit ein Zeitstempel für
;das OUTPUT COMPARE REGISTER A erstellen. Dieser Zeitstempel
;dient später zur Messung der Bitzeiten.

OUTP_COMP_B_INT:

in  buffer, SREG
push   buffer
cli
out  tcnt1h, NULL  ;Der Counter wird auf ein Anfagswert
ldi  buffer, RELOAD_COUNTER  ;gesetzt
out   tcnt1l, buffer
ldi   buffer,(1<<ticie1)    ;Es werden Interrupts zugelassen für
out      timsk, buffer    ;Input Capture
ldi  buffer, (1<<ICF1)
out  TIFR, buffer
ldi   buffer,(1<<CS10)
out   tccr1b, buffer    ;Capture auf fallende Flanke
inc  BUSRUHE_GELESEN
ldi  counter, 0x00
pop  buffer
out  SREG,buffer

sei

ret

;*********************************************************************** 
***

ICP_INT:


in  buffer, SREG    ;Status-Register Sichern
push   buffer      ;und auf derm Stack ablegen
cli        ;Globale Interrupt deaktiviere
inc   Counter
cpi  Counter, 0x01    ;Überprüfen, welches Bit eingelesen wurde
breq  WECHSEL_EINS        ;
cpi  Counter, 0x02        ;
breq  WECHSEL_ZWEI        ;



WECHSEL_EINS:

cbi  portd,6
out  tcnt1h, NULL    ;Der Counter wird auf ein Anfagswert
ldi  buffer, RELOAD_COUNTER  ;gesetzt
out   tcnt1l, buffer    ;
ldi   buffer, (1<<ICES1)|(1<<CS10);
out   tccr1b, buffer    ;Capture auf steigende Flanke
pop  buffer      ;Zurückholen des Status-Registers vom Stack
out  SREG,buffer    ;Rückladen
sei
reti

WECHSEL_ZWEI:
cbi  portd,6
ldi   buffer,(1<<CS10)    ;Capture auf fallende Flanke
out  tccr1b, buffer
clr  counter
pop  buffer      ;Zurückholen des Status-Registers vom Stack
out  SREG,buffer
sei        ;Globale Interrupt zulassen


rjmp  INIT

/*
;*********************************************************************** 
***

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.