mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega88 8Bit Timer


Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
erst mal ein gutes neues

bin am verzweifeln. warum wird der Timer0 8-Bit nicht eingeschaltet, was 
mach ich falsch?

lass ich das in AVR-Studio laufen wird CS0 im TCCR0B nicht gesetzt. im 
register temp1=r16 steht aber eine 1.

bei TOIE0 im TIMSK0 geht es doch auch.
; Timer0 8-Bit vorbereiten
ldi temp1, (1<<CS00)   ; CS0 setzen: Teiler 1
sts TCCR0B, temp1

ldi temp1, (1<<TOIE0)   ; TOIE0: Interrupt bei Timer Overflow
sts TIMSK0, temp1
 

;Alle Interrups an
sei

Autor: ASM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchs mal mit out, nicht sts.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh danke das war es.

wann benutze ich sts und wann out wo liegt der uterschied?

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus schrieb:
> wann benutze ich sts und wann out wo liegt der uterschied?

ich merk mir das so:
- sts nur für store direct to sram, also nur für Datenspeicher
- out für die In/Out-Speicher
:-)

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber
ldi temp1, (1<<TOIE0)   ; TOIE0: Interrupt bei Timer Overflow
out TIMSK0, temp1

geht nicht. ist TIMSK0 ein datenspeicher und TCCR0B ein In/Out-Speicher.

wo kann ich nachlesen was was ist?

Autor: Magnus M. (magnetus) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus schrieb:
> geht nicht. ist TIMSK0 ein datenspeicher und TCCR0B ein In/Out-Speicher.
>
> wo kann ich nachlesen was was ist?

Datenblatt Kapitel 30: "Register Summary"

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus schrieb:
> geht nicht. ist TIMSK0 ein datenspeicher und TCCR0B ein In/Out-Speicher.

Muss gehen.
Alle Speicherstellen, die besondere Funktionen für die Hardware haben, 
sogenante SFR (special function registers) kannst du meines Wissens über 
in / out ansprechen.
siehe dazu auch Datenblatt, Register set summary.
sts und lds geht nur bis zu einer bestimmten Speicheradresse, das ist 
ein bisschen inkonsistent gemacht.
:-)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Alle Speicherstellen, die besondere Funktionen für die Hardware haben,
>sogenante SFR (special function registers) kannst du meines Wissens über
>in / out ansprechen.
>siehe dazu auch Datenblatt, Register set summary.
>sts und lds geht nur bis zu einer bestimmten Speicheradresse, das ist
>ein bisschen inkonsistent gemacht.

Genau umgedreht. Alle SFRs kann man mit sts/lds ansprechen. Mit in/out 
nicht. Wenn im Register set summary zwei Adressen angeben sind, dann 
in/out. Ansonsten sts/lds.

MfG Spess

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so ganz schnalle ich das noch nicht.

bei timer1 16-bit muss es so sein:
; Timer1 16-Bit vorbereiten
ldi temp1, (1<<CS10)   ; CS10 setzen: Teiler 1
sts TCCR1B, temp1

ldi temp1, (1<<TOIE1)   ; TOIE1: Interrupt bei Timer Overflow
sts TIMSK1, temp1

und bei timer0 8-bit muss es so sein:
; Timer1 8-Bit vorbereiten
ldi temp1, (1<<CS00)   ; CS00 setzen: Teiler 1
out TCCR0B, temp1

ldi temp1, (1<<TOIE0)   ; TOIE0: Interrupt bei Timer Overflow
sts TIMSK0, temp1

????

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>bei timer1 16-bit muss es so sein:
>.....

und bei timer0 8-bit muss es so sein:
>....

Ja. Die Register von Timer0 liegen im mit in/out erreichbaren 
Adressbereich.
Die von Timer1 nicht.

MfG Spess

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nochmal danke

gibt es hier im forum eine registerübersicht für den meag88

gerade was die timer betrifft TCCR1B u.s.w. tu mich da noch sehr schwer.
möchte eine input capture machen mit timer1.

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also im Datenblatt (mega32) hab ich folgendes gefunden:
"All ATmega32 I/Os and peripherals are placed in the I/O space. The I/O 
locations are accessed
by the IN and OUT instructions, transferring data between the 32 general 
purpose working registers
and the I/O space. I/O Registers within the address range $00 - $1F are 
directly bitaccessible
using the SBI and CBI instructions. In these registers, the value of 
single bits can be
checked by using the SBIS and SBIC instructions. Refer to the 
Instruction Set section for more
details. When using the I/O specific commands IN and OUT, the I/O 
addresses $00 - $3F must
be used. When addressing I/O Registers as data space using LD and ST 
instructions, $20 must
be added to these addresses."

also:
2 Adressen da (also alle SFR), egal, kann mit in/out oder mit lds/sts 
arbeiten, muss allerdings auf den Versatz von 0x20 achten (bei sts/lds 
dazuzählen, oder macht das der Assembler?).

spess53 schrieb:
> Genau umgedreht. Alle SFRs kann man mit sts/lds ansprechen. Mit in/out
> nicht.
Hast du da zufälligerweise ein Beispiel parat, dachte es wär immer 
umgekehrt gewesen (was irgendwie auch nicht stimmt) ?
:-)

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok Beispiel gefunden -.-
Ich sollte auch mal einen nueren uC anschauen.

mega88:

"The ATmega48/88/168 is a complex microcontroller with more peripheral 
units than can be supported
within the 64 locations reserved in the Opcode for the IN and OUT 
instructions. For the
Extended I/O space from 0x60 - 0xFF in SRAM, only the ST/STS/STD and 
LD/LDS/LDD instructions
can be used."
:-)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Hast du da zufälligerweise ein Beispiel parat, dachte es wär immer
>umgekehrt gewesen (was irgendwie auch nicht stimmt) ?
>:-)

Die Register r0...r31, die IO-Register und der RAM liegen praktisch in 
einem Speicherbereich. Auf diesen Speicher kannst du mit der absoluten 
Adresse mit sts/lds zugreifen. Es ist also auch folgendes möglich:
ldi r16,$AA
sts 0,r16    ; lädt r0 mit r16

Allerdings haben sts/lds eine Befehlslänge von 2 Word.

In/out kann nur Adressen von 0...63 verarbeiten. Bei der Abarbeitung 
werden zu der Adresse $20 (r0...r31) addiert und auf die richtige 
Adresse $20...$5F zugegriffen. Dafür haben in/out nur eine Befehlslänge 
von einem Word.

MfG Spess

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe da noch eine frage.

müsste ich nicht in HWert und LWert immer den gleichen wert haben bei 
einer frequenz von 10Hz?
; Timer1 16-Bit vorbereiten
ldi temp1, (1<<CS10) | (1<<ICNC1) | (0<<ICES1); CS10 setzen: Teiler 1 ICNC1 für 4takte stabil fallende Flanke
sts TCCR1B, temp1

ldi temp1, (1<<ICIE1)   ; ICIE1: Interrupt bei Input Capture
sts TIMSK1, temp1
 
;Alle Interrups an
sei

..
..
..

T1:
    push  temp1
    in    temp1,SREG
    push  temp1

    lds   HWert, ICR1H
    lds   LWert, ICR1L

    ldi   temp1,0
    sts   ICR1H, temp1
    sts   ICR1L, temp1


    pop   temp1
    out   SREG,temp1
    pop   temp1
    reti              ; Zurück aus dem Interrupt

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>müsste ich nicht in HWert und LWert immer den gleichen wert haben bei
>einer frequenz von 10Hz?

Wobei?

>    lds   HWert, ICR1H
>    lds   LWert, ICR1L

Beim Lesen von 16-Bit-Registern erst L-Teil dann H-Teil lesen. Beim 
Schreiben umgedreht.

>    ldi   temp1,0
>    sts   ICR1H, temp1
>    sts   ICR1L, temp1

Das macht keinen Sinn. Wenn schon, dann solltest du TCNT1 löschen. ICR1 
dient nur der Speicherung des Timerwertes zum Zeitpunkt des Ereignisses. 
Der Timer läuft weiter.

MfG Spess

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.