PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verzögerung ATMega8



kawamaha
28.07.2009, 21: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, 22: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
28.07.2009, 23:23
Die Datenübertragung zum Display kann schon recht lange dauern, auch wenn man kein explizites Waitms mehr drin hat.

kawamaha
28.07.2009, 23: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
28.07.2009, 23: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, 12: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

askazo
29.07.2009, 15:41
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, 15: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...

wkrug
29.07.2009, 16:01
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, 10:50
hat funktioniert! danke euch :)