PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeit für Pulsein "Messung"?



TobiasBlome
22.10.2006, 19:16
Hallo,
ich habe 4 Signale die immer mit einer Länge zwischen 1 - 2 ms am µC Eingang liegen! Diese 4 Signale gehen auf 4 Eingänge und je nach Länge werden verschiedene µC Ausgänge geschaltet oder nicht!

Urspünglich hatte ich einen 4MHz Quarz für den µC genommen, um die 4 Eingänge abzufragen. Weil das zu langsam war habe ich auf 20 MHz erhöht! Leider dauert ein Zyklus immernoch (schätzungsweise) genauso lange wie mit den 4MHz!!!

Wenn ich ein Signal über die FB sende, dauert es ca. 1 Sekunde, bis der entsprechende Ausgang geschaltet hat! (und der µC macht sonst nix anderes!!!)

Weis jemand Rat?
Tobias

Programm:


'-------------------------------------------------------------------------------
' Modellbauschalter 4/8Kanal
'-------------------------------------------------------------------------------
'Beschreibung:

'4Steuerkanäle von Fernsteuerung auf 8 µC - Ausgänge
'Das Hi-Signal vom Empfänger wird mit "Pulsein" ermittelt!
'Knüppelstellung mitte hat ca. 121 Zeiteinheiten bei einem 3.6864 MHz Quarz!
'guter Schaltbereich für:
'oben einschalten ca.: 140 -> bei 20 MHz = 9
'unten einschalten ca.: 100 -> bei 20 MHz = 6
'Der mit "Pulsein" gemessene Wert wird in Pulsbreite1-4 ausgegeben.
'Kanal1-3u/o wird zum speichern benutzt, damit damit nicht bei jedem Durchlauf
'über "toggle" geschaltet wird, sondern erst wieder,
'wenn der Knüppel vorher in Nullstellung gewesen ist!
'"toggle" schaltet den Ausgang von Hi auf Low und wieder zurück!
'Der PNP Transistor BD 238 schaltet bei einem LOW Signal 5V auf die LED



'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "ATtiny2313.dat" 'ATtiny2313-Deklarationen
$crystal = 20000000 'Quarz: 20.0 MHz

'-------------------------------------------------------------------------------
'Ein- Ausgänge:
Ddrd = &B1000011 '1 Ausgang, 0 Eingang = Pin PD6,1+0 als Ausgang / PD5-2 als Eingang
Ddrb = &B11111111 '1 Ausgang, 0 Eingang = Pin PB7-0 als Ausgang
Portb = &B11111111 'PB0...PB7 auf High setzen

'-------------------------------------------------------------------------------
'Variablen auswertung FB
Dim Pulsbreite1 As Word 'Knüppelstellung Knüppel 1 '
Dim Pulsbreite2 As Word
Dim Pulsbreite3 As Word
Dim Pulsbreite4 As Word

Dim Kanal1o As Bit 'Speicher von Knüppel 1 OBEN
Dim Kanal1u As Bit 'Speicher von Knüppel 1 UNTEN
Dim Kanal2o As Bit
Dim Kanal2u As Bit
Dim Kanal3o As Bit
Dim Kanal3u As Bit


'-------------------------------------------------------------------------------
' HAUPTPROGRAMM
'-------------------------------------------------------------------------------


Do 'Do Loop Schleife



'FB auswerten:

'Kanal 1 LICHT HINTEN:
'____________________

Pulsein Pulsbreite1 , Pind , 5 , 1 'Pulsbreite auslesen (1=High Impuls)
'Knüppel rastend OBEN
If Pulsbreite1 > 9 And Kanal1o = 0 Then 'wenn Knüppel oben und Kanal1oben=0 dann
Toggle Portb.1 'Pin 1 mal schalten (entweder auf Hi oder Low je nach vorherigem zustand)
Kanal1o = 1 'Variable Kanal1o setzen damit nicht neu getoggled werden kann
End If
If Pulsbreite1 < 9 Then 'Wenn Knüppel nicht oben dann
Kanal1o = 0 'Variable Kanal1o RÜCKsetzen damit neu getoggled werden kann
End If
'Knüppel rastend UNTEN
If Pulsbreite1 < 6 And Kanal1u = 0 Then
Toggle Portb.0
Kanal1u = 1
End If
If Pulsbreite1 > 6 Then
Kanal1u = 0
End If



'Kanal 2 UNTERBODEN:
'___________________

Pulsein Pulsbreite2 , Pind , 4 , 1 'Pulsbreite auslesen (1=High Impuls)
'Knüppel rastend OBEN
If Pulsbreite2 > 9 And Kanal2o = 0 Then
Toggle Portb.3
Kanal2o = 1
End If
If Pulsbreite2 < 9 Then
Kanal2o = 0
End If
'Knüppel rastend UNTEN
If Pulsbreite2 < 6 And Kanal2u = 0 Then
Toggle Portb.2
Kanal2u = 1
End If
If Pulsbreite2 > 6 Then
Kanal2u = 0
End If



