PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe zum DZM



hardstyleroxx
01.11.2005, 21:58
Hallo,

ich habe hier den Code von einem DZM und hätte gerne noch einen kleinen zusatz weiss aber nicht wie ich den einbaue.

Es soll folgende Funktion gegeben sein: Wenn an Pinb.7 ein LOW Signal anliegt soll der DZM keine Anzeige auf den 7 Segmentanzeigen ausgeben (Er soll aber trotzdem weiterlaufen, nur die Anzeigen sollen tot sein!). Wäre echt nett wenn mir jemand helfen könnte.
Hier mal der Code:


' Hardware:
' ---------
' PD0: gelbe LED
' PD6: Signaleingang
' PB0-PB6: 7-segment - Segment A bis G
' PD1-PD5: 7-segment - Ziffer - Select


$regfile = "2313def.dat" 'AT90S2313
$crystal = 8000000 '8MHz Quarz
Ddrb = &B11111111 'PortB = Ausgang
Ddrd = &B0111111 'PortD = Ausgang bis auf PD6

Dim Icount As Long At &H60
Dim Wcountlo As Word At &H60 Overlay
Dim Wcounthi As Word At &H62 Overlay
Dim Temp As Integer At &H80
Dim Temp2 As Integer At &H80 Overlay
Dim Y As String * 5 At &H70
Dim Z(5) As Byte At &H70 Overlay
Dim Frequenz As Long
Dim Freq As Word
Dim Freq1 As Word
Dim Freq2 As Word
Dim Timeout As Byte
Dim Impulse As Byte
Dim X(5) As Byte
Dim Test As Integer
Dim Test2 As Integer
Dim Zaehler As Byte
Timeout = 0

On Icp1 Oncapture
On Ovf1 Onoverflow
Config Timer1 = Timer , Prescale = 8 , Capture Edge = Rising
Enable Icp1
Enable Ovf1
Enable Interrupts


'*******************
'* Start-Animation *
'*******************

Do
Portb = 1
Portd = 2
Waitms 50
Portd = 4
Waitms 50
Portd = 8
Waitms 50
Portd = 16
Waitms 50
Portb = 2
Waitms 50
Portb = 64
Waitms 50
Portd = 8
Waitms 50
Portd = 4
Waitms 50
Portd = 2
Waitms 50
Portb = 16
Waitms 50
Portb = 8
Waitms 50
Portd = 4
Waitms 50
Portd = 8
Waitms 50
Portd = 16
Waitms 50
Portb = 4
Waitms 50
Portb = 64
Waitms 50
Portd = 8
Waitms 50
Portd = 4
Waitms 50
Portd = 2
Waitms 50
Portb = 32
Waitms 50
Loop Until Temp2 = 1 'Bis zum 1. Impuls



'******************************************
'* Hauptschleife - LED-Anzeigen ansteuern *
'******************************************

Main:
Incr Timeout 'Bei Timeout: 0 U/min.
If Timeout = 10 Then
Timeout = 10
Freq = 0
Y = Str(freq)
Z(1) = 0
Z(2) = 0
Z(3) = 0
Z(4) = 0
Z(5) = 48
End If

For Test2 = 1 To 5 'Wert sichern .....
X(test2) = Z(test2)
Next Test2

For Test2 = 1 To 400 '..... und 400 mal Anzeigen
For Zaehler = 1 To 5
Test = X(zaehler)
Select Case Test
Case 48 : Portb = 63
Case 49 : Portb = 6
Case 50 : Portb = 91
Case 51 : Portb = 79
Case 52 : Portb = 102
Case 53 : Portb = 109
Case 54 : Portb = 125
Case 55 : Portb = 39
Case 56 : Portb = 127
Case 57 : Portb = 111
Case Else : Portb = 0
End Select
Portd.zaehler = 1
Waitus 100 'Zeit für jede Anzeige
Portd.zaehler = 0
Next Zaehler
Next Test2

Goto Main




'*************************************
'* Interrupt-Routine (Zeiten messen) *
'* (wird bei jedem Impuls ausgelöst) *
'*************************************

