PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer mehrfach / optimal nutzen



DerRuffi
24.10.2006, 12:39
Hallo,
ich möchte mit einem ATMEGA 8-16 gerne 2 drehzahlen über hall-sensoren einlesen, außerdem einen rc-kanal einlesen und dann noch einen servobefehl ausgeben.
die hall-sensoren geben ein digitales signal aus, genau wie der rc-kanal.
der servobefehl nimmt den timer0 in beschlag (bascom), das einlesen des rc-kanals habe ich mit dem timer1 gemacht und einen (!) hall sensor kann ich mit dem timer2 einlesen. bleibt noch der andere.
meine fragen:
1. kann man mit dem mega 8-16 auch mehr als einen hall sensor einlesen? beide INT - Pins sind ja schon belegt ?
2. wenn ja, wie nutze ich dann den timer2 doppelt?

oder muss ich für diese aufgabenstellung 2 controller miteinander vernetzen?


Vielen Dank! :)

Hubert.G
24.10.2006, 20:38
Ich glaube hier überschätzt du die Community doch erheblich. Um dir hier wirklich gute Auskunft zu geben müsste sich jemand noch mehr mit deinem Programm auseinandersetzen als du es selbst getan hast und auch deine Pheriperiegeräte und Eingaben kennen.

SprinterSB
25.10.2006, 08:24
-- muss das ganze zeitparallel sein oder geht auch Zeit-MUX?
-- welche Auflösung brauchst du für die Eingaben (f, duty)

Du kannst den AC und den InCapt ebenfalls als externe INTs verwenden :-)

DerRuffi
25.10.2006, 18:49
danke für die antworten,
davon habe ich auch schon gelesen, dass man andere ports als INT benutzen kann, aber wie genau macht man das?
bin gerade erst in das thema atmel eingestiegen, bin noch grün hinter den ohren ;)
gedacht habe ich mir das so:

2 hallsensoren an 2 INTs geben unabhängig voneinander einen impuls pro umdrehung. diese werden von 2 subroutinen gezählt.
gleichzeitig läuft der timer2 und läuft nach einer halben sekunde über. das läuft soweit auch mit einen hall sensor wunderbar.
ist der timer2 voll, so sollen beide zählungen ausgelesen und in 2 verschiedene upm umgerechnet werden.

SprinterSB
25.10.2006, 23:05
Den AnalocComparator kannst du einen IRQ auslösen lassen. Er vergleicht die Spannungen an AIN0 gegen AIN1. Ausserdem kannst du noch viele andere Eingänge für den AC wählen (interne Referenz, Ausgang des Input-Multiplexers des ADC, etc). Am klarsten wird das, wenn du das Blockschaltbild im AVR-Manual anschaust.

Der AC hat andere physikalische Eigenschaften als digitale I/O bzw. INTn. Aberzum Messen von digitalen Signalen stört das nicht weiter.

Pulse zählen kannst du auch über die Timer1-Hardware, indem du den Timer nicht mit einer interenen Clock taktest sondern über Eingänge T0 bzw. T1.

"Digitales Signal" sagt erst mal nix. Was musst du da analysieren? Pulse/Flanken Zählen? Dutycycle measurement, Datenstrom einlesen, ...?

DerRuffi
26.10.2006, 07:50
ich will einfach nur die pulse zählen.
hast du vielleicht einen link, wo beschrieben wird, wie man das mit dem AC macht? und dann in bascom programmiert? bin halt noch ziemlich neu in der materie...
hier mal ein ausschnitt des codes zum zählen eines hall sensors. geht auch wunderbar.



$regfile "m8def.dat"
$crystal = 8000000
Config Timer2 = Timer , Prescale = 256
Config Int1 = Falling
On Timer2 Timer_irq
Dim Zaehler As Long
Dim Nzaehler As Word
Dim Hall_ups As Word
Dim Hall_upm As Word
Enable Timer2
Enable Interrupts
'================================================= =====
'Hallsensor: Pro Impuls ein Aufruf
'================================================= =====
Irq0:
Incr Zaehler
Return

'================================================= =====
'Hallsensor: Wenn Timer voll ist. Pro halbe Sekunde ein Aufruf
'================================================= =====
Timer_irq:
Incr Nzaehler
If Nzaehler = 61 Then
Timer2 = 0
Hall_ups = Zaehler * 2
Hall_upm = Hall_ups * 60
Zaehler = 0
Nzaehler = 0
Else
Timer2 = 0
End If
Return


danke

SprinterSB
26.10.2006, 08:16
Den AC findest du im ATmega8-Handbuch auf Seite 190--192. Wenn was zur Hadrwar unklar ist, frag eben. Für die Software passt das BASCOM-Forum, evtl den Thread dahin verschieben.