Anzeige:

Timer0 als Counter

Hier finden sie die archivierten Beiträge des alten PHPBB Forums von www.loetstelle.net

Timer0 als Counter

Von modellfreund am 20.01.2012 14:37

Hallo,

ich möchte mit einem Atmega8 die Umdrehungen eines Windsensors erfassen. In dem Windsensor ist ein Reed-Kontakt und 2 Magnete, sodass 2 Impulse pro Umderehung gemessen werden. Um das Programm im µC nicht ständig zu unterbrechen wollte ich den Timer0 als Counter verwenden. Nur irgendwie bekomme ich das nicht hin. Ich gebe euch mal das Programm damit Ihr seht was ich da fabriziert habe. Der Timer1 soll nur einen Sekundentakt erzeugen mit dem ich dann später noch arbeiten kann, der funktioniert aber :-)

Momentan zählt der Timer0 ohne das etwas angeschlossen ist. Vielleicht findest Ihr den Fehler :-S

1]$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100

Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , _
Db7 = Portd.0 , E = Portb.6 , Rs = Portb.0
Config Lcd = 16 * 2
Config Lcdbus = 4
Cursor Off Noblink

Taster_raus Alias Portd.6
Config Taster_raus = Input
Pind.6 = 1

Taster_rein Alias Portd.7
Config Taster_rein = Input
Pind.7 = 1

Motor_raus Alias Portb.1
Config Motor_raus = Output

Motor_rein Alias Portb.2
Config Motor_rein = Output

Enable Timer0
Config Pind.4 = Input
Config Timer0 = Counter , Edge = Rising 'Windsensor


Enable Timer1 'Zaehlen
Const
Config Timer1 = Timer , Prescale = 64
Const Preset = 49911
On Timer1 Zaehlen

Config Pinc.3 = Input 'LDR
Config Pinc.4 = Input 'NTC
Config Adc = Free , Prescaler = Auto , Reference = Aref
Licht Alias Getadc(3)
Temp Alias Getadc(4)

On Interrupts
Enable Interrupts


Dim Wind As Long
Dim Zeit As Byte

Do
Loop

Zaehlen:
Timer1 = Preset
Incr Zeit

If Zeit > 59 Then
Zeit = 0
Tcnt0 = 0
End If

Gosub Anzeigen

Return


Anzeigen:
Cls
Locate 1 , 1
Lcd "Wind"
Locate 1 , 6
Lcd Tcnt0

Locate 2 , 1
Lcd "Zeit"
Locate 2 , 6
Lcd Zeit
Return

End1]

Gruß Felix

Von modellfreund am 22.01.2012 10:14

Hallo

Hat den niemand eine Idee wie das Programm aussehen könnte?

MFG
Felix

Von ernesto am 22.01.2012 12:45

Zitat:

Momentan zählt der Timer0 ohne das etwas angeschlossen ist.


Mal darann gedacht das Eingänge nicht offen in der Luft rumhängen sollen ,also PullUp oder PullDown R's ....

und weiter gehts:

Code:
 

'First you must configure the timer to operate as a counter or as a timer

'Lets configure it as a COUNTER now

'You must also specify if it will count on a rising or falling edge

 

Config Timer0 = Counter , Edge = Rising

'Config Timer0 = Counter , Edge = falling

'unremark the line aboven to use timer0 to count on falling edge

 

'To get/set the value from the timer access the timer/counter register

'lets reset it to 0

Tcnt0 = 0

 

Do

Print Tcnt0

Loop Until Tcnt0 >= 10

'when 10 pulses are count the loop is exited

'or use the special variable TIMER0

Timer0 = 0
END



Wo ist deine Var. die den Zählerstand erfasst ?
Welchen Eingangspin benutzt du --> für Counter nur ein pin/ Modell spezifisch

(hab grad keine Lust für dich das Datenblatt zu lesen Razz)

Code:


Zaehlen:
Timer1 = Preset
Incr Zeit

   If Zeit > 59 Then
   Zeit = 0
   Tcnt0 = 0
   End If


Im Timer1 Interupt das Zählregister für Timer0 zurücksetzen ist suboptimal !!!!!

