PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer/Counter



Jon
30.04.2007, 16:56
Hallo,
wie ich schon im Thread zu IMADEIT geschrieben habe, habe ich mit dem Timer/Counter ein Problem.
Timer0 geht, aber Timer1 kriege ich einfach nicht hin.
Mein Code für Timer0:


'##########
'# by jon #
'##########
$regfile = "m32def.dat"
$crystal = 1000000
$baud = 2400

Const Ticks = 32
Dim Count As Byte

Config Timer0 = Counter , Edge = Rising
Load Timer0 , Ticks
Set Portb.1

On Timer0 Timer0_isr
Config Pinb.0 = Input

Enable Timer0
Enable Interrupts


Config Pind.5 = Output 'Links
Config Pind.4 = Output 'Rechts

Config Pinc.5 = Output
R_1 Alias Portc.5
Config Pinc.4 = Output
R_2 Alias Portc.4

Config Pinc.3 = Output
L_1 Alias Portc.3
Config Pinc.2 = Output
L_2 Alias Portc.2

Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1

R_1 = 0
R_2 = 1
Pwm1b = 50

L_1 = 0
L_2 = 1
Pwm1a = 50

Do
Print "TCNT0 = " ; Tcnt0 ; Spc(3) ; "Count = " ; Count
Waitms 200
Loop

End

Timer0_isr:
Load Timer0 , Ticks
Incr Count
Return

Wie sähe das jetzt mit Timr1 und Timer0 in einem aus??

Würde mich freuen, wenn sich jemand die Mühe macht und mir hilft!

jon

coCo
30.04.2007, 17:08
Hi,
ich glaube dir fehlt ein "Enable Timer1". Oder hab ich jetzt deine Frage falsch verstanden? Dein Timer1 geht net oder?

MfG

edit: ok ich seh grad, das is bei PWM gar net nötig ](*,)

linux_80
30.04.2007, 17:23
Hallo,

Enable ist nur da um eine Interrupt zu aktivieren.
Es gibt für Timer1 aber keine ISR, also braucht (jetzt) nix aktiviert zu werden.

@Jon,
was soll mit dem Timer0 gemacht werden, der zählt steigende Flanken an PB0, und nach 32 Flanken wird die ISR ausgeführt und eine weitere Variable hochgezählt, und dann, oder wie, was war die Frage ? :-k

Timer1 soll PWM ausgeben, das wäre dann PD4/5, die Richtung mit PC2-5 ?

Aja, bei 10Bit PWM ist 50 noch nicht so recht viel !

Jon
30.04.2007, 17:34
Stimmt. Ich sollte beschreiben, um was es geht *g*. Sorry.

Also ich habe an Pinb.1 und Pinb.0 jeweils einen Radencoder Marke Eigenbau.
An Pinb.0 (hab mich im letzten Post verschrieben, werde ich verbessern) habe ich einen Radencoder, der funktioniert auch klasse.
Den anderen habe ich an Pinb.1. Und da habe ich ein Problem mit.
Wie "lese" ich den anderen aus?


Timer1 soll PWM ausgeben, das wäre dann PD4/5, die Richtung mit PC2-5 ?
Genau.


Aja, bei 10Bit PWM ist 50 noch nicht so recht viel !
Soll erstmal nicht so schnell fahren.

Ich glaube, ich habe mir gerade etwas verstrubbelt (gedanklich).

jon

linux_80
30.04.2007, 18:34
So wie mit Timer0 kannst Du den PB1 Eingang nicht verwenden, da der Timer1 schon mit PWM belegt ist.
Könntest aber die INT0-2 verwenden und selber zählen, in 'ner ISR.

Bewegt sich bei 50 überhaupt schon was ?

Jon
30.04.2007, 18:45
So wie mit Timer0 kannst Du den PB1 Eingang nicht verwenden, da der Timer1 schon mit PWM belegt ist.
Bullshit. ](*,) ](*,)
Kann ich PWM auch Softwaremäßig machen? Wenn ja, wie?
Weil dann könnte ich die Motoren über Software-PWM ansteuern und den Timer1 für den Radencoder verwenden.


Könntest aber die INT0-2 verwenden und selber zählen, in 'ner ISR.
Schon belegt *g*
Ich habe gar keinen freien Pin mehr. Kann ich das auch über einen Portexpander machen??


Bewegt sich bei 50 überhaupt schon was ?
Ganz langsam schon...

jon

linux_80
30.04.2007, 20:36
Also ich würde den schönen 16Bit Timer1 mit PWM nicht für so popeliges zählen verschwenden, vor allem wenn PWM gebraucht wird [-X
Kannst Du nicht den ein oder andern Draht tauschen, damit Du auf einen INTx-Pin kommst ?

Ansonsten wäre da noch der Timer2 übrig, kannst du ja mal ausrechnen ob Du mit dessen 8Bit breite eine gescheite PWM Auflösung hinbekommst.
Geht bestimmt, aber alles per Hand zählen, und das gleich 2mal.
Schau mal beim Servo-Befehl, so in der Richtung geht das dann hier auch, nur der Servo-Befehl selber geht nicht, weil mit dem keine 100% erreicht werden können. Sondern nur etwa 0-10%.

Jon
30.04.2007, 20:47
Kannst Du nicht den ein oder andern Draht tauschen, damit Du auf einen INTx-Pin kommst ?
Kann ich mal nachschauen. Mir fehlt nur für IMADEIT eine ordentliche Doku, in der notiert ist, wohin welcher Pin führt *g*. Sollte ich mal machen O:)

