loetstelle.net
Lötstelle Userforum
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Timer0 als Counter

 
Neues Thema eröffnen   Neue Antwort erstellen    loetstelle.net Foren-Übersicht -> BASCOM
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
modellfreund



Anmeldungsdatum: 01.03.2008
Beiträge: 410
Wohnort: Aken

BeitragVerfasst am: Fr 20.Jan 2012 14:37:05    Titel: Timer0 als Counter Bauteile finden Antworten mit Zitat

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 Smile

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

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 = 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

End


Gruß Felix

_________________
www.lang-gartenbahn.de
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
modellfreund



Anmeldungsdatum: 01.03.2008
Beiträge: 410
Wohnort: Aken

BeitragVerfasst am: So 22.Jan 2012 10:14:59    Titel: Bauteile finden Antworten mit Zitat

Hallo

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

MFG
Felix

_________________
www.lang-gartenbahn.de
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
ernesto



Anmeldungsdatum: 07.01.2012
Beiträge: 18

BeitragVerfasst am: So 22.Jan 2012 12:45:49    Titel: Bauteile finden Antworten mit Zitat

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
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
BellaD



Anmeldungsdatum: 03.12.2006
Beiträge: 1708
Wohnort: Klinik der misshandelten Kuscheltiere

BeitragVerfasst am: So 22.Jan 2012 15:35:08    Titel: Bauteile finden Antworten mit Zitat

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

_________________
Eine Weiterverbreitung ohne ausdrückliche Genehmigung ist untersagt. Für Schäden, lehnen wir jegliche Haftung ab.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
BellaD



Anmeldungsdatum: 03.12.2006
Beiträge: 1708
Wohnort: Klinik der misshandelten Kuscheltiere

BeitragVerfasst am: So 22.Jan 2012 23:37:53    Titel: Bauteile finden Antworten mit Zitat

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

_________________
Eine Weiterverbreitung ohne ausdrückliche Genehmigung ist untersagt. Für Schäden, lehnen wir jegliche Haftung ab.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Anzeige






Verfasst am: Heute 08:59:56    Titel: Bauteile finden

Nach oben
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    loetstelle.net Foren-Übersicht -> BASCOM Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum nicht herunterladen


Powered by phpBB 2.x © 2001, 2002 phpBB Group

Sie sind Besucher Nr. 1222437
©opyright by Markus Vohburger 2005 All Rights reserved