Videomonitor

Herr_F_aus_M

Neues Mitglied
28. Sep. 2009
25
0
0
Sprachen
Erstmal ein Hallo an Alle,

so vor kurzem habe ich begonnen AVR-Mikrocontroller mittels Bascom zuprogrammieren, einfache Dinge klappen auch ganz gut.

Nun habe ich mit meinen ersten ernsthaften Projekt begonnen, ein Monitor für eine Videoüberwachungsanlage, welche folgende Funktionen haben soll. Mittels Druck auf einen von 4 Tastern soll der Monitor eingeschaltet werden und der entsprechende Kanal auf dem Monitor angezeigt werden. Dazu nutze ich einen 4 Kanal-Multiplexer von Maxim, welchen ich per AVR ansteuere. Zusätzlich soll der Monitor per Klingelsignal angesteuert werden und dann das Videosignal der Tür anzeigen.

Nach dem Aktivierung mittels eines der 4 Taster oder nach der Erkennung des Klingelsignals, soll sich der Monitor selbstständig nach 30 sec. wieder abschalten; und hier habe ich noch Probleme. Vielleicht kann mir jemand einen Tipp geben, wie ich dieses Problem am besten löse.

Ich füge mal meinen "Auswahl-Code" an

Code:
If Pina.0 = 0 Then
       Porta.5 = 1                                          ' Monitor an
       Porta.6 = 0 : Porta.7 = 0                            ' Videoschalter Kanal 1

     Elseif Pina.1 = 0 Then
       Porta.5 = 1                                          ' Monitor an
       Porta.6 = 0 : Porta.7 = 0                            ' Videoschalter Kanal 1

     Elseif Pina.2 = 0 Then
       Porta.5 = 1                                          ' Monitor an
       Porta.6 = 1 : Porta.7 = 0                            ' Videoschalter Kanal 2

     Elseif Pina.3 = 0 Then
       Porta.5 = 1                                          ' Monitor an
       Porta.6 = 0 : Porta.7 = 1                            ' Videoschalter Kanal 3

     Elseif Pina.4 = 0 Then
       Porta.5 = 1                                          ' Monitor an
       Porta.6 = 1 : Porta.7 = 1                            ' Videoschalter Kanal 4

     Else
       Porta.5 = 0                                          ' Monitor aus
     End If
 
Hallo,

ich würde das (Sprachenunabhängig erklärt) folgendermaßen lösen ...

Du hast für die 4 Kanäle 4 Variablen die normalerweise den Inhalt 0 haben.
0=Kanal abgeschaltet.
Wenn man jetzt einen Taster betätigt, dann setzt man die zugehörige Variable
auf 30 (30 Sekunden) und alle anderen auf 0 (ausschalten).
Für die Ausschaltung nach 30 Sekunden nimmt man nen Timer, der die Variablen
jede Sekunde um eins veringert, so lange bis sie auf 0 sind.
Der Kanal, dessen Variable über 0 ist ist aktiviert.

Gruß
Dino
 
Hallo Herr F aus M,

Nach dem Aktivierung mittels eines der 4 Taster oder nach der Erkennung des Klingelsignals, soll sich der Monitor selbstständig nach 30 sec. wieder abschalten; und hier habe ich noch Probleme. Vielleicht kann mir jemand einen Tipp geben, wie ich dieses Problem am besten löse.

Alsoooo, ich würde das auf jeden Fall auch mit einem Timer lösen. Und zwar würde ich einen 16-Bit-Timer nehmen und den so konfigurieren, dass er wie Dino schon sagte jede Sekunde einen Interrupt erzeugt, in dem Du dann die Variablen zählen kannst.

Welchen Controller verwendest Du und mit wieviel Herzen hoppelt dieser?

Grüße,
Markus
 
hi :),

also ich würd den Timer auf maximal 10mS laufen lassen.. ganz einfach aus dem grund weil man mit diesem Super auch noch die Tasten entprellen kann.

(alle 10mS Ticks ne Variable hochzählen)

