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

Fragen zur Software

Windi

Geoguru
stonewood schrieb:
... daher sollte man den auch nur anfassen wenn man genau weiß was man da tut.
Ich glaube das Lehrgeld haben in der Experimentierphase schon einige von uns zahlen müssen. Ich schließe mich da nicht aus. Wer rechnet denn auch schon damit dass man den Chip danach nicht mehr normal ansprechen kann.
 

nhedgehog

Geocacher
Windi schrieb:
stonewood schrieb:
... daher sollte man den auch nur anfassen wenn man genau weiß was man da tut.
Ich glaube das Lehrgeld haben in der Experimentierphase schon einige von uns zahlen müssen. Ich schließe mich da nicht aus. Wer rechnet denn auch schon damit dass man den Chip danach nicht mehr normal ansprechen kann.
Nu denn, Thanks für die aufmunternden und ehrlichen Worte. Fühl ich mich nicht mehr ganz so volldeppig!
 

upigors

Geowizard
Hallo, ich wende mich mal mit einer frage an die Community die einigen sicher banal vorkommen wird aber ich komm an dieser stelle einfach nicht weiter. Für diverse Bastelein benutze ich im Prinzip immernoch den Code aus dem ursprünglichen reaktivlicht oder zum Mindestens Teile davon. Der basiert ja darauf das ich gleich am Anfang die Ports verteile also hier B0-2 und A0+1auf out, Rest auf in. Letztendlich habee ich aber nur einen Eingang bzw. nutze nur einen. Nun kann ich nicht erkennen wie das Ganze aufgebaut sein müsste wenn ich mehrere Eingänge brauch. Ich kann an keiner Stelle erkennen wo gesagt wird wenn Eingang Nr. 1 den und den Wert hat dann mach das und das sondern nur wenn Eingang den und den wert hat mach das und das. Mir fehlt hier an dieser Stelle das Verständniss wo das definitiv gemacht wird. Bei den Ausgängen ist das logisch aber im Eingang...??? Lässt sich jetzt doof beschreiben irgendwie aber vielleicht verstehts ja doch einer und kann mir das mal erklären.
Ich möchte also um das zu vereinfachen erreichen das wenn Eingang Nr.1 ne Spannung anliegt passiert dieses, liegt an Eingang Nr. 2 Spannung an dann passiert jenes.
Ich vermute das das hier: "Dim Ldr As Integer" passiert aber da steht ja nichts was genau den einen eingang definiert....
Hier der betreffende Auszug des Codes den ich verwende, sollte den meisten ja bekannt vorkommen :roll:

Config Adc = Single , Prescaler = Auto
Config Portb = &B00000111 'Pinb.0-2 auf 'Ausgang', Rest auf 'Eingang' schalten
Config Porta = &B00000011 'Pina.0+1 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = 0
Porta = 0

Stop Ac 'Analog-Komparator abschalten, um Strom zu sparen
Wdtcsr = &B11010011
Enable Interrupts 'Interrupts freigeben

Const Schwelle = 150
Const Tagschwelle = 800


Dim A As Byte 'Variablen definieren
Dim Tagzaehler As Byte
Dim Schlafzaehler As Byte
Dim Ldr As Integer '0 = Dunkel, 1023 = Hell
Dim Alt As Integer
Dim Merker As Integer
Dim Zeichen As String * 1



Do
Reset Watchdog
Powerdown
Start Adc
Ldr = Getadc(2)
Stop Adc
If Ldr > 900 Then
Gosub Morsen
End If

Loop

Wenn mich hier jemand mal aufklären könnte wäre mir sehr geholfen. Wie gesagt, Ausgänge ist klar aber der Rest...???
 

Kappler

Geowizard
Das kommt zunächst mal darauf an, wie der Eingang beschaltet sein soll.

