Forum: Mikrocontroller und Digitale Elektronik ATMega88 8Bit Timer


von Klaus (Gast)


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.
1
; Timer0 8-Bit vorbereiten
2
ldi temp1, (1<<CS00)   ; CS0 setzen: Teiler 1
3
sts TCCR0B, temp1
4
5
ldi temp1, (1<<TOIE0)   ; TOIE0: Interrupt bei Timer Overflow
6
sts TIMSK0, temp1
7
 
8
9
;Alle Interrups an
10
sei

von ASM (Gast)


Lesenswert?

Versuchs mal mit out, nicht sts.

von Klaus (Gast)


Lesenswert?

oh danke das war es.

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

von Floh (Gast)


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
:-)

von Klaus (Gast)


Lesenswert?

aber
1
ldi temp1, (1<<TOIE0)   ; TOIE0: Interrupt bei Timer Overflow
2
out TIMSK0, temp1

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

wo kann ich nachlesen was was ist?

von Magnus M. (magnetus) Benutzerseite


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"

von Floh (Gast)


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.
:-)

von spess53 (Gast)


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

von Klaus (Gast)


Lesenswert?

so ganz schnalle ich das noch nicht.

bei timer1 16-bit muss es so sein:
1
; Timer1 16-Bit vorbereiten
2
ldi temp1, (1<<CS10)   ; CS10 setzen: Teiler 1
3
sts TCCR1B, temp1
4
5
ldi temp1, (1<<TOIE1)   ; TOIE1: Interrupt bei Timer Overflow
6
sts TIMSK1, temp1

und bei timer0 8-bit muss es so sein:
1
; Timer1 8-Bit vorbereiten
2
ldi temp1, (1<<CS00)   ; CS00 setzen: Teiler 1
3
out TCCR0B, temp1
4
5
ldi temp1, (1<<TOIE0)   ; TOIE0: Interrupt bei Timer Overflow
6
sts TIMSK0, temp1

????

von spess53 (Gast)


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

von Klaus (Gast)


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.

von Floh (Gast)


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) ?
:-)

von Klaus (Gast)


Lesenswert?


von Floh (Gast)


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."
:-)

von spess53 (Gast)


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:
1
ldi r16,$AA
2
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

von Klaus (Gast)


Lesenswert?

habe da noch eine frage.

müsste ich nicht in HWert und LWert immer den gleichen wert haben bei 
einer frequenz von 10Hz?
1
; Timer1 16-Bit vorbereiten
2
ldi temp1, (1<<CS10) | (1<<ICNC1) | (0<<ICES1); CS10 setzen: Teiler 1 ICNC1 für 4takte stabil fallende Flanke
3
sts TCCR1B, temp1
4
5
ldi temp1, (1<<ICIE1)   ; ICIE1: Interrupt bei Input Capture
6
sts TIMSK1, temp1
7
 
8
;Alle Interrups an
9
sei
10
11
..
12
..
13
..
14
15
T1:
16
    push  temp1
17
    in    temp1,SREG
18
    push  temp1
19
20
    lds   HWert, ICR1H
21
    lds   LWert, ICR1L
22
23
    ldi   temp1,0
24
    sts   ICR1H, temp1
25
    sts   ICR1L, temp1
26
27
28
    pop   temp1
29
    out   SREG,temp1
30
    pop   temp1
31
    reti              ; Zurück aus dem Interrupt

von spess53 (Gast)


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

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.