'Kanal 3:
'________

Pulsein Pulsbreite3 , Pind , 3 , 1 'Pulsbreite auslesen (1=High Impuls)
'Knüppel rastend OBEN
If Pulsbreite3 > 9 And Kanal3o = 0 Then
Toggle Portb.5
Kanal3o = 1
End If
If Pulsbreite3 < 9 Then
Kanal3o = 0
End If
'Knüppel rastend UNTEN
If Pulsbreite3 < 6 And Kanal3u = 0 Then
Toggle Portb.4
Kanal3u = 1
End If
If Pulsbreite3 > 6 Then
Kanal3u = 0
End If



'Kanal 4 (Taster / Taster):
'________

Pulsein Pulsbreite4 , Pind , 2 , 1 'Pulsbreite auslesen (1=High Impuls)
'Knüppel tastend OBEN
If Pulsbreite4 > 9 Then 'Knüppel oben
Portb. 7 = 0 'Port PB 7 setzen
Else 'sonst
Portb. 7 = 1 'Port PB 7 zurücksetzen
End If
'Knüppel tastend UNTEN
If Pulsbreite4 < 6 Then 'Knüppel unten
Portb. 6 = 0 'Port PB 6 setzen
Else 'sonst
Portb. 6 = 1 'Port PB 6 zurücksetzen
End If



'Automatikfunktion für Scheinwerfer: GEPRÜFT MIT HARDWARE OK
'___________________________________

If Portb.0 = 0 Or Portb.1 = 0 Then 'Wenn PB0 oder PB1 Hi sind dann
Portd.6 = 0 ' PD6 setzen
Else 'sonst
Portd.6 = 1 'PD6 RÜCKsetzen
End If

Loop



'================================================= ===============================
'Pinbelegung µC
'================================================= ==============================
' AtmelATtiny2313
'PD0 = Frei +---U---+
'PD1 = ResetTaster (Reset) PA2 +1 20+ Vcc +5V
'PD2 = Kanal 4 FREI ->PD0 +2 19+ PB7 Zusatzfunktion 3 tastend
'PD3 = Kanal 3 FREI ->PD1 +3 18+ PB6 Hupe / tastend
'PD4 = Kanal 2 x x Xtal 2 / PA1 +4 17+ PB5 Zusatzfunktion 2 rastend
'PD5 = Kanal 1 x x Xtal 1 / PA0 +5 16+ PB4 Zusatzfunktion 1 rastend
'PD6 = Licht vorne Kanal 4->PD2 +6 15+ PB3 Licht Boden 2 / rastend (OC1A)PWM
'PB0 = Licht hinten 1 Kanal 3->PD3 +7 14+ PB2 Licht Boden 1 / rastend (OC0A)PWM
'PB1 = Licht hinten 2 Kanal 2->PD4 +8 13+ PB1 Licht hinten 2 / rastend
'PB2 = Licht Boden 1 Kanal 1->PD5 +9 12+ PB0 Licht hinten 1 / rastend
'PB3 = Licht Boden 2 GND +10 11+ PD6 Licht vorne
'PB4 = Zusatzfunktion 1 +-------+
'PB5 = Zusatzfunktion 2
'PB6 = Hupe
'PB7 = Zusatzfunktion 3

TobiasBlome
22.10.2006, 20:00
Hab den Fehler gefunden - aber wie beheben??

Also einen Kanal habe ich als "Reserve" programmiert und da das Kabel nicht angeschlossen ist kommen auch keine Impulse auf den Eingang: Pulsein wartet dann die volle Zeit von 65535/10us = 655,35ms und erst dann läuft mein Programm weiter!! Kann man die 655,35ms irgendwie verkürzen?

Bascom Hilfe:
RR variable will be set to 1 in case of a time out. A time out will occur after 65535 unit counts. With 10 uS units this will be after 655.35 mS.


Tobias

magnetix48
23.10.2006, 09:37
Hallo Tobias,

kannst du nicht den Reservekanal einfach überspringen, vielleicht in Abhängigkeit vom Signal an einem Port-Pin? Oder du legst eins von den anderen Signalen zusätzlich auf den Reserve-Kanal.

Gruß
Detlef

Gruß
Detlef

TobiasBlome
23.10.2006, 15:39
Hallo Detlef,
das könnte ich machen: ich lege einfach eins von den andere Signalen über einen Jumper auf den Reserve Eingang.

Gute Idee - Danke!

Da hätte ich ja eigendlich auch selber drauf kommen können :oops:
Tobias