PDA

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..

Neutro
06.01.2009, 20:13
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 ..

patti16
06.01.2009, 20:39
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

patti16
06.01.2009, 21:27
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 :-!

patti16
06.01.2009, 21:48
bei mir funktioniert es hast du alles ports richtig konfiguriert und angeschlossen ?

patti16
06.01.2009, 21:53
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...

patti16
06.01.2009, 22:03
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..

Neutro
07.01.2009, 15:59
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

patti16
07.01.2009, 18:51
[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ß

patti16
07.01.2009, 20:55
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;)

patti16
07.01.2009, 21:43
dann schreib mal richtig auf wo was angeschlossen ist und wie

Neutro
07.01.2009, 21:43
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..

Neutro
08.01.2009, 19:42
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.

Neutro
09.01.2009, 19:49
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

Neutro
10.01.2009, 19:35
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