• 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

chrysophylax

Geomaster
btw: Einen aufgeladenen Kerko über einen Reedkontakt durch Kurzschluss zu entladen ist keine gute Idee - Reedkontakte sind was die Strombelastbarkeit angeht gerne mal etwas pissig und bappen dann zusammen.... Einen Reedkontakt, der einmal zusammengeklebt war kriegt man zwar für gewöhnlich durch kräftiges aufdentischschlagen wieder unterbrochen, aber er wird immer wieder zusammenkleben, auch wenn man ihn ab dem moment nur noch mit datenblattkonformen Strömen beackert. Lieber gleich wegwerfen, wenn sie einmal verklebt waren. Wenn man sowas unbedingt machen muss, dann bitte einen strombegrenzenden Entladewiderstand vorsehen.

Von daher würde ich mich auch dringend der von Stonewood vorgeschlagenen Lösung anschließen ;)

chrysophylax.de


chrysophylax
 

ksbender

Geocacher
Danke für die drei Antworten.
Zuerst einmal zu Erklärung:
LED2 sollte mir nur anzeigen, ob der Reedkontakt funktioniert. (und das tat er prima)
Den Elko und Widerstand hatte ich quasi zum "entprellen" vorgesehen. Layout also fast analog einer Schaltung mit Taster, die ich im roboternetz gesehen hatte.
Aber viel weiter bin ich jetzt noch nicht. :kopfwand:

Layout sieht jetzt bereinigt so aus:

Code wie folgt geändert:
Code:
$regfile = "attiny13.dat"
$crystal = 128000
$hwstack = 24
$swstack = 10
$framesize = 24

Config Portb = &B00000001                                   'Pinb.0 auf "Ausgang", Rest auf "Eingang"

Portb = &B00000010                                          'Pull-Up-Widerstand Bit 1 zuschalten

Ausgang Alias Pinb.0
Eingang Alias Pinb.1


Do

Ausgang = 1
Waitms 500
Ausgang = 0
Waitms 500
If Pinb.1 = 0 Then Gosub Ledan


Loop

End


Ledan:
Waitms 20
Ausgang = 0
Waitms 20
Ausgang = 1
Wait 10
Ausgang = 0
Waitms 20

Return

Wenn alles i.O. ist, blinkt die LED wie sie soll. Sie tut´s aber nicht kontinuierlich. OFT geht sie für längere Zeit aus - kommt aber irgendwann auch von alleine wieder.
Gibt es irgendwelche Störeinflüsse, die ich noch abstellen kann?

Frage: was muß ich mit den freien Beinchen PB2, PB3 und PB4 machen?

Gruß
ksbender
 

Anhänge

  • Versuch2.jpg
    Versuch2.jpg
    34,4 KB · Aufrufe: 550

thomas_st

Geowizard
Ich hätte da mal eine Frage an die Bascom-Experten, was die folgenden Zeilen genau machen (insbesondere die 3. sowie die 2. im Gegensatz zur 1.) ...
ksbender schrieb:
Code:
$hwstack = 24
$swstack = 10
$framesize = 24
Wenn dort nämlich, wie ich vermute, ein Hardware-Stack von 24 Byte Länge, ein Software-Stack (was ist der Unterschied zum Hardware-Stack?) von 10 Byte Länge und noch irgendein Buffer von 24 Byte erzeugt werden, sind das zusammen 58 Byte - der Tiny 13 hat aber nur 64 Byte Arbeitsspeicher - könnte insbesondere innerhalb der Bascom internen Routinen etwas knapp werden.

Viele Grüße,
Thomas(_st)
 

Kappler

Geowizard
Kurze Erklärung aus der Bascom-Hilfe:

$hwstack: Each Gosub uses 2 bytes. Default 32, when you use Interrupts, increase this size (ich setze hier nach Kochbuch-Anleitung immer auf 6 Bytes).
$swstack: Each local or passed parameter uses 2 Bytes. Default 8.
$framesize: Maximum size for local variables. Default 16

Also: Summe beim Tiny13 64 bytes, wenn Unterprogramme nicht zu sehr geschachtelt werden, reicht ein hwstack von 6 aus. Entsprechend kann framesize hochgesetzt werden, um mehr Platz für lokale Variable zu haben.
 

thomas_st

Geowizard
Kappler schrieb:
Kurze Erklärung aus der Bascom-Hilfe:
Danke fürs Nachsehen.

Kappler schrieb:
$hwstack: Each Gosub uses 2 bytes. Default 32, when you use Interrupts, increase this size (ich setze hier nach Kochbuch-Anleitung immer auf 6 Bytes).
$swstack: Each local or passed parameter uses 2 Bytes. Default 8.
$framesize: Maximum size for local variables. Default 16
Da wird bei Bascom unterschieden :???: Ah, danke - ich bin es bisher gewohnt, das dies alles gemischt auf einem Stack landet.

Von WinAVR bin ich es gewohnt, das die Stackgröße gar nicht festgelegt wird - was dann zu den lustigsten Fehlern führen kann, wenn der Stack in die statisch angelegten Variablen hinein wächst.

Aber auch von mir der Rat an ksbender, dort etwas weniger anzusetzen - insbesondere, da er ja momentan maximal 2 Byte für die Rücksprungadresse aber keinen Speicher für irgend welche Variablen benötigt (aber aufpassen, wenn das Programm dann mal größer wird).

Viele Grüße,
Thomas(_st)
 

Kappler

Geowizard
Wobei hierdurch bei Bascom eigentlich kein Fehler entstehen kann:
Wenn der RAM-Speicher für die deklarierten Variablen nicht ausreicht, dann wird schon beim Kompilieren gemeckert...
 

ksbender

Geocacher
Leider habe ich auch mit einem hwstack von 6 immer noch kein laufendes Programm.
Andreas, was mach´ ich falsch?
Gruß
Stephan
 

thomas_st

Geowizard
Was mir gerade noch einfällt: wie ist den das WDTON Fuse (Bascom-Bezeichnung bitte selbst heraussuchen) programmiert? Wenn es programmiert ist, resettet Dir der Watchdog immer wieder den Tiny.

Viele Grüße,
Thomas(_st)
 

ksbender

Geocacher
Kappler schrieb:
Probier es doch mal mit:

Ausgang Alias Portb.0

Dazu habe ich dann auch noch den Eingang auf PortB.1 gesetzt und siehe da:
KAUM MACHT MAN´S RICHTIG, FUNKTIONIERT ES AUCH.

Wenn du (egal ob 1/4 oder bis zu 4/4 Kappler) mal hier oben (Nähe Wolfsburg) bist/seid - oder ich im Schwarzwald - dann gebe ich ein Bier aus.
Vielen Dank, jetzt ist mein Schlaf und das kommende Wochenende gerettet :roll:
Gruß
ksbender
aka Stephan
 

stonewood

Geowizard
thomas_st schrieb:
stonewood schrieb:
zweitens:
Die Portpins haben einen internen Pullup der um die 10 KOhm hat. Genauer: 20-50 KOhm laut Datenblatt.
Die PullUps sind aber mit
ksbender schrieb:
Code:
[...]
Portb = 0                                                   'Ausgänge auf Low setzen
[...]
deaktiviert worden. Also zumindest an dieser Stelle ist bei Nutzung der PullUps noch eine Anpassung notwendig (entsprechende Bits auf High). Ob Bascom die PullUps dann noch eventuell global deaktiviert, wäre zu klären.
Nö, das setzt die Ausgänge auf 0 (also den gesamten PortB), macht aber nichts an den Pullups. Die werden ja eh nur für Eingänge genutzt.
 

stonewood

Geowizard
ksbender schrieb:
Kappler schrieb:
Probier es doch mal mit:
Ausgang Alias Portb.0
Dazu habe ich dann auch noch den Eingang auf PortB.1 gesetzt und siehe da:
KAUM MACHT MAN´S RICHTIG, FUNKTIONIERT ES AUCH.
Da war mir gestern im Datenblatt was über den Weg gelaufen daß bei 'PINxn = 1' der Ausgang umgeschaltet wird ('Toggling the Pin') ... konnte nicht wirklich glauben daß bascom das mitmacht, aber genau das scheinst Du oben ausgelöst zu haben.
 

Kappler

Geowizard
ksbender schrieb:
...Dazu habe ich dann auch noch den Eingang auf PortB.1 gesetzt und siehe da:
KAUM MACHT MAN´S RICHTIG, FUNKTIONIERT ES AUCH...
Bist du dir mit dem Eingang auf Portb.1 sicher?

Nach meinem Wissen werde Ausgänge mit Port... gesetzt, Eingänge aber mit Pin... ausgelesen.
Schau doch auch mal hier:
Roboternetz-Wiki

Die Roboternetz-Seite kann ich übrigens jedem wärmstens ans Herz legen, das ist ein schier unergründlicher Schatz an Microcontroller-Wissen...
 

thomas_st

Geowizard
stonewood schrieb:
thomas_st schrieb:
stonewood schrieb:
zweitens:
Die Portpins haben einen internen Pullup der um die 10 KOhm hat. Genauer: 20-50 KOhm laut Datenblatt.
Die PullUps sind aber mit
ksbender schrieb:
Code:
[...]
Portb = 0                                                   'Ausgänge auf Low setzen
[...]
deaktiviert worden. Also zumindest an dieser Stelle ist bei Nutzung der PullUps noch eine Anpassung notwendig (entsprechende Bits auf High). Ob Bascom die PullUps dann noch eventuell global deaktiviert, wäre zu klären.
Nö, das setzt die Ausgänge auf 0 (also den gesamten PortB), macht aber nichts an den Pullups. Die werden ja eh nur für Eingänge genutzt.
Nöp zurück, falls Bascom keine Extra-Wurst brät, wird bei auf Eingang geschalteten Ports, darüber die PullUps ein- und ausgeschaltet.

Kleines Zitat aus dem Datenblatt dazu:
Datenblatt Attiny 13 schrieb:
If PORTxn is written logic one when the pin is configured as an input pin, the pull-up resistor is
activated. To switch the pull-up resistor off, PORTxn has to be written logic zero or the pin has to
be configured as an output pin.

Viele Grüße,
Thomas(_st)
 

thomas_st

Geowizard
Kappler schrieb:
Bist du dir mit dem Eingang auf Portb.1 sicher?
Mit Portb bei einem auf Eingang konfigurierten Pin werden die PullUps aktiviert. Da die Schaltung wie sie ist, keine Möglichkeit bietet, dass Ladung abfließen kann (nur über die sehr geringen Leckströme des Eingangspins), ist der PullUp notwendig. Wenn er deaktiviert ist, dann funktioniert die Schaltung zwar erstmal auch, aber wenn der Readkontakt einmal aktiviert und anschließend wieder geöffnet wurde, wird es eine gewisse Zeit dauern (kann schon mal paar Sekunden sein) bis der Tiny es mitbekommt, dass der Readkontakt wieder offen ist.

Viele Grüße,
Thomas(_st)
 

Kappler

Geowizard
Ich meinte auch eher das Abfragen der Eingänge über Pin... statt über Port...
Oder habe ich da was missverstanden?

Zusammenfassend:

Eingang:
Setzen der Pullups mit Port...
Abfragen des Eingangs mit Pin...

Ausgang:
Setzen des Ausgangs mit Port...

So müsste es doch stimmen, oder?
 

thomas_st

Geowizard
Kappler schrieb:
Ich meinte auch eher das Abfragen der Eingänge über Pin... statt über Port...
Oder habe ich da was missverstanden?

Zusammenfassend:

Eingang:
Setzen der Pullups mit Port...
Abfragen des Eingangs mit Pin...

Ausgang:
Setzen des Ausgangs mit Port...

So müsste es doch stimmen, oder?
Ähm, klar, ähm, ja :)
Ich sehe inzwischen nur noch Widerstände ;) ...

... man könnte der Vollständigkeit halber noch beim Ausgang das Toggeln mit "Pin" angeben.

Viele Grüße,
Thomas(_st)
 

nhedgehog

Geocacher
Nun muß ich doch einmal die Spezis fragen.
Ich habe das Reaktivlicht 7-Segment-reaktiv (kirby100124) nachgebastelt, die Schaltung meinen Bedürfnissen angepasst (Photowiderstand raus, Aktivierung per Reed der die Masse zuschaltet, Lochplatine mit möglichst wenig sichtbaren Drähten).
Die Pinbelegung ist aber bei mir eine Andere:
SC39-11GN Pin Attiny24 Pin
a 10 PA5 8
b 9 PA4 9
c 7 PA3 10
d 5 PB3 4
e 4 PB2 5
f 2 PA7 6
g 1 PA6 7
dp 6 PA2 11

Das Programm wurde entsprechend "umgeschrieben", alles funktioniert bis auf den Ausgang PB3. Wenn ich den Tinny aus der Fassung rausnehme und da Plus anlege leuchtet das entsprechende Segment, aber nicht wenn der Tinny steckt.

Programmcode:
Code:
'nhedgehog 2010.10.31, Spiegelschrift, anderer Schaltplan&Magnetbake
$hwstack = 20                                               'hardwarestack herabsetzen damit genügend variablen zur verfügung stehen
$regfile = "ATtiny24.DAT"
$crystal = 128000                                           'Frequenz des internen Oszillators




'Config Adc = Single , Prescaler = Auto
Config Portb = &B00001100                                   'Pinb.2-3 auf 'Ausgang', Rest auf 'Eingang' schalten
Config Porta = &B11111100                                   'Pinq.2-7 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = 0
Porta = 0                                                   '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
Dim Zeichen As String * 1

'(Const Schwelle = 50                                         'je größer der Schwellwert, desto unempfindlicher
Const Tagschwelle = 800                                     'Schwellwert für Schlafmodus
Const Zwangsimpuls = 8                                      'LED-Impuls tagsüber alle X Schlafyklen (á ca. 8 Sekunden)

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                                                   'prozessor bremsen da sonst lichtänderung nicht erkannt wird
Start Adc                                                   'A/D-Wandler starten
Ldr = Getadc(2)                                             'Helligkeitswert einlesen
Stop Adc                                                    'A/D-Wandler zum Stromsparen wieder stoppen
Merker = Ldr - Alt                                          'Unterschied zwischen letzter und aktueller Messung ermitteln
Alt = Ldr                                                   'letzten LDR-Wert sichern
If Merker > Schwelle Then Gosub Morsen                      'Bei großer Änderung Dunkel->Hell: Blinken
If Ldr > Tagschwelle Then                                   'prüfen ob helligkeit über tagschwelle liegt
   If Tagzaehler < 255 Then                                 'int-variable geht nur bis 255
      Tagzaehler = Tagzaehler + 1
   End If
Else
   Tagzaehler = 0                                           'wenn wieder dunkel tagzähler löschen
End If

If Tagzaehler > 200 Then Gosub Pause                        'wenn mehr als x zyklen hell dann schlafmodus
')
Do
Gosub Warte250ms
'(Gosub Rechts
Gosub Warte250ms
Gosub Warte250ms
Gosub Warte250ms
')
Gosub Morsen
Gosub Warte8s
Loop


'(Pause:
Wdtcr = &B11110001                                          'Watchdog auf 8 Sekunden stellen
Reset Watchdog
Powerdown
Wdtcr = &B11010011                                          'Watchdog wieder auf 0,125 Sekunden zurückstellen
Schlafzaehler = Schlafzaehler + 1                           'merken wie oft Schlafmodus durchlaufen wurde
If Schlafzaehler = Zwangsimpuls Then                        'als Funktionskontrolle tagsüber LED auslösen
   Porta.5 = 1
   Reset Watchdog
   Powerdown
   Porta.5 = 0
   Schlafzaehler = 0
End If
Return
')

Morsen:
Restore Daten                                               'Am Beginn der Daten anfangen
'Alt = 1023                                                  'Doppelauslösung verhindern
Do
Read Zeichen
Wdtcr = &B11010111
If Zeichen = "dp" Then Gosub Pdp                            'Watchdog auf 2s stellen
If Zeichen = "0" Then Gosub P0
If Zeichen = "1" Then Gosub P1
If Zeichen = "2" Then Gosub P2
If Zeichen = "3" Then Gosub P3
If Zeichen = "4" Then Gosub P4
If Zeichen = "5" Then Gosub P5
If Zeichen = "6" Then Gosub P6
If Zeichen = "7" Then Gosub P7
If Zeichen = "8" Then Gosub P8
If Zeichen = "9" Then Gosub P9
If Zeichen = "n" Then Gosub Pn
If Zeichen = "e" Then Gosub Pe
If Zeichen = "re" Then Gosub Rechts
If Zeichen = "li" Then Gosub Links
If Zeichen = " " Then Gosub Leer
If Zeichen = "ost" Then Gosub Ost
If Zeichen = "nord" Then Gosub Nord
Wdtcr = &B11010011                                          'Watchdog wieder auf 125ms stellen
If Zeichen = "X" Then Return
Loop


Pdp:
Porta = &B00000100
Reset Watchdog
Powerdown
Porta = 0
Return

P0:
Portb = &B00001100
Porta = &B10111011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P1:
Porta = &B10000000
Portb = &B00000100
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P2:
Portb = &B00001000
Porta = &B11101000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P3:
Portb = &B00001100
Porta = &B11100000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P4:
Portb = &B00000100
Porta = &B11010000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P5:
Portb = &B00001100
Porta = &B01110000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P6:
Portb = &B00001100
Porta = &B01111000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P7:
Portb = &B00000100
Porta = &B10100000
Reset Watchdog
Powerdown
Portb = 0
Return

P8:
Portb = &B00001100
Porta = &B11111000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P9:
Portb = &B00001100
Porta = &B11110000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

Pn:
Portb = &B00000100
Porta = &B01001000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

Pe:
Portb = &B00001000
Porta = &B01111000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

Links:
Wdtcr = &B11010100
Portb = &B00000100
Reset Watchdog
Powerdown
Portb = 0
Porta = &B10000000
Reset Watchdog
Powerdown
Porta = 0
Porta = &B00100000
Reset Watchdog
Powerdown
Porta = 0
Porta = &B00010000
Reset Watchdog
Powerdown
Porta = 0
Porta = &B00001000
Reset Watchdog
Powerdown
Porta = 0
Portb = &B00001000
Reset Watchdog
Powerdown
Portb = 0
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

Rechts:
Wdtcr = &B11010100
Porta = &B00001000
Reset Watchdog
Powerdown
Porta = 0
Porta = &B00010000
Reset Watchdog
Powerdown
Porta = 0
Porta = &B00100000
Reset Watchdog
Powerdown
Porta = 0
Porta = &B10000010
Reset Watchdog
Powerdown
Porta = 0
Portb = &B00000100
Reset Watchdog
Powerdown
Portb = 0
Portb = &B00001000
Reset Watchdog
Powerdown
Portb = 0
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

Ost:
Wdtcr = &B11010101
Portb = &B00001100
Porta = &B01001000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Portb = &B00001000
Porta = &B11101000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Portb = &B00000100
Porta = &B11000000
Reset Watchdog
Powerdown
Porta = 0
Return

Nord:
Wdtcr = &B11010101
Portb = &B00000100
Porta = &B01001000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Portb = &B00001100
Porta = &B01001000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Porta = &B01001000
Reset Watchdog
Powerdown
Porta = 0
Portb = &B00001100
Porta = &B11001000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

Leer:
Reset Watchdog
Portb = 0
Porta = 0
Powerdown

Return

Warte8s:
Wdtcr = &B11110001                                          'Watchdog auf 8s einstellen
Reset Watchdog
Powerdown
Return

Warte16ms:
Wdtcr = &B11010000                                          'Watchdog auf 16ms einstellen
Reset Watchdog
Powerdown
Return

Warte64ms:
Wdtcr = &B11010010                                          'Watchdog auf 64ms einstellen
Reset Watchdog
Powerdown
Return

Warte250ms:
Wdtcr = &B11010100                                          'Watchdog auf 250ms einstellen
Reset Watchdog
Powerdown
Return
End

End

Daten:
Data "nord"
Data "dp"
Data "re"
Data "n" , "1" , "2" , "dp" , "3" , "4" , "5"
Data " "
Data "li"
Data "ost"
Data " "
Data "e" , "6" , "7" , "dp" , "8" , "9" , "0"
Data "re"
Data "X"

Hab ich den Tinny gegrillt oder irgendetwas simples übersehn?
Danke,
nhedgehog
 

nhedgehog

Geocacher
Wer lesen kann ist klar im Vorteil.
Port B output buffers have symmetrical drive characteristics with both high sink and source
capability except PB3 which has the RESET
capability. To use pin PB3 as an I/O pin, instead of
RESET pin, program (‘0’) RSTDISBL fuse. As inputs, Port B pins that are externally pulled low/quote]
und später:
Reset input. A low level on this pin for longer than the minimum pulse length will generate a
reset, even if the clock is not running and provided the reset pin has not been disabled. Shorter
pulses are not guaranteed to generate a reset.
The reset pin can also be used as a (weak) I/O pin.

Zuerst hab ich den RSTDISBL fuse gesetzt und dann folgerichtig festgestellt, daß der I/O Strom nicht ausreicht. :kopfwand: Jetzt hab ich das Segment auf PA2 gelegt und alles ist in Butter. Außer das ich jetzt nen neuen Tiny nehmen mußte, da der Alte mit dem gesetzten RSTDISBL fuse nicht mehr ansprechbar ist. :zensur: Aber die Schaltung funktioniert. Falls jemand einen Tip zur Wiederbelebung hat (oder mit einem High Voltage Programmer in der Nähe von Halberstadt ist), ich wäre ein dankbarer Abnehmer.

nhedgehog
 

stonewood

Geowizard
nhedgehog schrieb:
Zuerst hab ich den RSTDISBL fuse gesetzt und dann folgerichtig festgestellt, daß der I/O Strom nicht ausreicht. :kopfwand: Jetzt hab ich das Segment auf PA2 gelegt und alles ist in Butter. Außer das ich jetzt nen neuen Tiny nehmen mußte, da der Alte mit dem gesetzten RSTDISBL fuse nicht mehr ansprechbar ist. :zensur: Aber die Schaltung funktioniert. Falls jemand einen Tip zur Wiederbelebung hat (oder mit einem High Voltage Programmer in der Nähe von Halberstadt ist), ich wäre ein dankbarer Abnehmer.
RSTDISBL ausschalten geht nur mit High Voltage ... da liegst Du schon ganz richtig ... daher sollte man den auch nur anfassen wenn man genau weiß was man da tut.
 
Oben