Archiv verlassen und diese Seite im Standarddesign anzeigen : Verzögerung ATMega8
kawamaha
28.07.2009, 22:38
ich bau mir grade mit dem ATMega8 eine Drehzahlanzeige fürs Moped. funktioniert auch soweit. nun möchte ich die LCD Anzeige einfrieren, wenn die Auslasssteuerung aufmacht. funktioniert zwar prinzipiell auch, allerdings dauert es unterschiedlich lange, bis der Eingang erkannt wird (bis zu 1 s)
als Drehzahlgeber verwende ich einen Interrupt, der andere Eingang ganz normal.
zum testen habe ich geschrieben:
if PinB.2 = 1 then
set PortB.1
end if
wie gesagt, wenn ich den Eingang nur kurz betätige bleibt die LED am PortB.1 meistens dunkel.
das Programm wird doch mit der Taktfrequenz abgearbeitet und normalerweise müßte der Eingang doch im Millisekundenbereich abgefragt werden und auch ausgegeben werden, oder sehe ich da was falsch?
Ich habe auch extra den "waitms" befehl zum display löschen rausgenommen.
jemand ne allgemeine erklärung oder braucht es dazu das komplette programm?
danke schon mal...
Che Guevara
28.07.2009, 23:50
Hallo kawamaha,
der gesamte Code währe schon nicht schlecht und evtl. auch noch der Schaltplan, oder du sagst einfach, was wie wo angeschlossen ist!
Gruß
Chris
Besserwessi
29.07.2009, 00:23
Die Datenübertragung zum Display kann schon recht lange dauern, auch wenn man kein explizites Waitms mehr drin hat.
kawamaha
29.07.2009, 00:34
mal das test programm:
$regfile = "m8def.dat"
$crystal = 3686400 'ext. Quarz
Config Lcd = 16 * 2 'LCD-Typ
Config Lcdmode = Port 'Ports zur Ansteuerung benutzt
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
On Icp1 Oncapture 'Port B0 ist Interupt
Dim Wcapture As Word
Dim Stopuhr As Word
Ddrb.0 = 0 'Eingang B0 Drehzahl
Ddrb.1 = 1 'Ausgang B1 LED 6000U/min
Ddrb.2 = 0 'Eingang B2 KIPS
Ddrb.3 = 0 'Eingang B3 LCD normal/einfrieren
Portb.0 = 1 'Eingang hochziehen
Portb.1 = 0 'Ausgang LED
Portb.2 = 1 'Eingang hochziehen
Portb.3 = 1 'Eingang hochziehen
Dim Merker As Bit 'Selbsthaltung KIPS Eingang B
Dim Timerword As Word 'Rückwärtszähler als Timer
Timerword = 15000
Tccr1a = &B00000000 'Timer1 Register A
Tccr1b = &B10000101 'Timer1 Register B Bit7:noise cancel, Bit6: fall.Flanke
Timsk.ticie1 = 1 'Capture IR ein
Sreg.7 = 1 'IR global ein
Main:
If Pinb.2 = 0 Then 'KIPS Stellung
Set Merker 'Selbsthaltung
Set Portb.1 'Test Ausgang
End If
If Merker = 0 Then 'Timer LCD Anzeige
Decr Timerword
End If
If Timerword = 10000 Then
Cls 'Display löschen
Lcd Wcapture 'neuen Wert in Display schreiben
End If
If Timerword = 10000 Then
Timerword = 15000
End If
Goto Main
Oncapture:
Timer1 = Timer1 - Capture1
Wcapture = Capture1 'Anz in 1/100s
Wcapture = 10000 / Wcapture 'Anzeige in Zehntel Hz
Wcapture = Wcapture * 6 'Anzeige in U/min
'If Wcapture > 6000 Then 'LED an über 6000U/min
'Set Portb.1
'End If
Return
End
hab noch n fehler entdeckt. Eingang hochgezogen und benutze ind. Näherungsschalter, der ein 1 signal bei betätigung liefert. werd das erstmal beheben..
kawamaha
29.07.2009, 00:39
Die Datenübertragung zum Display kann schon recht lange dauern, auch wenn man kein explizites Waitms mehr drin hat.
hmm, dann versuch ich mal das display dunkel zu lassen und erst wenn der eingang kommt den wert auszugeben
kawamaha
29.07.2009, 13:45
also wenn folgendes im programm steht:
Cls
Lcd Wcapture
kommts zu der verzögerung. ich habs auch in ein unterprogramm rein - genau das gleiche.
jetzt noch ne frage, bitte nicht steinigen, ich weiß es gibt ein datenblatt, aber ich bräuchte ca. bis 2017, bis ich das kapiert hab.
hat der ATMega 8 noch einen zweiten Interrupt? ich verwende ICP1, finde aber keinen ICP0 oder ICP2.
wenn ja, würde das funktionieren und der Eingang sofort bearbeitet werden?
grazie
Hi,
ICP1 ist kein Interrupt, sondern ein Input Capture für den Timer 1.
Damit kannst Du mit einem externen Signal den Timer beeinflussen, ohne den Prozessor damit zu belasten. Den hast Du auch für die Erfassung Deiner Drehzahl richtig verwendet.
Die externen Interrupts sind INT0 und INT1. Die wären dann die optimale Wahl, um auf kurze Signale zu reagieren und werden für Dein Problem auch die Lösung sein.
Gruß,
askazo
kawamaha
29.07.2009, 16:54
jo, danke für die antwort! muß ich mich jetzt echt mit den interrupts befassen 8-[
ich probier erstmal die leitungen zum LCD aus, ob da nicht eine dabei ist, die mir die anzeige einfriert :oops: , ansonsten, auf in den kampf...
Du könntest aber natürlich auch in der ICP Interrupt Routine den Port abfragen ein Bit setzen und dann in der Hauptroutine für die Displaysteuerung dieses Bit für die Anzeigensteuerung verwenden.
Das hätte den Vorteil ,das die letzte gültig gemessen Drehzahl auch auf das Display kommt.
kawamaha
03.08.2009, 11:50
hat funktioniert! danke euch :)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.