Oncapture:
Disable Icp1
Incr Impulse
If Impulse = 8 Then
Impulse = 0
Timeout = 0
Wcountlo = Timer1
Timer1 = 0
Frequenz = 240000000 / Icount 'Umrechnung für 4-Zylinder
Wcounthi = 0

Freq2 = Freq1
Freq1 = Frequenz
Frequenz = Freq1 + Freq2
Frequenz = Frequenz / 2
Freq = Frequenz

If Freq > 5999 Then Portd.0 = 1 'Wenn Drehzahl über 5999 LED an
if Freq < 4000 Then Portd.0 = 0 'Wenn Drehzahl unter 4000 LED aus
If Freq < 150 Then
Freq = 0
Y = Str(freq)
Z(1) = 0
Z(2) = 0
Z(3) = 0
Z(4) = 0
Z(5) = 48

Else

Y = Str(freq)
If Z(5) = 0 Then 'Führende Nullen eliminieren
Do
Z(5) = Z(4)
Z(4) = Z(3)
Z(3) = Z(2)
Z(2) = Z(1)
Z(1) = 0
Loop Until Z(5) > 0
End If
End If
End If
End If
Temp = 1
Enable Icp1
Return

Onoverflow:
Incr Wcounthi
Return


Dann habe ich noch eine frage: Bei überschreiten einer bestimmten Drehzahl soll ein Port 1 geben und bei unterschreiten einer anderen Drehzahl soll der gleiche Port 0 geben. Ich habe es gerade wie im folgenden gemacht, was aber sicher so nicht funktioniert oder?

If Freq > 5999 Then Portd.0 = 1 'Wenn Drehzahl über 5999 LED an
if Freq < 4000 Then Portd.0 = 0 'Wenn Drehzahl unter 4000 LED aus[/quote]

