PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Benötige ein wenig Programmierhilfe



Tetrapack
14.11.2008, 18:28
Hallo zusammen!

Wie schon im Hardwarebereich angedeutet, benötige ich hier nun ein paar Ratschläge bezüglich der Programmierung meines ATtiny25.

Da ich früher schon mal ein wenig mit µCs machen mußte(Im Rahmen einer Fortbildung), lag mir noch in Erinnerung, dass bei Tastern z.B. eine Entprellung stattfinden sollte, damit ein Tastendruck auch zuverlässig erkannt wird.
In Bascom scheint ja dafür die Funktion "debounce" direkt implementiert zu sein, zumindest habe ich das so verstanden!?

Also fange ich folgendermaßen an:



$regfile = "atTiny25.dat"
$crystal = 1000000
$sim
$hwstack = 24
$swstack = 16
$framesize = 32
'by default the tiny25 has a 8 MHz internal osc.
'and by default the internal 8 divider is enabled resulting in 1 Mhz clock freq.

Config Debounce = 100

Config Pinb.1 = Input
Config Pinb.2 = Input
Config Pinb.5 = Output
Config Pinb.3 = Output


Wie löse ich jetzt die Abfrage der Taster? Einfach über Debounce und dann in das passende Unterprogramm oder löst man das über einen externen Interrupt? (PCINTx), damit der Taster auch definitiv erkannt wird?
Entweder ist Ausgang 1 aktiv oder es sind beide Ausgänge aktiv, bzw. beide aus. Nur Ausgang 2 an geht nicht!
Taster 1 soll Ausgang 1 einschalten, aber auch Ausgang 1+2 ausschalten können. Taster 2 soll Ausgang 1+2 gleichzeitig einschalten und ebenfalls auch ausschalten können. Zusätzlich soll Taster 2 aber auch nur Taster 1 abschalten können.

Vom Prinzip her so: ?


Do
Debounce Pinb.1 , 1 , Hoch , Sub 'Taster 1
Debounce Pinb.2 , 1 , Runter , Sub 'Taster 2
Loop



Hoch:

If Portb.5 = 0 And Portb.3 <> 1 Then
Set Portb.5
Else
Reset Portb.5
Reset Portb.3

End If

Return



Runter:

If Portb.5 = 0 And Portb. = 0 Then
Set Portb.3
Wait 100
Set Portb.5
Else
Reset Portb.5
Reset Portb.3

End If

Return


End


Dazu kommt dann ein analoger Eingang, an dem 5V über ein 10K Poti anliegen. Dieser Eingang soll die automatische Ausschaltverzögerung steuern. Also wenn z.B. Taster 1 benutzt wird, soll Ausgang 1 durchschalten und gleichzeitig der Timer gestartet werden. Je nach anliegender Spannung am analogen Eingang, soll dann Ausgang 1 abgeschaltet werden, falls die Abschaltung nicht manuell über einen Taster erfolgt.
Die Zeit soll von ca. 2sec bis ca. 90sek einstellbar sein, wobei die Obergrenze eigentlich egal ist nur mehr als 2min wird nicht benötigt.




Config Adc = Single , Prescaler = Auto
Start Adc

Dim Spannung As Integer


Dazu dann in der Do Anweisung

Spannung = Getadc(2)
um den aktuellen Wert zu haben?

Wie bastle ich dann aber die Zeitfunktion zur Abschaltung? Das hier habe ich gefunden
http://halvar.at/elektronik/kleiner_bascom_avr_kurs/adc_mit_getadc/
weiß aber nicht so recht wie ich das einbauen muss. Vom Prinzip her müßte ich doch beim setzen eines Ausgangs den Timer starten und dann über den Timerinterrupt zählen. Über den analogen Eingang lege ich mit der Spannung die Zeit fest. Nur wie bringe ich das zusammen??

Würde mir da vielleicht jemand einen Tip geben und auch zum Rest etwas sagen?

Gruß
Jörg

stromflo
15.11.2008, 23:03
Hallo Tetrapack,

die Zeitschaltung mit Attiny13 (http://www.stromflo.de/elektronik/31-mikrocontroller/48-zeitschaltung-mit-attiny13) auf meiner Hompage könnte dir da eventuell etwas weiterhelfen. Zwar ist die Schaltung nicht identisch mit deiner, allerdings handelt es sich hierbei auch um eine Ausschaltverzögerung.

Gruß Flo

Tetrapack
16.11.2008, 06:04
Hallo Flo,

vielen Dank für den Tip!! Sieht auf den ersten Blick schon mal klasse aus ;)

