www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zwei Register in eine Variable schreiben


Autor: Toby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hab eine Bascom spezifische frage:

In den Registern ICR1L und ICR1H liegt der Timerstand zum Zeitpunkt
einer Captureflanke. Ich brauche diesen Wert für weitere Berechnungen
zusammengefasst in einem Word. also in 2Byte. Wie kann ich das in
Bascom realisieren?

Danke für Hilfe!

Toby

Autor: Franz josef Vögel (advors)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es geht am einfachsten, wenn man der Word Variable, welche den Wert
aufnehmen soll, 2 Bytes überlagert.

Dim Wert as Word
Dim WertLow as Byte at WordWert Overlay
Dim WertHigh as Byte at WordWert + 1 Overlay

' Und nun der Lesevorgang
WertLow = ICR1L
WertHigh = ICR1H

' und nun kann der 16-Bit Wert benutzt werden
Print Wert

Es muss beachtet werden, dass bei den 16-Bit I/O Registern zuerst der
Low-Wert und anschließend der High-Wert gelesen muss.
Beim Beschreiben muss zuerst der High-Wert und anschließend der
Low-Wert geschreiben werden.

Autor: Toby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Antwort! Ich probiers gleich aus!

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es nicht vielleicht gleich das word-Register "ICR1"?

Autor: Toby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielleicht, aber ich finde keinen bezeichner in bascom dafür. außerdem
bekomme ich gerade eine fehlermeldung "out of bounds", wenn ich die
Variable at &H60 bzw. &H61 anlegen will...

Autor: Franz josef Vögel (advors)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen AVR verwendest Du?. Bei vielen AVR beginnt das SRAM ab &H100.
Warum willst Du die Variable auf eine bestimmte Adresse legen?

Autor: Toby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß nicht wie ich das anders programmieren soll. Du schriebst
"Wordwert"... aber wie implementiere ich das genau? Ich weiß ja nicht
wo das word letzten endes liegt. ich verwende einen atmega 128.

danke für den konstanten support hier!!!

Autor: Franz josef Vögel (advors)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim Mega128 beginnt das SRAM ab &H100.
Im Normalfall ist es nicht nötig, die Variable auf eine bestimmte
Adresse zu legen.

Mit

Dim Wert as Word

legt BASCOM-AVR die Word Variable auf die nächste freie
Speicheradresse.

Mit

Dim WertLow as Byte at WordWert Overlay
Dim WertHigh as Byte at WordWert + 1 Overlay

hast Du 2 Byte-Variable, welche keinen eigenen Speicherplatz belegen,
sondern deren Adresse auf das LOW Byte und das HIGH Byte der Word
Variable WERT verweisen. Das Beschreiben dieser Overlay Bytes schreibt
also direkt in die Word Variable. Du hast also 2 Bytes im SRAM, welche
einerseits unter der Word-Variable WERT ansprechbar sind, aber
andererseits auch getrennt mit den überlagerten Byte-Variablen WertLow
und WertHigh.
Für die Variable kannst Du natürlich andereNamen verwenden.

Autor: Toby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Erläuterung!
Leider funktioniert es nicht. Ich hab in Bascom folgendes definiert:

Dim Long_Timer1 as word
Dim Timer1low as byte at WordLong_timer1 Overlay
Dim Timer1high as byte at WordLong_timer1 +1 Overlay


jetzt gibts 3 fehlermeldungen. 2 mal bekomme ich, adress out of bounds
und einmal illegal character [+]

als ich die Variablen an H198 bzw. H199 festgelegt habe, gab es keine
fehlermeldung.
Wo liegt der fehler?

Autor: Franz josef Vögel (advors)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Version von BASCOM-AVR verwendest Du?. Ich weiss nicht mit
welcher Version die Unterstützung dieser Art der OVERLAY Adressierung
eingeführt wurde. Ich verwende 1.11.8.2 und hier kompiliert er
problemlos.

Autor: Toby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm, ich verwende 1.11.7.4. dann liegt es wohl an der kompilierung.
das is natürlich blöd... ich kanns ja fürs erste mal von hand
festlegen, und wenn ich dann fertig bin mit dem programm, kann ich ja
aus dem mem-mapping ablesen, wo die nächste eigentlich freie stelle im
speicher wäre...
BTW: bis wohin geht der Adressierbare SRAM-Bereich?

Autor: Franz josef Vögel (advors)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hängt von der AVR-Type ab.

Schau im Compiler-Report und ziehe von Frame-Start noch den Framesize
ab. Oder ziehe von der höchsten Speicheraddresse (Siehe RAMEND im DAT
File) die Werte für Stack size,  S-Stacksize und Framesize ab. Dann
hast die höchste freie SRAM Adresse. Mehr Informationen zu den Stacks
gibt es auf http://www.roboternetz.de/wissen/index.php/Bascom_Inside

Autor: Henrik Reimers (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh weh, macht Ihr es hier komliziert.

In Capture1 fasst Bascom den Wert doch schon zu einem Word zusammen.

Also z.B. einfach:

<code>
On Icp1 Oncapture                            'Interrupt-Routine
Config Timer1 = Timer , Capture Edge = Falling , Prescale = 256
.....
Dim Wcount as Word
.....
.....
.....
Oncapture:                                   'Timer1-Capture
  Disable Interrupts                         'nötig für Auslesen von
Cap1
  Wcount = Capture1                          'Wert sichern
  Timer1 = 0                                 'Timer-Reset
  Enable Interrupts                          'Interrupts wieder
aktivieren
Return
</code>

Grüße
Henrik

PS: In diesem Forum wird grundsätzlich alles verkompliziert.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wusste ich es doch... So schlecht kann Bascom gar nicht sein, das es
sowas nicht unterstützt.

@Henrik: ne, ich hatte die Idee schon vorher, hab aber keine Ahnung von
Bascom...

Autor: Franz josef Vögel (advors)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Hinweis. Mir war das Capture1 nicht geläufig.

Das Disable und Enable von Interrupt in der Interrupt-Service-Routine
ist meines Erachtens nicht nötig, da mit dem Aufruf des
Interrupt-Routine der Interrupt automatisch Disabled wird und mit dem
RETURN, welche diese abschließt, BASCOM ein reti generiert, welcher den
Interrupt wieder Enabled.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.