Ich gehe mal vom einfachsten Fall aus, dass der Eingang über einen Taster nach GNG geschaltet wird.
Sinnvollerweise verwendet man dann am Eingang einen sogenannten Pullup-Widerstand (z.B. 10k) gegen +Ub, der den Eingang bei nicht betätigtem Taster definiert auf Hi-Pegel zieht.
Praktischerweise haben die Atmels so einen Widerstand schon eingebaut, der aber per Software eingeschaltet werden muss.

Zunächst mal zur Ein-/Ausgangsdeklaration:
Code:
Config Portb = &B00000111 'Pinb.0-2 auf 'Ausgang', Rest auf 'Eingang' schalten
Hier bedeutet eine "1" im Bitmuster, dass der korrespondierende Port ein Ausgang werden soll, eine "0" bedeutet, dass der Port als Eingang fungiert. Hier also die B.2 bis B.0 als Ausgang...

Als nächstes solltest du die Pullup-Widerstände für deine Eingänge zuschalten. Das machst du mit dem Port-Befehl:
Code:
Portb = &B11111000
würde, passend zu der obigen Ein-/Ausgangsdeklaration, die Pullups für die Eingänge B.7 bis B.3 zuschalten (eine "1" im Bitmuster an der entsprechenden Stelle).
Die Nullen an den anderen Stellen schalten hier die entsprechenden Ausgänge initialisiert aus.
In deinem Programm benutzt du keine Pullup-Widerstände, hier schreibst du
Code:
Portb = 0
was bedeutet, dass die Ausgänge ausgeschaltet und die Pullup-Widerstände der Eingänge nicht aktiviert sind.

Einen Eingang abfragen tust du mit dem Pin-Befehl, beispielsweise:
Code:
If Pinb.3 = 1 Then
   Portb.0 = 1                'Pin wird auf High, also 5V geschaltet (Taster nicht betätigt)
Else
   Portb.0 = 0                'Pin wird auf Low, also 0V geschaltet (Taster betätigt, also Eingang auf GND)
End If
Hier wird nichts anderes getan, als den Eingang B.3 abzufragen und je nach Eingangssignal den Ausgang B.0 entweder ein- oder auszuschalten...

Mehr ist gar nicht erforderlich...
 

upigors

Geowizard
Kappler schrieb:
Zunächst mal zur Ein-/Ausgangsdeklaration:
Code:
Config Portb = &B00000111 'Pinb.0-2 auf 'Ausgang', Rest auf 'Eingang' schalten
Hier bedeutet eine "0" im Bitmuster, dass der korrespondierende Port ein Ausgang werden soll, eine "1" bedeutet, dass der Port als Eingang fungiert. Hier also die B.2 bis B.0 als Eingang...

nicht umgekehrt? in der Schaltung zum Code sind B0-B2 Ausgänge eben wie es auch im Code steht :???:
Ich versuch mich jetzt mal langsam da durch zu arbeiten aber das ist jetzt erstmal ne Grundsatzfrage ;)
Und wiesso funktioniert meine Schaltung mit eben diesem code wenn die pullups nicht gesetzt sind?
 

upigors

Geowizard
also mal angenommen du hast oben nen Schreibfehler und es ist doch so das 1 im config portb bedeutet das es ein Ausgang ist, sollte das mit komplett gesetzten Pullups dann so aussehen?

Code:
Config Portb = &B00000111            'Pinb.0-2 auf 'Ausgang, Rest auf 'Eingang' schalten
Portb = &B11111000

Wären dann damit Portb 3-7 "fertige" Eingänge die ich mit "if" / "then" abfragen kann?
Und warum läuft es auch wenn der Pullup in meinem Code nicht gesetzt ist?
Code:
Portb = 0
 

Kappler

Geowizard
upigors schrieb:
nicht umgekehrt? in der Schaltung zum Code sind B0-B2 Ausgänge eben wie es auch im Code steht :???:
Stimmt natürlich, ich habe es oben mal geändert...