überlege mal , jede sec. den wert anzeigen der sich aufaddiert ,dann aber anstatt die U/min. anzuzeigen vor der Ausgabe auf null setzen ??

und das allerschlimmste :
Gosub in die LCD anzeigeroutine im Timer1 Interupt
Besser ! zähle einen Tickcounter (var) im Timer1 Int. hoch und benutze diesen um in der mainloop die Ausgabe zu machen

if tick=>10 then gosub anzeige

anzeige:
blabla
tick=0
return


Please give me another demonstration

ciao bambini

Von BellaD am 22.01.2012 15:35

modellfreund hat folgendes geschrieben:
Hallo

Hat den niemand eine Idee wie das Programm aussehen könnte?

MFG
Felix



Doch ,ich glaub schon Razz

aber Dieter sagt - dein Prg ist kacke ,absoluter dünpfiff
und Bruce sagt - soll er ma selba mache

nicht böse sein aber du solltest langsam mal in der lage sein nicht mehr solchen mist zu verzapfen .. überleg mal selber ...
Die Forenmitglieder helfen dir hier doch schon seit 2 Jahren ..

Überlege mal wie lange die LCD Ausgabe dauert (inclusive der sich aufaddierenden Latenzen) und das jede sec. , dazu kommt noch das die 4bitAusgabe in Bascom mit verzögerungen arbeitet - vielleicht liegt auch da der Hase begraben ...

mfg

Von BellaD am 22.01.2012 23:37

Sollte jetzt bis Windstärke 25 alles mitmachen , Anzeige ist in Hertz - geht so bis 100kHz ganz gut..

Alles was fehlt musst du wieder ,naa du weisst schon , cut & paste Wink
LCD ist hier anders belegt (entspricht meiner Entw.umgebung)

und noch was zu Bascom - der simulator ist voll die Grütze - wie kann man sich sowas nur antun ?

Code:

$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100

Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , _
Db7 = Portd.0 , E = Portd.7 , Rs = Portd.6
Config Lcd = 16 * 2
Config Lcdbus = 4
Cursor Off Noblink



Enable Timer0
Config Pind.4 = Input
Config Timer0 = Counter , Edge = Rising                     'Windsensor
On Timer0 Ueberlauf                                       
 ' da nur 8bit zähler machen wir in software einen grösseren draus


Enable Timer1                                               'Zaehlen
Config Timer1 = Timer , Prescale = 64
Const Preset = 49911
On Timer1 Zaehlen


On Interrupts
Enable Interrupts

Dim Umin As Long
Dim Uu As Long
Dim Zeit As Byte
Dim Merk As Byte

Merk = 1
Zeit = 0
Uu = 0
Umin = 0

  Gosub Anzeigen                                            'Begrüssung zbsp.

Do                                                          'Anzeige nur jede sec.
   If Merk = 1 Then

   Gosub Anzeigen

   Merk = 0
   End If

Loop

Zaehlen:
     Umin = Uu + Tcnt0

      Incr Zeit

      Uu = 0
      Tcnt0 = 0
      Merk = 1

   If Zeit > 59 Then

   Zeit = 0
   End If

 Timer1 = Preset

Return


Ueberlauf:
   Uu = Uu + 255                                           
 'wie oft ist der Zähler übergelaufen x mal 255
Return

Anzeigen:
Cls
Locate 1 , 1
Lcd "Wind"
Locate 1 , 6
Lcd Umin

Locate 2 , 1
Lcd "Zeit"
Locate 2 , 6
Lcd Zeit
Return

End


hab da noch mal was geändert (23.1.2011) Wink
damit wirds ein bischen genauer -
bei 27kHz = anzeige 26991
bei 1kHz = anzeige 1000 /1001
bei 100Hz = anzeige 100/101
alles mit internem 1Mhz Takt (wers genauer will muss ein Quartz nehmen)

Zaehlen:
zu erst den Zählerstand übernehmen / Umin = Uu + Tcnt0
dann alles andere was nicht zeitkritisch ist //
Incr Zeit

Uu = 0
Tcnt0 = 0
Merk = 1

If Zeit > 59 Then

Zeit = 0
End If //
zum schluss vor dem verlassen des irq erst den neuen Timerwert setzen

Timer1 = Preset

Return

Anzeige: