- 3D-Druck Einstieg und Tipps         
Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 36

Thema: Timer und Register

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    05.05.2013
    Beiträge
    22

    Timer und Register

    Anzeige

    Praxistest und DIY Projekte
    Hallo,

    Ich hoffe Ihr seit nicht böse, dass ich schon wieder ein Problem habe.

    Mein Projekt benötigt die Genauigkeit eines 8Bit Timers, ohne Prescale, über eine Dauer von mindestens 2ms, besser wären 100-200ms.

    Das ist mit einem 16 Bit Register, 2 mal 8 Bit, zu lösen, allerdings weiß ich nicht wie ich ein solches benutze. Das was ich im Internet fand sieht wie folgt aus:

    Code:
    .def Adresse = RAMEND
     LDI   R16, LOW(Adresse)        
     LDI   R17, HIGH(Adresse)
    Meine Idee wäre wie bei einem 8 Bit Register, bei jedem überall des Registers ein anderes um 1 zu inkrementieren.
    Das Problem ist, dass das Carry-Flag nicht von inc beeinflusst wird. Ich stehe momentan einfach mal wieder auf dem Schlauch wie ich mit solch Doppelregister Problemen am besten umgehe
    Code:
    .def timer0=r16
                   inc timer0
                   brbc ISR_END
                   inc timer0_1
    Liebe Grüße

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Wenn man es mit dem Befehl inc machen will, kann man das Zero Flag abfragen, also statt dem brbc (was immer das sein soll) ein BRNE. Die Alternative ist es zum Hochzählen -1 abzuziehen, mit dem SUBI Reg, FF Befehl. Das geht aber nur mit den oberen 16 Registern.

    Die wirkliche Schwierigkeit kommt ggf. wenn man die Zahl der Überläufe und den Timerstand zusammenfassen will. Es hängt aber davon ab, was man mit dem Timer machen will - eine externe Zeit messen, oder eine definierte Verzögerung.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied Avatar von derNeue
    Registriert seit
    01.01.2011
    Ort
    Bierstadt Radeberg
    Alter
    38
    Beiträge
    101
    Ich muss ehrlich sagen, ich verstehe nicht, wieso man von C auf Assembler wechseln will, aber es sei dir natürlich vergönnt. Ich habe es anders herum gemacht und möchte ehrlich gesagt C nicht mehr missen.

    Ich denke, wenn du mit mehr als 8bit rechnen willst, wirst du um den add/adc befehl nicht herum kommen. Dieser nutzt nunmal das Carry-Flag mit.

    http://www.mikrocontroller.net/artic...l:_Arithmetik8

    Hier ein sehr gut geschriebenes Tut dazu, ganz am Ende des Artikels gibts auch einen Link für Arithmetik Operationen mit mehr als 8bit.

    Dennis
    Ich studiere die Wirkung der Sonnenstrahlen auf das Liebesleben der Pflastersteine

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Zitat Zitat von Saturas077 Beitrag anzeigen
    Ich hoffe Ihr seit nicht böse, dass ich schon wieder ein Problem habe.
    Nicht, wenn wir dir helfen können

    Mein Projekt benötigt die Genauigkeit eines 8Bit Timers, ohne Prescale, über eine Dauer von mindestens 2ms, besser wären 100-200ms.
    Das klingt rätselhaft. Eigentlich konfiguriert man den Timer, läßt ihn laufen und läßt ihn über Interrupt melden, wann seine Zeit abgelaufen ist oder so ... Erklär doch ein bißchen mehr, so daß man eine sinnvolle Konfiguration vorschlagen kann.

    Auf welchem µC soll das laufen?

    Das ist mit einem 16 Bit Register, 2 mal 8 Bit, zu lösen, allerdings weiß ich nicht wie ich ein solches benutze. Das was ich im Internet fand sieht wie folgt aus: .....
    Ich verstehe das so, daß Du einen 16Bit Timercounter auslesen möchtest, um eins incrementieren willst und wieder zurückspeichern möchtest.

    Schreiben und Lesen eines 16Bit Registers, wie das TCNT1 des Timers 1, das aus TCNT1L und TCNT1H besteht, ist im Datenblatt des ATMega8a beispielhaft so dargestellt. Man beachte die Reihenfolge der Zugriffe.
    Code:
    ; Set TCNT1 to 0x01FF
    ldi r17,0x01
    ldi r16,0xFF
    out TCNT1H,r17
    out TCNT1L,r16
    
    ; Read TCNT1 into r17:r16
    in r16,TCNT1L
    in r17,TCNT1H
    Auf einem ATMega8 geht das ADIW. Also zB so:
    Code:
    in r24,tcnt1L
    in r25,tcnt1H
    ADIW r24,1
    out tcnt1H,r25
    out tcnt1L,r24
    Gruß
    Searcher
    Geändert von Searcher (28.04.2014 um 17:32 Uhr) Grund: Fehler berichtigt
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied Avatar von avr_racer
    Registriert seit
    01.04.2014
    Ort
    MecklenburgVorpommern
    Beiträge
    174
    Moin Moin aus dem sonnigen Norden,

    Pass mit der RAMEND auf weil es schon vergeben ist von Haus aus für den SRAM und du damit eigentlich die letzte Ramadresse auf den Stack legst

    ohne vorher irgendwas zu definieren:

    ldi SPH,high(Ramend)
    ldi SPL,low(Ramend)

    Letzte Adresse auf Stackpointer gelelegt.

    > Mein Projekt benötigt die Genauigkeit eines 8Bit Timers,

    Na denn nutze doch Timer0/2 weil die meistens ein 8bitter sind.

    Timer1 ist ein 16bitter und du kannst diesen Timer und dessen Register nicht zu einem 8bitter umschulen im Mode0.
    Die einzigen Modes sind die PWM-Modes /CTC-Modes wo du festlegen kannst ob er in 8/9/10bit laufen soll.


    > Das ist mit einem 16 Bit Register, 2 mal 8 Bit,

    oder soll einfach nur eine Zeitschleife erstellt werden?
    Geändert von avr_racer (28.04.2014 um 17:50 Uhr)

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    05.05.2013
    Beiträge
    22
    Danke für eure netten Antworten.

    Ich möchte mit dem Timer nach zwei Gewissen Verzögerungen einen Ausgang Toggeln. Nachdem Wechsel von High auf Low muss die Laufzeit meines Signales gemessen werden. Diese liegt je nach Länge bei 0,5us-2000us. Die Verzögerung sollte sein 100us und etwa zwischen 100ms und 300ms.

    Ich brauche eine Möglichst gute Auflösung, da habe ich mir selbst keine Vorgabe gesetzt, sie sollte aber als Richtung zwischen 50ns und 1us liegen. Diese Zeitspektren liegen im Bereich des Timer 0 und Timer 2. Als Test AVR dient der 328P, weil er auf den Arduino passt :P. Ist halt der, der auf Vorrat liegt.

    Danke für die Beispiele mit dem RAMEND, genau euer Angesprochenes ist das Problem. Es sind fest zu geordnete Speicheradressen. Ich möchte aber gerne zwei Register von r16-r32 nutzen. Wobei die Pointer Register ja wegfallen.

  7. #7
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Für die genaue Messung einer Zeit hat Timer1 die ICP Funktion - damit sind dann auch 50 ns Auflösung drin (bei 20 MHz Takt). Eine Erklärung dazu gibt es im Wiki-Bereich unter Timer(AVR). Den Zeitkritischen Teil übernimmt dabei die Hardware, und man kommt mit C oder auch BASIC aus.

    Der Mega328 hat einen 16 Bit timer - den kann man auch ruhig nutzen (es gibt kein Geld zurück dafür das man die HW nicht nutzt).

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied Avatar von avr_racer
    Registriert seit
    01.04.2014
    Ort
    MecklenburgVorpommern
    Beiträge
    174
    > Ich möchte mit dem Timer nach zwei Gewissen Verzögerungen einen Ausgang Toggeln

    Den Ausgang kannst du mit Timern direkt togglen entweder im CTC-Modus der immer ein schönes Rechtecksignal _--_--_-- erzeugt oder im (Fast)PWM-Modus der dir dann gleich noch ein geändertes Tastverhältniss liefern kann _------- invers gehts auch -------_

    > Nachdem Wechsel von High auf Low muss die Laufzeit meines Signales gemessen werden.

    Das Signal über den INTx anlegen, INTx-ISR auslösen lassen in der dann der Timer gestartet wird und wenn man zusätzlich einen Wert in das entsprechende OCRx-Register schreibt kann man den Timer einen OCx-Int auslösen lassen weil die Zeit erreicht ist. Das ganze kann auch mit der ICP des Timers eledigt werden.

    Aber was soll das werden irgendwas mit Ultraschall? Zum Verständniss um sich ein Bild des ganzen zu machen vielleicht kommt man denn auch noch auf viel simplere Ideen
    Geändert von avr_racer (28.04.2014 um 19:45 Uhr)

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied Avatar von derNeue
    Registriert seit
    01.01.2011
    Ort
    Bierstadt Radeberg
    Alter
    38
    Beiträge
    101
    Zitat Zitat von Searcher Beitrag anzeigen
    Auf einem ATMega8 geht das ADIW.
    Das funktioniert aber nur bei den Registern R32 bis R24, und auch jeweils nur bei den Pärchen, soweit ich mich noch erinnere, oder verwechsle ich gerade die Befehle?


    Dennis
    Ich studiere die Wirkung der Sonnenstrahlen auf das Liebesleben der Pflastersteine

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Zitat Zitat von derNeue Beitrag anzeigen
    Bild hier   Zitat von Searcher Bild hier  
    Auf einem ATMega8 geht das ADIW.
    Das funktioniert aber nur bei den Registern R32 bis R24, und auch jeweils nur bei den Pärchen, soweit ich mich noch erinnere, oder verwechsle ich gerade die Befehle?
    Nein, stimmt schon. ADIW geht nur bei den oberen Registerpärchen. Besteht da irgendwo ein Widerspruch oder warum fragst Du nach? Ist doch eine kurze Methode um etwas zu einem 16Bit Wert zu addieren

    Zitat Zitat von Saturas077 Beitrag anzeigen
    Ich möchte aber gerne zwei Register von r16-r32 nutzen. Wobei die Pointer Register ja wegfallen.
    Warum fallen die Pointerregister weg? r24/r25 sind auch keine der Pointer X, Y, Z.

    Gruß
    Searcher
    Geändert von Searcher (29.04.2014 um 08:46 Uhr) Grund: Ergänzung
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

Seite 1 von 4 123 ... LetzteLetzte

Ähnliche Themen

  1. gleiche register bei atmega32 und 16
    Von avrrobot im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 20.02.2011, 10:19
  2. Timer-Register mögen Befüllung durch Funktion nicht
    Von stefan_Z im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 06.08.2007, 19:25
  3. Asuro und OSCCAL Register Taktfrequenz
    Von Winne im Forum Asuro
    Antworten: 3
    Letzter Beitrag: 11.09.2005, 09:49
  4. Interne Register und Register in SRAM
    Von FoCus im Forum AVR Hardwarethemen
    Antworten: 9
    Letzter Beitrag: 27.07.2005, 13:06
  5. ADC und USART über Register?!
    Von BASTIUniversal im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 29.04.2005, 14:28

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress