• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Portabfrage in Bascom

Birabeach

Geocacher
Hallo hab mal wieder ein kleines Prob in Bascom.


Möchte folgendes mit einem tiny 13 realisieren

port 1 = 1 dann gosub pause
port 1 = 0 dann gosub Blau
port2 = 0 dann gosub Rot

das Prog soll im unterprog bleiben bis eine Änderung am Port eintritt.
Blau und Rot sollen Blinksequenzen sein, die als Endlosschleife laufen sollen.

habs schon mit verschieden Sachen probiert scheitere aber am Wechsel in die Unterprogs und ich bekomme keine Endloschleife beim Blinken hin


Steffen
 

stonewood

Geowizard
Moin,

kurze Antwort: http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht#Eingangsport_fragt_Taster_ab

Wichtig dabei:
- Port auf Eingang setzen
- Pullup einschalten (d.h. 'offen' = 1, 'geschlossen' = 0)
- Abfrage mit pinX.Y

Das Beispiel wird 1:1 auf dem Tiny13 nicht laufen, dafür muß bis $crystal alles angepaßt werden. Außerdem natürlich noch die Ports. Aber dann sollte es tun.
 
OP
Birabeach

Birabeach

Geocacher
mit einem port klappts ja nur wenn ich den 2ten port mit dazunehmen will gehts nicht
und dann ist da noch die sache mit der endlosschleife

hier mal mein prog

$regfile = "ATtiny13.DAT"
$crystal = 16000
$hwstack = 28

Config Portb = &B00001000
Portb = 0


Stop Ac
Wdtcr = &B11010011
Enable Interrupts


Port1 Alias Pinb.2
Config Port1 = Input
Portb.2 = 0


Port2 Alias Pinb.1
Config Port2 = Input
Portb.1 = 0

Do

If Port1 = 1 Then Gosub Blinken
If Port2 = 1 Then Gosub Rot
If Port1 = 0 Then Gosub Pause

Loop

Blinken:
Portb.3 = 1
Waitms 600
Portb.3 = 0
Wait 5
Return


Rot:
Portb.3 = 0
Portb.4 = 1
Waitms 500
Portb.4 = 0
Waitms 500
Return


Pause:
Wdtcr = &B11110001
Reset Watchdog
Powerdown
Return

End
 

stonewood

Geowizard
Birabeach schrieb:
Do

If Port1 = 1 Then Gosub Blinken
If Port2 = 1 Then Gosub Rot
If Port1 = 0 Then Gosub Pause

Loop
also das macht bei richtiger Schaltung:
- Blinken wenn Port1 nicht gedrückt
- Rot wenn Port2 nicht gedrückt
- Pause wenn Port1 gedrückt

Also wahrscheinlich genau andersrum wie Du gedacht hast.

Die Taster müssen dabei jeweils gegen Masse und _nicht_ gegen Vcc geschaltet werden. Genau so wie auf dem verlinkten Schaltplan oben.

Auswirkung: Bei offenem Pin wirkt der Pullup, zieht den Pin also auf 1. Und wenn der Taster gedrückt wird zieht der den Pin auf 0.
 
OP
Birabeach

Birabeach

Geocacher
so wie im prog ists nun richtig.

nur leider hört das jeweilige unterprog nach ca 6 sekunden auf und dann geht ein wirres lichtgeblitze der beiden leds los, aber es sollte ja solange laufen bis eine neue portänderung eintritt
 

fockel007

Geocacher
Code:
$regfile = "ATtiny13.DAT"
$crystal = 16000
$hwstack = 28

Config Portb = &B00011000



Stop Ac
Wdtcr = &B11010011
Enable Interrupts
Dim Port1 as bit
Dim Port2 as bit


Do
Gosub Einlesen
If Port1 = 1 Then Gosub Blinken
If Port2 = 1 Then Gosub Rot
If Port1 = 0 Then Gosub Pause

Loop


Einlesen:
Port1= portb.1
Port2= portb.2
Return

Blinken:
Portb.3 = 1
Waitms 600
Portb.3 = 0
Wait 5
Return


Rot:
Portb.3 = 0
Portb.4 = 1
Waitms 500
Portb.4 = 0
Waitms 500
Return


