Forum: Mikrocontroller und Digitale Elektronik Problem mit AT Tiny 13


von Theo L. (theo_100)


Lesenswert?

hallo Zusammen,
bin dabei mich in die Uc-Programmierung in Bascom einzuarbeiten. habe 
aktuell ein kleines Projekt mit obigem Uc, das Probleme bereitet.
Ich programmiere eine Lüftersteuerung mit - per SW - einstellbarem 
Nachlauf.
An PB.0 und PB.1 liegen zwei Taster ( Schliesser) intern sind die 
Pull-ups eingeschaltet. An PB.2 und 3 sind 2 Ausgänge die ich auf ein 
Testboard ziehe  und mit Transistor + LED erstmal den Status anzeige.
Das Programm bis dahin tut genau was es soll.
So, zu Testzwecken will ich jetzt PB4 als Ausgang verwenden um bestimmte 
Zustände zu kontrollieren. Dieser Ausgang PB4 war vorher als Eingang 
definiert mit einem internen Pull up , wurde aber nicht beschaltet.
Problem ist jetzt folgendes :
wenn ich da Programm in den Uc "schiebe" geht nichts mehr. Die 
Eingangsspannung an den Tastern PB.0 und PB.1 sinkt auf ca. 0,45 V (wenn 
Taster nicht gedrückt) und dazu noch bei einem Zustand, dass Ausgang 
PB.4 nicht beschaltet ist. ( also nicht verbunden mit Schalttransistor 
um den Status anzuzeigen)
Frage : wie kommt das ??
Anmerkung : bei der Syntaxprüfung tritt kein Fehler auf; es wird 
angezeigt, dass der Speicher zu 95% gefüllt wird
Wenn ich die Vorgängerversion - also die , die i.o war - wieder 
aufspiele (Programm Chip) ist wieder alles i.o.
Der wesentliche Unterschied zwischen den Versionen ist, dass PB.4 zuerst 
ein Eingang ist, und dann als Ausgang verwendet wird, ( ist im Programm 
auch so ungesetzt!)
Wer kann mir helfen / einen Tipp geben wo ich suchen sollte.
Vielen Dank vorab!
Gruss
Theo

von Eumel (Gast)


Lesenswert?

Theo Löcken schrieb:
> Wer kann mir helfen / einen Tipp geben wo ich suchen sollte.

Such mal den Schaltplan und den Code raus, dann beides hier posten :)

von Hannes L. (hannes)


Lesenswert?

Theo Löcken schrieb:
> An PB.2 und 3 sind 2 Ausgänge die ich auf ein
> Testboard ziehe  und mit Transistor + LED erstmal den Status anzeige.

Trenne PB2 mal ab, es könnte sein, dass damit SCK behindert wird.

...

von Theo L. (theo_100)


Angehängte Dateien:

Lesenswert?

hallo Zusammen,
vielen Dank für Eure Antworten. Zu der Frage nach einem Schaltplan, den 
gibt es so0 nicht. Das Experimentierboard für den AT Tiny 13 ist 
sebstgebaut. Alls PB's rausgeführt auf Buchsen ( 0,8mm) ; Reset mit 10 K 
an Vcc und ohne Kerko 100 nF. Die Ledtreiber ist ein Transistor Array 
ULM 28??? mit entsprechender Beschaltung.

Zu dem Thema : Last an PB.2 abtrennen, dann erhöht sich die Spannung am 
"high End" des Tasters von 0,45 V wie oben beschrieben auf ca. 0,7 V 
sonst bleibt alles gleich.

Ich hänge mal die beiden Programme an. Version 3 ist die die Problemlos 
läuft, Version 4 funzt überhaupt nicht.
Das das kein optimaler Code ist, weiss ich, ich übe ja noch.

Liegt in dem Code der Version 4 ein Fehler, der den AT Tiny 13 
"ausrasten" lässt ?
Vielen Dank für Eure Kommentare.
Gruss
Theo

von Wayne M. (vibra)


Lesenswert?

muss das jetzt xxx.docx sein,gehts auch als xxx.txt oder als code.

mfg

von Theo L. (theo_100)


Lesenswert?

hallo zusammen,
um weiteren Beschwerden vorzubeugen, hier der Code von Version 4, die 
Probleme bereitet , in diesen Thread copiert :

Lüfter Prog. Vers. 4


'Programm für ATTiny 13 um Lüfter Ein-bzw Auszuschalten und Timer zu 
aktivieren mit
 'Nachlauf. Nachlaufzeit wird im Programm festgelegt.
'erstellt : Nov 2013

'Programmname : Luefter_stg(Lüfter Steuerung)
'Programmversion :V4

'Beschreibung :
'Nach anlegen der Versorgungsspannung sind alle Ausgänge auf Low
'1. User drückt Taster eins; Ausgang PB0 wird auf High gesetzt ; Relais 
zieht an.
   'User drückt Taster 1 nochmals ; PB0 wird auf Low gesetzt : Relais 
