Hallo ich habe folgendes programm für einen ATmega8 geschrieben.
es soll pulsweiten mit einer pulslänge von 0,5ms messen
die genauigkeit ist allerdings alles andere als akzeptabel
ist an meinem programm irgendwas falsch?
vielen Dank Lutz
code:
include "m8def.inc" ;Definitionsdatei einbinden
.def save_sreg = r21
.def temp = r18
.equ CLOCK = 4000000
.equ BAUD = 19200
.equ UBRRVAL = CLOCK/(BAUD*8)-1
.equ Treset=0
; Baudrate einstellen
ldi temp, LOW(UBRRVAL)
out UBRRL, temp
ldi temp, HIGH(UBRRVAL)
out UBRRH, temp
ldi temp,0b10100110
out UCSRC,temp
ldi temp,0b00100010
out UCSRA, temp
; Stackpointer initialisieren
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
ldi temp, 0b11111110 ;0xFF ins Arbeitsregister r16 laden
out DDRB, temp ;Inhalt von r16 ins IO-Register DDRB
ausgeben
ldi temp, 0b11111100 ;0b11111100 in r16 laden
out PORTB, temp ;r16 ins IO-Register PORTB ausgeben
;ldi temp, 0b00000000 ;Port D als Input definiert
;out DDRD, temp
ldi temp, 0b01000001
out TCCR1B, temp ;Timer/Counter1 an und input capture bei
rising
edge
loop: in temp,TIFR ;Test ob Input capture event
sbrs temp,5
rjmp loop ;endlosschleife
ldi temp,HIGH(Treset) ;Counter zurücksetzen
out TCNT1H,temp ;(Achtung Highbyte und Lowbytereihenfolge
beachten)
ldi temp,LOW(Treset)
out TCNT1L,temp
ldi temp, 0b00000001 ;Capture auf falling edge
out TCCR1B, temp
ldi temp, 0b00100000 ;outp(1<<ICF1, TIFR);
sts $58,temp
step2: in temp,TIFR ;Test ob Input capture event
sbrs temp,5
rjmp step2
in r16,ICR1L ;Timerwert T1 speichern
in r17,ICR1H
ldi temp, 0b01000001 ;Capture auf rising edge
out TCCR1B, temp
ldi temp, 0b00100000 ;outp(1<<ICF1, TIFR);
sts $58,temp
step3: in temp,TIFR ;Test ob Input capture event
sbrs temp,5
rjmp step3
in r19,ICR1L ;Timerwert T2 speichern
in r20,ICR1H
;Ausgabe Pulsdauer y1(r16:r17) und y2(r19:r20)
ausgabe: rcall receive_loop ;Schleife zum Sendestart
mov temp,r16
rcall serout
mov temp,r17
rcall serout
mov temp,r19
rcall serout
mov temp,r20
rcall serout
ldi temp, 0b00100000 ;outp(1<<ICF1, TIFR);
sts $58,temp
rjmp loop
serout:
sbi UCSRB,TXEN ;TX aktivieren
sbis UCSRA,UDRE ;Warten bis UDR für das nächste
;Byte bereit ist
rjmp serout
out UDR, temp ;Übertragung temp
cbi UCSRB,TXEN ;TX deaktivieren
ret
receive_loop:
sbi UCSRB,RXEN
sbis UCSRA, RXC ;warten bis ein Byte angekommen ist
rjmp receive_loop
in temp, UDR
test: sbic UCSRA, RXC
rjmp test
cbi UCSRB,RXEN
ret
Was genau heißt "alles andere als genau" ? Was mich etwas verwundert: warum benutzt du keine Interrupts ? Ich habe auch mal Frequenzen über den ICP gemessen. Die Werte waren erst nach dem Bilden eines Durchschnittswerts relativ genau.
ich hab das mit den interrupts probiert...aber keine verbesserung gefunden...mit mittelwerten ist nicht so gut, da das ganze dann verdammt langsam läuft... ich habe hier abweichungen von umgerechnet 100-200 zähltakten des zählers bei einer flankenauswertung kann das sein?
Evtl hängt das damit zusammen, das du den Counter jedesmal resetet. Das macht man eigendlich, sondern läßt den durchlaufen und bilded differenzen. Das nächste ist evtl eine ungenaue Signalquelle, die du als Referenz nimmst - mitunter hilft dir ja der noise canceler. Damit bekommst du zwar die Signale verzögert, aber der Abstandsmessung tut es ja keinen Abbruch. Ich habe jedenfalls noch keine Probleme damit gehabt - wäre bei Zählern auch schwer zu glauben.
den noise canceler habe ich versucht, da bringt er mir im 10 werte lang den gleichen wert (keine ahnung woran das liegt) an der signalquelle liegt es nicht, ich habe einen beschleunigungssensor, den habe ich kontrolliert (Oszi), der funzt.. ich probiersmal ohne den timer zurückzusetzen dank dir
Nun du wirst dann sehr wahrscheinlich Störungen auf dem Eingangssignal haben. Das passt auch zu deinem anderen Thread, in welchem du schreibst, daß eine höhere Taktfrequenz das Problem vergrößert, schließlich wird damit die Empfindlichkeit auf kurze Störungen erhöht. Mit dem Oszi messen funktioniert nur Bedingt, da so ein Teil nicht alles erfasst und auch die Messung selber verändert. Als erstes solltest du mal prüfen, ob die Masseverbindung zwischen Controller und Signalquelle sauber ist - wenn die schwingt kann das ebenfalls zu solchen Effekten führen. Die Spannungsversorgung des Controllers ist ebenfalls sehr entscheidend, wenn die nicht sauber mit Kondensatoren gestützt wird, dann hat das ebenfalls Auswirkungen, da der Schwellwert für die High Erkennung von der Betriebsspannung abhängt. Ohne ein sauberes Design kann man sehr schnell mal Schwingungen im Bereich von mehreren Volt haben.
ich mal die masse verbindung gemessen... da hab ich ein rauschen bei ca. 10mV drauf... ist das zuviel?? dank dir für deine hilfe
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.