Pause:
Wdtcr = &B11110001
Reset Watchdog
Powerdown
Return

End
meine spontane Idee dazu, hab aber grad keinen Atty hier zum probieren ob es auch so klappt.
Die beiden Eingänge wären bei mir von Plus über den Taster / schalter zum eingang dann weiter über einen !m Ohm widerstand nach Masse geschaltet. Taster gedrückt = HiGH Pegel, nciht gedrück = LOW
 

stonewood

Geowizard
Vielleicht solltest Du doch mal Deinen Schaltplan posten. Ich vermute immer noch daß die Taster falsch angeschlossen sind.
 
OP
Birabeach

Birabeach

Geocacher
mal kurz im paint gekünstelt.


bild.bmp
 

McJenso

Geocacher
Hallo,
das ich Bascom nicht kann schreibselte ich dir ja schon einmal.
Aber, wenn dieser Befehl "Reset Watchdog" macht was ich denke, solltest du mal prüfen, wann und wie oft er aufgerufen wird.

Viele Grüße

Jens
 

stonewood

Geowizard
Birabeach schrieb:
mal kurz im paint gekünstelt.
Jo, damit wird's klarer, ist tatsächlich 'falschrum'.

Also:
Den Widerstand an den Tastern weglassen, die Taster jeweils nur zwischen '-' und dem Portpin.
Die rechte Seite braucht nur so aussehen: (jeweils direkt an '+' oder '-')
Code:
' ---------- 
'-|PB5* Vcc|-- +
'-|PB3  PB2|-- T1 - -
'-|PB4  PB1|-- T2 - -
'-|GND  PB0|-
(LEDs hab ich mal weggelassen ...)
Und jeweils auf '0' statt auf '1' testen.

Wenn Du einen externen Pullup (das was Du da in der Schaltung hast ist ein Pulldown) willst brauchst Du da übrigens jeweils einen Widerstand zwischen Portpin und '+'. Den liefert der Tiny aber auch.

So wie Du es gezeichnet hast werden beide Pins kurzgeschlossen, also egal welcher Taster gedrückt wird ist das Ergebnis immer gleich.

@McJenso: Das sieht schon so ganz richtig aus. 'Reset watchdog - Powerdown' setzt erst mal den Watchdog-Timer zurück und legt dann den Prozessor schlafen. Je nach dem was im wdtcr steht ist das 'warte bis eine gewisse Zeit abgelaufen ist', und das ist es wofür der Watchdog gebraucht wird. Alternativ könnte man z.B. 'waitms 500' nehmen, dabei läuft der Prozessor aber im 'busy wait' weiter und verbraucht munter Strom. Für einen jahrelangen Betrieb im Wald also tödlich.
 
OP
Birabeach

Birabeach

Geocacher
o.k. soweit hab ichs jetzt verstanden. man darf sowas einfachn icht so schnell mal nebenher machen :zensur:

habe aber festgestellt das ich noch ein logik problem habe.
sobalt ich die taster 1 oder 2 loslasse fällt das prog in den pause modus, für meinen zweck bedeutet das das ich noch einen dritten port als eingang brauche

ich glaube ich erklär mal was ich vorhab.

man nimmt aus einer start stage das gerät raus (funktioniert mit stecker)
die led1 im gerät blinkt
man kommt an eine andere stage steckt ein
led 2 blinkt
bringt man das ganze zurück hört das geblinke auf

ich glaube das hätte ich gleich zu anfang schreiben sollen :kopfwand:

steffen
 

stonewood

Geowizard
Ah, so soll das werden. Hier mal als Pseudo-Code:

Also 'in Stage 1': Stecker 1 ist drin. -> Pause
'raus aus Stage 1': Kein Stecker drin -> Blink LED1
'Rein in Stage 2': Stecker 2 ist drin -> merken daß Stecker2 drin ist, Blink LED2
'Raus aus Stage 2': Kein Stecker drin, aber 2 besucht -> blink LED2
'Rein in Stage1': Stecker 1 ist drin, Stage 2 ist besucht -> (irgendwas auslösen?) -> Pause
weiter geht's dann ganz oben.

