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
>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!
;*********************************************************************** *** ;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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.