Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR Stromstoßschaltung
voll-milch
06.01.2009, 19:35
Hallo,
Ich möchte, wenn ich den Taster Pinb.0 auf High setze
das sich Portc.0 high schaltet und auch eingeschalten bleibt, bis ich den
Taster erneut drücke ........
hört sich einfach an, ist es aber für mich nich also hat jemand eine idee?
hier mal ne schaltung wo der ausgang syncron zum eingang ist
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600
Sound Portd.7 , 400 , 450 'BEEP
Sound Portd.7 , 400 , 250 'BEEP
Sound Portd.7 , 400 , 450 'BEEP
Config Pinb.0 = Input 'Für Tastenabfrage
Taster Alias Pinb.0
Portb.0 = 1 'Pullup Widerstand ein
Config Pinc.0 = Output
Relais4 Alias Portc.0
Do
If Taster = 0 Then
Relais4 = 0
Else
Relais4 = 1
End If
Loop
schon mal vielen dank:)
Andree-HB
06.01.2009, 19:43
...suche mal in der Bascom-Hilfe nach "toggle"
peterfido
06.01.2009, 19:45
if pinb.0 = 1 then toggle portc.0
voll-milch
06.01.2009, 19:59
mit
Do
If Pinb.0 = 1 Then Toggle Portc.0
Loop
ist der port immer high. wenn ich n paar mal den taster drück geht er aus aber auch nur solange wie ich ihn gedrückt halte..
Versuche mal folgendes:
portB.0 = 0
PortC.0 = 0
do
If pinB.0 = 1 then
wait ms 50
toggle portc.0
end if
loop
jetzt sollte der Ausgang portc.0 bei jedem Tastendruck seinen
Zustand ändern.
MfG
Neutro
elkokiller
06.01.2009, 20:22
Hallo,
ich habe meine Stromstoßschalter (Eltakos) auch durch AVR's abgelöst.
Zunächst ging es mir nur um die reine Stromstoßfunktion. Dann kam die Zeitschaltfunktion dazu und jetzt sind alle über einen CAN Bus vernetzt und vom PC aus programmierbar!
Im angehängten Programm ist eine der ersten "funktionierenden" Versionen mit Eltako und Zeitschaltfunktion enthalten.
Bei Bedarf kann ich dir weitere Unterlagen zukommen lassen
$regfile = "m8def.dat"
$crystal = 7372800
$baud = 4800
'------------------------------------
Config Pinc.0 = Input ' Schaltport
Config Pinc.1 = Input
Config Pinc.2 = Input
Config Pinc.3 = Input
Config Pinc.4 = Input
Config Pinc.5 = Input
'Config Pind.5 = Input
Config Portb.0 = Output ' Schaltport
Config Portb.1 = Output
Config Portb.2 = Output
Config Portd.7 = Output
Config Portd.6 = Output
Config Portb.5 = Output ' Kontrollport
Dim T1 As Long
Dim T2 As Long
Dim T3 As Long
Dim T4 As Long
Dim T5 As Long
Dim Rtime As Long
Dim Minute As Long
Rtime = 0
Minute = 0
Dim Ablaufzeit1 As Long
Dim Ablaufzeit2 As Long
Dim Ablaufzeit3 As Long
Dim Ablaufzeit4 As Long
Dim Ablaufzeit5 As Long
Ablaufzeit1 = 0
Ablaufzeit2 = 0
Ablaufzeit3 = 0
Ablaufzeit4 = 0
Ablaufzeit5 = 0
Dim Zeit1 As Long
Dim Zeit2 As Long
Dim Zeit3 As Long
Dim Zeit4 As Long
Dim Zeit5 As Long
Dim Sz As Long 'Sendezeit
Zeit1 = 30 'Terasse
Zeit2 = 240 'Esstisch
Zeit3 = 60 '
Zeit4 = 10 'Treppenhaus
Zeit5 = 30 'Dachterasse / Treppe
Dim Db1_ As Byte ' db1 zur Aufnahme des Modulzustandes in Hex
T1 = 0
T2 = 0
T3 = 0
T4 = 0
T5 = 0
Sz = 0
Config Debounce = 50
Dim I As Byte
Dim Key As Byte
Dim S As String * 10
Dim B(10) As Byte 'At S Overlay
Dim N As Byte
' Protokoll ---------------------------------------------------------
On Timer0 Ontimer0
Config Timer0 = Timer , Prescale = 1024
Enable Timer0
'---------- Programm ----------
Prog_start:
N = 0
Do
If Portd.6 = 1 Then
Ablaufzeit1 = Minute - T1
If Zeit1 < Ablaufzeit1 Then
Portd.6 = 0
T1 = 0
Else
End If
Else
End If
If Portb.0 = 1 Then
Ablaufzeit2 = Minute - T2
If Zeit2 < Ablaufzeit2 Then
Portb.0 = 0
Else
End If
Else
End If
If Portb.2 = 1 Then
Ablaufzeit3 = Minute - T3
If Zeit3 < Ablaufzeit3 Then
Portb.2 = 0
Else
End If
Else
End If
If Portd.7 = 1 Then
Ablaufzeit4 = Minute - T4
If Zeit4 < Ablaufzeit4 Then
Portd.7 = 0
Else
End If
Else
End If
If Portb.1 = 1 Then
Ablaufzeit5 = Minute - T5
If Zeit5 < Ablaufzeit5 Then
Portb.1 = 0
Else
End If
Else
End If
Debounce Pinc.0 , 0 , Key_o1 , Sub 'Port 1.
Debounce Pinc.1 , 0 , Key_o2 , Sub 'Port 2
Debounce Pinc.2 , 0 , Key_o3 , Sub 'Port 3
Debounce Pinc.3 , 0 , Key_o4 , Sub 'Port 4
Debounce Pinc.4 , 0 , Key_o5 , Sub 'Port 5
Loop
End
Key_o1:
Toggle Portb.0 'Buchse 1
If T2 = 0 Then
T2 = Minute
Else
T2 = 0
End If
Return
Key_o2:
Toggle Portb.1 'Buchse 2
If T5 = 0 Then
T5 = Minute
Else
T5 = 0
End If
Return
Key_o3:
Toggle Portb.2 'Buchse 3
If T3 = 0 Then
T3 = Minute
Else
T3 = 0
End If
Return
Key_o4:
Toggle Portd.7 'Buchse 5
If T4 = 0 Then
T4 = Minute
Else
T4 = 0
End If
Return
Key_o5:
Toggle Portd.6 'Buchse 4
If T1 = 0 Then
T1 = Minute
Else
T1 = 0
End If
Return
Key_o6: 'Buchse 7 (Garagentor)
Return
'---------- Timer -----------
Ontimer0:
Rtime = Rtime + 1 ' variable wird bei jedem Interrupt um 1 erhöht
Gosub Minutenzaehler
Return
' ----Minutenauswertung -----------------------------------------
Minutenzaehler:
If Rtime = 1700 Then ' Teilungsfaktor bei 7372800 Hz und Prescale um auf 1 Minute zu kommen
Minute = Minute + 1
Rtime = 0
Else
End If
Return
voll-milch
06.01.2009, 20:28
hi neutro,
das is auch keine wahre lösung der port wechsel immer von high auf low flackert quasi ..
hallo,
sowie ich das verstehe will er auf knopf druck dass das Relai anzieht und bei erneutem drücke soll das wieder aus gehen.
do
Debounce Pind.2 , 0 , Taster1
If Normal = 1 Then
portd.6 = 1
End If
if normal = 2 then
portd.6 = 0
end if
loop
end
Taster1:
Normal = Normal + 1
If Normal > 2 Then
Normal = 0
End If
Return
probier dasmal aus dies klappt.... vielleicht noch etwas unsauber aber es klappt.
musst nur die ports ändern.
voll-milch
06.01.2009, 21:14
hi patti, das hast du richtig verstanden.
nur dein programm bekomm ich nicht complimiert:D
so läuft es durch bascom musst halt deinen µC usw noch hinzufügen
Dim Normal As Byte
do
Debounce Pind.2 , 0 , Taster1
If Normal = 1 Then
portd.6 = 1
End If
if normal = 2 then
portd.6 = 0
end if
loop
end
Taster1:
Normal = Normal + 1
If Normal > 2 Then
Normal = 0
End If
Return
voll-milch
06.01.2009, 21:33
ok es läuft durch bascom aber funktioniert nicht, nach jedem tastendruck startet der avr neu.. bzw die start sounds kommen :-!
bei mir funktioniert es hast du alles ports richtig konfiguriert und angeschlossen ?
so stehst im der hilfe drin.
$regfile = "m48def.dat" ' specify the used micro
$crystal = 4000000 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
Config Debounce = 30 'when the config statement is not used a default of 25mS will be used but we override to use 30 mS
'Debounce Pind.0 , 1 , Pr 'try this for branching when high(1)
Debounce Pind.0 , 0 , Pr , Sub
Debounce Pind.0 , 0 , Pr , Sub
' ^----- label to branch to
' ^---------- Branch when P1.0 goes low(0)
' ^---------------- Examine P1.0
'When Pind.0 goes low jump to subroutine Pr
'Pind.0 must go high again before it jumps again
'to the label Pr when Pind.0 is low
Debounce Pind.0 , 1 , Pr 'no branch
Debounce Pind.0 , 1 , Pr 'will result in a return without gosub
End
Pr:
Print "PIND.0 was/is low"
Return
hast du ein eigenes board gebaut oder gekauft ??
hast du einen int eingang belegt mit einem taster ?
voll-milch
06.01.2009, 21:56
kein int eingang belegt is ne fertig aufgebaute rn-control also das teil läuft 100% hab auch schon einige schaltungen damit aufgebaut...
dann musste aber die Tasten abfrage anders gestallten, siehe rn datenblatt
sprich seite 17 ganz unten sowie seite 17 nach dem do mit dem select case befehl
voll-milch
06.01.2009, 23:01
wie anderes gestalten?
ich hab n taster direkt am avr angeschlossen, nutz nich die vom board..
Schaltest du mit dem Taster von 5V nach GND bei Tastendruck oder
von GND nach 5V bei Tastendruck?
Ich denke das du wohl gegen GND schaltest und du am Input Pin dauerhaft
5V anliegen hast. Das würde erklären warum die LED in meinem Programm
flackert.
Probiere das mal einfach mit einem stückchen Draht aus den du einfach an den Input Pin hälst.
MfG
Neutro
[code]
do
Debounce Pind.2 , 0 , Taster1
loop
end
taster1:
toggle portd.6 'led blinken lassen oder einfach portd.6= 0/an
return
voll-milch
07.01.2009, 20:46
Schaltest du mit dem Taster von 5V nach GND bei Tastendruck oder
von GND nach 5V bei Tastendruck?
Ich denke das du wohl gegen GND schaltest und du am Input Pin dauerhaft
5V anliegen hast. Das würde erklären warum die LED in meinem Programm
flackert.
Probiere das mal einfach mit einem stückchen Draht aus den du einfach an den Input Pin hälst.
MfG
Neutro
versteh leider nich was du meinst? was soll das fürn unterschied machen,?
gruß
das unterschied daran das man es im programm auch so configurieren muss.
voll-milch
07.01.2009, 21:22
ich muss jetz echt mal betteln, kann mir jemand nichmal ne art minitutorial schreiben ich raffs nich bin noch recht neu in der branche;)
dann schreib mal richtig auf wo was angeschlossen ist und wie
Hallo voll-milch,
schau dir mal genau dieses WIKI an:https://www.roboternetz.de/wissen/index.php/AVR-Einstieg_leicht_gemacht
und dazu die Schaltpläne. Dann müsstest du erkennen das die Configuration
der I/O Ports immer zu dem Schaltplan , bzw mit der Beschatung des µC zusammenpassen muss.
MfG
Neutro
voll-milch
08.01.2009, 17:54
also ich hab an Pinb.0 einen taster gegen GND, und an Pinc.0 ein relais über einen schaltverstärler..
Hallo voll-milch,
wenn du es so aufgebaut hast wie oben beschrieben, das du bei Tastendruck gegen gnd schaltest muss das Programm so laufen:
$regfile = "m8def.dat" 'oder anderer Controller Typ
config pinb.0 = input 'Eingang festlegen
config portc.0 = output 'Ausgang festlegen
portB.0 = 1 'interner pull up ein (+5V)
PortC.0 = 0 'Ausgang auf 0 (GND) setzen
do
If pinB.0 = 0 then 'wenn an pinb.0 eine 0 (GND) anliegt dann
wait ms 50 'warte kurz
toggle portc.0 'ändere den Schaltzustand
end if
loop
Wenn das nicht geht dann stimmt wohl etwas an deinem Aufbau nicht...
MfG
Neutro
voll-milch
08.01.2009, 22:09
wow neutro,
damit komm ich der sache schon ein rießen stück näher
der ausgang flackert immer noch, wechselt schnel zwichen high/low aber wenn man dann im richtigen moment den taster drückt schaltet alles so wie es soll wie bekomm ich das flimmern jetzt noch raus?
schon mal danke:)
helimike0705
09.01.2009, 10:37
Hallo, schaue dir mal den Befehl " Bitwait " in der Hilfe an.
Du kannst den Wert der hinter "Waitms" steht einfach etwas vergrößern. Wenn du einen schnellen Quarz hast dann kannst du den wert ruhig mal auf
500 oder größer setzen.
voll-milch
10.01.2009, 18:22
WOOOW,
Vielen dank Neutro klappt jetz alles mit 200ms 500 war zu viel verzögerung..
klasse:P
Gern geschehen, freut mich wenn ich helfen konnte.
helimike0705
11.01.2009, 10:24
Hallo, also wenn man in dieser Do Loop Schleife den Taster länger drückt ,dann wechselt der Ausgang ja immer wieder. Nur halt mit langsamer verzögerung.Oder nicht!?
Wenn du in diesem Programm den Taster drückst ,wartet das Programm bis er losgelassen wird.
Do
Bitwait Pinb.0 , Reset
Waitms 500
If Pinb.0 = 0 Then
End If
Toggle Portc.0
Bitwait Pinb.0 , Set
Waitms 500
Loop
Mike
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.