Forum: Mikrocontroller und Digitale Elektronik Counter und schwer von Begriff


von Marc Vollmer (Gast)


Lesenswert?

Hallo,

ich teste gerade mit AVRStudio den Simulator für den ATMega16.

Ich möchte gerne den Counter 0 verwenden. Dieser soll die Impulse am
Eingang PortB Pin0 zählen (PB0).

Soweit ich das Manual verstanden habe, sollte TCCRO mit 0x00 als
Counter im "Normal Mode" funktionieren.

Also folglich toggle ich PB0 softwaremäßig, aber der Zähler zählt
nicht:

.include "m16def.inc"
.def null = r16
.def temp = r17

; Initialisierung vom Counter0
  ldi NULL,0x00
  out TCCR0,NULL
  out TCNT0,NULL
  ldi temp,0x00
  out TCCR0,temp

loop:
  ldi temp,0x00
  out portb,temp
  ldi temp,0x01
  out portb,temp
  rjmp loop

Geht das nicht im Simulator, oder ist die Initialisierung vom Counter 0
einfach Quatsch???

Der ATMega16 hat doch 3 Timer/Counter:

Eingang für den Counter 0 -> T0 auf PB0
Eingang für den Counter 1 -> T1 auf PB1

Kann mir einer sagen, wo der Eingang für Counter 2 ist, sprich T2?

Schon mal Danke
Gruss
Marc

von crazy horse (Gast)


Lesenswert?

auf jeden Fall ist die Initialisierung von TCCR0 falsch, schreibst du da
"0" rein, bleibt der Zähler stehen. Für externes Zählen muss 0x06
(falling edge) oder 0x07 (rising edge) da stehen.
Ob das überhaupt klappt, wenn du den Pin per Software toggelst, kann
ich dir so nicht sagen (macht auch keinen Sinn, kannst ja gleich einen
reinen Softwarezähler nehmen).

von Marc Vollmer (Gast)


Lesenswert?

Hallo,

ich habe die Initialisierung von TCCR0 mit 0x06 schon ausprobiert,
funktioniert aber auch nicht.

Mit dem Toggeln per Software ist nur ein Test, daß Ganze dient später
dazu Inkremente von einem Reflexkoppler aufzunehmen und anschließend
eine Regelung für eine Positionierung durchzuführen. Da für mich
ziemlich viel Neuland dabei ist, wollte ich es eben mal simulieren.

Eventuell muß ich dann eben auch den Counter simulieren...

Gruss
Marc

von crazy horse (Gast)


Lesenswert?

also vom Portschaltbild her sollte es funktionieren, da der
entsprechende Zählereingang direkt am Pin liegt, sollte dem Zähler also
wurscht sein, ob der Pin von "innen" oder von "aussen" getoggelt
wird. Du hast aber vergessen, den Port auch als Ausgang zu schalten
(sbi DDRx.x), mit deinem Programm erscheinen die Ausgaben nicht am Pin.

von Marc Vollmer (Gast)


Lesenswert?

Das war es, nachfolgendes Programm funktioniert auch im Simulator. Wenn
man allerdings den PB0 als Eingang schaltet (so wird es später mal
gebraucht), dann läuft der Counter nicht hoch -- ist aber irgendwie
logisch.

Danke crazy horse.

Gruss
Marc

--
.include "m16def.inc"
.def null = r16
.def temp = r17

  ; Initialisierung vom Counter0
  ldi NULL,0x00
  out TCCR0,NULL
  out TCNT0,NULL
  ldi temp,0x06
  out TCCR0,temp

  ; Initialisierung des PB0 als Ausgang
  ldi temp, 0x01
  out DDRB, temp

loop:
  ldi temp,0x00
  out portb,temp
  ldi temp,0x01
  out portb,temp
  rjmp loop

von Marc Vollmer (Gast)


Lesenswert?

So, jetzt funktioniert es auch als Eingang !!! Der Unterschied liegt
darin, daß nicht der PortB getoggelt wird, sondern der PinB.

Nochmal die Änderung, dann ist aber gut...

.include "m16def.inc"
.def null = r16
.def temp = r17

  ; Initialisierung vom Counter0
  ldi NULL,0x00
  out TCCR0,NULL
  out TCNT0,NULL
  ldi temp,0x06
  out TCCR0,temp

  ; Initialisierung des PB0 als Eingang
  ldi temp, 0x00
  out DDRB, temp

loop:
  ldi temp,0x00
  out pinb,temp
  ldi temp,0x01
  out pinb,temp
  rjmp loop

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.