fällt ab
'2. Wenn PB0 High ist , bewirkt das Drücken von T2 dass ein Timer 
eingeschaltet wird.
   'Nach Ablauf dieses Timers fällt das Relais wieder ab.
   'Die Anzahl der Tics (Constante Anz_Tiks) ist swo eizustellen, dass 
das Produkt aus
   'Anz_Tiks und der Constante T3 1 sec ergibt. Die Zeit für die 
Berechnungen wird dabei erstmal
   'nicht berücksichtigt.Anz_Tiks muss eine ganze gerade Zahl sein

$regfile = "attiny13.dat"
$crystal = 1200000
$framesize = 10 ' ist das so richtig ???
$swstack = 10 ' dito??
$hwstack = 10' dito ??


Config Pinb.0 = Input                                       'Port B.0 
als Eingang (Taster Ein /Aus)
Config Pinb.1 = Input                                       'Port B.1 
als Eingang (Taster Timer ein)
Config Portb.2 = Output                                     'Port B.2 
als Ausgang (Relais schalten über Transistor)
Config Portb.3 = Output                                     'Port B.3 
als Ausgang (LED zur Aktivierung Timer)
Config Portb.4 = Output                                     'als 
Testausgang für Zähler

Eing_ein_aus Alias Pinb.0                                   'Eingang
Eing_tim Alias Pinb.1                                       'Eingang
Ausg_relais Alias Portb.2                                   'Ausgang
Ausg_led Alias Portb.3                                      'Ausgang
Ausg_test Alias Portb.4

Portb.0 = 1                                                 'Pull-up R 
einschalten
Portb.1 = 1                                                 'Pull-up R 
einschalten
'Portb.4 = 1                                                 'Port B.4 
wird nicht genutzt , liegt aber hiermit auf def. Potential

Const T1 = 15                                               'Wartezeit 
(ms) für Schalter entprellen
Const T2 = 2                                                'Wartezeit 
(s) nach Schalter entprellen
Const T3 = 25                                               'Wartezeit 
(ms) für die minimale Taktzeit
Const Anz_ticks = 40
Const Maximp = 5                                            'Anzahl der 
Impulse bevor abgeschaltet wird


Dim Ein_aus As Bit                                          'Zeigt 
Zustand ob mit Haupttaster eingeschaltet wurde oder nicht (0=aus 1 = 
ein)
Dim I As Integer , J As Integer
Dim Zeit As Bit                                             'Zeigt ob 
Zeittaster betätigt wurde (Nacfhlaufzeit) (0 = aus 1 = ein)
Dim Zaehl_imp_a As Integer
Dim Zaehl_imp_b As Integer
Dim Ticks_2 As Integer                                      'Anzahl 
halbe Ticks: also Anz_Ticks / 2
Zeit = 0                                                    'Variable 
die zeigt ob Timer eingeschaltet oder nicht (1=eingschaltet 0=nicht 
eingeschaltet)
Ein_aus = 0                                                 'Variable 
die den Zustand des Relaisausganges beschreibt (0=aus / 1 = ein)
Zaehl_imp_a = 0 
'Impulszähler a der mit der Min Tacktzeit T3 getacktet wird
Zaehl_imp_b = 0 
'Impulszähler b der von a getacktet wird über die Sub Zeittaster
Ticks_2 = Anz_ticks / 2
Declare Sub Zeittaster()                                    'Sub wertet 
den Eingang PB1 aus
Declare Sub Haupttaster()                                   'Sub wertet 
den Eingang PB0 aus
Declare Sub Abfrage_t1()
Declare Sub Alles_null()

'Ausg_relais = 0
'Ausg_led = 0
'Ausg_test = 0

Do
If Ein_aus = 0 Then
   Haupttaster                                              'ruft die 
Sub Haupschalter() auf
End If

If Ein_aus = 1 Then
   Haupttaster                                              'ruft die 
Sub auf
End If


If Ein_aus = 1 Then
   Zeittaster
End If

If Zeit = 1 Then
   If Zaehl_imp_a = 0 Then
      Ausg_led = 1
      Zaehl_imp_a = Zaehl_imp_a + 1
      Ausg_test = 1
      Waitms 10
      Ausg_test = 0
      Waitms T3
   Elseif Zaehl_imp_a > 0 And Zaehl_imp_a < Ticks_2 Then
      Zaehl_imp_a = Zaehl_imp_a + 1
      Ausg_test = 1
      Waitms 10
      Ausg_test = 0
      Waitms T3
   Elseif Zaehl_imp_a = Ticks_2 Then
      Ausg_test = 1
      Waitms 10
      Ausg_test = 0
      Waitms T3
      Ausg_led = 0
      Zaehl_imp_a = Zaehl_imp_a + 1
   Elseif Zaehl_imp_a > 20 And Zaehl_imp_a < Anz_ticks Then
      Ausg_test = 1
      Waitms 10
      Ausg_test = 0
      Waitms T3
      Zaehl_imp_a = Zaehl_imp_a + 1
   Elseif Zaehl_imp_a => Anz_ticks Then
    'Elseif Zaehl_imp_a = Anz_ticks Then
      Ausg_test = 1
      Waitms 10
      Ausg_test = 0
      Waitms T3
      Zaehl_imp_a = 0
      Zaehl_imp_b = Zaehl_imp_b + 1
   End If