upigors schrieb:
Und wiesso funktioniert meine Schaltung mit eben diesem code wenn die pullups nicht gesetzt sind?
Deine Schaltung funktioniert, weil du überhaupt keinen (digitalen) Eingang benutzt ;) .
Mit
Code:
Ldr = Getadc(2)
fragst du einen analogen Eingang ab, der je nach angelegter Spannung einen beliebigen Wert zwischen 0 und 1023 (bei 10 Bit Auflösung) annimmt.

Ausserdem kann auch ein digitaler Eingang ohne Pullups funktionieren, es kann aber auch sein, dass falsch ausgelesen wird, da kein eindeutiger Pegel anliegt. Der korrekte Weg führt immer über Pullup- (gegen +Ub) oder Pulldown- (gegen GND) Widerstände. Und da Pullup-Widerstände im Atmel bereits eingebaut sind, bietet es sich einfach an, diese zu benutzen und die Eingänge gegen GND zu schalten...
 

upigors

Geowizard
ok, verstanden.
Den Code (
Code:
Portb = 0
) hab ich ja aus dem Kochbuch (Blinker mit LDR) und nachträglich nur geändert um einen anlogen Eingang zu bekommen also statt dem LDR nen Taster etc nehmen zu können.
Mein Ziel ist jetzt 2 taster zu verwenden also kann ich auf die Pullup's verzichten, Richtig?

Wenn ich das jetzt soweit richtig verstehe kann ich o.g. Code so lassen, ich habe bereits ausser b0-2 alle auf Eingng gesetzt und brauch jetzt nur noch weitere Taster an b 3-... zu bauen? Werden die so wie der Code jetzt ist auch schon (analog) abgefragt
oder noch präziser: b0-2 sind Ausgänge, b3-4 sollen Eingänge sein. Ich schalte im Übrigen ACC also + auf die Eingänge, eben wie im Kochbuch.

P.S. Danke für deine Geduld... :gott:
 

Kappler

Geowizard
Jetzt bin ich etwas verwirrt :???:

Willst du die Taster analog abfragen oder digital?
Und falls analog, warum???
 

upigors

Geowizard
im Prinzip ist mir die Art der Abfrage egal, mit der analogen, also so wie es jetzt ist (siehe ursprünglicher Code im ersten Posting), klappt es bestens. Ich hab natürlich kein Problem damit das digital zu machen aber warum wenn es ja so gut funktioniert und ich das quasi nur auf einen oder vllt. zwei zusätzliche(n) Eingang erweitern möchte.
Also kurz: egal ob digital oder analog, funktionieren muss es ;)
 

Kappler

Geowizard
Dann mach es digital... Braucht auch weniger Strom, würde ich vermuten.

Also einfach vom entsprechenden Tiny-Beinchen über den Taster auf GND schalten, und auf Pinb.x = 0 testen:
Wenn der Taster (bei zugeschalteten Pullups, wie oben beschrieben) gedrückt ist, wird Pinb.x zu 0, sonst ist es 1.

Wenn du ein fertiges Layout verwenden willst, dann ersetze einfach den Widerstand bzw. LDR aus dem LDR-Widerstands-Spannungsteiler, der zu GND führt, durch den Taster. Den anderen kannst du weglassen.
 

upigors

Geowizard
also kann ich den 4,70MOhm Widerstand auch weglassen und den LDR nurgegen einen Taster ersetzen. Alle weiteren Taster dann ebenfalls zwischen GRD und den entsprechenden Eingängen? Weil bisher hab ich den Taster halt im Spannungsteiler zwischen + und port x....
ok, ich werde das morgen mal versuchen, ich melde mich nochmal falls Fragen auftreten oder Bascom meckert weil ich Mist geschrieben hab :hilfe: ;) und sollte jemand den Codeschnipsel in dieser Art schon umgeschrieben im Schreibtisch haben.... her damit :roll:
Danke erstmal für Deine Mühe
Gruß Uwe
 

Kappler

Geowizard
Genau, alle Taster zwischen Eingang und GND, Spannungsteiler-Widerstände brauchst du nicht mehr...
Und nicht vergessen: Bei gedrücktem Taster wird der Wert von Pinb.x zu 0... :klugscheisser:
 

upigors

Geowizard
Morgen, aufgewacht die Sonne lacht....
Also wenn ich alles richtig verstanden hab sollte das so in etwas aussehen?
(wenn nicht geb ichs langsam auf)
natürlich rein fiktiv hab ich 2 Eingänge (b2+3)und 2 Ausgänge (b0+1).
wenn Eingang b.2 nach masse geschlossen wird soll Ausgang b.0 geschalten werden.
wenn Eingang b.3 nach Masse geschlossen wird soll Ausgang b.1 geschalten werden.
Kann ich eigentlich 2 IF / Then schleifen so hintereinander hängen??? :???:


Config Adc = Single , Prescaler = Auto
Config Portb = &B00000011 'Pinb.0+1 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = &B00001100 'Pullups setzen, pinb 2+3 Eingänge


Stop Ac 'Analog-Komparator abschalten, um Strom zu sparen
Wdtcsr = &B11010011
Enable Interrupts 'Interrupts freigeben

Const Schwelle = 150
Const Tagschwelle = 800


Dim A As Byte 'Variablen definieren
Dim Tagzaehler As Byte
Dim Schlafzaehler As Byte
Dim Ldr As Integer '0 = Dunkel, 1023 = Hell
Dim Alt As Integer
Dim Merker As Integer
Dim Zeichen As String * 1



Do

Reset Watchdog
Powerdown
Start Adc


If Pinb.2 = 0 Then
Portb.0 = 0
Else
Portb.0 = 1
If Pinb.3 = 1 Then
Portb.1 = 0
Else
Portb.1 = 1

End If


Loop
 

Kappler

Geowizard
Im Prinzip ist das so schon richtig..

Aber:
Schmeiß erst mal alle noch verbliebenen Befehle zur Analog-Digital-Wandlung raus, die brauchen nur Speicher, verwirren und sind unnötig:
Code:
Config Adc = Single , Prescaler = Auto
Start Adc
Und:
So wie du es momentan machst, erreichst du das Gegenteil vom gewünschten.
Wenn du den Taster drückst, wird der zugehörige Port zu 0 (siehe oben).
Bei dir wird dann aber auch der Ausgang zu 0, also ausgeschaltet.
Bei nicht gedrücktem Taster wird daher die LED leuchten, wenn du den Taster drückst, wird sie ausgehen.
Ausserdem hast du beim ersten If-Block das End If vergessen...

Richtig wäre:
Code:
If Pinb.2 = 0 Then ' Taste an PB2 ist gedrückt
   Portb.0 = 1
Else
   Portb.0 = 0
End If

If Pinb.3 = 0 Then ' Taste an PB3 ist gedrückt
   Portb.1 = 1
Else
   Portb.1 = 0
End If
 

upigors

Geowizard
Danke schön....
das "End if" ist irgendwie verloren gegangen :???:
Na dann werde ich das ganze mal vervollständigen und testen.
können die Schwellen (150/800) nicht auch weg?
nochmal danke
Uwe
 

Kappler

Geowizard
Die Schwellen und die Variablen (Dim...) können, so wie es momentan dasteht, alle weg.
Falls du in deinem Programm noch irgendwelche Variablen benötigst (ich weiß ja nicht, was du noch vorhast), kannst du dir die ja dann wieder passend deklarieren...
 

upigors

Geowizard
Kappler schrieb:
Falls du in deinem Programm noch irgendwelche Variablen benötigst (ich weiß ja nicht, was du noch vorhast), kannst du dir die ja dann wieder passend deklarieren...

das weiß ich auch noch nicht, ist wie schon geschrieben nur zu meinem Verständniss.
Als nächstes, vorrausgestzt ich bekomm das zum laufen, möchte ich erreichen das
z.b. LED 1 5x blinkt wenn ich Port 1 taste und LED 2 3x blinkt wenn ich Port 2 Taste aber das erst wenn das oben klappt.... Ganz viel später möchte ich die 7 segment geschichte soweit umstricken das ich 2 unterschiedliche Ausgaben bekomme wenn ich 2 unterschiedliche Eingaben über Ports mache. aber das scheint mir derzeit noch weit weg.
Jetzt gibts ne BoWu und dann gehts weiter :D
 

Kappler

Geowizard
Na, da hast du ja noch einiges vor...
Sollte aber alles ohne übergroßen Aufwand machbar sein.

Dann erstmal guten Appetit... :D
 

upigors

Geowizard
So, das funktioniert tatsächlich. Somit schein ich den Part "Eingänge" verstanden zu haben :D
Ich hab mal gleich weiter gespielt und das Programm so geändert:
Code:
$hwstack = 20                                               'hardwarestack herabsetzen damit genügend variablen zur verfügung stehen
$regfile = "ATtiny13.DAT"
$crystal = 128000                                           'Frequenz des internen Oszillators

Config Portb = &B00011000                                   'Pinb.4+3 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = &B00000110                                          'Ausgänge auf Low setzen
Stop Ac                                                     'Analog-Komparator abschalten, um Strom zu sparen

Wdtcr = &B11010011                                          'Watchdog definieren: 0.125 Sekunden, Interrupt auslösen, kein Reset
Enable Interrupts                                           'Interrupts freigeben

Do
Reset Watchdog
Powerdown
Start Adc

If Pinb.1 = 0 Then                                          
   Gosub A
Else
   Portb.3 = 0
End If

If Pinb.2 = 0 Then                                          
   Gosub B
Else
   Portb.4 = 0
End If

Loop

A:
Portb = &B00001000
Reset Watchdog
Powerdown
Portb = &B00000000
Reset Watchdog
Powerdown
Portb = &B00001000
Reset Watchdog
Powerdown
Portb = &B00000000
Reset Watchdog
Powerdown
Portb = &B00001000
Reset Watchdog
Powerdown
Portb = &B00000000
Reset Watchdog
Powerdown

Return

B:
Portb = &B00010000
Reset Watchdog
Powerdown
Portb = &B00000000
Reset Watchdog
Powerdown
Portb = &B00010000
Reset Watchdog
Powerdown
Portb = &B00000000
Reset Watchdog
Powerdown
Portb = &B00010000
Reset Watchdog
Powerdown
Portb = &B00000000
Reset Watchdog
Powerdown
Portb = &B00010000
Reset Watchdog
Powerdown
Portb = &B00000000
Reset Watchdog
Powerdown

Return

End

das Ganze klappt aber nur teilweise.
Es sollte nachdem, PB.1 getastet wurde, LED 1=3x blinken.
Wenn PB.2 getastet wurde sollte LED 2=4x blinken.
Gosub A scheint zu funktionieren ABER es läuft in einer unregelmäßigen Schleife und hört nicht wieder auf. Es blinkt 3x.... kurze Pause.... 3x und so weiter. manchmal scheinen die Pausen etwas länger auf jeden fall folgen die 3ergruppen in unregelmäßigen Abständen. Lässt sich doof erklären....
Gosub B scheint garnicht zu funktionieren (kann sicher auch nicht da das Programm ja in der ersten Schleife hängen bleibt.)
Hat jemand ne Idee? ich tippe mal ist nur ne Kleinigkeit aber komm nicht drauf :kopfwand:

EDIT: Fehler der 2. LED gefunden und oben geändert. Jetzt beginnt die LED zu blinken deren Eingang ich aktiviere aber dann blinkt die andere und dann nochmal die andere und dann wieder die erste usw. Also irgendwo im Programm läuft da noch was schief.
Prnzipiell funktioniert aber die Anzahl der Blinkzeichen (3 oder 4) und die Aktivierung der Ports....
macht richtig Spaß wenn man Stück für Stück durchsteigt..... :gott:
 
Oben