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
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...
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
Die Datenübertragung zum Display kann schon recht lange dauern, auch wenn man kein explizites Waitms mehr drin hat.
mal das test programm:
hab noch n fehler entdeckt. Eingang hochgezogen und benutze ind. Näherungsschalter, der ein 1 signal bei betätigung liefert. werd das erstmal beheben..Code:$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
hmm, dann versuch ich mal das display dunkel zu lassen und erst wenn der eingang kommt den wert auszugebenZitat von Besserwessi
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
jo, danke für die antwort! muß ich mich jetzt echt mit den interrupts befassen
ich probier erstmal die leitungen zum LCD aus, ob da nicht eine dabei ist, die mir die anzeige einfriert , 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.
hat funktioniert! danke euch
Lesezeichen