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
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).
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
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.
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
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
Eine eigene Frage?
Dieser Thread ist über 22 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.