Irgendwo (also in einer Variablen) muß sich der Tiny also merken wo er war. Also sowas wie:
Code:
Const Statesleep = 0

Const Statewaitpress = 1

Const Statewaitallpress = 2

Const Statewaitunpress = 3

Const Statedisplay = 4

Const Statewaittimeallpress = 5

Const Statewaittimeunpress = 6

Dim State As Byte

State = Statesleep
do
 I = Gettaster()
   Select Case State

      Case Statesleep:
 'pause, solange nix ist. Irgendwann gehts weiter:
        If I < &H0F Then

          State = Statewaitpress                            ' nix bisher, taster gedrückt -> warten bis alle gedrückt
      Case Statewaitpress:
'
       If I = 0 Then               
         State = Statewaittimeallpress

      End If
'usw.
    End Select

Loop
Ist aus einem anderen Programm, paßt also nicht wirklich auf das oben. Das muß aber auch wissen wann was passiert.

Wenn ich mal mehr Zeit hab kann ich daraus auch noch was zaubern, aber vielleicht hilft das oben ja?
 
OP
Birabeach

Birabeach

Geocacher
so war ein sehr langes wochenende :D

hab ein bischen mit deinem prog rumprobiert, leider komm ich auf keinen grünen zweig :zensur:
 

torama

Geocacher
Birabeach schrieb:
mal kurz im paint gekünstelt.
Also du hast ja 2 Ports miteinander verbunden (quasi kurzgeschlossen), da ist es völlig egal ab du nun T1 oder T2 drückst die Potentialänderung betrifft immer beide Ports. Das ist ein Fehler in deiner Schaultung auf alle Fälle...

*äh sehe gerade, das haste ja schon bemerkt*

Aber du solltest die Taster auf alle Fälle noch "softwaretechnisch entprellen", fällt mir dazu spontan ein.
 
OP
Birabeach

Birabeach

Geocacher
so
vor lauter bastelei ganz vergessen das fertige produkt noch zu zeigen.
nochmal danke für die vielen pm´s

led1 blinkt sobald spannung anliegt
led 2 blinkt sobald der port2 null wird und bis port 1null wird, danach muß neu gestartet werden

hier mal mein code:



$regfile = "ATtiny13.DAT"
$crystal = 16000
$hwstack = 28

Config Portb = &B00011001


Stop Adc
Stop Ac

Enable Interrupts


Port2 Alias Pinb.2
Config Port2 = Input
Portb.2 = 1


Port1 Alias Pinb.1
Config Port2 = Input
Portb.1 = 1



Do
Gosub Blinken

Debounce Port2 , 0 , Rot , Sub

Loop

Blinken:
Do
Portb.3 = 1
Wait 50
Portb.3 = 0
Wait 1000
Loop Until Port2 = 0
Return



Rot:
Portb.0 = 1
Do
Portb.4 = 1
Wait 20
Portb.4 = 0
Wait 20
Loop Until Port1 = 0
Return



End
 

torama

Geocacher
Du hast noch kleine Fehlerchen drin, schau mal hier kannste drauf aufbauen. Habe die Wait-Befehle mal Debuggertauglich gemacht (bitte wieder anpassen):

Code:
$regfile = "ATtiny13.DAT"
$crystal = 16000
$hwstack = 2

Config Portb = &B00011001

Stop Adc
Stop Ac

Enable Interrupts

Port2 Alias Pinb.2
Config Port2 = Input
'Portb.2 = 1  kann weg

Port1 Alias Pinb.1
Config Port1 = Input
'Portb.1 = 1  kann weg


Do
 'Tastenabfrage (Entprellwilli is ok)
 Debounce Port2 , 0 , Blinken , Sub
 Debounce Port1 , 0 , Rot , Sub

Loop

Blinken:
'IF -> Abfragen hier die Merkvariablen einbauen

Do
Portb.3 = 1
Waitms 2
Portb.3 = 0
Waitms 2
Loop Until Port2 = 1
Return


Rot:
'IF -> Abfragen hier die Merkvariablen einbauen

Do
Portb.4 = 1
Waitms 2
Portb.4 = 0
Waitms 2
Loop Until Port1 = 1
Return


End
 
Oben