hardstyleroxx
02.11.2005, 13:40
Keiner der mit helfen kann? Ist echt wichtig komme sonst nicht weiter :(

Danke schonmal.

PicNick
02.11.2005, 14:32
Was meinst du mit "tot" ? garnix (finster) oder nur "nicht ändern" ?

Der Drehzahlvergleich für Port 1 is ok, wenn dir klar ist, daß in dem Bereich 4000- 5999 ein anderes Verhalten ist, je nachdem, ob die Drehzahl steigt oder von oben abfällt.

hardstyleroxx
02.11.2005, 15:49
Mit tot meine ich, das die Anzeigen einfach aus sind.

Und mit der LED die leuchten soll habe ich mich vielelicht etwas schlecht ausgedrückt:

Sobald ich einmal über 5999rpm komme soll die LED so lange leuchten bis ich einmal unter 4000rpm war, dann soll sie ausgehen. Wenn ich dann wieder über 5999rpm komme geht das ganze von vorne los.

PicNick
02.11.2005, 16:08
Ok mit der Drehzahl, das scheint mir zu passen

Anzeige finster:


'-------------- ANZEIGE an ---------------------
IF herzeigen = 1 THEN
'--------------------------------------------------
For Test2 = 1 To 400 '..... und 400 mal Anzeigen
For Zaehler = 1 To 5
...usw...
Next Zaehler
Next Test2

ELSE
'--------------------------------------------------
'-------------- ANZEIGE finster----------------
'--------------------------------------------------
Portb = 0
Portd = 0
END IF

hardstyleroxx
02.11.2005, 21:44
Ich habs nun versucht zu ändern, ich hoffe das stimmt nun alles:



' Hardware:
' ---------
' PD0: gelbe LED (ab 6250 Umdr./min.)
' PD6: Signaleingang
' PB0-PB6: 7-segment - Segment A bis G
' PD1-PD5: 7-segment - Ziffer - Select


$regfile = "2313def.dat" 'AT90S2313
$crystal = 8000000 '8MHz Quarz
Ddrb = &B01111111 'PortB = Ausgang
Ddrd = &B0111111 'PortD = Ausgang bis auf PD6
portd = &B10000000 'Pullup von Pinb.7 Aktivieren


Pinb.7 alias herzeigen

Dim Icount As Long At &H60
Dim Wcountlo As Word At &H60 Overlay
Dim Wcounthi As Word At &H62 Overlay
Dim Temp As Integer At &H80
Dim Temp2 As Integer At &H80 Overlay
Dim Y As String * 5 At &H70
Dim Z(5) As Byte At &H70 Overlay
Dim Frequenz As Long
Dim Freq As Word
Dim Freq1 As Word
Dim Freq2 As Word
Dim Timeout As Byte
Dim Impulse As Byte
Dim X(5) As Byte
Dim Test As Integer
Dim Test2 As Integer
Dim Zaehler As Byte
Timeout = 0

On Icp1 Oncapture
On Ovf1 Onoverflow
Config Timer1 = Timer , Prescale = 8 , Capture Edge = Rising
Enable Icp1
Enable Ovf1
Enable Interrupts


'*******************
'* Start-Animation *
'*******************

Do
Portb = 1
Portd = 2
Waitms 50
Portd = 4
Waitms 50
Portd = 8
Waitms 50
Portd = 16
Waitms 50
Portb = 2
Waitms 50
Portb = 64
Waitms 50
Portd = 8
Waitms 50
Portd = 4
Waitms 50
Portd = 2
Waitms 50
Portb = 16
Waitms 50
Portb = 8
Waitms 50
Portd = 4
Waitms 50
Portd = 8
Waitms 50
Portd = 16
Waitms 50
Portb = 4
Waitms 50
Portb = 64
Waitms 50
Portd = 8
Waitms 50
Portd = 4
Waitms 50
Portd = 2
Waitms 50
Portb = 32
Waitms 50
Loop Until Temp2 = 1 'Bis zum 1. Impuls



'******************************************
'* Hauptschleife - LED-Anzeigen ansteuern *
'******************************************

Main:
Incr Timeout 'Bei Timeout: 0 U/min.
If Timeout = 10 Then
Timeout = 10
Freq = 0
Y = Str(freq)
Z(1) = 0
Z(2) = 0
Z(3) = 0
Z(4) = 0
Z(5) = 48
End If

For Test2 = 1 To 5 'Wert sichern .....
X(test2) = Z(test2)
Next Test2

'******************************************
'* Anzeigen an *
'******************************************

if herzeigen = 1 Then 'Wenn herzeigen = 1 dann...

For Test2 = 1 To 400 '..... und 400 mal Anzeigen
For Zaehler = 1 To 5
Test = X(zaehler)
Select Case Test
Case 48 : Portb = 63
Case 49 : Portb = 6
Case 50 : Portb = 91
Case 51 : Portb = 79
Case 52 : Portb = 102
Case 53 : Portb = 109
Case 54 : Portb = 125
Case 55 : Portb = 39
Case 56 : Portb = 127
Case 57 : Portb = 111
Case Else : Portb = 0
End Select
Portd.zaehler = 1
Waitus 100 'Zeit für jede Anzeige
Portd.zaehler = 0
Next Zaehler
Next Test2

'******************************************
'* Anzeigen aus *
'******************************************


Else 'Wenn herzeigen = 0 Anzeigen aus
Portb = 0
Portd = 0
END IF

Goto Main




'*************************************
'* Interrupt-Routine (Zeiten messen) *
'* (wird bei jedem Impuls ausgelöst) *
'*************************************

Oncapture:
Disable Icp1
Incr Impulse
If Impulse = 8 Then
Impulse = 0
Timeout = 0
Wcountlo = Timer1
Timer1 = 0
Frequenz = 240000000 / Icount 'Umrechnung für 4-Zylinder
Wcounthi = 0

Freq2 = Freq1
Freq1 = Frequenz
Frequenz = Freq1 + Freq2
Frequenz = Frequenz / 2
Freq = Frequenz

If Freq > 5999 Then Portd.0 = 1 'Wenn Drehzahl über 5999 LED an
if Freq < 4000 Then Portd.0 = 0 'Wenn Drehzahl unter 4000 LED aus
If Freq < 150 Then
Freq = 0
Y = Str(freq)
Z(1) = 0
Z(2) = 0
Z(3) = 0
Z(4) = 0
Z(5) = 48

Else

Y = Str(freq)
If Z(5) = 0 Then 'Führende Nullen eliminieren
Do
Z(5) = Z(4)
Z(4) = Z(3)
Z(3) = Z(2)
Z(2) = Z(1)
Z(1) = 0
Loop Until Z(5) > 0
End If
End If
End If
End If
Temp = 1
Enable Icp1
Return

Onoverflow:
Incr Wcounthi
Return


Muss ich irgentwas ausser &regfile ändern wenn ich einen ATMega8 verwenden möchte oder geht das nicht so ohne weiteres?

Danke!

Werner_Just
03.11.2005, 10:45
Hallo hardstyleroxx,

> Muss ich irgentwas ausser &regfile ändern wenn ich einen ATMega8
> verwenden möchte oder geht das nicht so ohne weiteres?

Eigentlich musst Du nur das Regfile ändern. Uneigentlich musst Du auch gucken, ob die Zweitbelegungen des neuen Chips nicht mit den Erstbelegungen kollidieren.

ICP liegt beim 2313 auf dem Pin PD6, beim Mega 8 liegt ICP auf PB0
PB verwendest Du aber als Ausgang für die Leds.

Ciao,
Werner

P.S. by the way, Du verwendest den ICP Interrupt zur Ermittlung der Zeit, liest dann aber in der ICP-Routine den Timer aus statt die Capture Register. Das schöne an den Capture Regisern ist ja gerade, das sie den Zählerstand beim Interrupt aufruf enthalten. Unabhängig davon, ob der Atmel während des Interrupt Aufrufs gerade mit etwas anderem beschäftigt war.
Kommt ein Zündimpuls z.B. unmittelbar nach einem Timerüberlauf, ist der Atmel mit dem OVF-Interrupt beschäftigt und arbeitet den ICP Interrupt erst danach ab. Liest den Timer also zu spät aus. Nungut, so schnell dreht Dein Motor wahrscheinlich nicht, daß das einen signifikanten Fehler produziert. Ich finde es nur unschön.

hardstyleroxx
03.11.2005, 11:13
Der Code ist nicht von mir, ich habe ihn so im Internet gefunden!
Mit deiner Kritik kann ich leider nichts anfangen da ich nur bahnhof verstehe :(


Nochmal zum ändern des Chips: Ich muss aber an dem Code selber nichts ändern (ausser &regfile) sondern nur an der beschaltung oder?

So ist nun die beschaltung des ATMega8


' Hardware:
' ---------
' PD0: Signaleingang
' PD6: LED am
' PB0-PB6: 7-segment - Segment A bis G
' PD1-PD5: 7-segment - Ziffer - Select


$regfile = "m8def.dat" 'ATMega8
$crystal = 8000000 '8MHz Quarz
Ddrb = &B01111111 'PortB = Ausgang
Ddrd = &B1111110 'PortD = Ausgang bis auf PD6
portd = &B10000000 'Pullup von Pinb.7 Aktivieren

Werner_Just
03.11.2005, 12:32
Hallo hardstyleroxx,

> Der Code ist nicht von mir, ich habe ihn so im Internet gefunden!
das hab ich mir gedacht. Trotzdem solltest Du imo den Code verstehen wenn Du ihn einsetzt.

> Nochmal zum ändern des Chips: Ich muss aber an dem Code selber
> nichts ändern (ausser &regfile) sondern nur an der beschaltung oder?

Am Code mußt Du einiges ändern.
Wie schon gesagt, Du verwendest den ICP Interrupt für Deine Signalerfassung und Port B als Ausgang für die LEDs. ICP ist aber beim Mega8 die Zweitbelegung des Pins B0 und ein Pin gleichzeitig als Eingang und als Ausgang geht nicht.

So wie Deine Software aufgebaut ist, brauchst Du einen Interrupt für die Zeiterfassung. Anschlüsse die einen Interrupt auslösen können sind bei den AVRs, die Pins mit den Zweitbelegungen Int0, Int1, ICP und, mit etwas externer Beschaltung die Pins AIN0 bzw. 1.

AIN0 & 1 lassen wir mal außen vor, denn dafür müsstest Du mit dem Analog Komparator rumspielen. Bleiben als mögliche Signaleingänge:
ICP = PB0
INT0 = PD2
INT1 = PD3

Bei INT0 & 1 müsstest Du nur Deine Interrupt Aufruf umschreiben.
Statt "On Icp1 Oncapture" -> "On Int0(1) Oncapture".

Aber das bringt Dich auch nicht weiter, denn PD2 und 3 verwendest Du ebenso wie PB0 um Deine Leds anzusteuern.

Du wirst also zumindest die Ausgabe Routine umschreiben müssen um einen der drei Pins als Signaleingang frei zu bekommen.

Der von Dir vorgesehene Pin PD0 geht nicht, denn PD0 kann wie gesagt keinen Interrupt auslösen, das können beim Mega 8 nur PB0, PD2 und PD3.

Ciao,
Werner

hardstyleroxx
03.11.2005, 14:19
Gut, dann kann ich das vergessen :( Ich glaube kaum das jemand von euch so lieb ist und den Code umschreibt oder? Ich verstehe da nämlich sogut wie gar nichts von und bin erst am anfang was Ucs angeht.

Werner_Just
03.11.2005, 14:43
Hallo hardstyleroxx,

> Gut, dann kann ich das vergessen
Armer schwarzer Kater ?

> Ich glaube kaum das jemand von euch so lieb ist und den Code umschreibt oder?
Zumindest in meinem Fall könntest Du recht haben.

> Ich verstehe da nämlich sogut wie gar nichts von und bin erst am anfang was Ucs angeht.
Aber Du hast eine gute Basis um anzufangen.
- Du hast eine Projekt, das von der Größenordnung her ideal als Anfangsprojekt ist.
- Du hast eine Lösung, vor der Du weist, sie funktioniert.
- Du musst sie nur Deinen Anforderungen anpassen.
- Du weist wo Du fragen kannst, wenn Du nicht mehr weiter kommst.

Also wo ist Dein Problem? Selber lernen ist schei***?

Nimm den Code den Du hast, schnapp Dir die Bascom Hilfe, setz Dich 3-4 Stunden hin und geh das Programm durch. Wenn Du weist wie es funktioniert, dann ist es ganz leicht zu ändern.

Viel ist es nicht!

Ciao,
Werner (kopfschüttelnd)

hardstyleroxx
03.11.2005, 15:27
Ich finde das ist für einen Anfänger ziemlich schwer (Also so gehts mir), ich habe echt schwierigkeiten was von dem programm zu verstehen.
Ich habe noch nie mit Timern, Interrupts etc. gearbeitet. Kann mir den jemand ein Buch empfehlen was mit dem ATmega8 arbeitet und auch für einen Anfänger verständlich geschreiben ist (Es sollte alles ausführlich erklärt werden (Timer, Interrutps, Multiplexen, Pins&Portd, Speicher etc)?


Zum hema selber lernen ist schei**: Ich sitze seit einer woche jeden tag mindestens 5 Stunden vor irgentwelchen Foren, Tutorials etc, finde aber einfach nicht den Einstieg... Der wille ist da, aber ich habe wie gesagt ziemliche Probleme beim verstehen der ganzen Sache.

Werner_Just
04.11.2005, 07:14
Hallo hardstyleroxx,

> Kann mir den jemand ein Buch empfehlen was mit dem ATmega8 arbeitet
> und auch für einen Anfänger verständlich geschreiben ist ?

AVR Mikrocontroller Lehrbuch
Untertitel: Eine Einführung in die Welt der AVR-RISC Mikrocontroller am Beispiel des AT Mega8.
Autor: Roland Walter
ISBN: - keine- (nur über den Autor erhältlich)
Web: www.rowalt.de (Beispiel Kapitel)

Das Buch wir imo seinem Titel mehr als gerecht. Es ist ein Lehrbuch und keine mit einem Tutorial aufgepeppte Übersetzung von Datenblättern.

Er erklärt die einzelnen Bausteine eines AVR und beschreibt wie man sie verwendet. Als Programmiersprache für alles drumherum verwendet er BASCOM. Die Hardware selbst programmiert er aber weitgehend über die Konfigurationsregister der AVRs. Daher ist alles was man lernt nahezu 1:1 in jede andere Programmiersprache zu übernehmen.

Das Arbeitsblatt (Experimentierbord zum Buch) braucht man imo nicht unbedingt. Der Simulator in BASCOM tut es auch, ebenso wie ein Steckbrett oder jedes andere Experimentierboard.

Ciao,
Werner

hardstyleroxx
04.11.2005, 12:17
Hallo Werner,
danke für den Tip werde mich gleich mal umschauen.

@Alle
stimmt der Code den jetzt? (Also das die Anzeigen nichts mehr anzeigen wenn an pinb.7 ein LOW Signal anliegt)



' Hardware:
' ---------
' PD0: gelbe LED (ab 6250 Umdr./min.)
' PD6: Signaleingang
' PB0-PB6: 7-segment - Segment A bis G
' PD1-PD5: 7-segment - Ziffer - Select
' PB7: Eingang (Anzeige Tot)

$regfile = "2313def.dat" 'AT90S2313
$crystal = 8000000 '8MHz Quarz
Ddrb = &B01111111 'PortB = Ausgang
Ddrd = &B0111111 'PortD = Ausgang bis auf PD6
portd = &B10000000 'Pullup von Pinb.7 Aktivieren


Pinb.7 alias herzeigen

Dim Icount As Long At &H60
Dim Wcountlo As Word At &H60 Overlay
Dim Wcounthi As Word At &H62 Overlay
Dim Temp As Integer At &H80
Dim Temp2 As Integer At &H80 Overlay
Dim Y As String * 5 At &H70
Dim Z(5) As Byte At &H70 Overlay
Dim Frequenz As Long
Dim Freq As Word
Dim Freq1 As Word
Dim Freq2 As Word
Dim Timeout As Byte
Dim Impulse As Byte
Dim X(5) As Byte
Dim Test As Integer
Dim Test2 As Integer
Dim Zaehler As Byte
Timeout = 0

On Icp1 Oncapture
On Ovf1 Onoverflow
Config Timer1 = Timer , Prescale = 8 , Capture Edge = Rising
Enable Icp1
Enable Ovf1
Enable Interrupts


'*******************
'* Start-Animation *
'*******************

Do
Portb = 1
Portd = 2
Waitms 50
Portd = 4
Waitms 50
Portd = 8
Waitms 50
Portd = 16
Waitms 50
Portb = 2
Waitms 50
Portb = 64
Waitms 50
Portd = 8
Waitms 50
Portd = 4
Waitms 50
Portd = 2
Waitms 50
Portb = 16
Waitms 50
Portb = 8
Waitms 50
Portd = 4
Waitms 50
Portd = 8
Waitms 50
Portd = 16
Waitms 50
Portb = 4
Waitms 50
Portb = 64
Waitms 50
Portd = 8
Waitms 50
Portd = 4
Waitms 50
Portd = 2
Waitms 50
Portb = 32
Waitms 50
Loop Until Temp2 = 1 'Bis zum 1. Impuls



'******************************************
'* Hauptschleife - LED-Anzeigen ansteuern *
'******************************************

Main:
Incr Timeout 'Bei Timeout: 0 U/min.
If Timeout = 10 Then
Timeout = 10
Freq = 0
Y = Str(freq)
Z(1) = 0
Z(2) = 0
Z(3) = 0
Z(4) = 0
Z(5) = 48
End If

For Test2 = 1 To 5 'Wert sichern .....
X(test2) = Z(test2)
Next Test2

'******************************************
'* Anzeigen an *
'******************************************

if herzeigen = 1 Then 'Wenn herzeigen = 1 dann...

For Test2 = 1 To 400 '..... und 400 mal Anzeigen
For Zaehler = 1 To 5
Test = X(zaehler)
Select Case Test
Case 48 : Portb = 63
Case 49 : Portb = 6
Case 50 : Portb = 91
Case 51 : Portb = 79
Case 52 : Portb = 102
Case 53 : Portb = 109
Case 54 : Portb = 125
Case 55 : Portb = 39
Case 56 : Portb = 127
Case 57 : Portb = 111
Case Else : Portb = 0
End Select
Portd.zaehler = 1
Waitus 100 'Zeit für jede Anzeige
Portd.zaehler = 0
Next Zaehler
Next Test2

'******************************************
'* Anzeigen aus *
'******************************************


Else 'Wenn herzeigen = 0 Anzeigen aus
Portb = 0
Portd = 0
END IF

Goto Main




'*************************************
'* Interrupt-Routine (Zeiten messen) *
'* (wird bei jedem Impuls ausgelöst) *
'*************************************

Oncapture:
Disable Icp1
Incr Impulse
If Impulse = 8 Then
Impulse = 0
Timeout = 0
Wcountlo = Timer1
Timer1 = 0
Frequenz = 240000000 / Icount 'Umrechnung für 4-Zylinder
Wcounthi = 0

Freq2 = Freq1
Freq1 = Frequenz
Frequenz = Freq1 + Freq2
Frequenz = Frequenz / 2
Freq = Frequenz

If Freq > 5999 Then Portd.0 = 1 'Wenn Drehzahl über 5999 LED an
if Freq < 4000 Then Portd.0 = 0 'Wenn Drehzahl unter 4000 LED aus
If Freq < 150 Then
Freq = 0
Y = Str(freq)
Z(1) = 0
Z(2) = 0
Z(3) = 0
Z(4) = 0
Z(5) = 48

Else

Y = Str(freq)
If Z(5) = 0 Then 'Führende Nullen eliminieren
Do
Z(5) = Z(4)
Z(4) = Z(3)
Z(3) = Z(2)
Z(2) = Z(1)
Z(1) = 0
Loop Until Z(5) > 0
End If
End If
End If
End If
Temp = 1
Enable Icp1
Return

Onoverflow:
Incr Wcounthi
Return

Werner_Just
04.11.2005, 13:39
Hallo hardstyleroxx,

ja, die Anzeigen werden nichts mehr anzeigen und
nein, der Code stimmt so nicht.

In der Pin Konfiguration definiert Du Pin B7 als Eingang und schaltest den PullUp von D7 ein (portd = &B10000000). D7 existiert beim 2313 nicht, Du wolltest also vermutlich den PullUp von B7 einschalten (portb = &B10000000).

Weiter unten, beim Abschalten der Anzeige setzte Du die kompletten Ports
B & D auf 0, schaltest also auch den PullUp für B7 (D7) ab.

Nur zur Sicherheit
Du verwendest 7-Segment Anzeigen mit gemeinsamer Kathode.
Die Kathoden werden über NPN Transistoren angesteuert, die Anoden hängen direkt am AVR. Richtig?

Zum Abschalten reicht es die Pins einen der beiden Ports, abzuschalten.
Vorzugsweise PortB, dabei aber den Eingang B7 auf "1" belassen.

Else 'Wenn herzeigen = 0 Anzeigen dann "aus"
Portb = &B10000000
END IF

Anmerkung PortD = 0 geht auch, dann schaltest Du aber die gelbe LED (ab 6250 Umdr./min.) mit ab oder Du musst sie extra ausmaskieren.

Ciao,
Werner

hardstyleroxx
04.11.2005, 16:37
Danke für deine Mühen.

PS: Das Buch wrid gleich bestellt, habe mir mal das Inhaltsverzeichnis angeschaut und es scheint genau das zu sein was ich suche :)

Alex20q90
29.04.2006, 13:25
Sorry für die dumme Fragen die ich gleich stellen werde,

aber hast Du das Programm irgendwo geklaut und möchtest Du sowas zum Laufen bringen :

http://defencemercury1.dyndns.org/spasslex/Fotos/Foto4(41).jpg

http://defencemercury1.dyndns.org/spasslex/Fotos/Foto4(39).jpg

Das ist ein variables Drehzahlmesservorwarnfeld! Wie es im BMW M3 und im M5 drinn ist! Da BMW selber sagte sowas würde es nur in den M-Modellen geben, hat jemand denen die kalte Schulter gezeigt und mal schnell selber sowas gebaut! Sehr zum Leidwesen des Fahrzeugbauers...