End If

If Zaehl_imp_b = Maximp Then
   'prüfen ob max Zeit erreicht ist; wenn wahr alles ausschalten und 
alle Zähler zurücksetzen auf 0
   Alles_null
End If

Loop


Sub Haupttaster()
'diese Sub fragt den Haupttaster ob gedrückt wird. Der Haupttaster 
schaltet den Lüfter ein / aus.
'Bei Start des Programmes ist der Lüfter aus. (PB3=0)

If Ein_aus = 0 Then
   Abfrage_t1
   If J > 4 Then
      Ausg_relais = 1
      Ein_aus = 1
      Wait T2
   End If
Elseif Ein_aus = 1 Then
   Abfrage_t1
   If J > 4 Then
      Ausg_relais = 0
      Ein_aus = 0
      Alles_null
      Wait T2

   End If
End If
End Sub

Sub Abfrage_t1()
'fragt Taster 1 (den Ein/Ausschalter) ab
J = 0
For I = 0 To 5
If Eing_ein_aus = 0 Then 
'Eing_ein_aus ist 0 wenn Taster gedrückt
   J = J + 1
   Waitms T1
End If
Next I
End Sub

Sub Zeittaster()
'fragt Taster 2 (den Starttaster für Timer Nachlauf) ab
J = 0
For I = 0 To 5
   If Eing_tim = 0 Then
      J = J + 1
      Waitms T1
   End If
Next I

If J > 4 Then
   Zeit = 1
End If
End Sub


Sub Alles_null()
'hier werden alle Werte auf 0 zurückgesetzt, bzw. die Ausgänge 
abgeschaltet
Ausg_relais = 0
Ein_aus = 0
Ausg_led = 0
Ausg_test = 0
Zeit = 0
Zaehl_imp_a = 0
Zaehl_imp_b = 0
End Sub
End

Gruss
Theo

von Hubert G. (hubertg)


Lesenswert?

Ich weiß nicht ob man im BASCOM nachsehen kann wieviel vom SRAM schon 
statisch belegt ist.
Aus eigener Erfahrung weiß ich nur das, wenn man etwas großzügig ist, 
die 64 Byte SRAM schnell voll sind. BASCOM ist was das anbelangt nicht 
sparsam.

von Wayne M. (vibra)


Lesenswert?

Im simulator kommt ein Fehler " Frame overlap swstack "
also $swstack auf 20 erhöhen dann ist der Fehler weg
und sehe dir bitte in der Bascom Hilfe den Befehl  " Debounce " an
der könnte dein Konstruckt der Tasten entprellung evtl. vereinfachen

von Theo L. (theo_100)


Lesenswert?

Hallo Zusammen,
vielen Dank für die Tipps ! werde es nachher mal ausprobieren.
@ vibra : ich habe mit dem Befehl "debounce" noch nichts gemacht; gehört 
/ gelesen schon. Ich will das Programm, wenn es so erstmal läuft incl. 
der noch "richtig" aufzubauenden HW, Schritt für Schritt verbessern. Ich 
hab halt "auf die Schelle" 2 sec. Wait reingeschrieben, hat den 
Nachteil, dass, wenn man den Taster zu lange gedrückt helt, der Ausgang 
auch wieder abfällt ( auf Low geht)
Wenn ich's erprobt habe, melde ich mich wieder.
Gruss
Theo

von Theo L. (theo_100)


Lesenswert?

Hallo zusammen,
ja, der $swstack war es. Wenn man den auf 20 setzt geht's. (wie's soll)

Eine Frage habe ich aber noch :
ich hab die Simmualtion versucht, da gibt's ja einen extra Button.
Bei mir kommt da die Meldung : "OBJ and DGB file not found" Was bedeutet 
denn das ? Und : in der Hilfe von Bascom finde ich nix zu "Simmulation".
Ist das Normal ? ich habe die Vollversion, also das, wofür man mal 
bezahlt hat.
Könnt Ihr mir die Fragen noch beantworten ?
Vielen Dank vorab!
Gruss
Theo

von NaNa_JaJa (Gast)


Lesenswert?

Einfach mal die Web site des Herstellers besuchen - da findet man doch 
alles ;-)

von J. H. (joho62)


Angehängte Dateien:

Lesenswert?

Du must in den Optionen die entsprechenden Ausgaben aktivieren.
Die Hilfe zur Simulation findest Du unter " $SIM ".

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.