Bei jedem Tick die Tasten entprellen (naja weiß ja nicht wie du sowas in basecom machst ich mag nur keinen code der zum entprellen nur nops macht ^^ dafür gibts ja interrups bzw hardware Timer die man pollen kann)

So und über die Taster würde ich nur die Mux Adresse und ein Flag setzen um "jetzt Ein" variable runterzählen oder hoch und bei deinem Wert (30 Sek) dann wieder Ausschalten und gleichzeitig das Flag löschen.


Ja das wäre so das einfachste was mir einfällt und gefallen würde ^^

mfg
Manuel
 
so es gehts auf WE zu und ich hab neue Bauteile bekommen, kann mich also wieder ans Projekt machen.

@Markus, also es wird wohl nen ATmega8 werden, hatte erst einen ATtiny24 aber jetzt hab ich noch einige weitere Funktionen drin, da die Taster beleuchtet sind. Und Frequenz, hmm eigentlich reicht mir der interne Takt von 1 Mhz.

@bluelight_electronic, Entprellen wollte ich per "debounce"-Bascom-Befehl.
 
hi,

hmmz kann zu Basecom nicht viel sagen da ich es nicht Nutze (also nicht hauen falls ich falsch lieg ^^), aber ich vermute das ist auch nur Zeit unnötig zu verschwenden (klar wenns kein Problem is kann man das machen aber ich pers. mags nicht *gg*).

Ich nutz halt gern nen timer für vieles und schau am liebsten dass ich immer im fluss bin also möglichst gleich wieder in der Main bin.

Weiß auch nicht in wie weit man da bei basecom eingriff drauf hat.
 
Hallo,

hmmz kann zu Basecom nicht viel sagen da ich es nicht Nutze (also nicht hauen falls ich falsch lieg ^^), aber ich vermute das ist auch nur Zeit unnötig zu verschwenden (klar wenns kein Problem is kann man das machen aber ich pers. mags nicht *gg*).

Ich nutz halt gern nen timer für vieles und schau am liebsten dass ich immer im fluss bin also möglichst gleich wieder in der Main bin.
ist auch nicht so mein Ding, Zeit zu verbraten aber bei manchen Sachen
ist es einfach "bequemer" oder bei der erzeugung von Timings schlecht anders
umzusetzen.

Die Entprellung mach ich auch ohne Zeitverbrennung allerdings auch ohne Timer :D
Einfach in einer Routine die zyklisch in der Main aufgerufen wird die Taster-Werte
in Register einschieben (ein Schieberegister pro Taster) und dann eine
Bewertung der eingeschobenen Bits. Wenn man das zweistufig macht, dann
kann man in der ersten Stufe bereits den Tastenstatus (gedrückt nicht gedrückt)
erkennen und in der zweiten Stufe die Flanken (drücken / loslassen).

Gruß
Dino
 
Erstes Programm ist fertig

So heute hab ich mal endlich Zeit gefunden, mich ans Projekt zumachen und das erste Programm ist fertig.

Code:
$regfile = "m8def.dat"                                      'für Mega8
$crystal = 3686400                                          'für 8MHz Quarz

$baud = 9600

Dim T As Word

'Eingänge
Config Portb.0 = Input                                      ' Klingel
Config Portb.1 = Input                                      ' Kanal 1
Config Portb.2 = Input                                      ' Kanal 2
Config Portb.3 = Input                                      ' Kanal 3
Config Portb.4 = Input                                      ' Kanal 4
Portb.0 = 1                                                 ' PullUp Klingel Ein
Portb.1 = 1                                                 ' PullUp Kanal 1 Ein
Portb.2 = 1                                                 ' PullUp Kanal 2 Ein
Portb.3 = 1                                                 ' PullUp Kanal 3 Ein
Portb.4 = 1                                                 ' PullUp Kanal 4 Ein

'Ausgänge
Config Portc.0 = Output                                     ' Spannung Videomonitor
Config Portc.1 = Output                                     ' Videokanalschalter a
Config Portc.2 = Output                                     ' Videokanalschalter b

