Forum: Mikrocontroller und Digitale Elektronik Frequenzberechnung mit Input Capture


von mike (Gast)


Lesenswert?

hallo!
Momentan möchte ich die Frequenz eines Rechtecksignals bestimmten. Dazu 
nutzte ich den Input Capture des Conters 1, des Mega88. Bei jeder 
steigenden Flanke bekomme ich ein Ergebnis.
Läuft alls ganz gut. Ich bekomme die Werte speichere sie zwischen und 
möchte sie nun auswerten. Dazu ziehe ich jeweils den neueren Wert von 
ältern ab. Nun beginnt mein Problem.
Wenn der alte Wert kurz vor dem Endewert des Zählers ist(0xFE) und der 
neue Wert kurz nach dem Überlauf (also z.B.0x40) kann ich ja nicht mehr 
ohne weiters die beiden weiter von einander abziehen. würde ja 
minuswerte bekommen.
Hat jemand eine Ahnung wie das lösen kann. Ich brauche ja eigentlich nur 
den Betrag.
Eine Lösung hätte ich schon nur weiss ich nicht ob die auch so ohne 
weiteres geht. Ich würde einfach überprüfen ob nach der Subtraktion der 
beiden Zahl das Negativ Flag gesetzt ist und wenn das der Fall ist in 
eine andere Schleife springen und dort einfach den Wert mit 0xFF 
addieren. schon hätte ich den Betrag wieder.
geht das alles so, wie ich mir das vorstelle oder gibt es da "ärger"?
ich habe mal gelesen dass es zu solchen fragestellung eine ap-note von 
atmel gibt. weiss jemand wo ich dies finde und wie die heisst!
Vielen dank schon mal für eurer Antworten!
schönen abend noch!

von Andreas K. (a-k)


Lesenswert?

> würde ja minuswerte bekommen.

Ein vorzeichenloser 8-Bit Wert hat per Definition kein Vorzeichen, kann 
also nicht negativ werden, und rechnet zudem in C modulo 256. Folglich 
gilt 0x40 - 0xFE = 0x42.

von mike (Gast)


Lesenswert?

danke für deine Antwort!
dann kann ich also ohne Problem die beiden High-Werte und die beiden 
Low-Werte von einander abziehen und dann zu einer Zahl zusammen fügen.
und das negativ bit in SREG ist auch ohne bedeutung?
verstehe ich das richtig?
danke nochmal

von Karl H. (kbuchegg)


Lesenswert?

mike wrote:
> danke für deine Antwort!
> dann kann ich also ohne Problem die beiden High-Werte und die beiden
> Low-Werte von einander abziehen und dann zu einer Zahl zusammen fügen.

Du rechnest offenbar in Assembler :-)

Ja das kannst du.
Aber bitte zuerst die Low-Bytes behandeln und dann erst die
High-Bytes unter Berücksichtigung eines eventuellen Carries.

Du solltest dir abgewöhnen, die beiden Bytes getrennt zu sehen.
Du hast eine 16-Bit Zahl, die aufgrund technischer Gegebenheiten
in 2 Register gespeichert werden muss. Aber die Addition 2-er
16 Bit Zahlen wird durch die Befehlssequenz (anstelle eines
Einzelbefehls)
      add  r17, r19
      adc  r18, r20
(am Beispiel der Zahlen in r18:r17 und r20:r19), bzw. die
Subtraktion 2-er 16-Bit Zahlen durch die Sequenz
      sub  r17, r19
      sbc  r18, r20
gemacht. Das muss dir in Fleisch und Blut übergehen. Wenn von
16 Bit Zahlen die Rede ist, dann muss dein Gehirn sofort auf
Registerpärchen umschalten und für Addition, Subtraktion, Vergleich
und dergleichen in Befehlssequenzen denken.

von mike (Gast)


Lesenswert?

nochmals danke für die antwort!
ja ich rechne in assembler!
werde mich damit noch genauer befassen und eure anmerkungen 
berücksichtigen!
falls ich noch weitere fragen habe,melde ich mich nochmal!
vielen dank nochmals und schönen abend zusammen!

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.