Dann fehlt mir nur noch die Sache mit den Fusebits ... das hatte ich noch nicht aufm Plan, dachte "einfach überspielen und fertig" ^^


Gruß
Jörg

stromflo
16.11.2008, 11:10
Dann fehlt mir nur noch die Sache mit den Fusebits ... das hatte ich noch nicht aufm Plan, dachte "einfach überspielen und fertig" ^^

Kommt natürlich jetzt drauf an, wie du deine Schaltung genau programmierst bzw. aufbaust. Wenn du die Schaltung so aufbaust wie auf meiner Hompage und du einen neuen Attiny13 nimmst, dann sind die Fusebits schon richtig eingestellt, da es sich bei den Einstellungen für die Zeitschaltung um die Default Einstellungen handelt.

Ansonsten musst du natürlich die Fusebits anpassen.
Dazu mal ein nützlicher Link (http://www.engbedded.com/cgi-bin/fc.cgi/).

Gruß Flo

Tetrapack
16.11.2008, 13:27
Ne, die Schaltung sieht etwas anders aus .. und benutzen werde/wollte ich einen Tiny25.

Der Link ist interessant ^^ ... auf was muß man da denn achten?? Kann ich die Voreinstellungen nutzen, nur zusätzlich noch einen Haken bei PB5 (Reset), da es kein Resetpin ist sondern ein I/O ?

stromflo
16.11.2008, 23:26
Ne, die Schaltung sieht etwas anders aus .. und benutzen werde/wollte ich einen Tiny25.


Schon klar, dass deine Schaltung etwas anders wird.


Kann ich die Voreinstellungen nutzen, nur zusätzlich noch einen Haken bei PB5 (Reset), da es kein Resetpin ist sondern ein I/O ?

Davon rate ich dir ab, einmal den Reset Pin als I/O Pin gesetzt, lässt sich der Controller, soweit ich mich erinnern kann, nur noch über einen Parallelprogrammer und nicht mehr über ISP programmieren.

Du benötigst ja nach deiner Beschreibung folgende I/O Pins:

2 x Ausgang
2 x Eingang - Taster
1 x ADC - Potentiometer

oder hab ich einen übersehen?
Der Attiny25 hat doch 6 I/O Pins mit Reset, da musst du doch den Reset nicht benutzen!

Solltest du noch einen Pin mehr benötigen, könntest du folgendes in Betracht ziehen:

Du könntest an einen ADC auch zwei Taster anschließen und die eingelesenen ADC_Werte z.B über Select Case auswerten. Ich hab dir mal ein Beispiel angehängt, wie du zwei Taster an einen Controller ADC anschließen könntest. Das Beispiel ist so ausgelegt, dass immer nur 1 Taster betätigt wird, ansonsten findet keine korrekte Auswertung statt. Soll auch ein Ereignis beim gleichzeitigen drücken beider Taster ausgeführt werden, müsste die Tastermatrix nochmal verändert werden.



Zusätzlich soll Taster 2 aber auch nur Taster 1 abschalten können.


Soll das heißen: Zusätzlich soll Taster 2 aber auch nur Ausgang 1 abschalten können?


Gruß Flo[/quote]

Tetrapack
16.11.2008, 23:35
Danke für den Tip, aber dadurch das das Layout fertig ist und ich nur den PIC gegen einen AVR austauschen möchte, habe ich keine andere Wahl als PB5 zu einem I/O zu machen. Sorry falls ich das missverständlich geschrieben hatte!
Das mit dem Resetproblem habe ich auch schon gefunden, das werde ich wohl in Kauf nehmen müssen ... aber leider läßt Ponyprog ein Deaktivieren nicht zu(zumindest die Version die ich jetzt habe) .. das Feld ist und bleibt ausgegraut. Gibt es da einen Trick?

*edit*
Ich habe mal dein Programm in Bascom geladen und versuche mich gerade am Simulator. Kann es sein, das der Durchlauf im Simulator wesentlich langsamer ist als in Echtzeit? Kann man den Simulator auch auf Echtzeit einstellen?


Jörg

stromflo
17.11.2008, 07:25
Ich habe mal dein Programm in Bascom geladen und versuche mich gerade am Simulator. Kann es sein, das der Durchlauf im Simulator wesentlich langsamer ist als in Echtzeit? Kann man den Simulator auch auf Echtzeit einstellen?


Im Moment kann ich dir die Frage nicht beantworten, da ich die Zeitschaltung bisher nur in Echtzeit laufen hab. Ich teste meine Programme zu 100% direkt an Hardware. Wenn es die Zeit zulässt werd ich mir das ganze die Woche mal im Simulator anschauen.

Gruß Flo