Config Timer1 = Timer , Prescale = 256                      ' Konfiguriere Timer1
Enable Timer1                                               ' schalte den Timer1 ein
On Timer1 Isr_von_timer1                                    ' verzweige bei Timer1 überlauf zu   Isr_von_Timer1
Enable Interrupts
Timer1 = 51135                                              ' Timer1 soll schon von 51135 wegzählen

T = 0
Do
 If Pinb.0 = 0 Then
       T = 30                                               ' Timer Monitor setzen
       Portc.1 = 0 : Portc.2 = 0                            ' Videoschalter Kanal 1
 Elseif Pinb.1 = 0 Then
       T = 30                                               ' Timer Monitor setzen
       Portc.1 = 0 : Portc.2 = 0                            ' Videoschalter Kanal 1
 Elseif Pinb.2 = 0 Then
       T = 30                                               ' Timer Monitor setzen
       Portc.1 = 1 : Portc.2 = 0                            ' Videoschalter Kanal 2
 Elseif Pinb.3 = 0 Then
       T = 30                                               ' Timer Monitor setzen
       Portc.1 = 0 : Portc.2 = 1                            ' Videoschalter Kanal 3
 Elseif Pinb.4 = 0 Then
       T = 30                                               ' Timer Monitor setzen
       Portc.1 = 1 : Portc.2 = 1                            ' Videoschalter Kanal 4
 End If

Loop
End

Isr_von_timer1:                                             ' ISR von Timer1
Timer1 = 51135                                              ' Timer1 soll ab 51135 an zählen

Decr T                                                      ' Variable T Decrementieren

 If T < 30 Then
      Portc.0 = 1                                           ' Videomonitor einschalten
 Else
      T = 0
      Portc.0 = 0                                           ' Videoschalter ausschalten
 End If

Return

Jetzt hab ich noch einige Sonderwünsche, da die Taster beleuchtet sind, d.h. bei Betätigung eines Tasters soll dieser leuchten.
 
So, hab mich gerade nochmal drangesetzt und meine neuen Wünsche eingefügt. Wenn ich jetzt auf einen der Taster drücke, leuchtet seine LED, wenn es klingelt geht entsprechend die LED vom Taster/Kanal 1 an, allerdings blinkt sie in diesem Fall.

Als nächstes werde ich mal die Bauteile rauskramen bzw. bestellen und das ganze aufbauen.

Code:
$regfile = "m8def.dat"                                      '[I]für Mega8[/I]
$crystal = 3686400                                          '[I]für 8MHz Quarz[/I]


Dim T As Word                                               ' [I]Variable T, Einschaltzeit für den Videomonitor[/I]
Dim K As Word                                               ' [I]Variable K, Einschaltzeit Blinken LED Taster 1[/I]

'[I]Eingänge[/I]
Config Portb.0 = Input                                      ' [I]Klingel[/I]
Config Portb.1 = Input                                      ' [I]Kanal 1[/I]
Config Portb.2 = Input                                      ' [I]Kanal 2[/I]
Config Portb.3 = Input                                      ' [I]Kanal 3[/I]
Config Portb.4 = Input                                      ' [I]Kanal 4[/I]
Portb.0 = 1                                                 ' [I]PullUp Klingel Ein[/I]
Portb.1 = 1                                                 ' [I]PullUp Kanal 1 Ein[/I]
Portb.2 = 1                                                 ' [I]PullUp Kanal 2 Ein[/I]
Portb.3 = 1                                                 ' [I]PullUp Kanal 3 Ein[/I]
Portb.4 = 1                                                 ' [I]PullUp Kanal 4 Ein[/I]


'Ausgänge
Config Portc.0 = Output                                     ' [I]Spannung Videomonitor[/I]
Config Portc.1 = Output                                     ' [I]Videokanalschalter a[/I]
Config Portc.2 = Output                                     ' [I]Videokanalschalter b[/I]