Den Rest verstehe ich nicht so ganz. Meinst du das in etwas so?:
Den Timer2 soll ich für die Motoren verwenden? Oder für den Radencoder?

Geht bestimmt, aber alles per Hand zählen, und das gleich 2mal.
Was meinst du damit?
Und was soll mir bei meinem Problem der Servo-Befehl helfen?
Sorry, aber ich habe heute irgendwie ein paar Probleme beim denken. Das kommt davon, wenn man sich nicht in der Schule warmdenkt.

jon

linux_80
30.04.2007, 21:52
Ich meinte mit Timer2, wenn Du den Timer1 für das zählen verwenden willst, bleibt nur der Timer2 übrig um damit ein PWM hinzubekommen.
Der hat aber nur einen OC-Ausgang, Du verwendest aber scheinbar 2 Motoren, weshalb der Timer2 nicht direkt als PWM-Erzeuger verwendet werden kann.
Deshalb könnte man den Timer2 so einstellen wie das beim Servo-Befehl auch gemacht wird, ca. alle 10µs das PWM-Signal updaten, dH., der Timer muss alle 10µs einen IRQ auslösen, in dessen ISR dann das PWM-Signal auf einen Ausgang gelegt wird, und entsprechend irgendwelchen Variablen gesetzt oder gelöscht wird. Ob 10µs reichen weiss ich aber auch nicht.

Jon
30.04.2007, 21:56
Ich werde morgen mal den Bot auseinander nehmen und schauen, ob ich irgendetwas umlegen kann, sodass ich einen INTx frei habe.
Ich blicke bei den Sachen mit ISR, ISQ usw. irgendwie nie so ganz durch.

jon

linux_80
30.04.2007, 22:07
Eben, deshalb ist es einfacher zwei Leitungen zu tauschen, und das PWM vom AVR machen zu lasssen :-)

Jon
01.05.2007, 09:02
Hab mal geschaut, ich kann da nichts tauschen (kein Platz da).
Ich bin jetzt am schauen, ob ich einen ATtiny die Aufgabe des Zählens übergeben kann. Werde ich noch etwas suchen und lesen müssen.

jon

Bin jetzt beim ATiny15 hängen geblieben. Der hat einen Timer/Counter0. Kann ich den OC1A auch als Timer/Counter verwenden?

linux_80
01.05.2007, 12:52
Hallo,
OC ist nur Ausgang, aber mit T0 an PB2 kannst Du zählen, geht so wie oben in Deinem Programm.

Jetzt ist nur die Frage, wie bekommst Du die Information aus dem T15 raus ?

Wenn Du schon einen weiteren AVR in betracht ziehst,
könntest Du gleich einen grösseren Tiny nehmen wie zB den Tiny25 bzw. 45, diesen mit I2C (bzw. TWI oder hier USI) ansprechen, und diesen das PWM ausgeben lassen.
Der grosse AVR zählt dann.

Den Tiny45 kannst Du dann auch gleich zum Temperatur messen verwenden, denn das hat der schon eingebaut :-)

Jon
01.05.2007, 16:32
Ist mir auch eingefallen, als ich mit dem Bike unterwegs war *g*
Ich werde also eine ATtiny2313 nehmen. Da kann ich dann entscheiden, ob ich UART oder I2C zur Kommunikation nehme. Und ich habe zwei Timer :)

jon

Jon
17.05.2007, 18:25
Da der ATtiny2313 jetzt da ist und er funktioniert hänge ich jetzt an der Programmierung *g*

Wie muss das Programm aussehen, um den Counter1 auszulesen? Was ich vermisse ist, wie bei Counter0, das TCNT0. Oder heißt das beim Counter1 nur anders?

Würde mich über eine Antwort freuen.

jon

P.S.: Wenn ihn noch weitere Angaben braucht, sagt bescheid!

linux_80
17.05.2007, 18:45
Den Timer1 Wert auslesen geht mit "Timer1":
variable = Timer1
oder setzen
Timer1 = 127

Timer1 ist ein 16Bit Timer also geht das mit 2 Registern TCNT1H und TCNT1L.

Jon
17.05.2007, 19:43
Timer1 ist ein 16Bit Timer also geht das mit 2 Registern TCNT1H und TCNT1L.
Danke! Das Hilft mir weiter. Jetzt habe ich was in der BASCOM-Hilfe gefunden und werde es mal weiterprobieren.
Wenn ich wieder Probleme habe, melde ich mich.

jon