Config Portd.4 = Output                                     ' [I]Led Taster 1[/I]
Config Portd.5 = Output                                     '[I] Led Taster 2[/I]
Config Portd.6 = Output                                     ' [I]Led Taster 3[/I]
Config Portd.7 = Output                                     ' [I]Led Taster 4[/I]


Config Timer1 = Timer , Prescale = 256                      ' [I]Konfiguriere Timer1[/I]
Enable Timer1                                               ' [I]schalte den Timer1 ein[/I]
On Timer1 Isr_von_timer1                                    ' [I]verzweige bei Timer1 überlauf zu   Isr_von_Timer1[/I]
Enable Interrupts
Timer1 = 51135                                              ' [I]Timer1 soll schon von 51135 wegzählen[/I]

K = 0                                                       ' [I]Variable K auf 0 setzen[/I]
T = 0                                                       ' [I]Variable T auf 0 setzen
[/I]
' Hauptprogramm
Do
 If Pinb.0 = 0 Then
       K = 30                                               ' [I]LED Taster 1 blinken[/I]
       T = 30                                               ' [I]Timer Monitor setzen[/I]
       Portc.1 = 0 : Portc.2 = 0                            ' [I]Videoschalter Kanal 1[/I]
 Elseif Pinb.1 = 0 Then
       K = 0
       T = 30                                               ' [I]Timer Monitor setzen[/I]
       Portc.1 = 0 : Portc.2 = 0                            ' [I]Videoschalter Kanal 1[/I]
       Portd.4 = 1 : Portd.5 = 0 : Portd.6 = 0 : Portd.7 = 0       ' [I]LED Taster 1 an[/I]
 Elseif Pinb.2 = 0 Then
       K = 0
       T = 30                                               ' [I]Timer Monitor setzen[/I]
       Portc.1 = 1 : Portc.2 = 0                            ' [I]Videoschalter Kanal 2[/I]
       Portd.4 = 0 : Portd.5 = 1 : Portd.6 = 0 : Portd.7 = 0       ' [I]LED Taster 2 an[/I]
 Elseif Pinb.3 = 0 Then
       K = 0
       T = 30                                               ' [I]Timer Monitor setzen[/I]
       Portc.1 = 0 : Portc.2 = 1                            ' [I]Videoschalter Kanal 3[/I]
       Portd.4 = 0 : Portd.5 = 0 : Portd.6 = 1 : Portd.7 = 0       '[I] LED Taster 3 an[/I]
 Elseif Pinb.4 = 0 Then
       K = 0
       T = 30                                               ' [I]Timer Monitor setzen[/I]
       Portc.1 = 1 : Portc.2 = 1                            ' [I]Videoschalter Kanal 4[/I]
       Portd.4 = 0 : Portd.5 = 0 : Portd.6 = 0 : Portd.7 = 1       '[I] LED Taster 4 an[/I]
 End If

Loop
End

' Interruptsubroutine von Timer 1
Isr_von_timer1:
Timer1 = 51135                                              ' [I]Timer1 soll ab 51135 an zählen
[/I]
Decr T                                                      ' [I]Variable T herunterzählen[/I]
Decr K                                                      ' [I]Variable K herunterzählen[/I]

 If T < 30 Then
      Portc.0 = 1                                           ' [I]Videomonitor einschalten[/I]
 Else
      T = 0
      Portc.0 = 0                                           ' [I]Videomonitor ausschalte[/I]n
      Portd.4 = 0                                           ' [I]LED Taster 1 aus[/I]
      Portd.5 = 0                                           ' [I]LED Taster 2 aus[/I]
      Portd.6 = 0                                           ' [I]LED Taster 3 aus[/I]
      Portd.7 = 0                                           '[I] LED Taster 4 aus[/I]
 End If

 If K < 30 Then
      Toggle Portd.4                                        ' [I]LED Taster 1 blinken[/I]
      Portd.5 = 0                                           ' [I]LED Taster 2 aus[/I]
      Portd.6 = 0                                           ' [I]LED Taster 3 aus[/I]
      Portd.7 = 0                                           ' [I]LED Taster 4 aus[/I]
 Else
      K = 0
 End If

Return
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)